=.01&&(n=this.pdf.internal.getFontSize(),this.pdf.setFontSize(n*t.scale),i=this.lineWidth,this.lineWidth=i*t.scale);var R=\"text\"!==this.autoPaging;if(R||E.y+E.h<=C){if(R||E.y>=F&&E.x<=O){var D=R?t.text:this.pdf.splitTextToSize(t.text,t.maxWidth||O-E.x)[0],T=N([JSON.parse(JSON.stringify(p))],this.posX+this.margin[3],-M+F+this.ctx.prevPageLastElemOffset)[0],z=R&&(k>x||k=.01&&(this.pdf.setFontSize(n),this.lineWidth=i)}}else t.scale>=.01&&(n=this.pdf.internal.getFontSize(),this.pdf.setFontSize(n*t.scale),i=this.lineWidth,this.lineWidth=i*t.scale),this.pdf.text(t.text,h.x+this.posX,h.y+this.posY,{angle:t.angle,align:e,renderingMode:t.renderingMode,maxWidth:t.maxWidth}),t.scale>=.01&&(this.pdf.setFontSize(n),this.lineWidth=i)},j=function(t,e,r,a){r=r||0,a=a||0,this.pdf.internal.out(n(t+r)+\" \"+i(e+a)+\" l\")},O=function(t,e,r){return this.pdf.lines(t,e,r,null,null)},B=function(t,e,n,i,o,u,c,l){this.pdf.internal.out([r(a(n+t)),r(s(i+e)),r(a(o+t)),r(s(u+e)),r(a(c+t)),r(s(l+e)),\"c\"].join(\" \"))},M=function(t,e,r,n){for(var i=2*Math.PI,a=Math.PI/2;e>r;)e-=i;var o=Math.abs(r-e);o1e-5;){var l=c+u*Math.min(o,a);s.push(q.call(this,t,c,l)),o-=Math.abs(l-c),c=l}return s},q=function(t,e,r){var n=(r-e)/2,i=t*Math.cos(n),a=t*Math.sin(n),o=i,s=-a,u=o*o+s*s,c=u+o*i+s*a,l=4/3*(Math.sqrt(2*u*c)-c)/(o*a-s*i),h=o-l*s,f=s+l*o,d=h,p=-f,g=n+e,m=Math.cos(g),v=Math.sin(g);return{x1:t*Math.cos(e),y1:t*Math.sin(e),x2:h*m-f*v,y2:h*v+f*m,x3:d*m-p*v,y3:d*v+p*m,x4:t*Math.cos(r),y4:t*Math.sin(r)}},E=function(t){return 180*t/Math.PI},R=function(t,e,r,n,i,a){var o=t+.5*(r-t),s=e+.5*(n-e),u=i+.5*(r-i),l=a+.5*(n-a),h=Math.min(t,i,o,u),f=Math.max(t,i,o,u),d=Math.min(e,a,s,l),p=Math.max(e,a,s,l);return new c(h,d,f-h,p-d)},D=function(t,e,r,n,i,a,o,s){var u,l,h,f,d,p,g,m,v,b,y,w,N,L,x=r-t,A=n-e,S=i-r,_=a-n,P=o-i,k=s-a;for(l=0;l<41;l++)v=(g=(h=t+(u=l/40)*x)+u*((d=r+u*S)-h))+u*(d+u*(i+u*P-d)-g),b=(m=(f=e+u*A)+u*((p=n+u*_)-f))+u*(p+u*(a+u*k-p)-m),0==l?(y=v,w=b,N=v,L=b):(y=Math.min(y,v),w=Math.min(w,b),N=Math.max(N,v),L=Math.max(L,b));return new c(Math.round(y),Math.round(w),Math.round(N-y),Math.round(L-w))},T=function(){if(this.prevLineDash||this.ctx.lineDash.length||this.ctx.lineDashOffset){var t,e,r=(t=this.ctx.lineDash,e=this.ctx.lineDashOffset,JSON.stringify({lineDash:t,lineDashOffset:e}));this.prevLineDash!==r&&(this.pdf.setLineDash(this.ctx.lineDash,this.ctx.lineDashOffset),this.prevLineDash=r)}}}(E.API),\n/**\n * @license\n * jsPDF filters PlugIn\n * Copyright (c) 2014 Aras Abbasi\n *\n * Licensed under the MIT License.\n * http://opensource.org/licenses/mit-license\n */\nfunction(t){var r=function(t){var e,r,n,i,a,o,s,u,c,l;for(/[^\\x00-\\xFF]/.test(t),r=[],n=0,i=(t+=e=\"\\0\\0\\0\\0\".slice(t.length%4||4)).length;i>n;n+=4)0!==(a=(t.charCodeAt(n)<<24)+(t.charCodeAt(n+1)<<16)+(t.charCodeAt(n+2)<<8)+t.charCodeAt(n+3))?(o=(a=((a=((a=((a=(a-(l=a%85))/85)-(c=a%85))/85)-(u=a%85))/85)-(s=a%85))/85)%85,r.push(o+33,s+33,u+33,c+33,l+33)):r.push(122);return function(t,e){for(var r=e;r>0;r--)t.pop()}(r,e.length),String.fromCharCode.apply(String,r)+\"~>\"},n=function(t){var e,r,n,i,a,o=String,s=\"length\",u=255,c=\"charCodeAt\",l=\"slice\",h=\"replace\";for(t[l](-2),t=t[l](0,-2)[h](/\\s/g,\"\")[h](\"z\",\"!!!!!\"),n=[],i=0,a=(t+=e=\"uuuuu\"[l](t[s]%5||5))[s];a>i;i+=5)r=52200625*(t[c](i)-33)+614125*(t[c](i+1)-33)+7225*(t[c](i+2)-33)+85*(t[c](i+3)-33)+(t[c](i+4)-33),n.push(u&r>>24,u&r>>16,u&r>>8,u&r);return function(t,e){for(var r=e;r>0;r--)t.pop()}(n,e[s]),o.fromCharCode.apply(o,n)},i=function(t){return t.split(\"\").map(function(t){return(\"0\"+t.charCodeAt().toString(16)).slice(-2)}).join(\"\")+\">\"},a=function(t){var e=new RegExp(/^([0-9A-Fa-f]{2})+$/);if(-1!==(t=t.replace(/\\s/g,\"\")).indexOf(\">\")&&(t=t.substr(0,t.indexOf(\">\"))),t.length%2&&(t+=\"0\"),!1===e.test(t))return\"\";for(var r=\"\",n=0;nc&&(u=l,l=c,c=u);else{if(\"l\"!==e&&\"landscape\"!==e)throw\"Invalid orientation: \"+e;e=\"l\",c>l&&(u=l,l=c,c=u)}return{width:l,height:c,unit:r,k:a,orientation:e}},e.html=function(t,e){(e=e||{}).callback=e.callback||function(){},e.html2canvas=e.html2canvas||{},e.html2canvas.canvas=e.html2canvas.canvas||this.canvas,e.jsPDF=e.jsPDF||this,e.fontFaces=e.fontFaces?e.fontFaces.map(Ot):null;var r=new u(e);return e.worker?r:r.from(t).doCallback()}}(E.API),E.API.addJS=function(t){var e,r,n=function(t){for(var e=\"\",r=0;r=0&&\"\\\\\"===t[a];a--)i++;e+=i%2==0?\"\\\\\"+n:n}else e+=n}return e}(t);return this.internal.events.subscribe(\"postPutResources\",function(){e=this.internal.newObject(),this.internal.out(\"<<\"),this.internal.out(\"/Names [(EmbeddedJS) \"+(e+1)+\" 0 R]\"),this.internal.out(\">>\"),this.internal.out(\"endobj\"),r=this.internal.newObject(),this.internal.out(\"<<\"),this.internal.out(\"/S /JavaScript\"),this.internal.out(\"/JS (\"+n+\")\"),this.internal.out(\">>\"),this.internal.out(\"endobj\")}),this.internal.events.subscribe(\"putCatalog\",function(){void 0!==e&&void 0!==r&&this.internal.out(\"/Names <>\")}),this},\n/**\n * @license\n * Copyright (c) 2014 Steven Spungin (TwelveTone LLC) steven@twelvetone.tv\n *\n * Licensed under the MIT License.\n * http://opensource.org/licenses/mit-license\n */\nfunction(t){var e;t.events.push([\"postPutResources\",function(){var t=this,r=/^(\\d+) 0 obj$/;if(this.outline.root.children.length>0)for(var n=t.outline.render().split(/\\r\\n/),i=0;i> endobj\")}var f=t.internal.newObject();for(t.internal.write(\"<< /Names [ \"),i=0;i>\",\"endobj\"),e=t.internal.newObject(),t.internal.write(\"<< /Dests \"+f+\" 0 R\"),t.internal.write(\">>\",\"endobj\")}}]),t.events.push([\"putCatalog\",function(){var t=this;t.outline.root.children.length>0&&(t.internal.write(\"/Outlines\",this.outline.makeRef(this.outline.root)),this.outline.createNamedDestinations&&t.internal.write(\"/Names \"+e+\" 0 R\"))}]),t.events.push([\"initialized\",function(){var t=this;t.outline={createNamedDestinations:!1,root:{children:[]}},t.outline.add=function(t,e,r){var n={title:e,options:r,children:[]};return null==t&&(t=this.root),t.children.push(n),n},t.outline.render=function(){return this.ctx={},this.ctx.val=\"\",this.ctx.pdf=t,this.genIds_r(this.root),this.renderRoot(this.root),this.renderItems(this.root),this.ctx.val},t.outline.genIds_r=function(e){e.id=t.internal.newObjectDeferred();for(var r=0;r0&&(this.line(\"/First \"+this.makeRef(t.children[0])),this.line(\"/Last \"+this.makeRef(t.children[t.children.length-1]))),this.line(\"/Count \"+this.count_r({count:0},t)),this.objEnd()},t.outline.renderItems=function(e){for(var r=this.ctx.pdf.internal.getVerticalCoordinateString,n=0;n0&&this.line(\"/Prev \"+this.makeRef(e.children[n-1])),n0&&(this.line(\"/First \"+this.makeRef(i.children[0])),this.line(\"/Last \"+this.makeRef(i.children[i.children.length-1])));var a=this.count=this.count_r({count:0},i);if(a>0&&this.line(\"/Count \"+a),i.options&&i.options.pageNumber){var o=t.internal.getPageInfo(i.options.pageNumber);this.line(\"/Dest [\"+o.objId+\" 0 R /XYZ 0 \"+r(0)+\" 0]\")}this.objEnd()}for(var s=0;s> \\r\\nendobj\\r\\n\"},t.outline.count_r=function(t,e){for(var r=0;r1){s=!0,c=void 0;var y=e*n;l=new Uint8Array(y);for(var w=new DataView(i.buffer),N=0;N536870912)throw new Error(\"Image dimensions exceed 512MB, which is too large.\");this.data=new Uint8Array(e);try{this[t]()}catch(r){o.log(\"bit decode error:\"+r)}},se.prototype.bit1=function(){var t,e=Math.ceil(this.width/8),r=e%4;for(t=this.height-1;t>=0;t--){for(var n=this.bottom_up?t:this.height-1-t,i=0;i>7-s&1];this.data[o+4*s]=u.blue,this.data[o+4*s+1]=u.green,this.data[o+4*s+2]=u.red,this.data[o+4*s+3]=255}0!==r&&(this.pos+=4-r)}},se.prototype.bit4=function(){for(var t=Math.ceil(this.width/2),e=t%4,r=this.height-1;r>=0;r--){for(var n=this.bottom_up?r:this.height-1-r,i=0;i>4,u=15&a,c=this.palette[s];if(this.data[o]=c.blue,this.data[o+1]=c.green,this.data[o+2]=c.red,this.data[o+3]=255,2*i+1>=this.width)break;c=this.palette[u],this.data[o+4]=c.blue,this.data[o+4+1]=c.green,this.data[o+4+2]=c.red,this.data[o+4+3]=255}0!==e&&(this.pos+=4-e)}},se.prototype.bit8=function(){for(var t=this.width%4,e=this.height-1;e>=0;e--){for(var r=this.bottom_up?e:this.height-1-e,n=0;n=0;r--){for(var n=this.bottom_up?r:this.height-1-r,i=0;i>5&e)/e*255|0,u=(a>>10&e)/e*255|0,c=a>>15?255:0,l=n*this.width*4+4*i;this.data[l]=u,this.data[l+1]=s,this.data[l+2]=o,this.data[l+3]=c}this.pos+=t}},se.prototype.bit16=function(){for(var t=this.width%3,e=parseInt(\"11111\",2),r=parseInt(\"111111\",2),n=this.height-1;n>=0;n--){for(var i=this.bottom_up?n:this.height-1-n,a=0;a>5&r)/r*255|0,c=(o>>11)/e*255|0,l=i*this.width*4+4*a;this.data[l]=c,this.data[l+1]=u,this.data[l+2]=s,this.data[l+3]=255}this.pos+=t}},se.prototype.bit24=function(){for(var t=this.height-1;t>=0;t--){for(var e=this.bottom_up?t:this.height-1-t,r=0;r=0;t--)for(var e=this.bottom_up?t:this.height-1-t,r=0;rn&&(i.push(t.slice(u,a)),s=0,u=a),s+=e[a],a++;return u!==a&&i.push(t.slice(u,a)),i},Vt=function(t,e,r){r||(r={});var n,i,a,o,s,u,c,l=[],h=[l],f=r.textIndent||0,d=0,p=0,g=t.split(\" \"),m=Ut.apply(this,[\" \",r])[0];if(u=-1===r.lineIndent?g[0].length+2:r.lineIndent||0){var v=Array(u).join(\" \"),b=[];g.map(function(t){(t=t.split(/\\s*\\n/)).length>1?b=b.concat(t.map(function(t,e){return(e&&t.length?\"\\n\":\"\")+t})):b.push(t[0])}),g=b,u=Ht.apply(this,[v,r])}for(a=0,o=g.length;ae||y){if(p>e){for(s=Wt.apply(this,[n,i,e-(f+d),e]),l.push(s.shift()),l=[s.pop()];s.length;)h.push([s.shift()]);p=i.slice(n.length-(l[0]?l[0].length:0)).reduce(function(t,e){return t+e},0)}else l=[n];h.push(l),f=p+u,d=m}else l.push(n),f+=d+p,d=m}return c=u?function(t,e){return(e?v:\"\")+t.join(\" \")}:function(t){return t.join(\" \")},h.map(c)},zt.splitTextToSize=function(t,e,r){var n,i=(r=r||{}).fontSize||this.internal.getFontSize(),a=function(t){if(t.widths&&t.kerning)return{widths:t.widths,kerning:t.kerning};var e=this.internal.getFont(t.fontName,t.fontStyle),r=\"Unicode\";return e.metadata[r]?{widths:e.metadata[r].widths||{0:1},kerning:e.metadata[r].kerning||{}}:{font:e.metadata,fontSize:this.internal.getFontSize(),charSpace:this.internal.getCharSpace()}}.call(this,r);n=Array.isArray(t)?t:String(t).split(/\\r?\\n/);var o=1*this.internal.scaleFactor*e/i;a.textIndent=r.textIndent?1*r.textIndent*this.internal.scaleFactor/i:0,a.lineIndent=r.lineIndent;var s,u,c=[];for(s=0,u=n.length;s1){for(h=0;h>\")}),this.internal.viewerpreferences.isSubscribed=!0),this.internal.viewerpreferences.configuration=n,this},E.API.addMetadata=function(t,e){return void 0===this.internal.__metadata__&&(this.internal.__metadata__={metadata:t,namespaceUri:null!=e?e:\"http://jspdf.default.namespaceuri/\",rawXml:\"boolean\"==typeof e&&e},this.internal.events.subscribe(\"putCatalog\",le),this.internal.events.subscribe(\"postPutResources\",ce)),this},function(t){var e=t.API,r=e.pdfEscape16=function(t,e){for(var r,n=e.metadata.Unicode.widths,i=[\"\",\"0\",\"00\",\"000\",\"0000\"],a=[\"\"],o=0,s=t.length;o> def\\n/CMapName /Adobe-Identity-UCS def\\n/CMapType 2 def\\n1 begincodespacerange\\n<0000>\\nendcodespacerange\",n=[],o=0,s=(r=Object.keys(t).sort(function(t,e){return t-e})).length;o=100&&(a+=\"\\n\"+n.length+\" beginbfchar\\n\"+n.join(\"\\n\")+\"\\nendbfchar\",n=[]),void 0!==t[e]&&null!==t[e]&&\"function\"==typeof t[e].toString&&(i=(\"0000\"+t[e].toString(16)).slice(-4),e=(\"0000\"+(+e).toString(16)).slice(-4),n.push(\"<\"+e+\"><\"+i+\">\"));return n.length&&(a+=\"\\n\"+n.length+\" beginbfchar\\n\"+n.join(\"\\n\")+\"\\nendbfchar\\n\"),a+\"endcmap\\nCMapName currentdict /CMap defineresource pop\\nend\\nend\"};e.events.push([\"putFont\",function(e){!function(e){var r=e.font,i=e.out,a=e.newObject,o=e.putStream;if(r.metadata instanceof t.API.TTFFont&&\"Identity-H\"===r.encoding){for(var s=r.metadata.Unicode.widths,u=r.metadata.subset.encode(r.metadata.glyIdsUsed,1),c=\"\",l=0;l>\"),i(\"endobj\");var p=a();i(\"<<\"),i(\"/Type /Font\"),i(\"/BaseFont /\"+C(r.fontName)),i(\"/FontDescriptor \"+d+\" 0 R\"),i(\"/W \"+t.API.PDFObject.convert(s)),i(\"/CIDToGIDMap /Identity\"),i(\"/DW 1000\"),i(\"/Subtype /CIDFontType2\"),i(\"/CIDSystemInfo\"),i(\"<<\"),i(\"/Supplement 0\"),i(\"/Registry (Adobe)\"),i(\"/Ordering (\"+r.encoding+\")\"),i(\">>\"),i(\">>\"),i(\"endobj\"),r.objectNumber=a(),i(\"<<\"),i(\"/Type /Font\"),i(\"/Subtype /Type0\"),i(\"/ToUnicode \"+f+\" 0 R\"),i(\"/BaseFont /\"+C(r.fontName)),i(\"/Encoding /\"+r.encoding),i(\"/DescendantFonts [\"+p+\" 0 R]\"),i(\">>\"),i(\"endobj\"),r.isAlreadyPutted=!0}}(e)}]),e.events.push([\"putFont\",function(e){!function(e){var r=e.font,i=e.out,a=e.newObject,o=e.putStream;if(r.metadata instanceof t.API.TTFFont&&\"WinAnsiEncoding\"===r.encoding){for(var s=r.metadata.rawData,u=\"\",c=0;c>\"),i(\"endobj\"),r.objectNumber=a();for(var d=0;d>\"),i(\"endobj\"),r.isAlreadyPutted=!0}}(e)}]);var i=function(t){var e,n=t.text||\"\",i=t.x,a=t.y,o=t.options||{},s=t.mutex||{},u=s.pdfEscape,c=s.activeFontKey,l=s.fonts,h=c,f=\"\",d=0,p=\"\",g=l[h].encoding;if(\"Identity-H\"!==l[h].encoding)return{text:n,x:i,y:a,options:o,mutex:s};for(p=n,h=c,Array.isArray(n)&&(p=n[0]),d=0;d\",\"<\",\"[\",\"]\",\"[\",\"{\",\"}\",\"{\",\"«\",\"»\",\"«\",\"‹\",\"›\",\"‹\",\"⁅\",\"⁆\",\"⁅\",\"⁽\",\"⁾\",\"⁽\",\"₍\",\"₎\",\"₍\",\"≤\",\"≥\",\"≤\",\"〈\",\"〉\",\"〈\",\"﹙\",\"﹚\",\"﹙\",\"﹛\",\"﹜\",\"﹛\",\"﹝\",\"﹞\",\"﹝\",\"﹤\",\"﹥\",\"﹤\"],g=new RegExp(/^([1-4|9]|1[0-9]|2[0-9]|3[0168]|4[04589]|5[012]|7[78]|159|16[0-9]|17[0-2]|21[569]|22[03489]|250)$/),m=!1,v=0;this.__bidiEngine__={};var b=function(t){var e=t.charCodeAt(),r=e>>8,n=d[r];return void 0!==n?c[256*n+(255&e)]:252===r||253===r?\"AL\":g.test(r)?\"L\":8===r?\"R\":\"N\"},y=function(t){for(var e,r=0;r=e.length||\"EN\"!==(u=o[s-1])&&\"AN\"!==u||\"EN\"!==(c=e[s+1])&&\"AN\"!==c?f=\"N\":m&&(c=\"AN\"),f=c===u?c:\"N\";break;case\"ES\":f=\"EN\"===(u=s>0?o[s-1]:\"B\")&&s+10&&\"EN\"===o[s-1]){f=\"EN\";break}if(m){f=\"N\";break}for(l=s+1,h=e.length;l=1425&&d<=2303||64286===d;if(u=e[l],p&&(\"R\"===u||\"AL\"===u)){f=\"R\";break}}}f=s<1||\"B\"===(u=e[s-1])?\"N\":o[s-1];break;case\"B\":m=!1,r=!0,f=v;break;case\"S\":n=!0,f=\"N\"}return f},N=function(t,e,r){var n=t.split(\"\");return r&&L(n,r,{hiLevel:v}),n.reverse(),e&&e.reverse(),n.join(\"\")},L=function(t,e,i){var a,o,s,u,c,d=-1,p=t.length,g=0,y=[],N=v?h:l,L=[];for(m=!1,r=!1,n=!1,o=0;o0)if(16===a){for(o=d;o-1){for(o=d;o=0&&\"WS\"===t[i];i--)e[i]=v}}(L,e,p)},x=function(t,e,n,i,a){if(!(a.hiLevel=t){for(u=h+1;u=t;)u++;for(c=h,s=u-1;c=0&&(t[i]=p[n+1])}(n,r,i),x(2,n,e,r,i),x(1,n,e,r,i),n.join(\"\")};return this.__bidiEngine__.doBidiReorder=function(t,e,r){if(function(t,e){if(e)for(var r=0;r>16)&&(e=-(1+(65535^e))),this.italicAngle=+(e+\".\"+r)):this.italicAngle=0,this.ascender=Math.round(this.ascender*this.scaleFactor),this.decender=Math.round(this.decender*this.scaleFactor),this.lineGap=Math.round(this.lineGap*this.scaleFactor),this.capHeight=this.os2.exists&&this.os2.capHeight||this.ascender,this.xHeight=this.os2.exists&&this.os2.xHeight||0,this.familyClass=(this.os2.exists&&this.os2.familyClass||0)>>8,this.isSerif=1===(i=this.familyClass)||2===i||3===i||4===i||5===i||7===i,this.isScript=10===this.familyClass,this.flags=0,this.post.isFixedPitch&&(this.flags|=1),this.isSerif&&(this.flags|=2),this.isScript&&(this.flags|=8),0!==this.italicAngle&&(this.flags|=64),this.flags|=32,!this.cmap.unicode)throw new Error(\"No unicode cmap for font\")},t.prototype.characterToGlyph=function(t){var e;return(null!=(e=this.cmap.unicode)?e.codeMap[t]:void 0)||0},t.prototype.widthOfGlyph=function(t){var e;return e=1e3/this.head.unitsPerEm,this.hmtx.forGlyph(t).advance*e},t.prototype.widthOfString=function(t,e,r){var n,i,a,o;for(a=0,i=0,o=(t=\"\"+t).length;0<=o?io;i=0<=o?++i:--i)n=t.charCodeAt(i),a+=this.widthOfGlyph(this.characterToGlyph(n))+r*(1e3/e)||0;return a*(e/1e3)},t.prototype.lineHeight=function(t,e){var r;return null==e&&(e=!1),r=e?this.lineGap:0,(this.ascender+r-this.decender)/1e3*t},t}();var he,fe=function(){function t(t){this.data=null!=t?t:[],this.pos=0,this.length=this.data.length}return t.prototype.readByte=function(){return this.data[this.pos++]},t.prototype.writeByte=function(t){return this.data[this.pos++]=t},t.prototype.readUInt32=function(){return 16777216*this.readByte()+(this.readByte()<<16)+(this.readByte()<<8)+this.readByte()},t.prototype.writeUInt32=function(t){return this.writeByte(t>>>24&255),this.writeByte(t>>16&255),this.writeByte(t>>8&255),this.writeByte(255&t)},t.prototype.readInt32=function(){var t;return(t=this.readUInt32())>=2147483648?t-4294967296:t},t.prototype.writeInt32=function(t){return t<0&&(t+=4294967296),this.writeUInt32(t)},t.prototype.readUInt16=function(){return this.readByte()<<8|this.readByte()},t.prototype.writeUInt16=function(t){return this.writeByte(t>>8&255),this.writeByte(255&t)},t.prototype.readInt16=function(){var t;return(t=this.readUInt16())>=32768?t-65536:t},t.prototype.writeInt16=function(t){return t<0&&(t+=65536),this.writeUInt16(t)},t.prototype.readString=function(t){var e,r;for(r=[],e=0;0<=t?et;e=0<=t?++e:--e)r[e]=String.fromCharCode(this.readByte());return r.join(\"\")},t.prototype.writeString=function(t){var e,r,n;for(n=[],e=0,r=t.length;0<=r?er;e=0<=r?++e:--e)n.push(this.writeByte(t.charCodeAt(e)));return n},t.prototype.readShort=function(){return this.readInt16()},t.prototype.writeShort=function(t){return this.writeInt16(t)},t.prototype.readLongLong=function(){var t,e,r,n,i,a,o,s;return t=this.readByte(),e=this.readByte(),r=this.readByte(),n=this.readByte(),i=this.readByte(),a=this.readByte(),o=this.readByte(),s=this.readByte(),128&t?-1*(72057594037927940*(255^t)+281474976710656*(255^e)+1099511627776*(255^r)+4294967296*(255^n)+16777216*(255^i)+65536*(255^a)+256*(255^o)+(255^s)+1):72057594037927940*t+281474976710656*e+1099511627776*r+4294967296*n+16777216*i+65536*a+256*o+s},t.prototype.writeLongLong=function(t){var e,r;return e=Math.floor(t/4294967296),r=4294967295&t,this.writeByte(e>>24&255),this.writeByte(e>>16&255),this.writeByte(e>>8&255),this.writeByte(255&e),this.writeByte(r>>24&255),this.writeByte(r>>16&255),this.writeByte(r>>8&255),this.writeByte(255&r)},t.prototype.readInt=function(){return this.readInt32()},t.prototype.writeInt=function(t){return this.writeInt32(t)},t.prototype.read=function(t){var e,r;for(e=[],r=0;0<=t?rt;r=0<=t?++r:--r)e.push(this.readByte());return e},t.prototype.write=function(t){var e,r,n,i;for(i=[],r=0,n=t.length;rn;r=0<=n?++r:--r)e={tag:t.readString(4),checksum:t.readInt(),offset:t.readInt(),length:t.readInt()},this.tables[e.tag]=e}return e.prototype.encode=function(e){var r,n,i,a,o,s,u,c,l,h,f,d,p;for(p in f=Object.keys(e).length,s=Math.log(2),l=16*Math.floor(Math.log(f)/s),a=Math.floor(l/s),c=16*f-l,(n=new fe).writeInt(this.scalarType),n.writeShort(f),n.writeShort(l),n.writeShort(a),n.writeShort(c),i=16*f,u=n.pos+i,o=null,d=[],e)for(h=e[p],n.writeString(p),n.writeInt(t(h)),n.writeInt(u),n.writeInt(h.length),d=d.concat(h),\"head\"===p&&(o=u),u+=h.length;u%4;)d.push(0),u++;return n.write(d),r=2981146554-t(n.data),n.pos=o+8,n.writeUInt32(r),n.data},t=function(t){var e,r,n,i;for(t=_e.call(t);t.length%4;)t.push(0);for(n=new fe(t),r=0,e=0,i=t.length;eh;s=0<=h?++e:--e)r.push(t.readUInt16());return r}(),t.pos+=2,p=function(){var e,r;for(r=[],s=e=0;0<=h?eh;s=0<=h?++e:--e)r.push(t.readUInt16());return r}(),u=function(){var e,r;for(r=[],s=e=0;0<=h?eh;s=0<=h?++e:--e)r.push(t.readUInt16());return r}(),c=function(){var e,r;for(r=[],s=e=0;0<=h?eh;s=0<=h?++e:--e)r.push(t.readUInt16());return r}(),n=(this.length-t.pos+this.offset)/2,o=function(){var e,r;for(r=[],s=e=0;0<=n?en;s=0<=n?++e:--e)r.push(t.readUInt16());return r}(),s=m=0,b=i.length;m=g;r=d<=g?++v:--v)0===c[s]?a=r+u[s]:0!==(a=o[c[s]/2+(r-d)-(h-s)]||0)&&(a+=u[s]),this.codeMap[r]=65535&a}t.pos=l}return t.encode=function(t,e){var r,n,i,a,o,s,u,c,l,h,f,d,p,g,m,v,b,y,w,N,L,x,A,S,_,P,k,F,I,C,j,O,B,M,q,E,R,D,T,z,U,H,W,V,G,Y;switch(F=new fe,a=Object.keys(t).sort(function(t,e){return t-e}),e){case\"macroman\":for(p=0,g=function(){var t=[];for(d=0;d<256;++d)t.push(0);return t}(),v={0:0},i={},I=0,B=a.length;I=32768)for(s.push(0),N.push(2*(f.length+A-d)),n=O=_;_<=c?O<=c:O>=c;n=_<=c?++O:--O)f.push(r[n].new);else s.push(k-_),N.push(0)}for(F.writeUInt16(3),F.writeUInt16(1),F.writeUInt32(12),F.writeUInt16(4),F.writeUInt16(16+8*A+2*f.length),F.writeUInt16(0),F.writeUInt16(S),F.writeUInt16(x),F.writeUInt16(h),F.writeUInt16(L),U=0,E=l.length;Un;r=0<=n?++r:--r)e=new ve(t,this.offset),this.tables.push(e),e.isUnicode&&null==this.unicode&&(this.unicode=e);return!0},t.encode=function(t,e){var r,n;return null==e&&(e=\"macroman\"),r=ve.encode(t,e),(n=new fe).writeUInt16(0),n.writeUInt16(1),r.table=n.data.concat(r.subtable),r},t}(),ye=function(){function t(){return t.__super__.constructor.apply(this,arguments)}return ge(t,he),t.prototype.tag=\"hhea\",t.prototype.parse=function(t){return t.pos=this.offset,this.version=t.readInt(),this.ascender=t.readShort(),this.decender=t.readShort(),this.lineGap=t.readShort(),this.advanceWidthMax=t.readShort(),this.minLeftSideBearing=t.readShort(),this.minRightSideBearing=t.readShort(),this.xMaxExtent=t.readShort(),this.caretSlopeRise=t.readShort(),this.caretSlopeRun=t.readShort(),this.caretOffset=t.readShort(),t.pos+=8,this.metricDataFormat=t.readShort(),this.numberOfMetrics=t.readUInt16()},t}(),we=function(){function t(){return t.__super__.constructor.apply(this,arguments)}return ge(t,he),t.prototype.tag=\"OS/2\",t.prototype.parse=function(t){if(t.pos=this.offset,this.version=t.readUInt16(),this.averageCharWidth=t.readShort(),this.weightClass=t.readUInt16(),this.widthClass=t.readUInt16(),this.type=t.readShort(),this.ySubscriptXSize=t.readShort(),this.ySubscriptYSize=t.readShort(),this.ySubscriptXOffset=t.readShort(),this.ySubscriptYOffset=t.readShort(),this.ySuperscriptXSize=t.readShort(),this.ySuperscriptYSize=t.readShort(),this.ySuperscriptXOffset=t.readShort(),this.ySuperscriptYOffset=t.readShort(),this.yStrikeoutSize=t.readShort(),this.yStrikeoutPosition=t.readShort(),this.familyClass=t.readShort(),this.panose=function(){var e,r;for(r=[],e=0;e<10;++e)r.push(t.readByte());return r}(),this.charRange=function(){var e,r;for(r=[],e=0;e<4;++e)r.push(t.readInt());return r}(),this.vendorID=t.readString(4),this.selection=t.readShort(),this.firstCharIndex=t.readShort(),this.lastCharIndex=t.readShort(),this.version>0&&(this.ascent=t.readShort(),this.descent=t.readShort(),this.lineGap=t.readShort(),this.winAscent=t.readShort(),this.winDescent=t.readShort(),this.codePageRange=function(){var e,r;for(r=[],e=0;e<2;e=++e)r.push(t.readInt());return r}(),this.version>1))return this.xHeight=t.readShort(),this.capHeight=t.readShort(),this.defaultChar=t.readShort(),this.breakChar=t.readShort(),this.maxContext=t.readShort()},t}(),Ne=function(){function t(){return t.__super__.constructor.apply(this,arguments)}return ge(t,he),t.prototype.tag=\"post\",t.prototype.parse=function(t){var e,r,n;switch(t.pos=this.offset,this.format=t.readInt(),this.italicAngle=t.readInt(),this.underlinePosition=t.readShort(),this.underlineThickness=t.readShort(),this.isFixedPitch=t.readInt(),this.minMemType42=t.readInt(),this.maxMemType42=t.readInt(),this.minMemType1=t.readInt(),this.maxMemType1=t.readInt(),this.format){case 65536:case 196608:break;case 131072:var i;for(r=t.readUInt16(),this.glyphNameIndex=[],i=0;0<=r?ir;i=0<=r?++i:--i)this.glyphNameIndex.push(t.readUInt16());for(this.names=[],n=[];t.posr;i=0<=r?++e:--e)n.push(t.readUInt32());return n}.call(this)}},t}(),Le=function(t,e){this.raw=t,this.length=t.length,this.platformID=e.platformID,this.encodingID=e.encodingID,this.languageID=e.languageID},xe=function(){function t(){return t.__super__.constructor.apply(this,arguments)}return ge(t,he),t.prototype.tag=\"name\",t.prototype.parse=function(t){var e,r,n,i,a,o,s,u,c,l,h;for(t.pos=this.offset,t.readShort(),e=t.readShort(),o=t.readShort(),r=[],i=0;0<=e?ie;i=0<=e?++i:--i)r.push({platformID:t.readShort(),encodingID:t.readShort(),languageID:t.readShort(),nameID:t.readShort(),length:t.readShort(),offset:this.offset+o+t.readShort()});for(s={},i=c=0,l=r.length;co;e=0<=o?++e:--e)this.metrics.push({advance:t.readUInt16(),lsb:t.readInt16()});for(n=this.file.maxp.numGlyphs-this.file.hhea.numberOfMetrics,this.leftSideBearings=function(){var r,i;for(i=[],e=r=0;0<=n?rn;e=0<=n?++r:--r)i.push(t.readInt16());return i}(),this.widths=function(){var t,e,r,n;for(n=[],t=0,e=(r=this.metrics).length;tn;e=0<=n?++a:--a)s.push(this.widths.push(r));return s},t.prototype.forGlyph=function(t){return t in this.metrics?this.metrics[t]:{advance:this.metrics[this.metrics.length-1].advance,lsb:this.leftSideBearings[t-this.metrics.length]}},t}(),_e=[].slice,Pe=function(){function t(){return t.__super__.constructor.apply(this,arguments)}return ge(t,he),t.prototype.tag=\"glyf\",t.prototype.parse=function(){return this.cache={}},t.prototype.glyphFor=function(t){var e,r,n,i,a,o,s,u,c,l;return t in this.cache?this.cache[t]:(i=this.file.loca,e=this.file.contents,r=i.indexOf(t),0===(n=i.lengthOf(t))?this.cache[t]=null:(e.pos=this.offset+r,a=(o=new fe(e.read(n))).readShort(),u=o.readShort(),l=o.readShort(),s=o.readShort(),c=o.readShort(),this.cache[t]=-1===a?new Fe(o,u,l,s,c):new ke(o,a,u,l,s,c),this.cache[t]))},t.prototype.encode=function(t,e,r){var n,i,a,o,s;for(a=[],i=[],o=0,s=e.length;o0&&(n+=s)}for(var u=new Array(4*r.length),c=0;c>8,u[4*c+1]=(16711680&r[c])>>16,u[4*c]=(4278190080&r[c])>>24;return u},t}(),Ce=function(){function t(t){this.font=t,this.subset={},this.unicodes={},this.next=33}return t.prototype.generateCmap=function(){var t,e,r,n,i;for(e in n=this.font.cmap.tables[0].codeMap,t={},i=this.subset)r=i[e],t[e]=n[r];return t},t.prototype.glyphsFor=function(t){var e,r,n,i,a,o,s;for(n={},a=0,o=t.length;a0)for(i in s=this.glyphsFor(e))r=s[i],n[i]=r;return n},t.prototype.encode=function(t,e){var r,n,i,a,o,s,u,c,l,h,f,d,p,g,m;for(n in r=be.encode(this.generateCmap(),\"unicode\"),a=this.glyphsFor(t),f={0:0},m=r.charMap)f[(s=m[n]).old]=s.new;for(d in h=r.maxGlyphID,a)d in f||(f[d]=h++);return c=function(t){var e,r;for(e in r={},t)r[t[e]]=e;return r}(f),l=Object.keys(c).sort(function(t,e){return t-e}),p=function(){var t,e,r;for(r=[],t=0,e=l.length;t>\"),a.join(\"\\n\")}return\"\"+r},e}();\n//# sourceMappingURL=jspdf.es.min.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qc3BkZi9kaXN0L2pzcGRmLmVzLm1pbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFcUssaUJBQWlCLDREQUE0RCxxQkFBTSxDQUFDLHFCQUFNLG9DQUFvQyxHQUFHLGFBQWEsc0ZBQXNGLE9BQU8sdUJBQXVCLGdIQUFnSCxtQkFBbUIsa0dBQWtHLGtCQUFrQix5QkFBeUIsMERBQTBELGtCQUFrQixzQkFBc0IsbUNBQW1DLFVBQVUsY0FBYyx5QkFBeUIsb0JBQW9CLElBQUksU0FBUyxVQUFVLG9DQUFvQyxjQUFjLElBQUkseUNBQXlDLFNBQVMsMENBQTBDLDBGQUEwRixvRUFBb0UseUVBQUMsa0NBQWtDLGlHQUFpRyx1REFBdUQsaU5BQWlOLDBCQUEwQiw0QkFBNEIsS0FBSyxLQUFLLGdEQUFnRCwrREFBK0QsS0FBSyxrQ0FBa0MsaURBQWlELEtBQUssRUFBRSw4Q0FBOEMscUJBQXFCLFdBQVcsWUFBWSx5RUFBQyxzRUFBc0UsV0FBVyxrRUFBa0UsOEVBQThFLFlBQVksSUFBSSxTQUFTLG1CQUFtQiw4SEFBOEgsb0lBQW9JLHFFQUFxRSx5RUFBQyxlQUFlLHFCQUFxQix1QkFBdUIsZUFBZSwwQkFBMEIsR0FBRyx3QkFBd0IseUNBQXlDLG9CQUFvQixLQUFLLGdEQUFnRCw0REFBNEQscUJBQXFCLE9BQU87QUFDMzFGO0FBQ0E7QUFD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LFFBQVEsaUlBQWlJLHNGQUFzRiw2REFBNkQscUNBQXFDLFVBQVUsZ0VBQWdFLElBQUksK0JBQStCLGNBQWMsR0FBRyxpQkFBaUIsYUFBYSxxREFBcUQscUVBQXFFLFFBQVEseUZBQXlGLFFBQVEsMkJBQTJCLElBQUksOEJBQThCLFNBQVMsdUJBQXVCLFFBQVEsMkJBQTJCLElBQUksNEJBQTRCLFNBQVMsWUFBWSxpQ0FBaUMsdUJBQXVCLGtDQUFrQyx5Q0FBeUMsa0NBQWtDLDJEQUEyRCxXQUFXLG1DQUFtQyxXQUFXLDRDQUE0QyxZQUFZLG9DQUFvQyxXQUFXLHlHQUF5RyxTQUFTLEdBQUcsaUJBQWlCLGNBQWMsMEJBQTBCLGlCQUFpQixjQUFjLDJDQUEyQyxjQUFjLGdEQUFnRCxnQ0FBZ0MsU0FBUyxtQ0FBbUMsa0JBQWtCLFFBQVEsZ0JBQWdCLElBQUkseUNBQXlDLCtFQUErRSx5REFBeUQsU0FBUyxrQ0FBa0Msa0NBQWtDLDJFQUEyRSxJQUFJLG1DQUFtQyw2Q0FBNkMscUJBQXFCLFFBQVEsYUFBYSxhQUFhLFNBQVMsd0NBQXdDLFdBQVcsZUFBZSxVQUFVLHdCQUF3QixJQUFJLHdCQUF3QixTQUFTLDBFQUEwRSw4TUFBOE0scUZBQXFGLEdBQUcsR0FBRywyQkFBMkIsTUFBTSxjQUFjLHVCQUF1Qix5Q0FBeUMsdUJBQXVCLFlBQVkseUNBQXlDLFVBQVUsd0JBQXdCLElBQUksZ0NBQWdDLFNBQVMsaUJBQWlCLGtDQUFrQyw2Q0FBNkMsMEtBQTBLLHlCQUF5QixtQkFBbUIsMERBQTBELGlDQUFpQyxXQUFXLEdBQUcsR0FBOFc7QUFDdHpsQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvanNwZGYvZGlzdC9qc3BkZi5lcy5taW4uanM/YjFmNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2VcbiAqXG4gKiBqc1BERiAtIFBERiBEb2N1bWVudCBjcmVhdGlvbiBmcm9tIEphdmFTY3JpcHRcbiAqIFZlcnNpb24gNC4yLjEgQnVpbHQgb24gMjAyNi0wMy0xN1QxMToxMToyNy4wNTdaXG4gKiAgICAgICAgICAgICAgICAgICAgICBDb21taXRJRCAwMDAwMDAwMFxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDI1IEphbWVzIEhhbGwgPGphbWVzQHBhcmFsbC5heD4sIGh0dHBzOi8vZ2l0aHViLmNvbS9NclJpby9qc1BERlxuICogICAgICAgICAgICAgICAyMDE1LTIwMjUgeVdvcmtzIEdtYkgsIGh0dHA6Ly93d3cueXdvcmtzLmNvbVxuICogICAgICAgICAgICAgICAyMDE1LTIwMjUgTHVrYXMgSG9sbMOkbmRlciA8bHVrYXMuaG9sbGFlbmRlckB5d29ya3MuY29tPiwgaHR0cHM6Ly9naXRodWIuY29tL0hhY2ticmV0dFhYWFxuICogICAgICAgICAgICAgICAyMDE2LTIwMTggQXJhcyBBYmJhc2kgPGFyYXMuYWJiYXNpQGdtYWlsLmNvbT5cbiAqICAgICAgICAgICAgICAgMjAxMCBBYXJvbiBTcGlrZSwgaHR0cHM6Ly9naXRodWIuY29tL2Fjc3Bpa2VcbiAqICAgICAgICAgICAgICAgMjAxMiBXaWxsb3cgU3lzdGVtcyBDb3Jwb3JhdGlvbiwgaHR0cHM6Ly9naXRodWIuY29tL3dpbGxvd3N5c3RlbXNcbiAqICAgICAgICAgICAgICAgMjAxMiBQYWJsbyBIZXNzLCBodHRwczovL2dpdGh1Yi5jb20vcGFibG9oZXNzXG4gKiAgICAgICAgICAgICAgIDIwMTIgRmxvcmlhbiBKZW5ldHQsIGh0dHBzOi8vZ2l0aHViLmNvbS9mamVuZXR0XG4gKiAgICAgICAgICAgICAgIDIwMTMgV2FycmVuIFdlY2tlc3NlciwgaHR0cHM6Ly9naXRodWIuY29tL3dhcnJlbndlY2tlc3NlclxuICogICAgICAgICAgICAgICAyMDEzIFlvdXNzZWYgQmVkZGFkLCBodHRwczovL2dpdGh1Yi5jb20vbGlmb2ZcbiAqICAgICAgICAgICAgICAgMjAxMyBMZWUgRHJpc2NvbGwsIGh0dHBzOi8vZ2l0aHViLmNvbS9sc2RyaXNjb2xsXG4gKiAgICAgICAgICAgICAgIDIwMTMgU3RlZmFuIFNsb25ldnNraXksIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVmc2xvblxuICogICAgICAgICAgICAgICAyMDEzIEplcmVteSBNb3JlbCwgaHR0cHM6Ly9naXRodWIuY29tL2ptb3JlbFxuICogICAgICAgICAgICAgICAyMDEzIENocmlzdG9waCBIYXJ0bWFubiwgaHR0cHM6Ly9naXRodWIuY29tL2NocmlzLXJvY2tcbiAqICAgICAgICAgICAgICAgMjAxNCBKdWFuIFBhYmxvIEdhdmlyaWEsIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWFucGdhdmlyaWFcbiAqICAgICAgICAgICAgICAgMjAxNCBKYW1lcyBNYWtlcywgaHR0cHM6Ly9naXRodWIuY29tL2RvbGxhcnV3XG4gKiAgICAgICAgICAgICAgIDIwMTQgRGllZ28gQ2Fzb3JyYW4sIGh0dHBzOi8vZ2l0aHViLmNvbS9kaWVnb2NyXG4gKiAgICAgICAgICAgICAgIDIwMTQgU3RldmVuIFNwdW5naW4sIGh0dHBzOi8vZ2l0aHViLmNvbS9GbGFtZW5jb1xuICogICAgICAgICAgICAgICAyMDE0IEtlbm5ldGggR2xhc3NleSwgaHR0cHM6Ly9naXRodWIuY29tL0dhdnZlcnNcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbiAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuICogXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xuICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4gKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4gKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKiBDb250cmlidXRvcihzKTpcbiAqICAgIHNpZWZrZW5qLCBhaHdvbGYsIHJpY2t5Z3UsIE1pZG5pdGgsIHNhaW50Y2xhaXIsIGVhcGFyYW5nbyxcbiAqICAgIGtpbTNlciwgbWZvLCBhbG5vcnRoLCBGbGFtZW5jb1xuICovXG5cbmltcG9ydCB0IGZyb21cIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCI7aW1wb3J0e3psaWJTeW5jIGFzIGV9ZnJvbVwiZmZsYXRlXCI7aW1wb3J0IHIgZnJvbVwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7aW1wb3J0e2RlY29kZSBhcyBufWZyb21cImZhc3QtcG5nXCI7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzpcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXN9KCk7ZnVuY3Rpb24gYSgpe2kuY29uc29sZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgaS5jb25zb2xlLmxvZyYmaS5jb25zb2xlLmxvZy5hcHBseShpLmNvbnNvbGUsYXJndW1lbnRzKX12YXIgbz17bG9nOmEsd2FybjpmdW5jdGlvbih0KXtpLmNvbnNvbGUmJihcImZ1bmN0aW9uXCI9PXR5cGVvZiBpLmNvbnNvbGUud2Fybj9pLmNvbnNvbGUud2Fybi5hcHBseShpLmNvbnNvbGUsYXJndW1lbnRzKTphLmNhbGwobnVsbCxhcmd1bWVudHMpKX0sZXJyb3I6ZnVuY3Rpb24odCl7aS5jb25zb2xlJiYoXCJmdW5jdGlvblwiPT10eXBlb2YgaS5jb25zb2xlLmVycm9yP2kuY29uc29sZS5lcnJvci5hcHBseShpLmNvbnNvbGUsYXJndW1lbnRzKTphKHQpKX19O2Z1bmN0aW9uIHModCxlLHIpe3ZhciBuPW5ldyBYTUxIdHRwUmVxdWVzdDtuLm9wZW4oXCJHRVRcIix0KSxuLnJlc3BvbnNlVHlwZT1cImJsb2JcIixuLm9ubG9hZD1mdW5jdGlvbigpe2wobi5yZXNwb25zZSxlLHIpfSxuLm9uZXJyb3I9ZnVuY3Rpb24oKXtvLmVycm9yKFwiY291bGQgbm90IGRvd25sb2FkIGZpbGVcIil9LG4uc2VuZCgpfWZ1bmN0aW9uIHUodCl7dmFyIGU9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub3BlbihcIkhFQURcIix0LCExKTt0cnl7ZS5zZW5kKCl9Y2F0Y2gocil7fXJldHVybiBlLnN0YXR1cz49MjAwJiZlLnN0YXR1czw9Mjk5fWZ1bmN0aW9uIGModCl7dHJ5e3QuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudChcImNsaWNrXCIpKX1jYXRjaChyKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRzXCIpO2UuaW5pdE1vdXNlRXZlbnQoXCJjbGlja1wiLCEwLCEwLHdpbmRvdywwLDAsMCw4MCwyMCwhMSwhMSwhMSwhMSwwLG51bGwpLHQuZGlzcGF0Y2hFdmVudChlKX19dmFyIGw9aS5zYXZlQXN8fChcIm9iamVjdFwiIT09KFwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3c/XCJ1bmRlZmluZWRcIjp0KHdpbmRvdykpfHx3aW5kb3chPT1pP2Z1bmN0aW9uKCl7fTpcInVuZGVmaW5lZFwiIT10eXBlb2YgSFRNTEFuY2hvckVsZW1lbnQmJlwiZG93bmxvYWRcImluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZT9mdW5jdGlvbih0LGUscil7dmFyIG49aS5VUkx8fGkud2Via2l0VVJMLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7ZT1lfHx0Lm5hbWV8fFwiZG93bmxvYWRcIixhLmRvd25sb2FkPWUsYS5yZWw9XCJub29wZW5lclwiLFwic3RyaW5nXCI9PXR5cGVvZiB0PyhhLmhyZWY9dCxhLm9yaWdpbiE9PWxvY2F0aW9uLm9yaWdpbj91KGEuaHJlZik/cyh0LGUscik6YyhhLGEudGFyZ2V0PVwiX2JsYW5rXCIpOmMoYSkpOihhLmhyZWY9bi5jcmVhdGVPYmplY3RVUkwodCksc2V0VGltZW91dChmdW5jdGlvbigpe24ucmV2b2tlT2JqZWN0VVJMKGEuaHJlZil9LDRlNCksc2V0VGltZW91dChmdW5jdGlvbigpe2MoYSl9LDApKX06XCJtc1NhdmVPck9wZW5CbG9iXCJpbiBuYXZpZ2F0b3I/ZnVuY3Rpb24oZSxyLG4pe2lmKHI9cnx8ZS5uYW1lfHxcImRvd25sb2FkXCIsXCJzdHJpbmdcIj09dHlwZW9mIGUpaWYodShlKSlzKGUscixuKTtlbHNle3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO2kuaHJlZj1lLGkudGFyZ2V0PVwiX2JsYW5rXCIsc2V0VGltZW91dChmdW5jdGlvbigpe2MoaSl9KX1lbHNlIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGZ1bmN0aW9uKGUscil7cmV0dXJuIHZvaWQgMD09PXI/cj17YXV0b0JvbTohMX06XCJvYmplY3RcIiE9PXQocikmJihvLndhcm4oXCJEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdFwiKSxyPXthdXRvQm9tOiFyfSksci5hdXRvQm9tJiYvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChlLnR5cGUpP25ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1Mjc5KSxlXSx7dHlwZTplLnR5cGV9KTplfShlLG4pLHIpfTpmdW5jdGlvbihlLHIsbixhKXtpZigoYT1hfHxvcGVuKFwiXCIsXCJfYmxhbmtcIikpJiYoYS5kb2N1bWVudC50aXRsZT1hLmRvY3VtZW50LmJvZHkuaW5uZXJUZXh0PVwiZG93bmxvYWRpbmcuLi5cIiksXCJzdHJpbmdcIj09dHlwZW9mIGUpcmV0dXJuIHMoZSxyLG4pO3ZhciBvPVwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCI9PT1lLnR5cGUsdT0vY29uc3RydWN0b3IvaS50ZXN0KGkuSFRNTEVsZW1lbnQpfHxpLnNhZmFyaSxjPS9DcmlPU1xcL1tcXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigoY3x8byYmdSkmJlwib2JqZWN0XCI9PT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIEZpbGVSZWFkZXI/XCJ1bmRlZmluZWRcIjp0KEZpbGVSZWFkZXIpKSl7dmFyIGw9bmV3IEZpbGVSZWFkZXI7bC5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgdD1sLnJlc3VsdDt0PWM/dDp0LnJlcGxhY2UoL15kYXRhOlteO10qOy8sXCJkYXRhOmF0dGFjaG1lbnQvZmlsZTtcIiksYT9hLmxvY2F0aW9uLmhyZWY9dDpsb2NhdGlvbj10LGE9bnVsbH0sbC5yZWFkQXNEYXRhVVJMKGUpfWVsc2V7dmFyIGg9aS5VUkx8fGkud2Via2l0VVJMLGY9aC5jcmVhdGVPYmplY3RVUkwoZSk7YT9hLmxvY2F0aW9uPWY6bG9jYXRpb24uaHJlZj1mLGE9bnVsbCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5yZXZva2VPYmplY3RVUkwoZil9LDRlNCl9fSk7XG4vKipcbiAqIEEgY2xhc3MgdG8gcGFyc2UgY29sb3IgdmFsdWVzXG4gKiBAYXV0aG9yIFN0b3lhbiBTdGVmYW5vdiA8c3N0b29AZ21haWwuY29tPlxuICoge0BsaW5rICAgaHR0cDovL3d3dy5waHBpZWQuY29tL3JnYi1jb2xvci1wYXJzZXItaW4tamF2YXNjcmlwdC99XG4gKiBAbGljZW5zZSBVc2UgaXQgaWYgeW91IGxpa2UgaXRcbiAqL2Z1bmN0aW9uIGgodCl7dmFyIGU7dD10fHxcIlwiLHRoaXMub2s9ITEsXCIjXCI9PXQuY2hhckF0KDApJiYodD10LnN1YnN0cigxLDYpKSx0PXthbGljZWJsdWU6XCJmMGY4ZmZcIixhbnRpcXVld2hpdGU6XCJmYWViZDdcIixhcXVhOlwiMDBmZmZmXCIsYXF1YW1hcmluZTpcIjdmZmZkNFwiLGF6dXJlOlwiZjBmZmZmXCIsYmVpZ2U6XCJmNWY1ZGNcIixiaXNxdWU6XCJmZmU0YzRcIixibGFjazpcIjAwMDAwMFwiLGJsYW5jaGVkYWxtb25kOlwiZmZlYmNkXCIsYmx1ZTpcIjAwMDBmZlwiLGJsdWV2aW9sZXQ6XCI4YTJiZTJcIixicm93bjpcImE1MmEyYVwiLGJ1cmx5d29vZDpcImRlYjg4N1wiLGNhZGV0Ymx1ZTpcIjVmOWVhMFwiLGNoYXJ0cmV1c2U6XCI3ZmZmMDBcIixjaG9jb2xhdGU6XCJkMjY5MWVcIixjb3JhbDpcImZmN2Y1MFwiLGNvcm5mbG93ZXJibHVlOlwiNjQ5NWVkXCIsY29ybnNpbGs6XCJmZmY4ZGNcIixjcmltc29uOlwiZGMxNDNjXCIsY3lhbjpcIjAwZmZmZlwiLGRhcmtibHVlOlwiMDAwMDhiXCIsZGFya2N5YW46XCIwMDhiOGJcIixkYXJrZ29sZGVucm9kOlwiYjg4NjBiXCIsZGFya2dyYXk6XCJhOWE5YTlcIixkYXJrZ3JlZW46XCIwMDY0MDBcIixkYXJra2hha2k6XCJiZGI3NmJcIixkYXJrbWFnZW50YTpcIjhiMDA4YlwiLGRhcmtvbGl2ZWdyZWVuOlwiNTU2YjJmXCIsZGFya29yYW5nZTpcImZmOGMwMFwiLGRhcmtvcmNoaWQ6XCI5OTMyY2NcIixkYXJrcmVkOlwiOGIwMDAwXCIsZGFya3NhbG1vbjpcImU5OTY3YVwiLGRhcmtzZWFncmVlbjpcIjhmYmM4ZlwiLGRhcmtzbGF0ZWJsdWU6XCI0ODNkOGJcIixkYXJrc2xhdGVncmF5OlwiMmY0ZjRmXCIsZGFya3R1cnF1b2lzZTpcIjAwY2VkMVwiLGRhcmt2aW9sZXQ6XCI5NDAwZDNcIixkZWVwcGluazpcImZmMTQ5M1wiLGRlZXBza3libHVlOlwiMDBiZmZmXCIsZGltZ3JheTpcIjY5Njk2OVwiLGRvZGdlcmJsdWU6XCIxZTkwZmZcIixmZWxkc3BhcjpcImQxOTI3NVwiLGZpcmVicmljazpcImIyMjIyMlwiLGZsb3JhbHdoaXRlOlwiZmZmYWYwXCIsZm9yZXN0Z3JlZW46XCIyMjhiMjJcIixmdWNoc2lhOlwiZmYwMGZmXCIsZ2FpbnNib3JvOlwiZGNkY2RjXCIsZ2hvc3R3aGl0ZTpcImY4ZjhmZlwiLGdvbGQ6XCJmZmQ3MDBcIixnb2xkZW5yb2Q6XCJkYWE1MjBcIixncmF5OlwiODA4MDgwXCIsZ3JlZW46XCIwMDgwMDBcIixncmVlbnllbGxvdzpcImFkZmYyZlwiLGhvbmV5ZGV3OlwiZjBmZmYwXCIsaG90cGluazpcImZmNjliNFwiLGluZGlhbnJlZDpcImNkNWM1Y1wiLGluZGlnbzpcIjRiMDA4MlwiLGl2b3J5OlwiZmZmZmYwXCIsa2hha2k6XCJmMGU2OGNcIixsYXZlbmRlcjpcImU2ZTZmYVwiLGxhdmVuZGVyYmx1c2g6XCJmZmYwZjVcIixsYXduZ3JlZW46XCI3Y2ZjMDBcIixsZW1vbmNoaWZmb246XCJmZmZhY2RcIixsaWdodGJsdWU6XCJhZGQ4ZTZcIixsaWdodGNvcmFsOlwiZjA4MDgwXCIsbGlnaHRjeWFuOlwiZTBmZmZmXCIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6XCJmYWZhZDJcIixsaWdodGdyZXk6XCJkM2QzZDNcIixsaWdodGdyZWVuOlwiOTBlZTkwXCIsbGlnaHRwaW5rOlwiZmZiNmMxXCIsbGlnaHRzYWxtb246XCJmZmEwN2FcIixsaWdodHNlYWdyZWVuOlwiMjBiMmFhXCIsbGlnaHRza3libHVlOlwiODdjZWZhXCIsbGlnaHRzbGF0ZWJsdWU6XCI4NDcwZmZcIixsaWdodHNsYXRlZ3JheTpcIjc3ODg5OVwiLGxpZ2h0c3RlZWxibHVlOlwiYjBjNGRlXCIsbGlnaHR5ZWxsb3c6XCJmZmZmZTBcIixsaW1lOlwiMDBmZjAwXCIsbGltZWdyZWVuOlwiMzJjZDMyXCIsbGluZW46XCJmYWYwZTZcIixtYWdlbnRhOlwiZmYwMGZmXCIsbWFyb29uOlwiODAwMDAwXCIsbWVkaXVtYXF1YW1hcmluZTpcIjY2Y2RhYVwiLG1lZGl1bWJsdWU6XCIwMDAwY2RcIixtZWRpdW1vcmNoaWQ6XCJiYTU1ZDNcIixtZWRpdW1wdXJwbGU6XCI5MzcwZDhcIixtZWRpdW1zZWFncmVlbjpcIjNjYjM3MVwiLG1lZGl1bXNsYXRlYmx1ZTpcIjdiNjhlZVwiLG1lZGl1bXNwcmluZ2dyZWVuOlwiMDBmYTlhXCIsbWVkaXVtdHVycXVvaXNlOlwiNDhkMWNjXCIsbWVkaXVtdmlvbGV0cmVkOlwiYzcxNTg1XCIsbWlkbmlnaHRibHVlOlwiMTkxOTcwXCIsbWludGNyZWFtOlwiZjVmZmZhXCIsbWlzdHlyb3NlOlwiZmZlNGUxXCIsbW9jY2FzaW46XCJmZmU0YjVcIixuYXZham93aGl0ZTpcImZmZGVhZFwiLG5hdnk6XCIwMDAwODBcIixvbGRsYWNlOlwiZmRmNWU2XCIsb2xpdmU6XCI4MDgwMDBcIixvbGl2ZWRyYWI6XCI2YjhlMjNcIixvcmFuZ2U6XCJmZmE1MDBcIixvcmFuZ2VyZWQ6XCJmZjQ1MDBcIixvcmNoaWQ6XCJkYTcwZDZcIixwYWxlZ29sZGVucm9kOlwiZWVlOGFhXCIscGFsZWdyZWVuOlwiOThmYjk4XCIscGFsZXR1cnF1b2lzZTpcImFmZWVlZVwiLHBhbGV2aW9sZXRyZWQ6XCJkODcwOTNcIixwYXBheWF3aGlwOlwiZmZlZmQ1XCIscGVhY2hwdWZmOlwiZmZkYWI5XCIscGVydTpcImNkODUzZlwiLHBpbms6XCJmZmMwY2JcIixwbHVtOlwiZGRhMGRkXCIscG93ZGVyYmx1ZTpcImIwZTBlNlwiLHB1cnBsZTpcIjgwMDA4MFwiLHJlZDpcImZmMDAwMFwiLHJvc3licm93bjpcImJjOGY4ZlwiLHJveWFsYmx1ZTpcIjQxNjllMVwiLHNhZGRsZWJyb3duOlwiOGI0NTEzXCIsc2FsbW9uOlwiZmE4MDcyXCIsc2FuZHlicm93bjpcImY0YTQ2MFwiLHNlYWdyZWVuOlwiMmU4YjU3XCIsc2Vhc2hlbGw6XCJmZmY1ZWVcIixzaWVubmE6XCJhMDUyMmRcIixzaWx2ZXI6XCJjMGMwYzBcIixza3libHVlOlwiODdjZWViXCIsc2xhdGVibHVlOlwiNmE1YWNkXCIsc2xhdGVncmF5OlwiNzA4MDkwXCIsc25vdzpcImZmZmFmYVwiLHNwcmluZ2dyZWVuOlwiMDBmZjdmXCIsc3RlZWxibHVlOlwiNDY4MmI0XCIsdGFuOlwiZDJiNDhjXCIsdGVhbDpcIjAwODA4MFwiLHRoaXN0bGU6XCJkOGJmZDhcIix0b21hdG86XCJmZjYzNDdcIix0dXJxdW9pc2U6XCI0MGUwZDBcIix2aW9sZXQ6XCJlZTgyZWVcIix2aW9sZXRyZWQ6XCJkMDIwOTBcIix3aGVhdDpcImY1ZGViM1wiLHdoaXRlOlwiZmZmZmZmXCIsd2hpdGVzbW9rZTpcImY1ZjVmNVwiLHllbGxvdzpcImZmZmYwMFwiLHllbGxvd2dyZWVuOlwiOWFjZDMyXCJ9W3Q9KHQ9dC5yZXBsYWNlKC8gL2csXCJcIikpLnRvTG93ZXJDYXNlKCldfHx0O2Zvcih2YXIgcj1be3JlOi9ecmdiXFwoKFxcZHsxLDN9KSxcXHMqKFxcZHsxLDN9KSxcXHMqKFxcZHsxLDN9KVxcKSQvLGV4YW1wbGU6W1wicmdiKDEyMywgMjM0LCA0NSlcIixcInJnYigyNTUsMjM0LDI0NSlcIl0scHJvY2VzczpmdW5jdGlvbih0KXtyZXR1cm5bcGFyc2VJbnQodFsxXSkscGFyc2VJbnQodFsyXSkscGFyc2VJbnQodFszXSldfX0se3JlOi9eKFxcd3syfSkoXFx3ezJ9KShcXHd7Mn0pJC8sZXhhbXBsZTpbXCIjMDBmZjAwXCIsXCIzMzY2OTlcIl0scHJvY2VzczpmdW5jdGlvbih0KXtyZXR1cm5bcGFyc2VJbnQodFsxXSwxNikscGFyc2VJbnQodFsyXSwxNikscGFyc2VJbnQodFszXSwxNildfX0se3JlOi9eKFxcd3sxfSkoXFx3ezF9KShcXHd7MX0pJC8sZXhhbXBsZTpbXCIjZmIwXCIsXCJmMGZcIl0scHJvY2VzczpmdW5jdGlvbih0KXtyZXR1cm5bcGFyc2VJbnQodFsxXSt0WzFdLDE2KSxwYXJzZUludCh0WzJdK3RbMl0sMTYpLHBhcnNlSW50KHRbM10rdFszXSwxNildfX1dLG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIGk9cltuXS5yZSxhPXJbbl0ucHJvY2VzcyxvPWkuZXhlYyh0KTtvJiYoZT1hKG8pLHRoaXMucj1lWzBdLHRoaXMuZz1lWzFdLHRoaXMuYj1lWzJdLHRoaXMub2s9ITApfXRoaXMucj10aGlzLnI8MHx8aXNOYU4odGhpcy5yKT8wOnRoaXMucj4yNTU/MjU1OnRoaXMucix0aGlzLmc9dGhpcy5nPDB8fGlzTmFOKHRoaXMuZyk/MDp0aGlzLmc+MjU1PzI1NTp0aGlzLmcsdGhpcy5iPXRoaXMuYjwwfHxpc05hTih0aGlzLmIpPzA6dGhpcy5iPjI1NT8yNTU6dGhpcy5iLHRoaXMudG9SR0I9ZnVuY3Rpb24oKXtyZXR1cm5cInJnYihcIit0aGlzLnIrXCIsIFwiK3RoaXMuZytcIiwgXCIrdGhpcy5iK1wiKVwifSx0aGlzLnRvSGV4PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yLnRvU3RyaW5nKDE2KSxlPXRoaXMuZy50b1N0cmluZygxNikscj10aGlzLmIudG9TdHJpbmcoMTYpO3JldHVybiAxPT10Lmxlbmd0aCYmKHQ9XCIwXCIrdCksMT09ZS5sZW5ndGgmJihlPVwiMFwiK2UpLDE9PXIubGVuZ3RoJiYocj1cIjBcIityKSxcIiNcIit0K2Urcn19dmFyIGY9aS5hdG9iLmJpbmQoaSksZD1pLmJ0b2EuYmluZChpKTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIEpvc2VwaCBNeWVycyBkb2VzIG5vdCBzcGVjaWZ5IGEgcGFydGljdWxhciBsaWNlbnNlIGZvciBoaXMgd29yay5cbiAqXG4gKiBBdXRob3I6IEpvc2VwaCBNeWVyc1xuICogQWNjZXNzZWQgZnJvbTogaHR0cDovL3d3dy5teWVyc2RhaWx5Lm9yZy9qb3NlcGgvamF2YXNjcmlwdC9tZDUuanNcbiAqXG4gKiBNb2RpZmllZCBieTogT3dlbiBMZW9uZ1xuICovXG5mdW5jdGlvbiBwKHQsZSl7dmFyIHI9dFswXSxuPXRbMV0saT10WzJdLGE9dFszXTtyPW0ocixuLGksYSxlWzBdLDcsLTY4MDg3NjkzNiksYT1tKGEscixuLGksZVsxXSwxMiwtMzg5NTY0NTg2KSxpPW0oaSxhLHIsbixlWzJdLDE3LDYwNjEwNTgxOSksbj1tKG4saSxhLHIsZVszXSwyMiwtMTA0NDUyNTMzMCkscj1tKHIsbixpLGEsZVs0XSw3LC0xNzY0MTg4OTcpLGE9bShhLHIsbixpLGVbNV0sMTIsMTIwMDA4MDQyNiksaT1tKGksYSxyLG4sZVs2XSwxNywtMTQ3MzIzMTM0MSksbj1tKG4saSxhLHIsZVs3XSwyMiwtNDU3MDU5ODMpLHI9bShyLG4saSxhLGVbOF0sNywxNzcwMDM1NDE2KSxhPW0oYSxyLG4saSxlWzldLDEyLC0xOTU4NDE0NDE3KSxpPW0oaSxhLHIsbixlWzEwXSwxNywtNDIwNjMpLG49bShuLGksYSxyLGVbMTFdLDIyLC0xOTkwNDA0MTYyKSxyPW0ocixuLGksYSxlWzEyXSw3LDE4MDQ2MDM2ODIpLGE9bShhLHIsbixpLGVbMTNdLDEyLC00MDM0MTEwMSksaT1tKGksYSxyLG4sZVsxNF0sMTcsLTE1MDIwMDIyOTApLHI9dihyLG49bShuLGksYSxyLGVbMTVdLDIyLDEyMzY1MzUzMjkpLGksYSxlWzFdLDUsLTE2NTc5NjUxMCksYT12KGEscixuLGksZVs2XSw5LC0xMDY5NTAxNjMyKSxpPXYoaSxhLHIsbixlWzExXSwxNCw2NDM3MTc3MTMpLG49dihuLGksYSxyLGVbMF0sMjAsLTM3Mzg5NzMwMikscj12KHIsbixpLGEsZVs1XSw1LC03MDE1NTg2OTEpLGE9dihhLHIsbixpLGVbMTBdLDksMzgwMTYwODMpLGk9dihpLGEscixuLGVbMTVdLDE0LC02NjA0NzgzMzUpLG49dihuLGksYSxyLGVbNF0sMjAsLTQwNTUzNzg0OCkscj12KHIsbixpLGEsZVs5XSw1LDU2ODQ0NjQzOCksYT12KGEscixuLGksZVsxNF0sOSwtMTAxOTgwMzY5MCksaT12KGksYSxyLG4sZVszXSwxNCwtMTg3MzYzOTYxKSxuPXYobixpLGEscixlWzhdLDIwLDExNjM1MzE1MDEpLHI9dihyLG4saSxhLGVbMTNdLDUsLTE0NDQ2ODE0NjcpLGE9dihhLHIsbixpLGVbMl0sOSwtNTE0MDM3ODQpLGk9dihpLGEscixuLGVbN10sMTQsMTczNTMyODQ3Mykscj1iKHIsbj12KG4saSxhLHIsZVsxMl0sMjAsLTE5MjY2MDc3MzQpLGksYSxlWzVdLDQsLTM3ODU1OCksYT1iKGEscixuLGksZVs4XSwxMSwtMjAyMjU3NDQ2MyksaT1iKGksYSxyLG4sZVsxMV0sMTYsMTgzOTAzMDU2Miksbj1iKG4saSxhLHIsZVsxNF0sMjMsLTM1MzA5NTU2KSxyPWIocixuLGksYSxlWzFdLDQsLTE1MzA5OTIwNjApLGE9YihhLHIsbixpLGVbNF0sMTEsMTI3Mjg5MzM1MyksaT1iKGksYSxyLG4sZVs3XSwxNiwtMTU1NDk3NjMyKSxuPWIobixpLGEscixlWzEwXSwyMywtMTA5NDczMDY0MCkscj1iKHIsbixpLGEsZVsxM10sNCw2ODEyNzkxNzQpLGE9YihhLHIsbixpLGVbMF0sMTEsLTM1ODUzNzIyMiksaT1iKGksYSxyLG4sZVszXSwxNiwtNzIyNTIxOTc5KSxuPWIobixpLGEscixlWzZdLDIzLDc2MDI5MTg5KSxyPWIocixuLGksYSxlWzldLDQsLTY0MDM2NDQ4NyksYT1iKGEscixuLGksZVsxMl0sMTEsLTQyMTgxNTgzNSksaT1iKGksYSxyLG4sZVsxNV0sMTYsNTMwNzQyNTIwKSxyPXkocixuPWIobixpLGEscixlWzJdLDIzLC05OTUzMzg2NTEpLGksYSxlWzBdLDYsLTE5ODYzMDg0NCksYT15KGEscixuLGksZVs3XSwxMCwxMTI2ODkxNDE1KSxpPXkoaSxhLHIsbixlWzE0XSwxNSwtMTQxNjM1NDkwNSksbj15KG4saSxhLHIsZVs1XSwyMSwtNTc0MzQwNTUpLHI9eShyLG4saSxhLGVbMTJdLDYsMTcwMDQ4NTU3MSksYT15KGEscixuLGksZVszXSwxMCwtMTg5NDk4NjYwNiksaT15KGksYSxyLG4sZVsxMF0sMTUsLTEwNTE1MjMpLG49eShuLGksYSxyLGVbMV0sMjEsLTIwNTQ5MjI3OTkpLHI9eShyLG4saSxhLGVbOF0sNiwxODczMzEzMzU5KSxhPXkoYSxyLG4saSxlWzE1XSwxMCwtMzA2MTE3NDQpLGk9eShpLGEscixuLGVbNl0sMTUsLTE1NjAxOTgzODApLG49eShuLGksYSxyLGVbMTNdLDIxLDEzMDkxNTE2NDkpLHI9eShyLG4saSxhLGVbNF0sNiwtMTQ1NTIzMDcwKSxhPXkoYSxyLG4saSxlWzExXSwxMCwtMTEyMDIxMDM3OSksaT15KGksYSxyLG4sZVsyXSwxNSw3MTg3ODcyNTkpLG49eShuLGksYSxyLGVbOV0sMjEsLTM0MzQ4NTU1MSksdFswXT1QKHIsdFswXSksdFsxXT1QKG4sdFsxXSksdFsyXT1QKGksdFsyXSksdFszXT1QKGEsdFszXSl9ZnVuY3Rpb24gZyh0LGUscixuLGksYSl7cmV0dXJuIGU9UChQKGUsdCksUChuLGEpKSxQKGU8PGl8ZT4+PjMyLWkscil9ZnVuY3Rpb24gbSh0LGUscixuLGksYSxvKXtyZXR1cm4gZyhlJnJ8fmUmbix0LGUsaSxhLG8pfWZ1bmN0aW9uIHYodCxlLHIsbixpLGEsbyl7cmV0dXJuIGcoZSZufHImfm4sdCxlLGksYSxvKX1mdW5jdGlvbiBiKHQsZSxyLG4saSxhLG8pe3JldHVybiBnKGVecl5uLHQsZSxpLGEsbyl9ZnVuY3Rpb24geSh0LGUscixuLGksYSxvKXtyZXR1cm4gZyhyXihlfH5uKSx0LGUsaSxhLG8pfWZ1bmN0aW9uIHcodCl7dmFyIGUscj10Lmxlbmd0aCxuPVsxNzMyNTg0MTkzLC0yNzE3MzM4NzksLTE3MzI1ODQxOTQsMjcxNzMzODc4XTtmb3IoZT02NDtlPD10Lmxlbmd0aDtlKz02NClwKG4sTih0LnN1YnN0cmluZyhlLTY0LGUpKSk7dD10LnN1YnN0cmluZyhlLTY0KTt2YXIgaT1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF07Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKylpW2U+PjJdfD10LmNoYXJDb2RlQXQoZSk8PChlJTQ8PDMpO2lmKGlbZT4+Ml18PTEyODw8KGUlNDw8MyksZT41NSlmb3IocChuLGkpLGU9MDtlPDE2O2UrKylpW2VdPTA7cmV0dXJuIGlbMTRdPTgqcixwKG4saSksbn1mdW5jdGlvbiBOKHQpe3ZhciBlLHI9W107Zm9yKGU9MDtlPDY0O2UrPTQpcltlPj4yXT10LmNoYXJDb2RlQXQoZSkrKHQuY2hhckNvZGVBdChlKzEpPDw4KSsodC5jaGFyQ29kZUF0KGUrMik8PDE2KSsodC5jaGFyQ29kZUF0KGUrMyk8PDI0KTtyZXR1cm4gcn12YXIgTD1cIjAxMjM0NTY3ODlhYmNkZWZcIi5zcGxpdChcIlwiKTtmdW5jdGlvbiB4KHQpe2Zvcih2YXIgZT1cIlwiLHI9MDtyPDQ7cisrKWUrPUxbdD4+OCpyKzQmMTVdK0xbdD4+OCpyJjE1XTtyZXR1cm4gZX1mdW5jdGlvbiBBKHQpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZ0LCg2NTI4MCZ0KT4+OCwoMTY3MTE2ODAmdCk+PjE2LCg0Mjc4MTkwMDgwJnQpPj4yNCl9ZnVuY3Rpb24gUyh0KXtyZXR1cm4gdyh0KS5tYXAoQSkuam9pbihcIlwiKX12YXIgXz1cIjVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyXCIhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV09eCh0W2VdKTtyZXR1cm4gdC5qb2luKFwiXCIpfSh3KFwiaGVsbG9cIikpO2Z1bmN0aW9uIFAodCxlKXtpZihfKXt2YXIgcj0oNjU1MzUmdCkrKDY1NTM1JmUpO3JldHVybih0Pj4xNikrKGU+PjE2KSsocj4+MTYpPDwxNnw2NTUzNSZyfXJldHVybiB0K2UmNDI5NDk2NzI5NX1cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEZQREYgaXMgcmVsZWFzZWQgdW5kZXIgYSBwZXJtaXNzaXZlIGxpY2Vuc2U6IHRoZXJlIGlzIG5vIHVzYWdlIHJlc3RyaWN0aW9uLlxuICogWW91IG1heSBlbWJlZCBpdCBmcmVlbHkgaW4geW91ciBhcHBsaWNhdGlvbiAoY29tbWVyY2lhbCBvciBub3QpLCB3aXRoIG9yXG4gKiB3aXRob3V0IG1vZGlmaWNhdGlvbnMuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwOi8vd3d3LmZwZGYub3JnL2VuL3NjcmlwdC9zY3JpcHQzNy5waHBcbiAqL2Z1bmN0aW9uIGsodCxlKXt2YXIgcixuLGksYTtpZih0IT09cil7Zm9yKHZhciBvPShpPXQsYT0xKygyNTYvdC5sZW5ndGh8MCksbmV3IEFycmF5KGErMSkuam9pbihpKSkscz1bXSx1PTA7dTwyNTY7dSsrKXNbdV09dTt2YXIgYz0wO2Zvcih1PTA7dTwyNTY7dSsrKXt2YXIgbD1zW3VdO2M9KGMrbCtvLmNoYXJDb2RlQXQodSkpJTI1NixzW3VdPXNbY10sc1tjXT1sfXI9dCxuPXN9ZWxzZSBzPW47dmFyIGg9ZS5sZW5ndGgsZj0wLGQ9MCxwPVwiXCI7Zm9yKHU9MDt1PGg7dSsrKWQ9KGQrKGw9c1tmPShmKzEpJTI1Nl0pKSUyNTYsc1tmXT1zW2RdLHNbZF09bCxvPXNbKHNbZl0rc1tkXSklMjU2XSxwKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGVBdCh1KV5vKTtyZXR1cm4gcH1cbi8qKlxuICogQGxpY2Vuc2VcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICogQXV0aG9yOiBPd2VuIExlb25nIChAb3dlbmwxMzEpXG4gKiBEYXRlOiAxNSBPY3QgMjAyMFxuICogUmVmZXJlbmNlczpcbiAqIGh0dHBzOi8vd3d3LmNzLmNtdS5lZHUvfmRzdC9BZG9iZS9HYWxsZXJ5L2Fub24yMWp1bDAxLXBkZi1lbmNyeXB0aW9uLnR4dFxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0L2Jsb2IvbWFzdGVyL2xpYi9zZWN1cml0eS5qc1xuICogaHR0cDovL3d3dy5mcGRmLm9yZy9lbi9zY3JpcHQvc2NyaXB0MzcucGhwXG4gKi92YXIgRj17cHJpbnQ6NCxtb2RpZnk6OCxjb3B5OjE2LFwiYW5ub3QtZm9ybXNcIjozMn07ZnVuY3Rpb24gSSh0LGUscixuKXt0aGlzLnY9MSx0aGlzLnI9Mjt2YXIgaT0xOTI7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PUYucGVybSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBlcm1pc3Npb246IFwiK3QpO2krPUZbdF19KSx0aGlzLnBhZGRpbmc9XCIowr9OXk51wopBZFxcME5Ww7/Dulx1MDAwMVxcYi4uXFwwwrbDkGg+woAvXFxmwqnDvmRTaXpcIjt2YXIgYT0oZSt0aGlzLnBhZGRpbmcpLnN1YnN0cigwLDMyKSxvPShyK3RoaXMucGFkZGluZykuc3Vic3RyKDAsMzIpO3RoaXMuTz10aGlzLnByb2Nlc3NPd25lclBhc3N3b3JkKGEsbyksdGhpcy5QPS0oMSsoMjU1XmkpKSx0aGlzLmVuY3J5cHRpb25LZXk9UyhhK3RoaXMuTyt0aGlzLmxzYkZpcnN0V29yZCh0aGlzLlApK3RoaXMuaGV4VG9CeXRlcyhuKSkuc3Vic3RyKDAsNSksdGhpcy5VPWsodGhpcy5lbmNyeXB0aW9uS2V5LHRoaXMucGFkZGluZyl9ZnVuY3Rpb24gQyh0KXtpZigvW15cXHUwMDAwLVxcdTAwZmZdLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgUERGIE5hbWUgT2JqZWN0OiBcIit0K1wiLCBPbmx5IGFjY2VwdCBBU0NJSSBjaGFyYWN0ZXJzLlwiKTtmb3IodmFyIGU9XCJcIixyPXQubGVuZ3RoLG49MDtuPHI7bisrKXt2YXIgaT10LmNoYXJDb2RlQXQobik7ZSs9aTwzM3x8MzU9PT1pfHwzNz09PWl8fDQwPT09aXx8NDE9PT1pfHw0Nz09PWl8fDYwPT09aXx8NjI9PT1pfHw5MT09PWl8fDkzPT09aXx8MTIzPT09aXx8MTI1PT09aXx8aT4xMjY/XCIjXCIrKFwiMFwiK2kudG9TdHJpbmcoMTYpKS5zbGljZSgtMik6dFtuXX1yZXR1cm4gZX1mdW5jdGlvbiBqKGUpe2lmKFwib2JqZWN0XCIhPT10KGUpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgQ29udGV4dCBwYXNzZWQgdG8gaW5pdGlhbGl6ZSBQdWJTdWIgKGpzUERGLW1vZHVsZSlcIik7dmFyIHI9e307dGhpcy5zdWJzY3JpYmU9ZnVuY3Rpb24odCxlLG4pe2lmKG49bnx8ITEsXCJzdHJpbmdcIiE9dHlwZW9mIHR8fFwiZnVuY3Rpb25cIiE9dHlwZW9mIGV8fFwiYm9vbGVhblwiIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8gUHViU3ViLnN1YnNjcmliZSAoanNQREYtbW9kdWxlKVwiKTtyLmhhc093blByb3BlcnR5KHQpfHwoclt0XT17fSk7dmFyIGk9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNSk7cmV0dXJuIHJbdF1baV09W2UsISFuXSxpfSx0aGlzLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiByKWlmKHJbZV1bdF0pcmV0dXJuIGRlbGV0ZSByW2VdW3RdLDA9PT1PYmplY3Qua2V5cyhyW2VdKS5sZW5ndGgmJmRlbGV0ZSByW2VdLCEwO3JldHVybiExfSx0aGlzLnB1Ymxpc2g9ZnVuY3Rpb24odCl7aWYoci5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGE9W107Zm9yKHZhciBzIGluIHJbdF0pe3ZhciB1PXJbdF1bc107dHJ5e3VbMF0uYXBwbHkoZSxuKX1jYXRjaChjKXtpLmNvbnNvbGUmJm8uZXJyb3IoXCJqc1BERiBQdWJTdWIgRXJyb3JcIixjLm1lc3NhZ2UsYyl9dVsxXSYmYS5wdXNoKHMpfWEubGVuZ3RoJiZhLmZvckVhY2godGhpcy51bnN1YnNjcmliZSl9fSx0aGlzLmdldFRvcGljcz1mdW5jdGlvbigpe3JldHVybiByfX1mdW5jdGlvbiBPKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIE8pKXJldHVybiBuZXcgTyh0KTt2YXIgZT1cIm9wYWNpdHksc3Ryb2tlLW9wYWNpdHlcIi5zcGxpdChcIixcIik7Zm9yKHZhciByIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmZS5pbmRleE9mKHIpPj0wJiYodGhpc1tyXT10W3JdKTt0aGlzLmlkPVwiXCIsdGhpcy5vYmplY3ROdW1iZXI9LTF9ZnVuY3Rpb24gQih0LGUpe3RoaXMuZ1N0YXRlPXQsdGhpcy5tYXRyaXg9ZSx0aGlzLmlkPVwiXCIsdGhpcy5vYmplY3ROdW1iZXI9LTF9ZnVuY3Rpb24gTSh0LGUscixuLGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIE0pKXJldHVybiBuZXcgTSh0LGUscixuLGkpO3RoaXMudHlwZT1cImF4aWFsXCI9PT10PzI6Myx0aGlzLmNvb3Jkcz1lLHRoaXMuY29sb3JzPXIsQi5jYWxsKHRoaXMsbixpKX1mdW5jdGlvbiBxKHQsZSxyLG4saSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcSkpcmV0dXJuIG5ldyBxKHQsZSxyLG4saSk7dGhpcy5ib3VuZGluZ0JveD10LHRoaXMueFN0ZXA9ZSx0aGlzLnlTdGVwPXIsdGhpcy5zdHJlYW09XCJcIix0aGlzLmNsb25lSW5kZXg9MCxCLmNhbGwodGhpcyxuLGkpfWZ1bmN0aW9uIEUoZSl7dmFyIHIsbj1cInN0cmluZ1wiPT10eXBlb2YgYXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpcInBcIixhPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSx1PWFyZ3VtZW50c1szXSxjPVtdLGY9MSxwPTE2LGc9XCJTXCIsbT1udWxsO1wib2JqZWN0XCI9PT10KGU9ZXx8e30pJiYobj1lLm9yaWVudGF0aW9uLGE9ZS51bml0fHxhLHM9ZS5mb3JtYXR8fHMsdT1lLmNvbXByZXNzfHxlLmNvbXByZXNzUGRmfHx1LG51bGwhPT0obT1lLmVuY3J5cHRpb258fG51bGwpJiYobS51c2VyUGFzc3dvcmQ9bS51c2VyUGFzc3dvcmR8fFwiXCIsbS5vd25lclBhc3N3b3JkPW0ub3duZXJQYXNzd29yZHx8XCJcIixtLnVzZXJQZXJtaXNzaW9ucz1tLnVzZXJQZXJtaXNzaW9uc3x8W10pLGY9XCJudW1iZXJcIj09dHlwZW9mIGUudXNlclVuaXQ/TWF0aC5hYnMoZS51c2VyVW5pdCk6MSx2b2lkIDAhPT1lLnByZWNpc2lvbiYmKHI9ZS5wcmVjaXNpb24pLHZvaWQgMCE9PWUuZmxvYXRQcmVjaXNpb24mJihwPWUuZmxvYXRQcmVjaXNpb24pLGc9ZS5kZWZhdWx0UGF0aE9wZXJhdGlvbnx8XCJTXCIpLGM9ZS5maWx0ZXJzfHwoITA9PT11P1tcIkZsYXRlRW5jb2RlXCJdOmMpLGE9YXx8XCJtbVwiLG49KFwiXCIrKG58fFwiUFwiKSkudG9Mb3dlckNhc2UoKTt2YXIgdj1lLnB1dE9ubHlVc2VkRm9udHN8fCExLGI9e30seT17aW50ZXJuYWw6e30sX19wcml2YXRlX186e319O3kuX19wcml2YXRlX18uUHViU3ViPWo7dmFyIHc9XCIxLjNcIixOPXkuX19wcml2YXRlX18uZ2V0UGRmVmVyc2lvbj1mdW5jdGlvbigpe3JldHVybiB3fTt5Ll9fcHJpdmF0ZV9fLnNldFBkZlZlcnNpb249ZnVuY3Rpb24odCl7dz10fTt2YXIgTD17YTA6WzIzODMuOTQsMzM3MC4zOV0sYTE6WzE2ODMuNzgsMjM4My45NF0sYTI6WzExOTAuNTUsMTY4My43OF0sYTM6Wzg0MS44OSwxMTkwLjU1XSxhNDpbNTk1LjI4LDg0MS44OV0sYTU6WzQxOS41Myw1OTUuMjhdLGE2OlsyOTcuNjQsNDE5LjUzXSxhNzpbMjA5Ljc2LDI5Ny42NF0sYTg6WzE0Ny40LDIwOS43Nl0sYTk6WzEwNC44OCwxNDcuNF0sYTEwOls3My43LDEwNC44OF0sYjA6WzI4MzQuNjUsNDAwOC4xOV0sYjE6WzIwMDQuMDksMjgzNC42NV0sYjI6WzE0MTcuMzIsMjAwNC4wOV0sYjM6WzEwMDAuNjMsMTQxNy4zMl0sYjQ6WzcwOC42NiwxMDAwLjYzXSxiNTpbNDk4LjksNzA4LjY2XSxiNjpbMzU0LjMzLDQ5OC45XSxiNzpbMjQ5LjQ1LDM1NC4zM10sYjg6WzE3NS43NSwyNDkuNDVdLGI5OlsxMjQuNzIsMTc1Ljc1XSxiMTA6Wzg3Ljg3LDEyNC43Ml0sYzA6WzI1OTkuMzcsMzY3Ni41NF0sYzE6WzE4MzYuODUsMjU5OS4zN10sYzI6WzEyOTguMjcsMTgzNi44NV0sYzM6WzkxOC40MywxMjk4LjI3XSxjNDpbNjQ5LjEzLDkxOC40M10sYzU6WzQ1OS4yMSw2NDkuMTNdLGM2OlszMjMuMTUsNDU5LjIxXSxjNzpbMjI5LjYxLDMyMy4xNV0sYzg6WzE2MS41NywyMjkuNjFdLGM5OlsxMTMuMzksMTYxLjU3XSxjMTA6Wzc5LjM3LDExMy4zOV0sZGw6WzMxMS44MSw2MjMuNjJdLGxldHRlcjpbNjEyLDc5Ml0sXCJnb3Zlcm5tZW50LWxldHRlclwiOls1NzYsNzU2XSxsZWdhbDpbNjEyLDEwMDhdLFwianVuaW9yLWxlZ2FsXCI6WzU3NiwzNjBdLGxlZGdlcjpbMTIyNCw3OTJdLHRhYmxvaWQ6Wzc5MiwxMjI0XSxcImNyZWRpdC1jYXJkXCI6WzE1MywyNDNdfTt5Ll9fcHJpdmF0ZV9fLmdldFBhZ2VGb3JtYXRzPWZ1bmN0aW9uKCl7cmV0dXJuIEx9O3ZhciB4PXkuX19wcml2YXRlX18uZ2V0UGFnZUZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gTFt0XX07cz1zfHxcImE0XCI7dmFyIEE9XCJjb21wYXRcIixTPVwiYWR2YW5jZWRcIixfPUE7ZnVuY3Rpb24gUCgpe3RoaXMuc2F2ZUdyYXBoaWNzU3RhdGUoKSxsdChuZXcgV3QoU3QsMCwwLC1TdCwwLFByKCkqU3QpLnRvU3RyaW5nKCkrXCIgY21cIiksdGhpcy5zZXRGb250U2l6ZSh0aGlzLmdldEZvbnRTaXplKCkvU3QpLGc9XCJuXCIsXz1TfWZ1bmN0aW9uIGsoKXt0aGlzLnJlc3RvcmVHcmFwaGljc1N0YXRlKCksZz1cIlNcIixfPUF9dmFyIEY9eS5fX3ByaXZhdGVfXy5jb21iaW5lRm9udFN0eWxlQW5kRm9udFdlaWdodD1mdW5jdGlvbih0LGUpe2lmKFwiYm9sZFwiPT10JiZcIm5vcm1hbFwiPT1lfHxcImJvbGRcIj09dCYmNDAwPT1lfHxcIm5vcm1hbFwiPT10JiZcIml0YWxpY1wiPT1lfHxcImJvbGRcIj09dCYmXCJpdGFsaWNcIj09ZSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIENvbWJpbmF0aW9uIG9mIGZvbnR3ZWlnaHQgYW5kIGZvbnRzdHlsZVwiKTtyZXR1cm4gZSYmKHQ9NDAwPT1lfHxcIm5vcm1hbFwiPT09ZT9cIml0YWxpY1wiPT09dD9cIml0YWxpY1wiOlwibm9ybWFsXCI6NzAwIT1lJiZcImJvbGRcIiE9PWV8fFwibm9ybWFsXCIhPT10Pyg3MDA9PWU/XCJib2xkXCI6ZSkrXCJcIit0OlwiYm9sZFwiKSx0fTt5LmFkdmFuY2VkQVBJPWZ1bmN0aW9uKHQpe3ZhciBlPV89PT1BO3JldHVybiBlJiZQLmNhbGwodGhpcyksXCJmdW5jdGlvblwiIT10eXBlb2YgdHx8KHQodGhpcyksZSYmay5jYWxsKHRoaXMpKSx0aGlzfSx5LmNvbXBhdEFQST1mdW5jdGlvbih0KXt2YXIgZT1fPT09UztyZXR1cm4gZSYmay5jYWxsKHRoaXMpLFwiZnVuY3Rpb25cIiE9dHlwZW9mIHR8fCh0KHRoaXMpLGUmJlAuY2FsbCh0aGlzKSksdGhpc30seS5pc0FkdmFuY2VkQVBJPWZ1bmN0aW9uKCl7cmV0dXJuIF89PT1TfTt2YXIgQixSPWZ1bmN0aW9uKHQpe2lmKF8hPT1TKXRocm93IG5ldyBFcnJvcih0K1wiIGlzIG9ubHkgYXZhaWxhYmxlIGluICdhZHZhbmNlZCcgQVBJIG1vZGUuIFlvdSBuZWVkIHRvIGNhbGwgYWR2YW5jZWRBUEkoKSBmaXJzdC5cIil9LEQ9eS5yb3VuZFRvUHJlY2lzaW9uPXkuX19wcml2YXRlX18ucm91bmRUb1ByZWNpc2lvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXJ8fGU7aWYoaXNOYU4odCl8fGlzTmFOKG4pKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLnJvdW5kVG9QcmVjaXNpb25cIik7cmV0dXJuIHQudG9GaXhlZChuKS5yZXBsYWNlKC8wKyQvLFwiXCIpfTtCPXkuaHBmPXkuX19wcml2YXRlX18uaHBmPVwibnVtYmVyXCI9PXR5cGVvZiBwP2Z1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmhwZlwiKTtyZXR1cm4gRCh0LHApfTpcInNtYXJ0XCI9PT1wP2Z1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmhwZlwiKTtyZXR1cm4gRCh0LHQ+LTEmJnQ8MT8xNjo1KX06ZnVuY3Rpb24odCl7aWYoaXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuaHBmXCIpO3JldHVybiBEKHQsMTYpfTt2YXIgVD15LmYyPXkuX19wcml2YXRlX18uZjI9ZnVuY3Rpb24odCl7aWYoaXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuZjJcIik7cmV0dXJuIEQodCwyKX0sej15Ll9fcHJpdmF0ZV9fLmYzPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmYzXCIpO3JldHVybiBEKHQsMyl9LFU9eS5zY2FsZT15Ll9fcHJpdmF0ZV9fLnNjYWxlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLnNjYWxlXCIpO3JldHVybiBfPT09QT90KlN0Ol89PT1TP3Q6dm9pZCAwfSxIPWZ1bmN0aW9uKHQpe3JldHVybiBVKGZ1bmN0aW9uKHQpe3JldHVybiBfPT09QT9QcigpLXQ6Xz09PVM/dDp2b2lkIDB9KHQpKX07eS5fX3ByaXZhdGVfXy5zZXRQcmVjaXNpb249eS5zZXRQcmVjaXNpb249ZnVuY3Rpb24odCl7XCJudW1iZXJcIj09dHlwZW9mIHBhcnNlSW50KHQsMTApJiYocj1wYXJzZUludCh0LDEwKSl9O3ZhciBXLFY9XCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLEc9eS5fX3ByaXZhdGVfXy5nZXRGaWxlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gVn0sWT15Ll9fcHJpdmF0ZV9fLnNldEZpbGVJZD1mdW5jdGlvbih0KXtyZXR1cm4gVj12b2lkIDAhPT10JiYvXlthLWZBLUYwLTldezMyfSQvLnRlc3QodCk/dC50b1VwcGVyQ2FzZSgpOlYuc3BsaXQoXCJcIikubWFwKGZ1bmN0aW9uKCl7cmV0dXJuXCJBQkNERUYwMTIzNDU2Nzg5XCIuY2hhckF0KE1hdGguZmxvb3IoMTYqTWF0aC5yYW5kb20oKSkpfSkuam9pbihcIlwiKSxudWxsIT09bSYmKE9lPW5ldyBJKG0udXNlclBlcm1pc3Npb25zLG0udXNlclBhc3N3b3JkLG0ub3duZXJQYXNzd29yZCxWKSksVn07eS5zZXRGaWxlSWQ9ZnVuY3Rpb24odCl7cmV0dXJuIFkodCksdGhpc30seS5nZXRGaWxlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gRygpfTt2YXIgSj15Ll9fcHJpdmF0ZV9fLmNvbnZlcnREYXRlVG9QREZEYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxyPWU8MD9cIitcIjpcIi1cIixuPU1hdGguZmxvb3IoTWF0aC5hYnMoZS82MCkpLGk9TWF0aC5hYnMoZSU2MCksYT1bcixRKG4pLFwiJ1wiLFEoaSksXCInXCJdLmpvaW4oXCJcIik7cmV0dXJuW1wiRDpcIix0LmdldEZ1bGxZZWFyKCksUSh0LmdldE1vbnRoKCkrMSksUSh0LmdldERhdGUoKSksUSh0LmdldEhvdXJzKCkpLFEodC5nZXRNaW51dGVzKCkpLFEodC5nZXRTZWNvbmRzKCkpLGFdLmpvaW4oXCJcIil9LFg9eS5fX3ByaXZhdGVfXy5jb252ZXJ0UERGRGF0ZVRvRGF0ZT1mdW5jdGlvbih0KXt2YXIgZT1wYXJzZUludCh0LnN1YnN0cigyLDQpLDEwKSxyPXBhcnNlSW50KHQuc3Vic3RyKDYsMiksMTApLTEsbj1wYXJzZUludCh0LnN1YnN0cig4LDIpLDEwKSxpPXBhcnNlSW50KHQuc3Vic3RyKDEwLDIpLDEwKSxhPXBhcnNlSW50KHQuc3Vic3RyKDEyLDIpLDEwKSxvPXBhcnNlSW50KHQuc3Vic3RyKDE0LDIpLDEwKTtyZXR1cm4gbmV3IERhdGUoZSxyLG4saSxhLG8sMCl9LEs9eS5fX3ByaXZhdGVfXy5zZXRDcmVhdGlvbkRhdGU9ZnVuY3Rpb24odCl7dmFyIGU7aWYodm9pZCAwPT09dCYmKHQ9bmV3IERhdGUpLHQgaW5zdGFuY2VvZiBEYXRlKWU9Sih0KTtlbHNle2lmKCEvXkQ6KDIwWzAtMl1bMC05XXwyMDNbMC03XXwxOVs3LTldWzAtOV0pKDBbMC05XXwxWzAtMl0pKFswLTJdWzAtOV18M1swLTFdKSgwWzAtOV18MVswLTldfDJbMC0zXSkoMFswLTldfFsxLTVdWzAtOV0pKDBbMC05XXxbMS01XVswLTldKShcXCswWzAtOV18XFwrMVswLTRdfC0wWzAtOV18LTFbMC0xXSknKDBbMC05XXxbMS01XVswLTldKSc/JC8udGVzdCh0KSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5zZXRDcmVhdGlvbkRhdGVcIik7ZT10fXJldHVybiBXPWV9LFo9eS5fX3ByaXZhdGVfXy5nZXRDcmVhdGlvbkRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9VztyZXR1cm5cImpzRGF0ZVwiPT09dCYmKGU9WChXKSksZX07eS5zZXRDcmVhdGlvbkRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIEsodCksdGhpc30seS5nZXRDcmVhdGlvbkRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIFoodCl9O3ZhciAkLFE9eS5fX3ByaXZhdGVfXy5wYWRkMj1mdW5jdGlvbih0KXtyZXR1cm4oXCIwXCIrcGFyc2VJbnQodCkpLnNsaWNlKC0yKX0sdHQ9eS5fX3ByaXZhdGVfXy5wYWRkMkhleD1mdW5jdGlvbih0KXtyZXR1cm4oXCIwMFwiKyh0PXQudG9TdHJpbmcoKSkpLnN1YnN0cih0Lmxlbmd0aCl9LGV0PTAscnQ9W10sbnQ9W10saXQ9MCxhdD1bXSxvdD1bXSxzdD0hMSx1dD1udDt5Ll9fcHJpdmF0ZV9fLnNldEN1c3RvbU91dHB1dERlc3RpbmF0aW9uPWZ1bmN0aW9uKHQpe3N0PSEwLHV0PXR9O3ZhciBjdD1mdW5jdGlvbih0KXtzdHx8KHV0PXQpfTt5Ll9fcHJpdmF0ZV9fLnJlc2V0Q3VzdG9tT3V0cHV0RGVzdGluYXRpb249ZnVuY3Rpb24oKXtzdD0hMSx1dD1udH07dmFyIGx0PXkuX19wcml2YXRlX18ub3V0PWZ1bmN0aW9uKHQpe3JldHVybiB0PXQudG9TdHJpbmcoKSxpdCs9dC5sZW5ndGgrMSx1dC5wdXNoKHQpLHV0fSxodD15Ll9fcHJpdmF0ZV9fLndyaXRlPWZ1bmN0aW9uKHQpe3JldHVybiBsdCgxPT09YXJndW1lbnRzLmxlbmd0aD90LnRvU3RyaW5nKCk6QXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsXCIgXCIpKX0sZnQ9eS5fX3ByaXZhdGVfXy5nZXRBcnJheUJ1ZmZlcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgQXJyYXlCdWZmZXIoZSksbj1uZXcgVWludDhBcnJheShyKTtlLS07KW5bZV09dC5jaGFyQ29kZUF0KGUpO3JldHVybiByfSxkdD1bW1wiSGVsdmV0aWNhXCIsXCJoZWx2ZXRpY2FcIixcIm5vcm1hbFwiLFwiV2luQW5zaUVuY29kaW5nXCJdLFtcIkhlbHZldGljYS1Cb2xkXCIsXCJoZWx2ZXRpY2FcIixcImJvbGRcIixcIldpbkFuc2lFbmNvZGluZ1wiXSxbXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiLFwiaGVsdmV0aWNhXCIsXCJpdGFsaWNcIixcIldpbkFuc2lFbmNvZGluZ1wiXSxbXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIixcImhlbHZldGljYVwiLFwiYm9sZGl0YWxpY1wiLFwiV2luQW5zaUVuY29kaW5nXCJdLFtcIkNvdXJpZXJcIixcImNvdXJpZXJcIixcIm5vcm1hbFwiLFwiV2luQW5zaUVuY29kaW5nXCJdLFtcIkNvdXJpZXItQm9sZFwiLFwiY291cmllclwiLFwiYm9sZFwiLFwiV2luQW5zaUVuY29kaW5nXCJdLFtcIkNvdXJpZXItT2JsaXF1ZVwiLFwiY291cmllclwiLFwiaXRhbGljXCIsXCJXaW5BbnNpRW5jb2RpbmdcIl0sW1wiQ291cmllci1Cb2xkT2JsaXF1ZVwiLFwiY291cmllclwiLFwiYm9sZGl0YWxpY1wiLFwiV2luQW5zaUVuY29kaW5nXCJdLFtcIlRpbWVzLVJvbWFuXCIsXCJ0aW1lc1wiLFwibm9ybWFsXCIsXCJXaW5BbnNpRW5jb2RpbmdcIl0sW1wiVGltZXMtQm9sZFwiLFwidGltZXNcIixcImJvbGRcIixcIldpbkFuc2lFbmNvZGluZ1wiXSxbXCJUaW1lcy1JdGFsaWNcIixcInRpbWVzXCIsXCJpdGFsaWNcIixcIldpbkFuc2lFbmNvZGluZ1wiXSxbXCJUaW1lcy1Cb2xkSXRhbGljXCIsXCJ0aW1lc1wiLFwiYm9sZGl0YWxpY1wiLFwiV2luQW5zaUVuY29kaW5nXCJdLFtcIlphcGZEaW5nYmF0c1wiLFwiemFwZmRpbmdiYXRzXCIsXCJub3JtYWxcIixudWxsXSxbXCJTeW1ib2xcIixcInN5bWJvbFwiLFwibm9ybWFsXCIsbnVsbF1dO3kuX19wcml2YXRlX18uZ2V0U3RhbmRhcmRGb250cz1mdW5jdGlvbigpe3JldHVybiBkdH07dmFyIHB0PWUuZm9udFNpemV8fDE2O3kuX19wcml2YXRlX18uc2V0Rm9udFNpemU9eS5zZXRGb250U2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gcHQ9Xz09PVM/dC9TdDp0LHRoaXN9O3ZhciBndCxtdD15Ll9fcHJpdmF0ZV9fLmdldEZvbnRTaXplPXkuZ2V0Rm9udFNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gXz09PUE/cHQ6cHQqU3R9LHZ0PWUuUjJMfHwhMTt5Ll9fcHJpdmF0ZV9fLnNldFIyTD15LnNldFIyTD1mdW5jdGlvbih0KXtyZXR1cm4gdnQ9dCx0aGlzfSx5Ll9fcHJpdmF0ZV9fLmdldFIyTD15LmdldFIyTD1mdW5jdGlvbigpe3JldHVybiB2dH07dmFyIGJ0LHl0PXkuX19wcml2YXRlX18uc2V0Wm9vbU1vZGU9ZnVuY3Rpb24odCl7aWYoL14oPzpcXGQrXFwuXFxkKnxcXGQqXFwuXFxkK3xcXGQrKSUkLy50ZXN0KHQpKWd0PXQ7ZWxzZSBpZihpc05hTih0KSl7aWYoLTE9PT1bdm9pZCAwLG51bGwsXCJmdWxsd2lkdGhcIixcImZ1bGxoZWlnaHRcIixcImZ1bGxwYWdlXCIsXCJvcmlnaW5hbFwiXS5pbmRleE9mKHQpKXRocm93IG5ldyBFcnJvcignem9vbSBtdXN0IGJlIEludGVnZXIgKGUuZy4gMiksIGEgcGVyY2VudGFnZSBWYWx1ZSAoZS5nLiAzMDAlKSBvciBmdWxsd2lkdGgsIGZ1bGxoZWlnaHQsIGZ1bGxwYWdlLCBvcmlnaW5hbC4gXCInK3QrJ1wiIGlzIG5vdCByZWNvZ25pemVkLicpO2d0PXR9ZWxzZSBndD1wYXJzZUludCh0LDEwKX07eS5fX3ByaXZhdGVfXy5nZXRab29tTW9kZT1mdW5jdGlvbigpe3JldHVybiBndH07dmFyIHd0LE50PXkuX19wcml2YXRlX18uc2V0UGFnZU1vZGU9ZnVuY3Rpb24odCl7aWYoLTE9PVt2b2lkIDAsbnVsbCxcIlVzZU5vbmVcIixcIlVzZU91dGxpbmVzXCIsXCJVc2VUaHVtYnNcIixcIkZ1bGxTY3JlZW5cIl0uaW5kZXhPZih0KSl0aHJvdyBuZXcgRXJyb3IoJ1BhZ2UgbW9kZSBtdXN0IGJlIG9uZSBvZiBVc2VOb25lLCBVc2VPdXRsaW5lcywgVXNlVGh1bWJzLCBvciBGdWxsU2NyZWVuLiBcIicrdCsnXCIgaXMgbm90IHJlY29nbml6ZWQuJyk7YnQ9dH07eS5fX3ByaXZhdGVfXy5nZXRQYWdlTW9kZT1mdW5jdGlvbigpe3JldHVybiBidH07dmFyIEx0PXkuX19wcml2YXRlX18uc2V0TGF5b3V0TW9kZT1mdW5jdGlvbih0KXtpZigtMT09W3ZvaWQgMCxudWxsLFwiY29udGludW91c1wiLFwic2luZ2xlXCIsXCJ0d29sZWZ0XCIsXCJ0d29yaWdodFwiLFwidHdvXCJdLmluZGV4T2YodCkpdGhyb3cgbmV3IEVycm9yKCdMYXlvdXQgbW9kZSBtdXN0IGJlIG9uZSBvZiBjb250aW51b3VzLCBzaW5nbGUsIHR3b2xlZnQsIHR3b3JpZ2h0LiBcIicrdCsnXCIgaXMgbm90IHJlY29nbml6ZWQuJyk7d3Q9dH07eS5fX3ByaXZhdGVfXy5nZXRMYXlvdXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHd0fSx5Ll9fcHJpdmF0ZV9fLnNldERpc3BsYXlNb2RlPXkuc2V0RGlzcGxheU1vZGU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB5dCh0KSxMdChlKSxOdChyKSx0aGlzfTt2YXIgeHQ9e3RpdGxlOlwiXCIsc3ViamVjdDpcIlwiLGF1dGhvcjpcIlwiLGtleXdvcmRzOlwiXCIsY3JlYXRvcjpcIlwifTt5Ll9fcHJpdmF0ZV9fLmdldERvY3VtZW50UHJvcGVydHk9ZnVuY3Rpb24odCl7aWYoLTE9PT1PYmplY3Qua2V5cyh4dCkuaW5kZXhPZih0KSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5nZXREb2N1bWVudFByb3BlcnR5XCIpO3JldHVybiB4dFt0XX0seS5fX3ByaXZhdGVfXy5nZXREb2N1bWVudFByb3BlcnRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4geHR9LHkuX19wcml2YXRlX18uc2V0RG9jdW1lbnRQcm9wZXJ0aWVzPXkuc2V0UHJvcGVydGllcz15LnNldERvY3VtZW50UHJvcGVydGllcz1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4geHQpeHQuaGFzT3duUHJvcGVydHkoZSkmJnRbZV0mJih4dFtlXT10W2VdKTtyZXR1cm4gdGhpc30seS5fX3ByaXZhdGVfXy5zZXREb2N1bWVudFByb3BlcnR5PWZ1bmN0aW9uKHQsZSl7aWYoLTE9PT1PYmplY3Qua2V5cyh4dCkuaW5kZXhPZih0KSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuc2V0RG9jdW1lbnRQcm9wZXJ0eVwiKTtyZXR1cm4geHRbdF09ZX07dmFyIEF0LFN0LF90LFB0LGt0LEZ0PXt9LEl0PXt9LEN0PVtdLGp0PXt9LE90PXt9LEJ0PXt9LE10PXt9LHF0PW51bGwsRXQ9MCxSdD1bXSxEdD1uZXcgaih5KSxUdD1lLmhvdGZpeGVzfHxbXSx6dD17fSxVdD17fSxIdD1bXSxXdD1mdW5jdGlvbiB0KGUscixuLGksYSxvKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0KSlyZXR1cm4gbmV3IHQoZSxyLG4saSxhLG8pO2lzTmFOKGUpJiYoZT0xKSxpc05hTihyKSYmKHI9MCksaXNOYU4obikmJihuPTApLGlzTmFOKGkpJiYoaT0xKSxpc05hTihhKSYmKGE9MCksaXNOYU4obykmJihvPTApLHRoaXMuX21hdHJpeD1bZSxyLG4saSxhLG9dfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoV3QucHJvdG90eXBlLFwic3hcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFswXX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFswXT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdC5wcm90b3R5cGUsXCJzaHlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFsxXX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFsxXT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdC5wcm90b3R5cGUsXCJzaHhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFsyXX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFsyXT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdC5wcm90b3R5cGUsXCJzeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF0cml4WzNdfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbWF0cml4WzNdPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFd0LnByb3RvdHlwZSxcInR4XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXRyaXhbNF19LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tYXRyaXhbNF09dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoV3QucHJvdG90eXBlLFwidHlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFs1XX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFs1XT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdC5wcm90b3R5cGUsXCJhXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXRyaXhbMF19LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tYXRyaXhbMF09dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoV3QucHJvdG90eXBlLFwiYlwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF0cml4WzFdfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbWF0cml4WzFdPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFd0LnByb3RvdHlwZSxcImNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFsyXX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFsyXT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdC5wcm90b3R5cGUsXCJkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXRyaXhbM119LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tYXRyaXhbM109dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoV3QucHJvdG90eXBlLFwiZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF0cml4WzRdfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbWF0cml4WzRdPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFd0LnByb3RvdHlwZSxcImZcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hdHJpeFs1XX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21hdHJpeFs1XT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdC5wcm90b3R5cGUsXCJyb3RhdGlvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnNoeCx0aGlzLnN4KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoV3QucHJvdG90eXBlLFwic2NhbGVYXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29tcG9zZSgpLnNjYWxlLnN4fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdC5wcm90b3R5cGUsXCJzY2FsZVlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb21wb3NlKCkuc2NhbGUuc3l9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFd0LnByb3RvdHlwZSxcImlzSWRlbnRpdHlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLnN4JiYwPT09dGhpcy5zaHkmJjA9PT10aGlzLnNoeCYmMT09PXRoaXMuc3kmJjA9PT10aGlzLnR4JiYwPT09dGhpcy50eX19KSxXdC5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtyZXR1cm5bdGhpcy5zeCx0aGlzLnNoeSx0aGlzLnNoeCx0aGlzLnN5LHRoaXMudHgsdGhpcy50eV0ubWFwKEIpLmpvaW4odCl9LFd0LnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbih0KXt2YXIgZT10LnN4KnRoaXMuc3grdC5zaHkqdGhpcy5zaHgscj10LnN4KnRoaXMuc2h5K3Quc2h5KnRoaXMuc3ksbj10LnNoeCp0aGlzLnN4K3Quc3kqdGhpcy5zaHgsaT10LnNoeCp0aGlzLnNoeSt0LnN5KnRoaXMuc3ksYT10LnR4KnRoaXMuc3grdC50eSp0aGlzLnNoeCt0aGlzLnR4LG89dC50eCp0aGlzLnNoeSt0LnR5KnRoaXMuc3krdGhpcy50eTtyZXR1cm4gbmV3IFd0KGUscixuLGksYSxvKX0sV3QucHJvdG90eXBlLmRlY29tcG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3gsZT10aGlzLnNoeSxyPXRoaXMuc2h4LG49dGhpcy5zeSxpPXRoaXMudHgsYT10aGlzLnR5LG89TWF0aC5zcXJ0KHQqdCtlKmUpLHM9KHQvPW8pKnIrKGUvPW8pKm47ci09dCpzLG4tPWUqczt2YXIgdT1NYXRoLnNxcnQocipyK24qbik7cmV0dXJuIHMvPXUsdCoobi89dSk8ZSooci89dSkmJih0PS10LGU9LWUscz0tcyxvPS1vKSx7c2NhbGU6bmV3IFd0KG8sMCwwLHUsMCwwKSx0cmFuc2xhdGU6bmV3IFd0KDEsMCwwLDEsaSxhKSxyb3RhdGU6bmV3IFd0KHQsZSwtZSx0LDAsMCksc2tldzpuZXcgV3QoMSwwLHMsMSwwLDApfX0sV3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmpvaW4oXCIgXCIpfSxXdC5wcm90b3R5cGUuaW52ZXJzZWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN4LGU9dGhpcy5zaHkscj10aGlzLnNoeCxuPXRoaXMuc3ksaT10aGlzLnR4LGE9dGhpcy50eSxvPTEvKHQqbi1lKnIpLHM9bipvLHU9LWUqbyxjPS1yKm8sbD10Km87cmV0dXJuIG5ldyBXdChzLHUsYyxsLC1zKmktYyphLC11KmktbCphKX0sV3QucHJvdG90eXBlLmFwcGx5VG9Qb2ludD1mdW5jdGlvbih0KXt2YXIgZT10LngqdGhpcy5zeCt0LnkqdGhpcy5zaHgrdGhpcy50eCxyPXQueCp0aGlzLnNoeSt0LnkqdGhpcy5zeSt0aGlzLnR5O3JldHVybiBuZXcgbXIoZSxyKX0sV3QucHJvdG90eXBlLmFwcGx5VG9SZWN0YW5nbGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hcHBseVRvUG9pbnQodCkscj10aGlzLmFwcGx5VG9Qb2ludChuZXcgbXIodC54K3Qudyx0LnkrdC5oKSk7cmV0dXJuIG5ldyB2cihlLngsZS55LHIueC1lLngsci55LWUueSl9LFd0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3gsZT10aGlzLnNoeSxyPXRoaXMuc2h4LG49dGhpcy5zeSxpPXRoaXMudHgsYT10aGlzLnR5O3JldHVybiBuZXcgV3QodCxlLHIsbixpLGEpfSx5Lk1hdHJpeD1XdDt2YXIgVnQ9eS5tYXRyaXhNdWx0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUubXVsdGlwbHkodCl9LEd0PW5ldyBXdCgxLDAsMCwxLDAsMCk7eS51bml0TWF0cml4PXkuaWRlbnRpdHlNYXRyaXg9R3Q7dmFyIFl0PWZ1bmN0aW9uKHQsZSl7aWYoIU90W3RdKXt2YXIgcj0oZSBpbnN0YW5jZW9mIE0/XCJTaFwiOlwiUFwiKSsoT2JqZWN0LmtleXMoanQpLmxlbmd0aCsxKS50b1N0cmluZygxMCk7ZS5pZD1yLE90W3RdPXIsanRbcl09ZSxEdC5wdWJsaXNoKFwiYWRkUGF0dGVyblwiLGUpfX07eS5TaGFkaW5nUGF0dGVybj1NLHkuVGlsaW5nUGF0dGVybj1xLHkuYWRkU2hhZGluZ1BhdHRlcm49ZnVuY3Rpb24odCxlKXtyZXR1cm4gUihcImFkZFNoYWRpbmdQYXR0ZXJuKClcIiksWXQodCxlKSx0aGlzfSx5LmJlZ2luVGlsaW5nUGF0dGVybj1mdW5jdGlvbih0KXtSKFwiYmVnaW5UaWxpbmdQYXR0ZXJuKClcIikseXIodC5ib3VuZGluZ0JveFswXSx0LmJvdW5kaW5nQm94WzFdLHQuYm91bmRpbmdCb3hbMl0tdC5ib3VuZGluZ0JveFswXSx0LmJvdW5kaW5nQm94WzNdLXQuYm91bmRpbmdCb3hbMV0sdC5tYXRyaXgpfSx5LmVuZFRpbGluZ1BhdHRlcm49ZnVuY3Rpb24odCxlKXtSKFwiZW5kVGlsaW5nUGF0dGVybigpXCIpLGUuc3RyZWFtPW90WyRdLmpvaW4oXCJcXG5cIiksWXQodCxlKSxEdC5wdWJsaXNoKFwiZW5kVGlsaW5nUGF0dGVyblwiLGUpLEh0LnBvcCgpLnJlc3RvcmUoKX07dmFyIEp0LFh0PXkuX19wcml2YXRlX18ubmV3T2JqZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9S3QoKTtyZXR1cm4gWnQodCwhMCksdH0sS3Q9eS5fX3ByaXZhdGVfXy5uZXdPYmplY3REZWZlcnJlZD1mdW5jdGlvbigpe3JldHVybiBldCsrLHJ0W2V0XT1mdW5jdGlvbigpe3JldHVybiBpdH0sZXR9LFp0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9XCJib29sZWFuXCI9PXR5cGVvZiBlJiZlLHJ0W3RdPWl0LGUmJmx0KHQrXCIgMCBvYmpcIiksdH0sJHQ9eS5fX3ByaXZhdGVfXy5uZXdBZGRpdGlvbmFsT2JqZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9e29iaklkOkt0KCksY29udGVudDpcIlwifTtyZXR1cm4gYXQucHVzaCh0KSx0fSxRdD1LdCgpLHRlPUt0KCksZWU9eS5fX3ByaXZhdGVfXy5kZWNvZGVDb2xvclN0cmluZz1mdW5jdGlvbih0KXt2YXIgZT10LnNwbGl0KFwiIFwiKTtpZigyIT09ZS5sZW5ndGh8fFwiZ1wiIT09ZVsxXSYmXCJHXCIhPT1lWzFdKTUhPT1lLmxlbmd0aHx8XCJrXCIhPT1lWzRdJiZcIktcIiE9PWVbNF18fChlPVsoMS1lWzBdKSooMS1lWzNdKSwoMS1lWzFdKSooMS1lWzNdKSwoMS1lWzJdKSooMS1lWzNdKSxcInJcIl0pO2Vsc2V7dmFyIHI9cGFyc2VGbG9hdChlWzBdKTtlPVtyLHIscixcInJcIl19Zm9yKHZhciBuPVwiI1wiLGk9MDtpPDM7aSsrKW4rPShcIjBcIitNYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGVbaV0pKS50b1N0cmluZygxNikpLnNsaWNlKC0yKTtyZXR1cm4gbn0scmU9eS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZz1mdW5jdGlvbihlKXt2YXIgcjtcInN0cmluZ1wiPT10eXBlb2YgZSYmKGU9e2NoMTplfSk7dmFyIG49ZS5jaDEsaT1lLmNoMixhPWUuY2gzLG89ZS5jaDQscz1cImRyYXdcIj09PWUucGRmQ29sb3JUeXBlP1tcIkdcIixcIlJHXCIsXCJLXCJdOltcImdcIixcInJnXCIsXCJrXCJdO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBuJiZcIiNcIiE9PW4uY2hhckF0KDApKXt2YXIgdT1uZXcgaChuKTtpZih1Lm9rKW49dS50b0hleCgpO2Vsc2UgaWYoIS9eXFxkKlxcLj9cXGQqJC8udGVzdChuKSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29sb3IgXCInK24rJ1wiIHBhc3NlZCB0byBqc1BERi5lbmNvZGVDb2xvclN0cmluZy4nKX1pZihcInN0cmluZ1wiPT10eXBlb2YgbiYmL14jWzAtOUEtRmEtZl17M30kLy50ZXN0KG4pJiYobj1cIiNcIituWzFdK25bMV0rblsyXStuWzJdK25bM10rblszXSksXCJzdHJpbmdcIj09dHlwZW9mIG4mJi9eI1swLTlBLUZhLWZdezZ9JC8udGVzdChuKSl7dmFyIGM9cGFyc2VJbnQobi5zdWJzdHIoMSksMTYpO249Yz4+MTYmMjU1LGk9Yz4+OCYyNTUsYT0yNTUmY31pZih2b2lkIDA9PT1pfHx2b2lkIDA9PT1vJiZuPT09aSYmaT09PWEpcj1cInN0cmluZ1wiPT10eXBlb2Ygbj9uK1wiIFwiK3NbMF06Mj09PWUucHJlY2lzaW9uP1Qobi8yNTUpK1wiIFwiK3NbMF06eihuLzI1NSkrXCIgXCIrc1swXTtlbHNlIGlmKHZvaWQgMD09PW98fFwib2JqZWN0XCI9PT10KG8pKXtpZihvJiYhaXNOYU4oby5hKSYmMD09PW8uYSlyZXR1cm5bXCIxLlwiLFwiMS5cIixcIjEuXCIsc1sxXV0uam9pbihcIiBcIik7cj1cInN0cmluZ1wiPT10eXBlb2Ygbj9bbixpLGEsc1sxXV0uam9pbihcIiBcIik6Mj09PWUucHJlY2lzaW9uP1tUKG4vMjU1KSxUKGkvMjU1KSxUKGEvMjU1KSxzWzFdXS5qb2luKFwiIFwiKTpbeihuLzI1NSkseihpLzI1NSkseihhLzI1NSksc1sxXV0uam9pbihcIiBcIil9ZWxzZSByPVwic3RyaW5nXCI9PXR5cGVvZiBuP1tuLGksYSxvLHNbMl1dLmpvaW4oXCIgXCIpOjI9PT1lLnByZWNpc2lvbj9bVChuKSxUKGkpLFQoYSksVChvKSxzWzJdXS5qb2luKFwiIFwiKTpbeihuKSx6KGkpLHooYSkseihvKSxzWzJdXS5qb2luKFwiIFwiKTtyZXR1cm4gcn0sbmU9eS5fX3ByaXZhdGVfXy5nZXRGaWx0ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIGN9LGllPXkuX19wcml2YXRlX18ucHV0U3RyZWFtPWZ1bmN0aW9uKHQpe3ZhciBlPSh0PXR8fHt9KS5kYXRhfHxcIlwiLHI9dC5maWx0ZXJzfHxuZSgpLG49dC5hbHJlYWR5QXBwbGllZEZpbHRlcnN8fFtdLGk9dC5hZGRMZW5ndGgxfHwhMSxhPWUubGVuZ3RoLG89dC5vYmplY3RJZCxzPWZ1bmN0aW9uKHQpe3JldHVybiB0fTtpZihudWxsIT09bSYmdm9pZCAwPT09byl0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RJZCBtdXN0IGJlIHBhc3NlZCB0byBwdXRTdHJlYW0gZm9yIGZpbGUgZW5jcnlwdGlvblwiKTtudWxsIT09bSYmKHM9T2UuZW5jcnlwdG9yKG8sMCkpO3ZhciB1PXt9OyEwPT09ciYmKHI9W1wiRmxhdGVFbmNvZGVcIl0pO3ZhciBjPXQuYWRkaXRpb25hbEtleVZhbHVlc3x8W10sbD0odT12b2lkIDAhPT1FLkFQSS5wcm9jZXNzRGF0YUJ5RmlsdGVycz9FLkFQSS5wcm9jZXNzRGF0YUJ5RmlsdGVycyhlLHIpOntkYXRhOmUscmV2ZXJzZUNoYWluOltdfSkucmV2ZXJzZUNoYWluKyhBcnJheS5pc0FycmF5KG4pP24uam9pbihcIiBcIik6bi50b1N0cmluZygpKTtpZigwIT09dS5kYXRhLmxlbmd0aCYmKGMucHVzaCh7a2V5OlwiTGVuZ3RoXCIsdmFsdWU6dS5kYXRhLmxlbmd0aH0pLCEwPT09aSYmYy5wdXNoKHtrZXk6XCJMZW5ndGgxXCIsdmFsdWU6YX0pKSwwIT1sLmxlbmd0aClpZihsLnNwbGl0KFwiL1wiKS5sZW5ndGgtMT09MSljLnB1c2goe2tleTpcIkZpbHRlclwiLHZhbHVlOmx9KTtlbHNle2MucHVzaCh7a2V5OlwiRmlsdGVyXCIsdmFsdWU6XCJbXCIrbCtcIl1cIn0pO2Zvcih2YXIgaD0wO2g8Yy5sZW5ndGg7aCs9MSlpZihcIkRlY29kZVBhcm1zXCI9PT1jW2hdLmtleSl7Zm9yKHZhciBmPVtdLGQ9MDtkPHUucmV2ZXJzZUNoYWluLnNwbGl0KFwiL1wiKS5sZW5ndGgtMTtkKz0xKWYucHVzaChcIm51bGxcIik7Zi5wdXNoKGNbaF0udmFsdWUpLGNbaF0udmFsdWU9XCJbXCIrZi5qb2luKFwiIFwiKStcIl1cIn19bHQoXCI8PFwiKTtmb3IodmFyIHA9MDtwPGMubGVuZ3RoO3ArKylsdChcIi9cIitjW3BdLmtleStcIiBcIitjW3BdLnZhbHVlKTtsdChcIj4+XCIpLDAhPT11LmRhdGEubGVuZ3RoJiYobHQoXCJzdHJlYW1cIiksbHQocyh1LmRhdGEpKSxsdChcImVuZHN0cmVhbVwiKSl9LGFlPXkuX19wcml2YXRlX18ucHV0UGFnZT1mdW5jdGlvbih0KXt2YXIgZT10Lm51bWJlcixyPXQuZGF0YSxuPXQub2JqSWQsaT10LmNvbnRlbnRzT2JqSWQ7WnQobiwhMCksbHQoXCI8PC9UeXBlIC9QYWdlXCIpLGx0KFwiL1BhcmVudCBcIit0LnJvb3REaWN0aW9uYXJ5T2JqSWQrXCIgMCBSXCIpLGx0KFwiL1Jlc291cmNlcyBcIit0LnJlc291cmNlRGljdGlvbmFyeU9iaklkK1wiIDAgUlwiKSxsdChcIi9NZWRpYUJveCBbXCIrcGFyc2VGbG9hdChCKHQubWVkaWFCb3guYm90dG9tTGVmdFgpKStcIiBcIitwYXJzZUZsb2F0KEIodC5tZWRpYUJveC5ib3R0b21MZWZ0WSkpK1wiIFwiK0IodC5tZWRpYUJveC50b3BSaWdodFgpK1wiIFwiK0IodC5tZWRpYUJveC50b3BSaWdodFkpK1wiXVwiKSxudWxsIT09dC5jcm9wQm94JiZsdChcIi9Dcm9wQm94IFtcIitCKHQuY3JvcEJveC5ib3R0b21MZWZ0WCkrXCIgXCIrQih0LmNyb3BCb3guYm90dG9tTGVmdFkpK1wiIFwiK0IodC5jcm9wQm94LnRvcFJpZ2h0WCkrXCIgXCIrQih0LmNyb3BCb3gudG9wUmlnaHRZKStcIl1cIiksbnVsbCE9PXQuYmxlZWRCb3gmJmx0KFwiL0JsZWVkQm94IFtcIitCKHQuYmxlZWRCb3guYm90dG9tTGVmdFgpK1wiIFwiK0IodC5ibGVlZEJveC5ib3R0b21MZWZ0WSkrXCIgXCIrQih0LmJsZWVkQm94LnRvcFJpZ2h0WCkrXCIgXCIrQih0LmJsZWVkQm94LnRvcFJpZ2h0WSkrXCJdXCIpLG51bGwhPT10LnRyaW1Cb3gmJmx0KFwiL1RyaW1Cb3ggW1wiK0IodC50cmltQm94LmJvdHRvbUxlZnRYKStcIiBcIitCKHQudHJpbUJveC5ib3R0b21MZWZ0WSkrXCIgXCIrQih0LnRyaW1Cb3gudG9wUmlnaHRYKStcIiBcIitCKHQudHJpbUJveC50b3BSaWdodFkpK1wiXVwiKSxudWxsIT09dC5hcnRCb3gmJmx0KFwiL0FydEJveCBbXCIrQih0LmFydEJveC5ib3R0b21MZWZ0WCkrXCIgXCIrQih0LmFydEJveC5ib3R0b21MZWZ0WSkrXCIgXCIrQih0LmFydEJveC50b3BSaWdodFgpK1wiIFwiK0IodC5hcnRCb3gudG9wUmlnaHRZKStcIl1cIiksXCJudW1iZXJcIj09dHlwZW9mIHQudXNlclVuaXQmJjEhPT10LnVzZXJVbml0JiZsdChcIi9Vc2VyVW5pdCBcIit0LnVzZXJVbml0KSxEdC5wdWJsaXNoKFwicHV0UGFnZVwiLHtvYmpJZDpuLHBhZ2VDb250ZXh0OlJ0W2VdLHBhZ2VOdW1iZXI6ZSxwYWdlOnJ9KSxsdChcIi9Db250ZW50cyBcIitpK1wiIDAgUlwiKSxsdChcIj4+XCIpLGx0KFwiZW5kb2JqXCIpO3ZhciBhPXIuam9pbihcIlxcblwiKTtyZXR1cm4gXz09PVMmJihhKz1cIlxcblFcIiksWnQoaSwhMCksaWUoe2RhdGE6YSxmaWx0ZXJzOm5lKCksb2JqZWN0SWQ6aX0pLGx0KFwiZW5kb2JqXCIpLG59LG9lPXkuX19wcml2YXRlX18ucHV0UGFnZXM9ZnVuY3Rpb24oKXt2YXIgdCxlLHI9W107Zm9yKHQ9MTt0PD1FdDt0KyspUnRbdF0ub2JqSWQ9S3QoKSxSdFt0XS5jb250ZW50c09iaklkPUt0KCk7Zm9yKHQ9MTt0PD1FdDt0Kyspci5wdXNoKGFlKHtudW1iZXI6dCxkYXRhOm90W3RdLG9iaklkOlJ0W3RdLm9iaklkLGNvbnRlbnRzT2JqSWQ6UnRbdF0uY29udGVudHNPYmpJZCxtZWRpYUJveDpSdFt0XS5tZWRpYUJveCxjcm9wQm94OlJ0W3RdLmNyb3BCb3gsYmxlZWRCb3g6UnRbdF0uYmxlZWRCb3gsdHJpbUJveDpSdFt0XS50cmltQm94LGFydEJveDpSdFt0XS5hcnRCb3gsdXNlclVuaXQ6UnRbdF0udXNlclVuaXQscm9vdERpY3Rpb25hcnlPYmpJZDpRdCxyZXNvdXJjZURpY3Rpb25hcnlPYmpJZDp0ZX0pKTtadChRdCwhMCksbHQoXCI8PC9UeXBlIC9QYWdlc1wiKTt2YXIgbj1cIi9LaWRzIFtcIjtmb3IoZT0wO2U8RXQ7ZSsrKW4rPXJbZV0rXCIgMCBSIFwiO2x0KG4rXCJdXCIpLGx0KFwiL0NvdW50IFwiK0V0KSxsdChcIj4+XCIpLGx0KFwiZW5kb2JqXCIpLER0LnB1Ymxpc2goXCJwb3N0UHV0UGFnZXNcIil9LHNlPWZ1bmN0aW9uKHQpe0R0LnB1Ymxpc2goXCJwdXRGb250XCIse2ZvbnQ6dCxvdXQ6bHQsbmV3T2JqZWN0Olh0LHB1dFN0cmVhbTppZX0pLCEwIT09dC5pc0FscmVhZHlQdXR0ZWQmJih0Lm9iamVjdE51bWJlcj1YdCgpLGx0KFwiPDxcIiksbHQoXCIvVHlwZSAvRm9udFwiKSxsdChcIi9CYXNlRm9udCAvXCIrQyh0LnBvc3RTY3JpcHROYW1lKSksbHQoXCIvU3VidHlwZSAvVHlwZTFcIiksXCJzdHJpbmdcIj09dHlwZW9mIHQuZW5jb2RpbmcmJmx0KFwiL0VuY29kaW5nIC9cIit0LmVuY29kaW5nKSxsdChcIi9GaXJzdENoYXIgMzJcIiksbHQoXCIvTGFzdENoYXIgMjU1XCIpLGx0KFwiPj5cIiksbHQoXCJlbmRvYmpcIikpfSx1ZT1mdW5jdGlvbih0KXt0Lm9iamVjdE51bWJlcj1YdCgpO3ZhciBlPVtdO2UucHVzaCh7a2V5OlwiVHlwZVwiLHZhbHVlOlwiL1hPYmplY3RcIn0pLGUucHVzaCh7a2V5OlwiU3VidHlwZVwiLHZhbHVlOlwiL0Zvcm1cIn0pLGUucHVzaCh7a2V5OlwiQkJveFwiLHZhbHVlOlwiW1wiK1tCKHQueCksQih0LnkpLEIodC54K3Qud2lkdGgpLEIodC55K3QuaGVpZ2h0KV0uam9pbihcIiBcIikrXCJdXCJ9KSxlLnB1c2goe2tleTpcIk1hdHJpeFwiLHZhbHVlOlwiW1wiK3QubWF0cml4LnRvU3RyaW5nKCkrXCJdXCJ9KTt2YXIgcj10LnBhZ2VzWzFdLmpvaW4oXCJcXG5cIik7aWUoe2RhdGE6cixhZGRpdGlvbmFsS2V5VmFsdWVzOmUsb2JqZWN0SWQ6dC5vYmplY3ROdW1iZXJ9KSxsdChcImVuZG9ialwiKX0sY2U9ZnVuY3Rpb24odCxlKXtlfHwoZT0yMSk7dmFyIHI9WHQoKSxuPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj1bXSxpPTEvKGUtMSk7Zm9yKHI9MDtyPDE7cis9aSluLnB1c2gocik7aWYobi5wdXNoKDEpLDAhPXRbMF0ub2Zmc2V0KXt2YXIgYT17b2Zmc2V0OjAsY29sb3I6dFswXS5jb2xvcn07dC51bnNoaWZ0KGEpfWlmKDEhPXRbdC5sZW5ndGgtMV0ub2Zmc2V0KXt2YXIgbz17b2Zmc2V0OjEsY29sb3I6dFt0Lmxlbmd0aC0xXS5jb2xvcn07dC5wdXNoKG8pfWZvcih2YXIgcz1cIlwiLHU9MCxjPTA7YzxuLmxlbmd0aDtjKyspe2ZvcihyPW5bY107cj50W3UrMV0ub2Zmc2V0Oyl1Kys7dmFyIGw9dFt1XS5vZmZzZXQsaD0oci1sKS8odFt1KzFdLm9mZnNldC1sKSxmPXRbdV0uY29sb3IsZD10W3UrMV0uY29sb3I7cys9dHQoTWF0aC5yb3VuZCgoMS1oKSpmWzBdK2gqZFswXSkudG9TdHJpbmcoMTYpKSt0dChNYXRoLnJvdW5kKCgxLWgpKmZbMV0raCpkWzFdKS50b1N0cmluZygxNikpK3R0KE1hdGgucm91bmQoKDEtaCkqZlsyXStoKmRbMl0pLnRvU3RyaW5nKDE2KSl9cmV0dXJuIHMudHJpbSgpfSh0LmNvbG9ycyxlKSxpPVtdO2kucHVzaCh7a2V5OlwiRnVuY3Rpb25UeXBlXCIsdmFsdWU6XCIwXCJ9KSxpLnB1c2goe2tleTpcIkRvbWFpblwiLHZhbHVlOlwiWzAuMCAxLjBdXCJ9KSxpLnB1c2goe2tleTpcIlNpemVcIix2YWx1ZTpcIltcIitlK1wiXVwifSksaS5wdXNoKHtrZXk6XCJCaXRzUGVyU2FtcGxlXCIsdmFsdWU6XCI4XCJ9KSxpLnB1c2goe2tleTpcIlJhbmdlXCIsdmFsdWU6XCJbMC4wIDEuMCAwLjAgMS4wIDAuMCAxLjBdXCJ9KSxpLnB1c2goe2tleTpcIkRlY29kZVwiLHZhbHVlOlwiWzAuMCAxLjAgMC4wIDEuMCAwLjAgMS4wXVwifSksaWUoe2RhdGE6bixhZGRpdGlvbmFsS2V5VmFsdWVzOmksYWxyZWFkeUFwcGxpZWRGaWx0ZXJzOltcIi9BU0NJSUhleERlY29kZVwiXSxvYmplY3RJZDpyfSksbHQoXCJlbmRvYmpcIiksdC5vYmplY3ROdW1iZXI9WHQoKSxsdChcIjw8IC9TaGFkaW5nVHlwZSBcIit0LnR5cGUpLGx0KFwiL0NvbG9yU3BhY2UgL0RldmljZVJHQlwiKTt2YXIgYT1cIi9Db29yZHMgW1wiK0IocGFyc2VGbG9hdCh0LmNvb3Jkc1swXSkpK1wiIFwiK0IocGFyc2VGbG9hdCh0LmNvb3Jkc1sxXSkpK1wiIFwiOzI9PT10LnR5cGU/YSs9QihwYXJzZUZsb2F0KHQuY29vcmRzWzJdKSkrXCIgXCIrQihwYXJzZUZsb2F0KHQuY29vcmRzWzNdKSk6YSs9QihwYXJzZUZsb2F0KHQuY29vcmRzWzJdKSkrXCIgXCIrQihwYXJzZUZsb2F0KHQuY29vcmRzWzNdKSkrXCIgXCIrQihwYXJzZUZsb2F0KHQuY29vcmRzWzRdKSkrXCIgXCIrQihwYXJzZUZsb2F0KHQuY29vcmRzWzVdKSksbHQoYSs9XCJdXCIpLHQubWF0cml4JiZsdChcIi9NYXRyaXggW1wiK3QubWF0cml4LnRvU3RyaW5nKCkrXCJdXCIpLGx0KFwiL0Z1bmN0aW9uIFwiK3IrXCIgMCBSXCIpLGx0KFwiL0V4dGVuZCBbdHJ1ZSB0cnVlXVwiKSxsdChcIj4+XCIpLGx0KFwiZW5kb2JqXCIpfSxsZT1mdW5jdGlvbih0LGUpe3ZhciByPUt0KCksbj1YdCgpO2UucHVzaCh7cmVzb3VyY2VzT2lkOnIsb2JqZWN0T2lkOm59KSx0Lm9iamVjdE51bWJlcj1uO3ZhciBpPVtdO2kucHVzaCh7a2V5OlwiVHlwZVwiLHZhbHVlOlwiL1BhdHRlcm5cIn0pLGkucHVzaCh7a2V5OlwiUGF0dGVyblR5cGVcIix2YWx1ZTpcIjFcIn0pLGkucHVzaCh7a2V5OlwiUGFpbnRUeXBlXCIsdmFsdWU6XCIxXCJ9KSxpLnB1c2goe2tleTpcIlRpbGluZ1R5cGVcIix2YWx1ZTpcIjFcIn0pLGkucHVzaCh7a2V5OlwiQkJveFwiLHZhbHVlOlwiW1wiK3QuYm91bmRpbmdCb3gubWFwKEIpLmpvaW4oXCIgXCIpK1wiXVwifSksaS5wdXNoKHtrZXk6XCJYU3RlcFwiLHZhbHVlOkIodC54U3RlcCl9KSxpLnB1c2goe2tleTpcIllTdGVwXCIsdmFsdWU6Qih0LnlTdGVwKX0pLGkucHVzaCh7a2V5OlwiUmVzb3VyY2VzXCIsdmFsdWU6citcIiAwIFJcIn0pLHQubWF0cml4JiZpLnB1c2goe2tleTpcIk1hdHJpeFwiLHZhbHVlOlwiW1wiK3QubWF0cml4LnRvU3RyaW5nKCkrXCJdXCJ9KSxpZSh7ZGF0YTp0LnN0cmVhbSxhZGRpdGlvbmFsS2V5VmFsdWVzOmksb2JqZWN0SWQ6dC5vYmplY3ROdW1iZXJ9KSxsdChcImVuZG9ialwiKX0saGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQub2JqZWN0TnVtYmVyPVh0KCksbHQoXCI8PFwiKSx0KXN3aXRjaChlKXtjYXNlXCJvcGFjaXR5XCI6bHQoXCIvY2EgXCIrVCh0W2VdKSk7YnJlYWs7Y2FzZVwic3Ryb2tlLW9wYWNpdHlcIjpsdChcIi9DQSBcIitUKHRbZV0pKX1sdChcIj4+XCIpLGx0KFwiZW5kb2JqXCIpfSxmZT1mdW5jdGlvbih0KXtadCh0LnJlc291cmNlc09pZCwhMCksbHQoXCI8PFwiKSxsdChcIi9Qcm9jU2V0IFsvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJXVwiKSxmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiBsdChcIi9Gb250IDw8XCIpLEZ0KUZ0Lmhhc093blByb3BlcnR5KHQpJiYoITE9PT12fHwhMD09PXYmJmIuaGFzT3duUHJvcGVydHkodCkpJiZsdChcIi9cIit0K1wiIFwiK0Z0W3RdLm9iamVjdE51bWJlcitcIiAwIFJcIik7bHQoXCI+PlwiKX0oKSxmdW5jdGlvbigpe2lmKE9iamVjdC5rZXlzKGp0KS5sZW5ndGg+MCl7Zm9yKHZhciB0IGluIGx0KFwiL1NoYWRpbmcgPDxcIiksanQpanQuaGFzT3duUHJvcGVydHkodCkmJmp0W3RdaW5zdGFuY2VvZiBNJiZqdFt0XS5vYmplY3ROdW1iZXI+PTAmJmx0KFwiL1wiK3QrXCIgXCIranRbdF0ub2JqZWN0TnVtYmVyK1wiIDAgUlwiKTtEdC5wdWJsaXNoKFwicHV0U2hhZGluZ1BhdHRlcm5EaWN0XCIpLGx0KFwiPj5cIil9fSgpLGZ1bmN0aW9uKHQpe2lmKE9iamVjdC5rZXlzKGp0KS5sZW5ndGg+MCl7Zm9yKHZhciBlIGluIGx0KFwiL1BhdHRlcm4gPDxcIiksanQpanQuaGFzT3duUHJvcGVydHkoZSkmJmp0W2VdaW5zdGFuY2VvZiB5LlRpbGluZ1BhdHRlcm4mJmp0W2VdLm9iamVjdE51bWJlcj49MCYmanRbZV0ub2JqZWN0TnVtYmVyPHQmJmx0KFwiL1wiK2UrXCIgXCIranRbZV0ub2JqZWN0TnVtYmVyK1wiIDAgUlwiKTtEdC5wdWJsaXNoKFwicHV0VGlsaW5nUGF0dGVybkRpY3RcIiksbHQoXCI+PlwiKX19KHQub2JqZWN0T2lkKSxmdW5jdGlvbigpe2lmKE9iamVjdC5rZXlzKEJ0KS5sZW5ndGg+MCl7dmFyIHQ7Zm9yKHQgaW4gbHQoXCIvRXh0R1N0YXRlIDw8XCIpLEJ0KUJ0Lmhhc093blByb3BlcnR5KHQpJiZCdFt0XS5vYmplY3ROdW1iZXI+PTAmJmx0KFwiL1wiK3QrXCIgXCIrQnRbdF0ub2JqZWN0TnVtYmVyK1wiIDAgUlwiKTtEdC5wdWJsaXNoKFwicHV0R1N0YXRlRGljdFwiKSxsdChcIj4+XCIpfX0oKSxmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiBsdChcIi9YT2JqZWN0IDw8XCIpLHp0KXp0Lmhhc093blByb3BlcnR5KHQpJiZ6dFt0XS5vYmplY3ROdW1iZXI+PTAmJmx0KFwiL1wiK3QrXCIgXCIrenRbdF0ub2JqZWN0TnVtYmVyK1wiIDAgUlwiKTtEdC5wdWJsaXNoKFwicHV0WG9iamVjdERpY3RcIiksbHQoXCI+PlwiKX0oKSxsdChcIj4+XCIpLGx0KFwiZW5kb2JqXCIpfSxkZT1mdW5jdGlvbih0KXtJdFt0LmZvbnROYW1lXT1JdFt0LmZvbnROYW1lXXx8e30sSXRbdC5mb250TmFtZV1bdC5mb250U3R5bGVdPXQuaWR9LHBlPWZ1bmN0aW9uKHQsZSxyLG4saSl7dmFyIGE9e2lkOlwiRlwiKyhPYmplY3Qua2V5cyhGdCkubGVuZ3RoKzEpLnRvU3RyaW5nKDEwKSxwb3N0U2NyaXB0TmFtZTp0LGZvbnROYW1lOmUsZm9udFN0eWxlOnIsZW5jb2Rpbmc6bixpc1N0YW5kYXJkRm9udDppfHwhMSxtZXRhZGF0YTp7fX07cmV0dXJuIER0LnB1Ymxpc2goXCJhZGRGb250XCIse2ZvbnQ6YSxpbnN0YW5jZTp0aGlzfSksRnRbYS5pZF09YSxkZShhKSxhLmlkfSxnZT15Ll9fcHJpdmF0ZV9fLnBkZkVzY2FwZT15LnBkZkVzY2FwZT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciByLG4saSxhLG8scyx1LGMsbDtpZihpPShlPWV8fHt9KS5zb3VyY2VFbmNvZGluZ3x8XCJVbmljb2RlXCIsbz1lLm91dHB1dEVuY29kaW5nLChlLmF1dG9lbmNvZGV8fG8pJiZGdFtBdF0ubWV0YWRhdGEmJkZ0W0F0XS5tZXRhZGF0YVtpXSYmRnRbQXRdLm1ldGFkYXRhW2ldLmVuY29kaW5nJiYoYT1GdFtBdF0ubWV0YWRhdGFbaV0uZW5jb2RpbmcsIW8mJkZ0W0F0XS5lbmNvZGluZyYmKG89RnRbQXRdLmVuY29kaW5nKSwhbyYmYS5jb2RlUGFnZXMmJihvPWEuY29kZVBhZ2VzWzBdKSxcInN0cmluZ1wiPT10eXBlb2YgbyYmKG89YVtvXSksbykpe2Zvcih1PSExLHM9W10scj0wLG49dC5sZW5ndGg7cjxuO3IrKykoYz1vW3QuY2hhckNvZGVBdChyKV0pP3MucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTpzLnB1c2godFtyXSksc1tyXS5jaGFyQ29kZUF0KDApPj44JiYodT0hMCk7dD1zLmpvaW4oXCJcIil9Zm9yKHI9dC5sZW5ndGg7dm9pZCAwPT09dSYmMCE9PXI7KXQuY2hhckNvZGVBdChyLTEpPj44JiYodT0hMCksci0tO2lmKCF1KXJldHVybiB0O2ZvcihzPWUubm9CT00/W106WzI1NCwyNTVdLHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspe2lmKChsPShjPXQuY2hhckNvZGVBdChyKSk+PjgpPj44KXRocm93IG5ldyBFcnJvcihcIkNoYXJhY3RlciBhdCBwb3NpdGlvbiBcIityK1wiIG9mIHN0cmluZyAnXCIrdCtcIicgZXhjZWVkcyAxNmJpdHMuIENhbm5vdCBiZSBlbmNvZGVkIGludG8gVUNTLTIgQkVcIik7cy5wdXNoKGwpLHMucHVzaChjLShsPDw4KSl9cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkodm9pZCAwLHMpfSh0LGUpLnJlcGxhY2UoL1xcXFwvZyxcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1xcKC9nLFwiXFxcXChcIikucmVwbGFjZSgvXFwpL2csXCJcXFxcKVwiKX0sbWU9eS5fX3ByaXZhdGVfXy5iZWdpblBhZ2U9ZnVuY3Rpb24odCl7b3RbKytFdF09W10sUnRbRXRdPXtvYmpJZDowLGNvbnRlbnRzT2JqSWQ6MCx1c2VyVW5pdDpOdW1iZXIoZiksYXJ0Qm94Om51bGwsYmxlZWRCb3g6bnVsbCxjcm9wQm94Om51bGwsdHJpbUJveDpudWxsLG1lZGlhQm94Ontib3R0b21MZWZ0WDowLGJvdHRvbUxlZnRZOjAsdG9wUmlnaHRYOk51bWJlcih0WzBdKSx0b3BSaWdodFk6TnVtYmVyKHRbMV0pfX0seWUoRXQpLGN0KG90WyRdKX0sdmU9ZnVuY3Rpb24odCxlKXt2YXIgcixpLGE7c3dpdGNoKG49ZXx8bixcInN0cmluZ1wiPT10eXBlb2YgdCYmKHI9eCh0LnRvTG93ZXJDYXNlKCkpLEFycmF5LmlzQXJyYXkocikmJihpPXJbMF0sYT1yWzFdKSksQXJyYXkuaXNBcnJheSh0KSYmKGk9dFswXSpTdCxhPXRbMV0qU3QpLGlzTmFOKGkpJiYoaT1zWzBdLGE9c1sxXSksKGk+MTQ0MDB8fGE+MTQ0MDApJiYoby53YXJuKFwiQSBwYWdlIGluIGEgUERGIGNhbiBub3QgYmUgd2lkZXIgb3IgdGFsbGVyIHRoYW4gMTQ0MDAgdXNlclVuaXQuIGpzUERGIGxpbWl0cyB0aGUgd2lkdGgvaGVpZ2h0IHRvIDE0NDAwXCIpLGk9TWF0aC5taW4oMTQ0MDAsaSksYT1NYXRoLm1pbigxNDQwMCxhKSkscz1baSxhXSxuLnN1YnN0cigwLDEpKXtjYXNlXCJsXCI6YT5pJiYocz1bYSxpXSk7YnJlYWs7Y2FzZVwicFwiOmk+YSYmKHM9W2EsaV0pfW1lKHMpLFFlKFplKSxsdChzciksMCE9PWRyJiZsdChkcitcIiBKXCIpLDAhPT1wciYmbHQocHIrXCIgalwiKSxEdC5wdWJsaXNoKFwiYWRkUGFnZVwiLHtwYWdlTnVtYmVyOkV0fSl9LGJlPWZ1bmN0aW9uKHQpe3Q+MCYmdDw9RXQmJihvdC5zcGxpY2UodCwxKSxSdC5zcGxpY2UodCwxKSxFdC0tLCQ+RXQmJigkPUV0KSx0aGlzLnNldFBhZ2UoJCkpfSx5ZT1mdW5jdGlvbih0KXt0PjAmJnQ8PUV0JiYoJD10KX0sd2U9eS5fX3ByaXZhdGVfXy5nZXROdW1iZXJPZlBhZ2VzPXkuZ2V0TnVtYmVyT2ZQYWdlcz1mdW5jdGlvbigpe3JldHVybiBvdC5sZW5ndGgtMX0sTmU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGk9dm9pZCAwO3JldHVybiByPXJ8fHt9LHQ9dm9pZCAwIT09dD90OkZ0W0F0XS5mb250TmFtZSxlPXZvaWQgMCE9PWU/ZTpGdFtBdF0uZm9udFN0eWxlLG49dC50b0xvd2VyQ2FzZSgpLHZvaWQgMCE9PUl0W25dJiZ2b2lkIDAhPT1JdFtuXVtlXT9pPUl0W25dW2VdOnZvaWQgMCE9PUl0W3RdJiZ2b2lkIDAhPT1JdFt0XVtlXT9pPUl0W3RdW2VdOiExPT09ci5kaXNhYmxlV2FybmluZyYmby53YXJuKFwiVW5hYmxlIHRvIGxvb2sgdXAgZm9udCBsYWJlbCBmb3IgZm9udCAnXCIrdCtcIicsICdcIitlK1wiJy4gUmVmZXIgdG8gZ2V0Rm9udExpc3QoKSBmb3IgYXZhaWxhYmxlIGZvbnRzLlwiKSxpfHxyLm5vRmFsbGJhY2t8fG51bGw9PShpPUl0LnRpbWVzW2VdKSYmKGk9SXQudGltZXMubm9ybWFsKSxpfSxMZT15Ll9fcHJpdmF0ZV9fLnB1dEluZm89ZnVuY3Rpb24oKXt2YXIgdD1YdCgpLGU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9O2Zvcih2YXIgciBpbiBudWxsIT09bSYmKGU9T2UuZW5jcnlwdG9yKHQsMCkpLGx0KFwiPDxcIiksbHQoXCIvUHJvZHVjZXIgKFwiK2dlKGUoXCJqc1BERiBcIitFLnZlcnNpb24pKStcIilcIikseHQpeHQuaGFzT3duUHJvcGVydHkocikmJnh0W3JdJiZsdChcIi9cIityLnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkrci5zdWJzdHIoMSkrXCIgKFwiK2dlKGUoeHRbcl0pKStcIilcIik7bHQoXCIvQ3JlYXRpb25EYXRlIChcIitnZShlKFcpKStcIilcIiksbHQoXCI+PlwiKSxsdChcImVuZG9ialwiKX0seGU9eS5fX3ByaXZhdGVfXy5wdXRDYXRhbG9nPWZ1bmN0aW9uKHQpe3ZhciBlPSh0PXR8fHt9KS5yb290RGljdGlvbmFyeU9iaklkfHxRdDtzd2l0Y2goWHQoKSxsdChcIjw8XCIpLGx0KFwiL1R5cGUgL0NhdGFsb2dcIiksbHQoXCIvUGFnZXMgXCIrZStcIiAwIFJcIiksZ3R8fChndD1cImZ1bGx3aWR0aFwiKSxndCl7Y2FzZVwiZnVsbHdpZHRoXCI6bHQoXCIvT3BlbkFjdGlvbiBbMyAwIFIgL0ZpdEggbnVsbF1cIik7YnJlYWs7Y2FzZVwiZnVsbGhlaWdodFwiOmx0KFwiL09wZW5BY3Rpb24gWzMgMCBSIC9GaXRWIG51bGxdXCIpO2JyZWFrO2Nhc2VcImZ1bGxwYWdlXCI6bHQoXCIvT3BlbkFjdGlvbiBbMyAwIFIgL0ZpdF1cIik7YnJlYWs7Y2FzZVwib3JpZ2luYWxcIjpsdChcIi9PcGVuQWN0aW9uIFszIDAgUiAvWFlaIG51bGwgbnVsbCAxXVwiKTticmVhaztkZWZhdWx0OnZhciByPVwiXCIrZ3Q7XCIlXCI9PT1yLnN1YnN0cihyLmxlbmd0aC0xKSYmKGd0PXBhcnNlSW50KGd0KS8xMDApLFwibnVtYmVyXCI9PXR5cGVvZiBndCYmbHQoXCIvT3BlbkFjdGlvbiBbMyAwIFIgL1hZWiBudWxsIG51bGwgXCIrVChndCkrXCJdXCIpfXN3aXRjaCh3dHx8KHd0PVwiY29udGludW91c1wiKSx3dCl7Y2FzZVwiY29udGludW91c1wiOmx0KFwiL1BhZ2VMYXlvdXQgL09uZUNvbHVtblwiKTticmVhaztjYXNlXCJzaW5nbGVcIjpsdChcIi9QYWdlTGF5b3V0IC9TaW5nbGVQYWdlXCIpO2JyZWFrO2Nhc2VcInR3b1wiOmNhc2VcInR3b2xlZnRcIjpsdChcIi9QYWdlTGF5b3V0IC9Ud29Db2x1bW5MZWZ0XCIpO2JyZWFrO2Nhc2VcInR3b3JpZ2h0XCI6bHQoXCIvUGFnZUxheW91dCAvVHdvQ29sdW1uUmlnaHRcIil9YnQmJmx0KFwiL1BhZ2VNb2RlIC9cIitidCksRHQucHVibGlzaChcInB1dENhdGFsb2dcIiksbHQoXCI+PlwiKSxsdChcImVuZG9ialwiKX0sQWU9eS5fX3ByaXZhdGVfXy5wdXRUcmFpbGVyPWZ1bmN0aW9uKCl7bHQoXCJ0cmFpbGVyXCIpLGx0KFwiPDxcIiksbHQoXCIvU2l6ZSBcIisoZXQrMSkpLGx0KFwiL1Jvb3QgXCIrZXQrXCIgMCBSXCIpLGx0KFwiL0luZm8gXCIrKGV0LTEpK1wiIDAgUlwiKSxudWxsIT09bSYmbHQoXCIvRW5jcnlwdCBcIitPZS5vaWQrXCIgMCBSXCIpLGx0KFwiL0lEIFsgPFwiK1YrXCI+IDxcIitWK1wiPiBdXCIpLGx0KFwiPj5cIil9LFNlPXkuX19wcml2YXRlX18ucHV0SGVhZGVyPWZ1bmN0aW9uKCl7bHQoXCIlUERGLVwiK3cpLGx0KFwiJcK6w5/CrMOgXCIpfSxfZT15Ll9fcHJpdmF0ZV9fLnB1dFhSZWY9ZnVuY3Rpb24oKXt2YXIgdD1cIjAwMDAwMDAwMDBcIjtsdChcInhyZWZcIiksbHQoXCIwIFwiKyhldCsxKSksbHQoXCIwMDAwMDAwMDAwIDY1NTM1IGYgXCIpO2Zvcih2YXIgZT0xO2U8PWV0O2UrKylcImZ1bmN0aW9uXCI9PXR5cGVvZiBydFtlXT9sdCgodCtydFtlXSgpKS5zbGljZSgtMTApK1wiIDAwMDAwIG4gXCIpOnZvaWQgMCE9PXJ0W2VdP2x0KCh0K3J0W2VdKS5zbGljZSgtMTApK1wiIDAwMDAwIG4gXCIpOmx0KFwiMDAwMDAwMDAwMCAwMDAwMCBuIFwiKX0sUGU9eS5fX3ByaXZhdGVfXy5idWlsZERvY3VtZW50PWZ1bmN0aW9uKCl7dmFyIHQ7ZXQ9MCxpdD0wLG50PVtdLHJ0PVtdLGF0PVtdLFF0PUt0KCksdGU9S3QoKSxjdChudCksRHQucHVibGlzaChcImJ1aWxkRG9jdW1lbnRcIiksU2UoKSxvZSgpLGZ1bmN0aW9uKCl7RHQucHVibGlzaChcInB1dEFkZGl0aW9uYWxPYmplY3RzXCIpO2Zvcih2YXIgdD0wO3Q8YXQubGVuZ3RoO3QrKyl7dmFyIGU9YXRbdF07WnQoZS5vYmpJZCwhMCksbHQoZS5jb250ZW50KSxsdChcImVuZG9ialwiKX1EdC5wdWJsaXNoKFwicG9zdFB1dEFkZGl0aW9uYWxPYmplY3RzXCIpfSgpLHQ9W10sZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gRnQpRnQuaGFzT3duUHJvcGVydHkodCkmJighMT09PXZ8fCEwPT09diYmYi5oYXNPd25Qcm9wZXJ0eSh0KSkmJnNlKEZ0W3RdKX0oKSxmdW5jdGlvbigpe3ZhciB0O2Zvcih0IGluIEJ0KUJ0Lmhhc093blByb3BlcnR5KHQpJiZoZShCdFt0XSl9KCksZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4genQpenQuaGFzT3duUHJvcGVydHkodCkmJnVlKHp0W3RdKX0oKSxmdW5jdGlvbih0KXt2YXIgZTtmb3IoZSBpbiBqdClqdC5oYXNPd25Qcm9wZXJ0eShlKSYmKGp0W2VdaW5zdGFuY2VvZiBNP2NlKGp0W2VdKTpqdFtlXWluc3RhbmNlb2YgcSYmbGUoanRbZV0sdCkpfSh0KSxEdC5wdWJsaXNoKFwicHV0UmVzb3VyY2VzXCIpLHQuZm9yRWFjaChmZSksZmUoe3Jlc291cmNlc09pZDp0ZSxvYmplY3RPaWQ6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9KSxEdC5wdWJsaXNoKFwicG9zdFB1dFJlc291cmNlc1wiKSxudWxsIT09bSYmKE9lLm9pZD1YdCgpLGx0KFwiPDxcIiksbHQoXCIvRmlsdGVyIC9TdGFuZGFyZFwiKSxsdChcIi9WIFwiK09lLnYpLGx0KFwiL1IgXCIrT2UuciksbHQoXCIvVSA8XCIrT2UudG9IZXhTdHJpbmcoT2UuVSkrXCI+XCIpLGx0KFwiL08gPFwiK09lLnRvSGV4U3RyaW5nKE9lLk8pK1wiPlwiKSxsdChcIi9QIFwiK09lLlApLGx0KFwiPj5cIiksbHQoXCJlbmRvYmpcIikpLExlKCkseGUoKTt2YXIgZT1pdDtyZXR1cm4gX2UoKSxBZSgpLGx0KFwic3RhcnR4cmVmXCIpLGx0KFwiXCIrZSksbHQoXCIlJUVPRlwiKSxjdChvdFskXSksbnQuam9pbihcIlxcblwiKX0sa2U9eS5fX3ByaXZhdGVfXy5nZXRCbG9iPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQmxvYihbZnQodCldLHt0eXBlOlwiYXBwbGljYXRpb24vcGRmXCJ9KX0sRmU9ZnVuY3Rpb24odCl7Zm9yKDt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKX0sSWU9ZnVuY3Rpb24odCl7dmFyIGUscj10LmRvY3VtZW50LG49ci5kb2N1bWVudEVsZW1lbnQsaT1yLmhlYWQsYT1yLmJvZHk7cmV0dXJuIGl8fChpPXIuY3JlYXRlRWxlbWVudChcImhlYWRcIiksbi5hcHBlbmRDaGlsZChpKSksYXx8KGE9ci5jcmVhdGVFbGVtZW50KFwiYm9keVwiKSxuLmFwcGVuZENoaWxkKGEpKSxGZShpKSxGZShhKSwoZT1yLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKSkuYXBwZW5kQ2hpbGQoci5jcmVhdGVUZXh0Tm9kZShcImh0bWwsIGJvZHkgeyBwYWRkaW5nOiAwOyBtYXJnaW46IDA7IH0gaWZyYW1lIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgYm9yZGVyOiAwO31cIikpLGkuYXBwZW5kQ2hpbGQoZSkse2RvY3VtZW50OnIsYm9keTphfX0sQ2U9eS5vdXRwdXQ9eS5fX3ByaXZhdGVfXy5vdXRwdXQ9KEp0PWZ1bmN0aW9uKHQsZSl7c3dpdGNoKFwic3RyaW5nXCI9PXR5cGVvZihlPWV8fHt9KT9lPXtmaWxlbmFtZTplfTplLmZpbGVuYW1lPWUuZmlsZW5hbWV8fFwiZ2VuZXJhdGVkLnBkZlwiLHQpe2Nhc2Ugdm9pZCAwOnJldHVybiBQZSgpO2Nhc2VcInNhdmVcIjp5LnNhdmUoZS5maWxlbmFtZSk7YnJlYWs7Y2FzZVwiYXJyYXlidWZmZXJcIjpyZXR1cm4gZnQoUGUoKSk7Y2FzZVwiYmxvYlwiOnJldHVybiBrZShQZSgpKTtjYXNlXCJibG9idXJpXCI6Y2FzZVwiYmxvYnVybFwiOmlmKHZvaWQgMCE9PWkuVVJMJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBpLlVSTC5jcmVhdGVPYmplY3RVUkwpcmV0dXJuIGkuVVJMJiZpLlVSTC5jcmVhdGVPYmplY3RVUkwoa2UoUGUoKSkpfHx2b2lkIDA7by53YXJuKFwiYmxvYnVybCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHlvdXIgc3lzdGVtLCBiZWNhdXNlIFVSTC5jcmVhdGVPYmplY3RVUkwgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuXCIpO2JyZWFrO2Nhc2VcImRhdGF1cmlzdHJpbmdcIjpjYXNlXCJkYXRhdXJsc3RyaW5nXCI6dmFyIHI9XCJcIixuPVBlKCk7dHJ5e3I9ZChuKX1jYXRjaChMKXtyPWQodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KG4pKSl9cmV0dXJuXCJkYXRhOmFwcGxpY2F0aW9uL3BkZjtmaWxlbmFtZT1cIitlbmNvZGVVUklDb21wb25lbnQoZS5maWxlbmFtZSkrXCI7YmFzZTY0LFwiK3I7Y2FzZVwicGRmb2JqZWN0bmV3d2luZG93XCI6aWYoXCJbb2JqZWN0IFdpbmRvd11cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKSl7dmFyIGE9XCJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9wZGZvYmplY3QvMi4xLjEvcGRmb2JqZWN0Lm1pbi5qc1wiLHM9IWUucGRmT2JqZWN0VXJsO3N8fChhPWUucGRmT2JqZWN0VXJsKTt2YXIgdT1pLm9wZW4oKTtpZihudWxsIT09dSl7dmFyIGM9SWUodSksbD1jLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIiksaD10aGlzO2wuc3JjPWEscyYmKGwuaW50ZWdyaXR5PVwic2hhNTEyLTR6ZS9hOS80anF1K3RYOWRmT3FKWVN2eVlkNU02cXVtLzNIcENMcisvSnFmMHdoYzM3VlVia3BOR0hSNy84cFNuQ0Z3NDdUMWZtSXB3QlY3VXlTaDNnPT1cIixsLmNyb3NzT3JpZ2luPVwiYW5vbnltb3VzXCIpLGwub25sb2FkPWZ1bmN0aW9uKCl7dS5QREZPYmplY3QuZW1iZWQoaC5vdXRwdXQoXCJkYXRhdXJsc3RyaW5nXCIpLGUpfSxjLmJvZHkuYXBwZW5kQ2hpbGQobCl9cmV0dXJuIHV9dGhyb3cgbmV3IEVycm9yKFwiVGhlIG9wdGlvbiBwZGZvYmplY3RuZXd3aW5kb3cganVzdCB3b3JrcyBpbiBhIGJyb3dzZXItZW52aXJvbm1lbnQuXCIpO2Nhc2VcInBkZmpzbmV3d2luZG93XCI6aWYoXCJbb2JqZWN0IFdpbmRvd11cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKSl7dmFyIGY9ZS5wZGZKc1VybHx8XCJleGFtcGxlcy9QREYuanMvd2ViL3ZpZXdlci5odG1sXCIscD1pLm9wZW4oKTtpZihudWxsIT09cCl7dmFyIGc9SWUocCksbT1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIiksdj0tMT09PWYuaW5kZXhPZihcIj9cIik/XCI/XCI6XCImXCI7aD10aGlzLG0uaWQ9XCJwZGZWaWV3ZXJcIixtLndpZHRoPVwiNTAwcHhcIixtLmhlaWdodD1cIjQwMHB4XCIsbS5zcmM9Zit2K1wiZmlsZT0mZG93bmxvYWROYW1lPVwiK2VuY29kZVVSSUNvbXBvbmVudChlLmZpbGVuYW1lKSxtLm9ubG9hZD1mdW5jdGlvbigpe3AuZG9jdW1lbnQudGl0bGU9ZS5maWxlbmFtZSxtLmNvbnRlbnRXaW5kb3cuUERGVmlld2VyQXBwbGljYXRpb24ub3BlbihoLm91dHB1dChcImJsb2J1cmxcIikpfSxnLmJvZHkuYXBwZW5kQ2hpbGQobSl9cmV0dXJuIHB9dGhyb3cgbmV3IEVycm9yKFwiVGhlIG9wdGlvbiBwZGZqc25ld3dpbmRvdyBqdXN0IHdvcmtzIGluIGEgYnJvd3Nlci1lbnZpcm9ubWVudC5cIik7Y2FzZVwiZGF0YXVybG5ld3dpbmRvd1wiOmlmKFwiW29iamVjdCBXaW5kb3ddXCIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaSkpdGhyb3cgbmV3IEVycm9yKFwiVGhlIG9wdGlvbiBkYXRhdXJsbmV3d2luZG93IGp1c3Qgd29ya3MgaW4gYSBicm93c2VyLWVudmlyb25tZW50LlwiKTt2YXIgYj1pLm9wZW4oKTtpZihudWxsIT09Yil7dmFyIHc9SWUoYiksTj13LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7Ti5zcmM9dGhpcy5vdXRwdXQoXCJkYXRhdXJpc3RyaW5nXCIsZSksdy5ib2R5LmFwcGVuZENoaWxkKE4pLGIuZG9jdW1lbnQudGl0bGU9ZS5maWxlbmFtZX1pZihifHxcInVuZGVmaW5lZFwiPT10eXBlb2Ygc2FmYXJpKXJldHVybiBiO2JyZWFrO2Nhc2VcImRhdGF1cmlcIjpjYXNlXCJkYXRhdXJsXCI6cmV0dXJuIGkuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm91dHB1dChcImRhdGF1cmlzdHJpbmdcIixlKTtkZWZhdWx0OnJldHVybiBudWxsfX0sSnQuZm9vPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBKdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9Y2F0Y2gocil7dmFyIHQ9ci5zdGFja3x8XCJcIjt+dC5pbmRleE9mKFwiIGF0IFwiKSYmKHQ9dC5zcGxpdChcIiBhdCBcIilbMV0pO3ZhciBlPVwiRXJyb3IgaW4gZnVuY3Rpb24gXCIrdC5zcGxpdChcIlxcblwiKVswXS5zcGxpdChcIjxcIilbMF0rXCI6IFwiK3IubWVzc2FnZTtpZighaS5jb25zb2xlKXRocm93IG5ldyBFcnJvcihlKTtpLmNvbnNvbGUuZXJyb3IoZSxyKSxpLmFsZXJ0JiZhbGVydChlKX19LEp0LmZvby5iYXI9SnQsSnQuZm9vKSxqZT1mdW5jdGlvbih0KXtyZXR1cm4hMD09PUFycmF5LmlzQXJyYXkoVHQpJiZUdC5pbmRleE9mKHQpPi0xfTtzd2l0Y2goYSl7Y2FzZVwicHRcIjpTdD0xO2JyZWFrO2Nhc2VcIm1tXCI6U3Q9NzIvMjUuNDticmVhaztjYXNlXCJjbVwiOlN0PTcyLzIuNTQ7YnJlYWs7Y2FzZVwiaW5cIjpTdD03MjticmVhaztjYXNlXCJweFwiOlN0PTE9PWplKFwicHhfc2NhbGluZ1wiKT8uNzU6OTYvNzI7YnJlYWs7Y2FzZVwicGNcIjpjYXNlXCJlbVwiOlN0PTEyO2JyZWFrO2Nhc2VcImV4XCI6U3Q9NjticmVhaztkZWZhdWx0OmlmKFwibnVtYmVyXCIhPXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdW5pdDogXCIrYSk7U3Q9YX12YXIgT2U9bnVsbDtLKCksWSgpO3ZhciBCZT15Ll9fcHJpdmF0ZV9fLmdldFBhZ2VJbmZvPXkuZ2V0UGFnZUluZm89ZnVuY3Rpb24odCl7aWYoaXNOYU4odCl8fHQlMSE9MCl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5nZXRQYWdlSW5mb1wiKTtyZXR1cm57b2JqSWQ6UnRbdF0ub2JqSWQscGFnZU51bWJlcjp0LHBhZ2VDb250ZXh0OlJ0W3RdfX0sTWU9eS5fX3ByaXZhdGVfXy5nZXRQYWdlSW5mb0J5T2JqSWQ9ZnVuY3Rpb24odCl7aWYoaXNOYU4odCl8fHQlMSE9MCl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5nZXRQYWdlSW5mb0J5T2JqSWRcIik7Zm9yKHZhciBlIGluIFJ0KWlmKFJ0W2VdLm9iaklkPT09dClicmVhaztyZXR1cm4gQmUoZSl9LHFlPXkuX19wcml2YXRlX18uZ2V0Q3VycmVudFBhZ2VJbmZvPXkuZ2V0Q3VycmVudFBhZ2VJbmZvPWZ1bmN0aW9uKCl7cmV0dXJue29iaklkOlJ0WyRdLm9iaklkLHBhZ2VOdW1iZXI6JCxwYWdlQ29udGV4dDpSdFskXX19O3kuYWRkUGFnZT1mdW5jdGlvbigpe3JldHVybiB2ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpc30seS5zZXRQYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHllLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjdC5jYWxsKHRoaXMsb3RbJF0pLHRoaXN9LHkuaW5zZXJ0UGFnZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGRQYWdlKCksdGhpcy5tb3ZlUGFnZSgkLHQpLHRoaXN9LHkubW92ZVBhZ2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuO2lmKHQ+ZSl7cj1vdFt0XSxuPVJ0W3RdO2Zvcih2YXIgaT10O2k+ZTtpLS0pb3RbaV09b3RbaS0xXSxSdFtpXT1SdFtpLTFdO290W2VdPXIsUnRbZV09bix0aGlzLnNldFBhZ2UoZSl9ZWxzZSBpZih0PGUpe3I9b3RbdF0sbj1SdFt0XTtmb3IodmFyIGE9dDthPGU7YSsrKW90W2FdPW90W2ErMV0sUnRbYV09UnRbYSsxXTtvdFtlXT1yLFJ0W2VdPW4sdGhpcy5zZXRQYWdlKGUpfXJldHVybiB0aGlzfSx5LmRlbGV0ZVBhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gYmUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXN9LHkuX19wcml2YXRlX18udGV4dD15LnRleHQ9ZnVuY3Rpb24oZSxyLG4saSxhKXt2YXIgbyxzLHUsYyxsLGgsZixkLHAsZz0oaT1pfHx7fSkuc2NvcGV8fHRoaXM7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUmJlwibnVtYmVyXCI9PXR5cGVvZiByJiYoXCJzdHJpbmdcIj09dHlwZW9mIG58fEFycmF5LmlzQXJyYXkobikpKXt2YXIgbT1uO249cixyPWUsZT1tfWlmKGFyZ3VtZW50c1szXWluc3RhbmNlb2YgV3Q9PTA/KHU9YXJndW1lbnRzWzRdLGM9YXJndW1lbnRzWzVdLFwib2JqZWN0XCI9PT10KGY9YXJndW1lbnRzWzNdKSYmbnVsbCE9PWZ8fChcInN0cmluZ1wiPT10eXBlb2YgdSYmKGM9dSx1PW51bGwpLFwic3RyaW5nXCI9PXR5cGVvZiBmJiYoYz1mLGY9bnVsbCksXCJudW1iZXJcIj09dHlwZW9mIGYmJih1PWYsZj1udWxsKSxpPXtmbGFnczpmLGFuZ2xlOnUsYWxpZ246Y30pKTooUihcIlRoZSB0cmFuc2Zvcm0gcGFyYW1ldGVyIG9mIHRleHQoKSB3aXRoIGEgTWF0cml4IHZhbHVlXCIpLHA9YSksaXNOYU4ocil8fGlzTmFOKG4pfHxudWxsPT1lKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi50ZXh0XCIpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gZzt2YXIgdix5PVwiXCIsdz1cIm51bWJlclwiPT10eXBlb2YgaS5saW5lSGVpZ2h0RmFjdG9yP2kubGluZUhlaWdodEZhY3RvcjpLZSxOPWcuaW50ZXJuYWwuc2NhbGVGYWN0b3I7ZnVuY3Rpb24gTCh0KXtyZXR1cm4gdD10LnNwbGl0KFwiXFx0XCIpLmpvaW4oQXJyYXkoaS5UYWJMZW58fDkpLmpvaW4oXCIgXCIpKSxnZSh0LGYpfWZ1bmN0aW9uIHgodCl7Zm9yKHZhciBlLHI9dC5jb25jYXQoKSxuPVtdLGk9ci5sZW5ndGg7aS0tOylcInN0cmluZ1wiPT10eXBlb2YoZT1yLnNoaWZ0KCkpP24ucHVzaChlKTpBcnJheS5pc0FycmF5KHQpJiYoMT09PWUubGVuZ3RofHx2b2lkIDA9PT1lWzFdJiZ2b2lkIDA9PT1lWzJdKT9uLnB1c2goZVswXSk6bi5wdXNoKFtlWzBdLGVbMV0sZVsyXV0pO3JldHVybiBufWZ1bmN0aW9uIEEodCxlKXt2YXIgcjtpZihcInN0cmluZ1wiPT10eXBlb2YgdClyPWUodClbMF07ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIG4saSxhPXQuY29uY2F0KCksbz1bXSxzPWEubGVuZ3RoO3MtLTspXCJzdHJpbmdcIj09dHlwZW9mKG49YS5zaGlmdCgpKT9vLnB1c2goZShuKVswXSk6QXJyYXkuaXNBcnJheShuKSYmXCJzdHJpbmdcIj09dHlwZW9mIG5bMF0mJihpPWUoblswXSxuWzFdLG5bMl0pLG8ucHVzaChbaVswXSxpWzFdLGlbMl1dKSk7cj1vfXJldHVybiByfXZhciBQPSExLGs9ITA7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpUD0hMDtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciBGPWUuY29uY2F0KCk7cz1bXTtmb3IodmFyIEksQz1GLmxlbmd0aDtDLS07KShcInN0cmluZ1wiIT10eXBlb2YoST1GLnNoaWZ0KCkpfHxBcnJheS5pc0FycmF5KEkpJiZcInN0cmluZ1wiIT10eXBlb2YgSVswXSkmJihrPSExKTtQPWt9aWYoITE9PT1QKXRocm93IG5ldyBFcnJvcignVHlwZSBvZiB0ZXh0IG11c3QgYmUgc3RyaW5nIG9yIEFycmF5LiBcIicrZSsnXCIgaXMgbm90IHJlY29nbml6ZWQuJyk7XCJzdHJpbmdcIj09dHlwZW9mIGUmJihlPWUubWF0Y2goL1tcXHI/XFxuXS8pP2Uuc3BsaXQoL1xcclxcbnxcXHJ8XFxuL2cpOltlXSk7dmFyIGo9cHQvZy5pbnRlcm5hbC5zY2FsZUZhY3RvcixPPWoqKHctMSk7c3dpdGNoKGkuYmFzZWxpbmUpe2Nhc2VcImJvdHRvbVwiOm4tPU87YnJlYWs7Y2FzZVwidG9wXCI6bis9ai1PO2JyZWFrO2Nhc2VcImhhbmdpbmdcIjpuKz1qLTIqTzticmVhaztjYXNlXCJtaWRkbGVcIjpuKz1qLzItT31pZigoaD1pLm1heFdpZHRofHwwKT4wJiYoXCJzdHJpbmdcIj09dHlwZW9mIGU/ZT1nLnNwbGl0VGV4dFRvU2l6ZShlLGgpOlwiW29iamVjdCBBcnJheV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSYmKGU9ZS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb25jYXQoZy5zcGxpdFRleHRUb1NpemUoZSxoKSl9LFtdKSkpLG89e3RleHQ6ZSx4OnIseTpuLG9wdGlvbnM6aSxtdXRleDp7cGRmRXNjYXBlOmdlLGFjdGl2ZUZvbnRLZXk6QXQsZm9udHM6RnQsYWN0aXZlRm9udFNpemU6cHR9fSxEdC5wdWJsaXNoKFwicHJlUHJvY2Vzc1RleHRcIixvKSxlPW8udGV4dCx1PShpPW8ub3B0aW9ucykuYW5nbGUscCBpbnN0YW5jZW9mIFd0PT0wJiZ1JiZcIm51bWJlclwiPT10eXBlb2YgdSl7dSo9TWF0aC5QSS8xODAsMD09PWkucm90YXRpb25EaXJlY3Rpb24mJih1PS11KSxfPT09UyYmKHU9LXUpO3ZhciBNPU1hdGguY29zKHUpLHE9TWF0aC5zaW4odSk7cD1uZXcgV3QoTSxxLC1xLE0sMCwwKX1lbHNlIHUmJnUgaW5zdGFuY2VvZiBXdCYmKHA9dSk7XyE9PVN8fHB8fChwPUd0KSx2b2lkIDAhPT0obD1pLmNoYXJTcGFjZXx8aHIpJiYoeSs9QihVKGwpKStcIiBUY1xcblwiLHRoaXMuc2V0Q2hhclNwYWNlKHRoaXMuZ2V0Q2hhclNwYWNlKCl8fDApKSx2b2lkIDAhPT0oZD1pLmhvcml6b250YWxTY2FsZSkmJih5Kz1CKDEwMCpkKStcIiBUelxcblwiKSxpLmxhbmc7dmFyIEU9LTEsRD12b2lkIDAhPT1pLnJlbmRlcmluZ01vZGU/aS5yZW5kZXJpbmdNb2RlOmkuc3Ryb2tlLFQ9Zy5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlQ29udGV4dDtzd2l0Y2goRCl7Y2FzZSAwOmNhc2UhMTpjYXNlXCJmaWxsXCI6RT0wO2JyZWFrO2Nhc2UgMTpjYXNlITA6Y2FzZVwic3Ryb2tlXCI6RT0xO2JyZWFrO2Nhc2UgMjpjYXNlXCJmaWxsVGhlblN0cm9rZVwiOkU9MjticmVhaztjYXNlIDM6Y2FzZVwiaW52aXNpYmxlXCI6RT0zO2JyZWFrO2Nhc2UgNDpjYXNlXCJmaWxsQW5kQWRkRm9yQ2xpcHBpbmdcIjpFPTQ7YnJlYWs7Y2FzZSA1OmNhc2VcInN0cm9rZUFuZEFkZFBhdGhGb3JDbGlwcGluZ1wiOkU9NTticmVhaztjYXNlIDY6Y2FzZVwiZmlsbFRoZW5TdHJva2VBbmRBZGRUb1BhdGhGb3JDbGlwcGluZ1wiOkU9NjticmVhaztjYXNlIDc6Y2FzZVwiYWRkVG9QYXRoRm9yQ2xpcHBpbmdcIjpFPTd9dmFyIHo9dm9pZCAwIT09VC51c2VkUmVuZGVyaW5nTW9kZT9ULnVzZWRSZW5kZXJpbmdNb2RlOi0xOy0xIT09RT95Kz1FK1wiIFRyXFxuXCI6LTEhPT16JiYoeSs9XCIwIFRyXFxuXCIpLC0xIT09RSYmKFQudXNlZFJlbmRlcmluZ01vZGU9RSksYz1pLmFsaWdufHxcImxlZnRcIjt2YXIgSCxXPXB0KncsVj1nLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCksRz1GdFtBdF07bD1pLmNoYXJTcGFjZXx8aHIsaD1pLm1heFdpZHRofHwwLGY9T2JqZWN0LmFzc2lnbih7YXV0b2VuY29kZTohMCxub0JPTTohMH0saS5mbGFncyk7dmFyIFk9W10sSj1mdW5jdGlvbih0KXtyZXR1cm4gZy5nZXRTdHJpbmdVbml0V2lkdGgodCx7Zm9udDpHLGNoYXJTcGFjZTpsLGZvbnRTaXplOnB0LGRvS2VybmluZzohMX0pKnB0L059O2lmKFwiW29iamVjdCBBcnJheV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSl7dmFyIFg7cz14KGUpLFwibGVmdFwiIT09YyYmKEg9cy5tYXAoSikpO3ZhciBLLFo9MDtpZihcInJpZ2h0XCI9PT1jKXtyLT1IWzBdLGU9W10sQz1zLmxlbmd0aDtmb3IodmFyICQ9MDskPEM7JCsrKTA9PT0kPyhLPW5yKHIpLFg9aXIobikpOihLPVUoWi1IWyRdKSxYPS1XKSxlLnB1c2goW3NbJF0sSyxYXSksWj1IWyRdfWVsc2UgaWYoXCJjZW50ZXJcIj09PWMpe3ItPUhbMF0vMixlPVtdLEM9cy5sZW5ndGg7Zm9yKHZhciBRPTA7UTxDO1ErKykwPT09UT8oSz1ucihyKSxYPWlyKG4pKTooSz1VKChaLUhbUV0pLzIpLFg9LVcpLGUucHVzaChbc1tRXSxLLFhdKSxaPUhbUV19ZWxzZSBpZihcImxlZnRcIj09PWMpe2U9W10sQz1zLmxlbmd0aDtmb3IodmFyIHR0PTA7dHQ8Qzt0dCsrKWUucHVzaChzW3R0XSl9ZWxzZSBpZihcImp1c3RpZnlcIj09PWMmJlwiSWRlbnRpdHktSFwiPT09Ry5lbmNvZGluZyl7ZT1bXSxDPXMubGVuZ3RoLGg9MCE9PWg/aDpWO2Zvcih2YXIgZXQ9MCxydD0wO3J0PEM7cnQrKylpZihYPTA9PT1ydD9pcihuKTotVyxLPTA9PT1ydD9ucihyKTpldCxydDxDLTEpe3ZhciBudD1VKChoLUhbcnRdKS8oc1tydF0uc3BsaXQoXCIgXCIpLmxlbmd0aC0xKSksaXQ9c1tydF0uc3BsaXQoXCIgXCIpO2UucHVzaChbaXRbMF0rXCIgXCIsSyxYXSksZXQ9MDtmb3IodmFyIGF0PTE7YXQ8aXQubGVuZ3RoO2F0Kyspe3ZhciBvdD0oSihpdFthdC0xXStcIiBcIitpdFthdF0pLUooaXRbYXRdKSkqTitudDthdD09aXQubGVuZ3RoLTE/ZS5wdXNoKFtpdFthdF0sb3QsMF0pOmUucHVzaChbaXRbYXRdK1wiIFwiLG90LDBdKSxldC09b3R9fWVsc2UgZS5wdXNoKFtzW3J0XSxLLFhdKTtlLnB1c2goW1wiXCIsZXQsMF0pfWVsc2V7aWYoXCJqdXN0aWZ5XCIhPT1jKXRocm93IG5ldyBFcnJvcignVW5yZWNvZ25pemVkIGFsaWdubWVudCBvcHRpb24sIHVzZSBcImxlZnRcIiwgXCJjZW50ZXJcIiwgXCJyaWdodFwiIG9yIFwianVzdGlmeVwiLicpO2ZvcihlPVtdLEM9cy5sZW5ndGgsaD0wIT09aD9oOlYscnQ9MDtydDxDO3J0Kyspe1g9MD09PXJ0P2lyKG4pOi1XLEs9MD09PXJ0P25yKHIpOjA7dmFyIHN0PXNbcnRdLnNwbGl0KFwiIFwiKS5sZW5ndGgtMSx1dD1zdD4wPyhoLUhbcnRdKS9zdDowO3J0PEMtMT9ZLnB1c2goQihVKHV0KSkpOlkucHVzaCgwKSxlLnB1c2goW3NbcnRdLEssWF0pfX19ITA9PT0oXCJib29sZWFuXCI9PXR5cGVvZiBpLlIyTD9pLlIyTDp2dCkmJihlPUEoZSxmdW5jdGlvbih0LGUscil7cmV0dXJuW3Quc3BsaXQoXCJcIikucmV2ZXJzZSgpLmpvaW4oXCJcIiksZSxyXX0pKSxvPXt0ZXh0OmUseDpyLHk6bixvcHRpb25zOmksbXV0ZXg6e3BkZkVzY2FwZTpnZSxhY3RpdmVGb250S2V5OkF0LGZvbnRzOkZ0LGFjdGl2ZUZvbnRTaXplOnB0fX0sRHQucHVibGlzaChcInBvc3RQcm9jZXNzVGV4dFwiLG8pLGU9by50ZXh0LHY9by5tdXRleC5pc0hleHx8ITE7dmFyIGN0PUZ0W0F0XS5lbmNvZGluZztcIldpbkFuc2lFbmNvZGluZ1wiIT09Y3QmJlwiU3RhbmRhcmRFbmNvZGluZ1wiIT09Y3R8fChlPUEoZSxmdW5jdGlvbih0LGUscil7cmV0dXJuW0wodCksZSxyXX0pKSxzPXgoZSksZT1bXTtmb3IodmFyIGh0LGZ0LGR0LGd0PUFycmF5LmlzQXJyYXkoc1swXSk/MTowLG10PVwiXCIsYnQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVwiXCI7cmV0dXJuIHIgaW5zdGFuY2VvZiBXdD8ocj1cIm51bWJlclwiPT10eXBlb2YgaS5hbmdsZT9WdChyLG5ldyBXdCgxLDAsMCwxLHQsZSkpOlZ0KG5ldyBXdCgxLDAsMCwxLHQsZSksciksXz09PVMmJihyPVZ0KG5ldyBXdCgxLDAsMCwtMSwwLDApLHIpKSxuPXIuam9pbihcIiBcIikrXCIgVG1cXG5cIik6bj1CKHQpK1wiIFwiK0IoZSkrXCIgVGRcXG5cIixufSx5dD0wO3l0PHMubGVuZ3RoO3l0Kyspe3N3aXRjaChtdD1cIlwiLGd0KXtjYXNlIDE6ZHQ9KHY/XCI8XCI6XCIoXCIpK3NbeXRdWzBdKyh2P1wiPlwiOlwiKVwiKSxodD1wYXJzZUZsb2F0KHNbeXRdWzFdKSxmdD1wYXJzZUZsb2F0KHNbeXRdWzJdKTticmVhaztjYXNlIDA6ZHQ9KHY/XCI8XCI6XCIoXCIpK3NbeXRdKyh2P1wiPlwiOlwiKVwiKSxodD1ucihyKSxmdD1pcihuKX12b2lkIDAhPT1ZJiZ2b2lkIDAhPT1ZW3l0XSYmKG10PVlbeXRdK1wiIFR3XFxuXCIpLDA9PT15dD9lLnB1c2gobXQrYnQoaHQsZnQscCkrZHQpOjA9PT1ndD9lLnB1c2gobXQrZHQpOjE9PT1ndCYmZS5wdXNoKG10K2J0KGh0LGZ0LHApK2R0KX1lPTA9PT1ndD9lLmpvaW4oXCIgVGpcXG5UKiBcIik6ZS5qb2luKFwiIFRqXFxuXCIpLGUrPVwiIFRqXFxuXCI7dmFyIHd0PVwiQlRcXG4vXCI7cmV0dXJuIHd0Kz1BdCtcIiBcIitwdCtcIiBUZlxcblwiLHd0Kz1CKHB0KncpK1wiIFRMXFxuXCIsd3QrPWNyK1wiXFxuXCIsd3QrPXksd3QrPWUsbHQod3QrPVwiRVRcIiksYltBdF09ITAsZ307dmFyIEVlPXkuX19wcml2YXRlX18uY2xpcD15LmNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGx0KFwiZXZlbm9kZFwiPT09dD9cIlcqXCI6XCJXXCIpLHRoaXN9O3kuY2xpcEV2ZW5PZGQ9ZnVuY3Rpb24oKXtyZXR1cm4gRWUoXCJldmVub2RkXCIpfSx5Ll9fcHJpdmF0ZV9fLmRpc2NhcmRQYXRoPXkuZGlzY2FyZFBhdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbHQoXCJuXCIpLHRoaXN9O3ZhciBSZT15Ll9fcHJpdmF0ZV9fLmlzVmFsaWRTdHlsZT1mdW5jdGlvbih0KXt2YXIgZT0hMTtyZXR1cm4tMSE9PVt2b2lkIDAsbnVsbCxcIlNcIixcIkRcIixcIkZcIixcIkRGXCIsXCJGRFwiLFwiZlwiLFwiZipcIixcIkJcIixcIkIqXCIsXCJuXCJdLmluZGV4T2YodCkmJihlPSEwKSxlfTt5Ll9fcHJpdmF0ZV9fLnNldERlZmF1bHRQYXRoT3BlcmF0aW9uPXkuc2V0RGVmYXVsdFBhdGhPcGVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIFJlKHQpJiYoZz10KSx0aGlzfTt2YXIgRGU9eS5fX3ByaXZhdGVfXy5nZXRTdHlsZT15LmdldFN0eWxlPWZ1bmN0aW9uKHQpe3ZhciBlPWc7c3dpdGNoKHQpe2Nhc2VcIkRcIjpjYXNlXCJTXCI6ZT1cIlNcIjticmVhaztjYXNlXCJGXCI6ZT1cImZcIjticmVhaztjYXNlXCJGRFwiOmNhc2VcIkRGXCI6ZT1cIkJcIjticmVhaztjYXNlXCJmXCI6Y2FzZVwiZipcIjpjYXNlXCJCXCI6Y2FzZVwiQipcIjplPXR9cmV0dXJuIGV9LFRlPXkuY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gbHQoXCJoXCIpLHRoaXN9O3kuc3Ryb2tlPWZ1bmN0aW9uKCl7cmV0dXJuIGx0KFwiU1wiKSx0aGlzfSx5LmZpbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHplKFwiZlwiLHQpLHRoaXN9LHkuZmlsbEV2ZW5PZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHplKFwiZipcIix0KSx0aGlzfSx5LmZpbGxTdHJva2U9ZnVuY3Rpb24odCl7cmV0dXJuIHplKFwiQlwiLHQpLHRoaXN9LHkuZmlsbFN0cm9rZUV2ZW5PZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHplKFwiQipcIix0KSx0aGlzfTt2YXIgemU9ZnVuY3Rpb24oZSxyKXtcIm9iamVjdFwiPT09dChyKT9XZShyLGUpOmx0KGUpfSxVZT1mdW5jdGlvbih0KXtudWxsPT09dHx8Xz09PVMmJnZvaWQgMD09PXR8fCh0PURlKHQpLGx0KHQpKX07ZnVuY3Rpb24gSGUodCxlLHIsbixpKXt2YXIgYT1uZXcgcShlfHx0aGlzLmJvdW5kaW5nQm94LHJ8fHRoaXMueFN0ZXAsbnx8dGhpcy55U3RlcCx0aGlzLmdTdGF0ZSxpfHx0aGlzLm1hdHJpeCk7YS5zdHJlYW09dGhpcy5zdHJlYW07dmFyIG89dCtcIiQkXCIrdGhpcy5jbG9uZUluZGV4KysrXCIkJFwiO3JldHVybiBZdChvLGEpLGF9dmFyIFdlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9T3RbdC5rZXldLG49anRbcl07aWYobiBpbnN0YW5jZW9mIE0pbHQoXCJxXCIpLGx0KFZlKGUpKSxuLmdTdGF0ZSYmeS5zZXRHU3RhdGUobi5nU3RhdGUpLGx0KHQubWF0cml4LnRvU3RyaW5nKCkrXCIgY21cIiksbHQoXCIvXCIrcitcIiBzaFwiKSxsdChcIlFcIik7ZWxzZSBpZihuIGluc3RhbmNlb2YgcSl7dmFyIGk9bmV3IFd0KDEsMCwwLC0xLDAsUHIoKSk7dC5tYXRyaXgmJihpPWkubXVsdGlwbHkodC5tYXRyaXh8fEd0KSxyPUhlLmNhbGwobix0LmtleSx0LmJvdW5kaW5nQm94LHQueFN0ZXAsdC55U3RlcCxpKS5pZCksbHQoXCJxXCIpLGx0KFwiL1BhdHRlcm4gY3NcIiksbHQoXCIvXCIrcitcIiBzY25cIiksbi5nU3RhdGUmJnkuc2V0R1N0YXRlKG4uZ1N0YXRlKSxsdChlKSxsdChcIlFcIil9fSxWZT1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZVwiZlwiOmNhc2VcIkZcIjpjYXNlXCJuXCI6cmV0dXJuXCJXIG5cIjtjYXNlXCJmKlwiOnJldHVyblwiVyogblwiO2Nhc2VcIkJcIjpjYXNlXCJTXCI6cmV0dXJuXCJXIFNcIjtjYXNlXCJCKlwiOnJldHVyblwiVyogU1wifX0sR2U9eS5tb3ZlVG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHQoQihVKHQpKStcIiBcIitCKEgoZSkpK1wiIG1cIiksdGhpc30sWWU9eS5saW5lVG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHQoQihVKHQpKStcIiBcIitCKEgoZSkpK1wiIGxcIiksdGhpc30sSmU9eS5jdXJ2ZVRvPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXtyZXR1cm4gbHQoW0IoVSh0KSksQihIKGUpKSxCKFUocikpLEIoSChuKSksQihVKGkpKSxCKEgoYSkpLFwiY1wiXS5qb2luKFwiIFwiKSksdGhpc307eS5fX3ByaXZhdGVfXy5saW5lPXkubGluZT1mdW5jdGlvbih0LGUscixuLGkpe2lmKGlzTmFOKHQpfHxpc05hTihlKXx8aXNOYU4ocil8fGlzTmFOKG4pfHwhUmUoaSkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmxpbmVcIik7cmV0dXJuIF89PT1BP3RoaXMubGluZXMoW1tyLXQsbi1lXV0sdCxlLFsxLDFdLGl8fFwiU1wiKTp0aGlzLmxpbmVzKFtbci10LG4tZV1dLHQsZSxbMSwxXSkuc3Ryb2tlKCl9LHkuX19wcml2YXRlX18ubGluZXM9eS5saW5lcz1mdW5jdGlvbih0LGUscixuLGksYSl7dmFyIG8scyx1LGMsbCxoLGYsZCxwLGcsbSx2O2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0JiYodj1yLHI9ZSxlPXQsdD12KSxuPW58fFsxLDFdLGE9YXx8ITEsaXNOYU4oZSl8fGlzTmFOKHIpfHwhQXJyYXkuaXNBcnJheSh0KXx8IUFycmF5LmlzQXJyYXkobil8fCFSZShpKXx8XCJib29sZWFuXCIhPXR5cGVvZiBhKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5saW5lc1wiKTtmb3IoR2UoZSxyKSxvPW5bMF0scz1uWzFdLGM9dC5sZW5ndGgsZz1lLG09cix1PTA7dTxjO3UrKykyPT09KGw9dFt1XSkubGVuZ3RoPyhnPWxbMF0qbytnLG09bFsxXSpzK20sWWUoZyxtKSk6KGg9bFswXSpvK2csZj1sWzFdKnMrbSxkPWxbMl0qbytnLHA9bFszXSpzK20sZz1sWzRdKm8rZyxtPWxbNV0qcyttLEplKGgsZixkLHAsZyxtKSk7cmV0dXJuIGEmJlRlKCksVWUoaSksdGhpc30seS5wYXRoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgcj10W2VdLG49ci5jO3N3aXRjaChyLm9wKXtjYXNlXCJtXCI6R2UoblswXSxuWzFdKTticmVhaztjYXNlXCJsXCI6WWUoblswXSxuWzFdKTticmVhaztjYXNlXCJjXCI6SmUuYXBwbHkodGhpcyxuKTticmVhaztjYXNlXCJoXCI6VGUoKX19cmV0dXJuIHRoaXN9LHkuX19wcml2YXRlX18ucmVjdD15LnJlY3Q9ZnVuY3Rpb24odCxlLHIsbixpKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKXx8IVJlKGkpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5yZWN0XCIpO3JldHVybiBfPT09QSYmKG49LW4pLGx0KFtCKFUodCkpLEIoSChlKSksQihVKHIpKSxCKFUobikpLFwicmVcIl0uam9pbihcIiBcIikpLFVlKGkpLHRoaXN9LHkuX19wcml2YXRlX18udHJpYW5nbGU9eS50cmlhbmdsZT1mdW5jdGlvbih0LGUscixuLGksYSxvKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKXx8aXNOYU4oaSl8fGlzTmFOKGEpfHwhUmUobykpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLnRyaWFuZ2xlXCIpO3JldHVybiB0aGlzLmxpbmVzKFtbci10LG4tZV0sW2ktcixhLW5dLFt0LWksZS1hXV0sdCxlLFsxLDFdLG8sITApLHRoaXN9LHkuX19wcml2YXRlX18ucm91bmRlZFJlY3Q9eS5yb3VuZGVkUmVjdD1mdW5jdGlvbih0LGUscixuLGksYSxvKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKXx8aXNOYU4oaSl8fGlzTmFOKGEpfHwhUmUobykpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLnJvdW5kZWRSZWN0XCIpO3ZhciBzPTQvMyooTWF0aC5TUVJUMi0xKTtyZXR1cm4gaT1NYXRoLm1pbihpLC41KnIpLGE9TWF0aC5taW4oYSwuNSpuKSx0aGlzLmxpbmVzKFtbci0yKmksMF0sW2kqcywwLGksYS1hKnMsaSxhXSxbMCxuLTIqYV0sWzAsYSpzLC1pKnMsYSwtaSxhXSxbMippLXIsMF0sWy1pKnMsMCwtaSwtYSpzLC1pLC1hXSxbMCwyKmEtbl0sWzAsLWEqcyxpKnMsLWEsaSwtYV1dLHQraSxlLFsxLDFdLG8sITApLHRoaXN9LHkuX19wcml2YXRlX18uZWxsaXBzZT15LmVsbGlwc2U9ZnVuY3Rpb24odCxlLHIsbixpKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKXx8IVJlKGkpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5lbGxpcHNlXCIpO3ZhciBhPTQvMyooTWF0aC5TUVJUMi0xKSpyLG89NC8zKihNYXRoLlNRUlQyLTEpKm47cmV0dXJuIEdlKHQrcixlKSxKZSh0K3IsZS1vLHQrYSxlLW4sdCxlLW4pLEplKHQtYSxlLW4sdC1yLGUtbyx0LXIsZSksSmUodC1yLGUrbyx0LWEsZStuLHQsZStuKSxKZSh0K2EsZStuLHQrcixlK28sdCtyLGUpLFVlKGkpLHRoaXN9LHkuX19wcml2YXRlX18uY2lyY2xlPXkuY2lyY2xlPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGlzTmFOKHQpfHxpc05hTihlKXx8aXNOYU4ocil8fCFSZShuKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY2lyY2xlXCIpO3JldHVybiB0aGlzLmVsbGlwc2UodCxlLHIscixuKX0seS5zZXRGb250PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gciYmKGU9RihlLHIpKSxBdD1OZSh0LGUse2Rpc2FibGVXYXJuaW5nOiExfSksdGhpc307dmFyIFhlPXkuX19wcml2YXRlX18uZ2V0Rm9udD15LmdldEZvbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gRnRbTmUuYXBwbHkoeSxhcmd1bWVudHMpXX07eS5fX3ByaXZhdGVfXy5nZXRGb250TGlzdD15LmdldEZvbnRMaXN0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyPXt9O2Zvcih0IGluIEl0KWlmKEl0Lmhhc093blByb3BlcnR5KHQpKWZvcihlIGluIHJbdF09W10sSXRbdF0pSXRbdF0uaGFzT3duUHJvcGVydHkoZSkmJnJbdF0ucHVzaChlKTtyZXR1cm4gcn0seS5hZGRGb250PWZ1bmN0aW9uKHQsZSxyLG4saSl7dmFyIGE9W1wiU3RhbmRhcmRFbmNvZGluZ1wiLFwiTWFjUm9tYW5FbmNvZGluZ1wiLFwiSWRlbnRpdHktSFwiLFwiV2luQW5zaUVuY29kaW5nXCJdO3JldHVybiBhcmd1bWVudHNbM10mJi0xIT09YS5pbmRleE9mKGFyZ3VtZW50c1szXSk/aT1hcmd1bWVudHNbM106YXJndW1lbnRzWzNdJiYtMT09YS5pbmRleE9mKGFyZ3VtZW50c1szXSkmJihyPUYocixuKSkscGUuY2FsbCh0aGlzLHQsZSxyLGk9aXx8XCJJZGVudGl0eS1IXCIpfTt2YXIgS2UsWmU9ZS5saW5lV2lkdGh8fC4yMDAwMjUsJGU9eS5fX3ByaXZhdGVfXy5nZXRMaW5lV2lkdGg9eS5nZXRMaW5lV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gWmV9LFFlPXkuX19wcml2YXRlX18uc2V0TGluZVdpZHRoPXkuc2V0TGluZVdpZHRoPWZ1bmN0aW9uKHQpe3JldHVybiBaZT10LGx0KEIoVSh0KSkrXCIgd1wiKSx0aGlzfTt5Ll9fcHJpdmF0ZV9fLnNldExpbmVEYXNoPUUuQVBJLnNldExpbmVEYXNoPUUuQVBJLnNldExpbmVEYXNoUGF0dGVybj1mdW5jdGlvbih0LGUpe2lmKHQ9dHx8W10sZT1lfHwwLGlzTmFOKGUpfHwhQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuc2V0TGluZURhc2hcIik7cmV0dXJuIHQ9dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIEIoVSh0KSl9KS5qb2luKFwiIFwiKSxlPUIoVShlKSksbHQoXCJbXCIrdCtcIl0gXCIrZStcIiBkXCIpLHRoaXN9O3ZhciB0cj15Ll9fcHJpdmF0ZV9fLmdldExpbmVIZWlnaHQ9eS5nZXRMaW5lSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHB0KktlfTt5Ll9fcHJpdmF0ZV9fLmdldExpbmVIZWlnaHQ9eS5nZXRMaW5lSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHB0KktlfTt2YXIgZXI9eS5fX3ByaXZhdGVfXy5zZXRMaW5lSGVpZ2h0RmFjdG9yPXkuc2V0TGluZUhlaWdodEZhY3Rvcj1mdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YodD10fHwxLjE1KSYmKEtlPXQpLHRoaXN9LHJyPXkuX19wcml2YXRlX18uZ2V0TGluZUhlaWdodEZhY3Rvcj15LmdldExpbmVIZWlnaHRGYWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gS2V9O2VyKGUubGluZUhlaWdodCk7dmFyIG5yPXkuX19wcml2YXRlX18uZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIFUodCl9LGlyPXkuX19wcml2YXRlX18uZ2V0VmVydGljYWxDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBfPT09Uz90OlJ0WyRdLm1lZGlhQm94LnRvcFJpZ2h0WS1SdFskXS5tZWRpYUJveC5ib3R0b21MZWZ0WS1VKHQpfSxhcj15Ll9fcHJpdmF0ZV9fLmdldEhvcml6b250YWxDb29yZGluYXRlU3RyaW5nPXkuZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGVTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIEIobnIodCkpfSxvcj15Ll9fcHJpdmF0ZV9fLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZz15LmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gQihpcih0KSl9LHNyPWUuc3Ryb2tlQ29sb3J8fFwiMCBHXCI7eS5fX3ByaXZhdGVfXy5nZXRTdHJva2VDb2xvcj15LmdldERyYXdDb2xvcj1mdW5jdGlvbigpe3JldHVybiBlZShzcil9LHkuX19wcml2YXRlX18uc2V0U3Ryb2tlQ29sb3I9eS5zZXREcmF3Q29sb3I9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHNyPXJlKHtjaDE6dCxjaDI6ZSxjaDM6cixjaDQ6bixwZGZDb2xvclR5cGU6XCJkcmF3XCIscHJlY2lzaW9uOjJ9KSxsdChzciksdGhpc307dmFyIHVyPWUuZmlsbENvbG9yfHxcIjAgZ1wiO3kuX19wcml2YXRlX18uZ2V0RmlsbENvbG9yPXkuZ2V0RmlsbENvbG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGVlKHVyKX0seS5fX3ByaXZhdGVfXy5zZXRGaWxsQ29sb3I9eS5zZXRGaWxsQ29sb3I9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHVyPXJlKHtjaDE6dCxjaDI6ZSxjaDM6cixjaDQ6bixwZGZDb2xvclR5cGU6XCJmaWxsXCIscHJlY2lzaW9uOjJ9KSxsdCh1ciksdGhpc307dmFyIGNyPWUudGV4dENvbG9yfHxcIjAgZ1wiLGxyPXkuX19wcml2YXRlX18uZ2V0VGV4dENvbG9yPXkuZ2V0VGV4dENvbG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGVlKGNyKX07eS5fX3ByaXZhdGVfXy5zZXRUZXh0Q29sb3I9eS5zZXRUZXh0Q29sb3I9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIGNyPXJlKHtjaDE6dCxjaDI6ZSxjaDM6cixjaDQ6bixwZGZDb2xvclR5cGU6XCJ0ZXh0XCIscHJlY2lzaW9uOjN9KSx0aGlzfTt2YXIgaHI9ZS5jaGFyU3BhY2UsZnI9eS5fX3ByaXZhdGVfXy5nZXRDaGFyU3BhY2U9eS5nZXRDaGFyU3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gcGFyc2VGbG9hdChocnx8MCl9O3kuX19wcml2YXRlX18uc2V0Q2hhclNwYWNlPXkuc2V0Q2hhclNwYWNlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLnNldENoYXJTcGFjZVwiKTtyZXR1cm4gaHI9dCx0aGlzfTt2YXIgZHI9MDt5LkNhcEpvaW5TdHlsZXM9ezA6MCxidXR0OjAsYnV0OjAsbWl0ZXI6MCwxOjEscm91bmQ6MSxyb3VuZGVkOjEsY2lyY2xlOjEsMjoyLHByb2plY3Rpbmc6Mixwcm9qZWN0OjIsc3F1YXJlOjIsYmV2ZWw6Mn0seS5fX3ByaXZhdGVfXy5zZXRMaW5lQ2FwPXkuc2V0TGluZUNhcD1mdW5jdGlvbih0KXt2YXIgZT15LkNhcEpvaW5TdHlsZXNbdF07aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJMaW5lIGNhcCBzdHlsZSBvZiAnXCIrdCtcIicgaXMgbm90IHJlY29nbml6ZWQuIFNlZSBvciBleHRlbmQgLkNhcEpvaW5TdHlsZXMgcHJvcGVydHkgZm9yIHZhbGlkIHN0eWxlc1wiKTtyZXR1cm4gZHI9ZSxsdChlK1wiIEpcIiksdGhpc307dmFyIHByPTA7eS5fX3ByaXZhdGVfXy5zZXRMaW5lSm9pbj15LnNldExpbmVKb2luPWZ1bmN0aW9uKHQpe3ZhciBlPXkuQ2FwSm9pblN0eWxlc1t0XTtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcihcIkxpbmUgam9pbiBzdHlsZSBvZiAnXCIrdCtcIicgaXMgbm90IHJlY29nbml6ZWQuIFNlZSBvciBleHRlbmQgLkNhcEpvaW5TdHlsZXMgcHJvcGVydHkgZm9yIHZhbGlkIHN0eWxlc1wiKTtyZXR1cm4gcHI9ZSxsdChlK1wiIGpcIiksdGhpc30seS5fX3ByaXZhdGVfXy5zZXRMaW5lTWl0ZXJMaW1pdD15Ll9fcHJpdmF0ZV9fLnNldE1pdGVyTGltaXQ9eS5zZXRMaW5lTWl0ZXJMaW1pdD15LnNldE1pdGVyTGltaXQ9ZnVuY3Rpb24odCl7aWYodD10fHwwLGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLnNldExpbmVNaXRlckxpbWl0XCIpO3JldHVybiBsdChCKFUodCkpK1wiIE1cIiksdGhpc30seS5HU3RhdGU9Tyx5LnNldEdTdGF0ZT1mdW5jdGlvbih0KXsodD1cInN0cmluZ1wiPT10eXBlb2YgdD9CdFtNdFt0XV06Z3IobnVsbCx0KSkuZXF1YWxzKHF0KXx8KGx0KFwiL1wiK3QuaWQrXCIgZ3NcIikscXQ9dCl9O3ZhciBncj1mdW5jdGlvbih0LGUpe2lmKCF0fHwhTXRbdF0pe3ZhciByPSExO2Zvcih2YXIgbiBpbiBCdClpZihCdC5oYXNPd25Qcm9wZXJ0eShuKSYmQnRbbl0uZXF1YWxzKGUpKXtyPSEwO2JyZWFrfWlmKHIpZT1CdFtuXTtlbHNle3ZhciBpPVwiR1NcIisoT2JqZWN0LmtleXMoQnQpLmxlbmd0aCsxKS50b1N0cmluZygxMCk7QnRbaV09ZSxlLmlkPWl9cmV0dXJuIHQmJihNdFt0XT1lLmlkKSxEdC5wdWJsaXNoKFwiYWRkR1N0YXRlXCIsZSksZX19O3kuYWRkR1N0YXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGdyKHQsZSksdGhpc30seS5zYXZlR3JhcGhpY3NTdGF0ZT1mdW5jdGlvbigpe3JldHVybiBsdChcInFcIiksQ3QucHVzaCh7a2V5OkF0LHNpemU6cHQsY29sb3I6Y3J9KSx0aGlzfSx5LnJlc3RvcmVHcmFwaGljc1N0YXRlPWZ1bmN0aW9uKCl7bHQoXCJRXCIpO3ZhciB0PUN0LnBvcCgpO3JldHVybiBBdD10LmtleSxwdD10LnNpemUsY3I9dC5jb2xvcixxdD1udWxsLHRoaXN9LHkuc2V0Q3VycmVudFRyYW5zZm9ybWF0aW9uTWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBsdCh0LnRvU3RyaW5nKCkrXCIgY21cIiksdGhpc30seS5jb21tZW50PWZ1bmN0aW9uKHQpe3JldHVybiBsdChcIiNcIit0KSx0aGlzfTt2YXIgbXI9ZnVuY3Rpb24odCxlKXt2YXIgcj10fHwwO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwieFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByfSxzZXQ6ZnVuY3Rpb24odCl7aXNOYU4odCl8fChyPXBhcnNlRmxvYXQodCkpfX0pO3ZhciBuPWV8fDA7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ5XCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG59LHNldDpmdW5jdGlvbih0KXtpc05hTih0KXx8KG49cGFyc2VGbG9hdCh0KSl9fSk7dmFyIGk9XCJwdFwiO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInR5cGVcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sc2V0OmZ1bmN0aW9uKHQpe2k9dC50b1N0cmluZygpfX0pLHRoaXN9LHZyPWZ1bmN0aW9uKHQsZSxyLG4pe21yLmNhbGwodGhpcyx0LGUpLHRoaXMudHlwZT1cInJlY3RcIjt2YXIgaT1yfHwwO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwid1wiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpfSxzZXQ6ZnVuY3Rpb24odCl7aXNOYU4odCl8fChpPXBhcnNlRmxvYXQodCkpfX0pO3ZhciBhPW58fDA7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiaFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhfSxzZXQ6ZnVuY3Rpb24odCl7aXNOYU4odCl8fChhPXBhcnNlRmxvYXQodCkpfX0pLHRoaXN9LGJyPWZ1bmN0aW9uKCl7dGhpcy5wYWdlPUV0LHRoaXMuY3VycmVudFBhZ2U9JCx0aGlzLnBhZ2VzPW90LnNsaWNlKDApLHRoaXMucGFnZXNDb250ZXh0PVJ0LnNsaWNlKDApLHRoaXMueD1fdCx0aGlzLnk9UHQsdGhpcy5tYXRyaXg9a3QsdGhpcy53aWR0aD1OcigkKSx0aGlzLmhlaWdodD14cigkKSx0aGlzLm91dHB1dERlc3RpbmF0aW9uPXV0LHRoaXMuaWQ9XCJcIix0aGlzLm9iamVjdE51bWJlcj0tMX07YnIucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24oKXtFdD10aGlzLnBhZ2UsJD10aGlzLmN1cnJlbnRQYWdlLFJ0PXRoaXMucGFnZXNDb250ZXh0LG90PXRoaXMucGFnZXMsX3Q9dGhpcy54LFB0PXRoaXMueSxrdD10aGlzLm1hdHJpeCxMcigkLHRoaXMud2lkdGgpLEFyKCQsdGhpcy5oZWlnaHQpLHV0PXRoaXMub3V0cHV0RGVzdGluYXRpb259O3ZhciB5cj1mdW5jdGlvbih0LGUscixuLGkpe0h0LnB1c2gobmV3IGJyKSxFdD0kPTAsb3Q9W10sX3Q9dCxQdD1lLGt0PWksbWUoW3Isbl0pfTtmb3IodmFyIHdyIGluIHkuYmVnaW5Gb3JtT2JqZWN0PWZ1bmN0aW9uKHQsZSxyLG4saSl7cmV0dXJuIHlyKHQsZSxyLG4saSksdGhpc30seS5lbmRGb3JtT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihVdFt0XSlIdC5wb3AoKS5yZXN0b3JlKCk7ZWxzZXt2YXIgZT1uZXcgYnIscj1cIlhvXCIrKE9iamVjdC5rZXlzKHp0KS5sZW5ndGgrMSkudG9TdHJpbmcoMTApO2UuaWQ9cixVdFt0XT1yLHp0W3JdPWUsRHQucHVibGlzaChcImFkZEZvcm1PYmplY3RcIixlKSxIdC5wb3AoKS5yZXN0b3JlKCl9fSh0KSx0aGlzfSx5LmRvRm9ybU9iamVjdD1mdW5jdGlvbih0LGUpe3ZhciByPXp0W1V0W3RdXTtyZXR1cm4gbHQoXCJxXCIpLGx0KGUudG9TdHJpbmcoKStcIiBjbVwiKSxsdChcIi9cIityLmlkK1wiIERvXCIpLGx0KFwiUVwiKSx0aGlzfSx5LmdldEZvcm1PYmplY3Q9ZnVuY3Rpb24odCl7dmFyIGU9enRbVXRbdF1dO3JldHVybnt4OmUueCx5OmUueSx3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodCxtYXRyaXg6ZS5tYXRyaXh9fSx5LnNhdmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10fHxcImdlbmVyYXRlZC5wZGZcIiwoZT1lfHx7fSkucmV0dXJuUHJvbWlzZT1lLnJldHVyblByb21pc2V8fCExLCExPT09ZS5yZXR1cm5Qcm9taXNlPyhsKGtlKFBlKCkpLHQpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGwudW5sb2FkJiZpLnNldFRpbWVvdXQmJnNldFRpbWVvdXQobC51bmxvYWQsOTExKSx0aGlzKTpuZXcgUHJvbWlzZShmdW5jdGlvbihlLHIpe3RyeXt2YXIgbj1sKGtlKFBlKCkpLHQpO1wiZnVuY3Rpb25cIj09dHlwZW9mIGwudW5sb2FkJiZpLnNldFRpbWVvdXQmJnNldFRpbWVvdXQobC51bmxvYWQsOTExKSxlKG4pfWNhdGNoKGEpe3IoYS5tZXNzYWdlKX19KX0sRS5BUEkpRS5BUEkuaGFzT3duUHJvcGVydHkod3IpJiYoXCJldmVudHNcIj09PXdyJiZFLkFQSS5ldmVudHMubGVuZ3RoP2Z1bmN0aW9uKHQsZSl7dmFyIHIsbixpO2ZvcihpPWUubGVuZ3RoLTE7LTEhPT1pO2ktLSlyPWVbaV1bMF0sbj1lW2ldWzFdLHQuc3Vic2NyaWJlLmFwcGx5KHQsW3JdLmNvbmNhdChcImZ1bmN0aW9uXCI9PXR5cGVvZiBuP1tuXTpuKSl9KER0LEUuQVBJLmV2ZW50cyk6eVt3cl09RS5BUElbd3JdKTtmdW5jdGlvbiBOcih0KXtyZXR1cm4gUnRbdF0ubWVkaWFCb3gudG9wUmlnaHRYLVJ0W3RdLm1lZGlhQm94LmJvdHRvbUxlZnRYfWZ1bmN0aW9uIExyKHQsZSl7UnRbdF0ubWVkaWFCb3gudG9wUmlnaHRYPWUrUnRbdF0ubWVkaWFCb3guYm90dG9tTGVmdFh9ZnVuY3Rpb24geHIodCl7cmV0dXJuIFJ0W3RdLm1lZGlhQm94LnRvcFJpZ2h0WS1SdFt0XS5tZWRpYUJveC5ib3R0b21MZWZ0WX1mdW5jdGlvbiBBcih0LGUpe1J0W3RdLm1lZGlhQm94LnRvcFJpZ2h0WT1lK1J0W3RdLm1lZGlhQm94LmJvdHRvbUxlZnRZfXZhciBTcj15LmdldFBhZ2VXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gTnIodD10fHwkKS9TdH0sX3I9eS5zZXRQYWdlV2lkdGg9ZnVuY3Rpb24odCxlKXtMcih0LGUqU3QpfSxQcj15LmdldFBhZ2VIZWlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHhyKHQ9dHx8JCkvU3R9LGtyPXkuc2V0UGFnZUhlaWdodD1mdW5jdGlvbih0LGUpe0FyKHQsZSpTdCl9O3JldHVybiB5LmludGVybmFsPXtwZGZFc2NhcGU6Z2UsZ2V0U3R5bGU6RGUsZ2V0Rm9udDpYZSxnZXRGb250U2l6ZTptdCxnZXRDaGFyU3BhY2U6ZnIsZ2V0VGV4dENvbG9yOmxyLGdldExpbmVIZWlnaHQ6dHIsZ2V0TGluZUhlaWdodEZhY3RvcjpycixnZXRMaW5lV2lkdGg6JGUsd3JpdGU6aHQsZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGU6bnIsZ2V0VmVydGljYWxDb29yZGluYXRlOmlyLGdldENvb3JkaW5hdGVTdHJpbmc6YXIsZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nOm9yLGNvbGxlY3Rpb25zOnt9LG5ld09iamVjdDpYdCxuZXdBZGRpdGlvbmFsT2JqZWN0OiR0LG5ld09iamVjdERlZmVycmVkOkt0LG5ld09iamVjdERlZmVycmVkQmVnaW46WnQsZ2V0RmlsdGVyczpuZSxwdXRTdHJlYW06aWUsZXZlbnRzOkR0LHNjYWxlRmFjdG9yOlN0LHBhZ2VTaXplOntnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiBTcigkKX0sc2V0V2lkdGg6ZnVuY3Rpb24odCl7X3IoJCx0KX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIFByKCQpfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCl7a3IoJCx0KX19LGVuY3J5cHRpb25PcHRpb25zOm0sZW5jcnlwdGlvbjpPZSxnZXRFbmNyeXB0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT1tP09lLmVuY3J5cHRvcih0LDApOmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sb3V0cHV0OkNlLGdldE51bWJlck9mUGFnZXM6d2UsZ2V0IHBhZ2VzKCl7cmV0dXJuIG90fSxvdXQ6bHQsZjI6VCxmMzp6LGdldFBhZ2VJbmZvOkJlLGdldFBhZ2VJbmZvQnlPYmpJZDpNZSxnZXRDdXJyZW50UGFnZUluZm86cWUsZ2V0UERGVmVyc2lvbjpOLFBvaW50Om1yLFJlY3RhbmdsZTp2cixNYXRyaXg6V3QsaGFzSG90Zml4OmplfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeS5pbnRlcm5hbC5wYWdlU2l6ZSxcIndpZHRoXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBTcigkKX0sc2V0OmZ1bmN0aW9uKHQpe19yKCQsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHkuaW50ZXJuYWwucGFnZVNpemUsXCJoZWlnaHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFByKCQpfSxzZXQ6ZnVuY3Rpb24odCl7a3IoJCx0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPWR0Lmxlbmd0aDtlPHI7ZSsrKXt2YXIgbj1wZS5jYWxsKHRoaXMsdFtlXVswXSx0W2VdWzFdLHRbZV1bMl0sZHRbZV1bM10sITApOyExPT09diYmKGJbbl09ITApO3ZhciBpPXRbZV1bMF0uc3BsaXQoXCItXCIpO2RlKHtpZDpuLGZvbnROYW1lOmlbMF0sZm9udFN0eWxlOmlbMV18fFwiXCJ9KX1EdC5wdWJsaXNoKFwiYWRkRm9udHNcIix7Zm9udHM6RnQsZGljdGlvbmFyeTpJdH0pfS5jYWxsKHksZHQpLEF0PVwiRjFcIix2ZShzLG4pLER0LnB1Ymxpc2goXCJpbml0aWFsaXplZFwiKSx5fUkucHJvdG90eXBlLmxzYkZpcnN0V29yZD1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmdCx0Pj44JjI1NSx0Pj4xNiYyNTUsdD4+MjQmMjU1KX0sSS5wcm90b3R5cGUudG9IZXhTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BsaXQoXCJcIikubWFwKGZ1bmN0aW9uKHQpe3JldHVybihcIjBcIisoMjU1JnQuY2hhckNvZGVBdCgwKSkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKFwiXCIpfSxJLnByb3RvdHlwZS5oZXhUb0J5dGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDtyKz0yKWUucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHQuc3Vic3RyKHIsMiksMTYpKSk7cmV0dXJuIGUuam9pbihcIlwiKX0sSS5wcm90b3R5cGUucHJvY2Vzc093bmVyUGFzc3dvcmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gayhTKGUpLnN1YnN0cigwLDUpLHQpfSxJLnByb3RvdHlwZS5lbmNyeXB0b3I9ZnVuY3Rpb24odCxlKXt2YXIgcj1TKHRoaXMuZW5jcnlwdGlvbktleStTdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZ0LHQ+PjgmMjU1LHQ+PjE2JjI1NSwyNTUmZSxlPj44JjI1NSkpLnN1YnN0cigwLDEwKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGsocix0KX19LE8ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXt2YXIgcixuPVwiaWQsb2JqZWN0TnVtYmVyLGVxdWFsc1wiO2lmKCFlfHx0KGUpIT09dCh0aGlzKSlyZXR1cm4hMTt2YXIgaT0wO2ZvcihyIGluIHRoaXMpaWYoIShuLmluZGV4T2Yocik+PTApKXtpZih0aGlzLmhhc093blByb3BlcnR5KHIpJiYhZS5oYXNPd25Qcm9wZXJ0eShyKSlyZXR1cm4hMTtpZih0aGlzW3JdIT09ZVtyXSlyZXR1cm4hMTtpKyt9Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZuLmluZGV4T2Yocik8MCYmaS0tO3JldHVybiAwPT09aX0sRS5BUEk9e2V2ZW50czpbXX0sRS52ZXJzaW9uPVwiNC4yLjFcIjt2YXIgUj1FLkFQSSxEPTEsVD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9cXFxcL2csXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cXCgvZyxcIlxcXFwoXCIpLnJlcGxhY2UoL1xcKS9nLFwiXFxcXClcIil9LHo9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvXFxcXFxcXFwvZyxcIlxcXFxcIikucmVwbGFjZSgvXFxcXFxcKC9nLFwiKFwiKS5yZXBsYWNlKC9cXFxcXFwpL2csXCIpXCIpfSxVPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKCkucmVwbGFjZSgvIy9nLFwiIzIzXCIpLnJlcGxhY2UoL1tcXHNcXG5cXHIoKTw+W1xcXXt9XFwvJV0vZyxmdW5jdGlvbih0KXt2YXIgZT10LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7cmV0dXJuXCIjXCIrKDE9PT1lLmxlbmd0aD9cIjBcIitlOmUpfSl9LEg9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9GaXhlZCgyKX0sVz1mdW5jdGlvbih0KXtyZXR1cm4gdC50b0ZpeGVkKDUpfTtSLl9fYWNyb2Zvcm1fXz17fTt2YXIgVj1mdW5jdGlvbih0LGUpe3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9LEc9ZnVuY3Rpb24odCl7cmV0dXJuIHQqRH0sWT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbHQscj1BdC5pbnRlcm5hbC5nZXRIZWlnaHQodCl8fDAsbj1BdC5pbnRlcm5hbC5nZXRXaWR0aCh0KXx8MDtyZXR1cm4gZS5CQm94PVswLDAsTnVtYmVyKEgobikpLE51bWJlcihIKHIpKV0sZX0sSj1SLl9fYWNyb2Zvcm1fXy5zZXRCaXQ9ZnVuY3Rpb24odCxlKXtpZih0PXR8fDAsZT1lfHwwLGlzTmFOKHQpfHxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXRcIik7cmV0dXJuIHR8MTw8ZX0sWD1SLl9fYWNyb2Zvcm1fXy5jbGVhckJpdD1mdW5jdGlvbih0LGUpe2lmKHQ9dHx8MCxlPWV8fDAsaXNOYU4odCl8fGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0XCIpO3JldHVybiB0Jn4oMTw8ZSl9LEs9Ui5fX2Fjcm9mb3JtX18uZ2V0Qml0PWZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odCl8fGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmdldEJpdFwiKTtyZXR1cm4gdCYxPDxlPzE6MH0sWj1SLl9fYWNyb2Zvcm1fXy5nZXRCaXRGb3JQZGY9ZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmXCIpO3JldHVybiBLKHQsZS0xKX0sJD1SLl9fYWNyb2Zvcm1fXy5zZXRCaXRGb3JQZGY9ZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Rm9yUGRmXCIpO3JldHVybiBKKHQsZS0xKX0sUT1SLl9fYWNyb2Zvcm1fXy5jbGVhckJpdEZvclBkZj1mdW5jdGlvbih0LGUpe2lmKGlzTmFOKHQpfHxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdEZvclBkZlwiKTtyZXR1cm4gWCh0LGUtMSl9LHR0PVIuX19hY3JvZm9ybV9fLmNhbGN1bGF0ZUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS5pbnRlcm5hbC5nZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSxuPWUuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlLGk9dFswXSxhPXRbMV0sbz10WzJdLHM9dFszXSx1PXt9O3JldHVybiB1Lmxvd2VyTGVmdF9YPXIoaSl8fDAsdS5sb3dlckxlZnRfWT1uKGErcyl8fDAsdS51cHBlclJpZ2h0X1g9cihpK28pfHwwLHUudXBwZXJSaWdodF9ZPW4oYSl8fDAsW051bWJlcihIKHUubG93ZXJMZWZ0X1gpKSxOdW1iZXIoSCh1Lmxvd2VyTGVmdF9ZKSksTnVtYmVyKEgodS51cHBlclJpZ2h0X1gpKSxOdW1iZXIoSCh1LnVwcGVyUmlnaHRfWSkpXX0sZXQ9ZnVuY3Rpb24odCl7aWYodC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudClyZXR1cm4gdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudDtpZih0LlZ8fHQuRFYpe3ZhciBlPVtdLHI9dC5fVnx8dC5EVixuPXJ0KHQsciksaT10LnNjb3BlLmludGVybmFsLmdldEZvbnQodC5mb250TmFtZSx0LmZvbnRTdHlsZSkuaWQ7ZS5wdXNoKFwiL1R4IEJNQ1wiKSxlLnB1c2goXCJxXCIpLGUucHVzaChcIkJUXCIpLGUucHVzaCh0LnNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKHQuY29sb3IpKSxlLnB1c2goXCIvXCIraStcIiBcIitIKG4uZm9udFNpemUpK1wiIFRmXCIpLGUucHVzaChcIjEgMCAwIDEgMCAwIFRtXCIpLGUucHVzaChuLnRleHQpLGUucHVzaChcIkVUXCIpLGUucHVzaChcIlFcIiksZS5wdXNoKFwiRU1DXCIpO3ZhciBhPVkodCk7cmV0dXJuIGEuc2NvcGU9dC5zY29wZSxhLnN0cmVhbT1lLmpvaW4oXCJcXG5cIiksYX19LHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9MD09PXQuZm9udFNpemU/dC5tYXhGb250U2l6ZTp0LmZvbnRTaXplLG49e3RleHQ6XCJcIixmb250U2l6ZTpcIlwifSxpPShlPVwiKVwiPT0oZT1cIihcIj09ZS5zdWJzdHIoMCwxKT9lLnN1YnN0cigxKTplKS5zdWJzdHIoZS5sZW5ndGgtMSk/ZS5zdWJzdHIoMCxlLmxlbmd0aC0xKTplKS5zcGxpdChcIiBcIik7aT10Lm11bHRpbGluZT9pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5zcGxpdChcIlxcblwiKX0pOmkubWFwKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pO3ZhciBhPXIsbz1BdC5pbnRlcm5hbC5nZXRIZWlnaHQodCl8fDA7bz1vPDA/LW86bzt2YXIgcz1BdC5pbnRlcm5hbC5nZXRXaWR0aCh0KXx8MDtzPXM8MD8tczpzO3ZhciB1PWZ1bmN0aW9uKGUscixuKXtpZihlKzE8aS5sZW5ndGgpe3ZhciBhPXIrXCIgXCIraVtlKzFdWzBdO3JldHVybiBudChhLHQsbikud2lkdGg8PXMtNH1yZXR1cm4hMX07YSsrO3Q6Zm9yKDthPjA7KXtlPVwiXCIsYS0tO3ZhciBjLGwsaD1udChcIjNcIix0LGEpLmhlaWdodCxmPXQubXVsdGlsaW5lP28tYTooby1oKS8yLGQ9Zis9MixwPTAsZz0wLG09MDtpZihhPD0wKXtlPVwiKC4uLikgVGpcXG5cIixlKz1cIiUgV2lkdGggb2YgVGV4dDogXCIrbnQoZSx0LGE9MTIpLndpZHRoK1wiLCBGaWVsZFdpZHRoOlwiK3MrXCJcXG5cIjticmVha31mb3IodmFyIHY9XCJcIixiPTAseT0wO3k8aS5sZW5ndGg7eSsrKWlmKGkuaGFzT3duUHJvcGVydHkoeSkpe3ZhciB3PSExO2lmKDEhPT1pW3ldLmxlbmd0aCYmbSE9PWlbeV0ubGVuZ3RoLTEpe2lmKChoKzIpKihiKzIpKzI+byljb250aW51ZSB0O3YrPWlbeV1bbV0sdz0hMCxnPXkseS0tfWVsc2V7dj1cIiBcIj09KHYrPWlbeV1bbV0rXCIgXCIpLnN1YnN0cih2Lmxlbmd0aC0xKT92LnN1YnN0cigwLHYubGVuZ3RoLTEpOnY7dmFyIE49cGFyc2VJbnQoeSksTD11KE4sdixhKSx4PXk+PWkubGVuZ3RoLTE7aWYoTCYmIXgpe3YrPVwiIFwiLG09MDtjb250aW51ZX1pZihMfHx4KXtpZih4KWc9TjtlbHNlIGlmKHQubXVsdGlsaW5lJiYoaCsyKSooYisyKSsyPm8pY29udGludWUgdH1lbHNle2lmKCF0Lm11bHRpbGluZSljb250aW51ZSB0O2lmKChoKzIpKihiKzIpKzI+byljb250aW51ZSB0O2c9Tn19Zm9yKHZhciBBPVwiXCIsUz1wO1M8PWc7UysrKXt2YXIgXz1pW1NdO2lmKHQubXVsdGlsaW5lKXtpZihTPT09Zyl7QSs9X1ttXStcIiBcIixtPShtKzEpJV8ubGVuZ3RoO2NvbnRpbnVlfWlmKFM9PT1wKXtBKz1fW18ubGVuZ3RoLTFdK1wiIFwiO2NvbnRpbnVlfX1BKz1fWzBdK1wiIFwifXN3aXRjaChBPVwiIFwiPT1BLnN1YnN0cihBLmxlbmd0aC0xKT9BLnN1YnN0cigwLEEubGVuZ3RoLTEpOkEsbD1udChBLHQsYSkud2lkdGgsdC50ZXh0QWxpZ24pe2Nhc2VcInJpZ2h0XCI6Yz1zLWwtMjticmVhaztjYXNlXCJjZW50ZXJcIjpjPShzLWwpLzI7YnJlYWs7ZGVmYXVsdDpjPTJ9ZSs9SChjKStcIiBcIitIKGQpK1wiIFRkXFxuXCIsZSs9XCIoXCIrVChBKStcIikgVGpcXG5cIixlKz0tSChjKStcIiAwIFRkXFxuXCIsZD0tKGErMiksbD0wLHA9dz9nOmcrMSxiKyssdj1cIlwifWJyZWFrfXJldHVybiBuLnRleHQ9ZSxuLmZvbnRTaXplPWEsbn0sbnQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUuc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChlLmZvbnROYW1lLGUuZm9udFN0eWxlKSxpPWUuc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKHQse2ZvbnQ6bixmb250U2l6ZTpwYXJzZUZsb2F0KHIpLGNoYXJTcGFjZTowfSkqcGFyc2VGbG9hdChyKTtyZXR1cm57aGVpZ2h0OmUuc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKFwiM1wiLHtmb250Om4sZm9udFNpemU6cGFyc2VGbG9hdChyKSxjaGFyU3BhY2U6MH0pKnBhcnNlRmxvYXQocikqMS41LHdpZHRoOml9fSxpdD17ZmllbGRzOltdLHhGb3JtczpbXSxhY3JvRm9ybURpY3Rpb25hcnlSb290Om51bGwscHJpbnRlZE91dDohMSxpbnRlcm5hbDpudWxsLGlzSW5pdGlhbGl6ZWQ6ITF9LGF0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9e3R5cGU6XCJyZWZlcmVuY2VcIixvYmplY3Q6dH07dm9pZCAwPT09ZS5pbnRlcm5hbC5nZXRQYWdlSW5mbyh0LnBhZ2UpLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZT09PXIudHlwZSYmdC5vYmplY3Q9PT1yLm9iamVjdH0pJiZlLmludGVybmFsLmdldFBhZ2VJbmZvKHQucGFnZSkucGFnZUNvbnRleHQuYW5ub3RhdGlvbnMucHVzaChyKX0sb3Q9ZnVuY3Rpb24oZSxyKXtpZihyLnNjb3BlPWUsdm9pZCAwIT09ZS5pbnRlcm5hbCYmKHZvaWQgMD09PWUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW58fCExPT09ZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkKSl7aWYoZnQuRmllbGROdW09MCxlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaXQpKSxlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpdGhyb3cgbmV3IEVycm9yKFwiRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIEFjcm9mb3JtRGljdGlvbmFyeVwiKTtEPWUuaW50ZXJuYWwuc2NhbGVGYWN0b3IsZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290PW5ldyBodCxlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Quc2NvcGU9ZSxlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuX2V2ZW50SUQ9ZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKFwicG9zdFB1dFJlc291cmNlc1wiLGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3QuaW50ZXJuYWwuZXZlbnRzLnVuc3Vic2NyaWJlKHQuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCksZGVsZXRlIHQuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCx0LmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQ9ITB9KGUpfSksZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKFwiYnVpbGREb2N1bWVudFwiLGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3QuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZD12b2lkIDA7dmFyIGU9dC5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcztmb3IodmFyIHIgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHIpKXt2YXIgbj1lW3JdO24ub2JqSWQ9dm9pZCAwLG4uaGFzQW5ub3RhdGlvbiYmYXQobix0KX19KGUpfSksZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKFwicHV0Q2F0YWxvZ1wiLGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCl0aHJvdyBuZXcgRXJyb3IoXCJwdXRDYXRhbG9nQ2FsbGJhY2s6IFJvb3QgbWlzc2luZy5cIik7dC5pbnRlcm5hbC53cml0ZShcIi9BY3JvRm9ybSBcIit0LmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQrXCIgMCBSXCIpfShlKX0pLGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZShcInBvc3RQdXRQYWdlc1wiLGZ1bmN0aW9uKHIpeyFmdW5jdGlvbihlLHIpe3ZhciBuPSFlO2Zvcih2YXIgaSBpbiBlfHwoci5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKHIuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCwhMCksci5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LnB1dFN0cmVhbSgpKSxlPWV8fHIuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5LaWRzKWlmKGUuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhPWVbaV0sbz1bXSxzPWEuUmVjdDtpZihhLlJlY3QmJihhLlJlY3Q9dHQoYS5SZWN0LHIpKSxyLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oYS5vYmpJZCwhMCksYS5EQT1BdC5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZVN0cmVhbShhKSxcIm9iamVjdFwiPT09dChhKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0mJihvPWEuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCkpLGEuUmVjdD1zLGEuaGFzQXBwZWFyYW5jZVN0cmVhbSYmIWEuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpe3ZhciB1PWV0KGEpO28ucHVzaCh7a2V5OlwiQVBcIix2YWx1ZTpcIjw8L04gXCIrdStcIj4+XCJ9KSxyLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKHUpfWlmKGEuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpe3ZhciBjPVwiXCI7Zm9yKHZhciBsIGluIGEuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpaWYoYS5hcHBlYXJhbmNlU3RyZWFtQ29udGVudC5oYXNPd25Qcm9wZXJ0eShsKSl7dmFyIGg9YS5hcHBlYXJhbmNlU3RyZWFtQ29udGVudFtsXTtpZihjKz1cIi9cIitsK1wiIFwiLGMrPVwiPDxcIixPYmplY3Qua2V5cyhoKS5sZW5ndGg+PTF8fEFycmF5LmlzQXJyYXkoaCkpe2Zvcih2YXIgaSBpbiBoKWlmKGguaGFzT3duUHJvcGVydHkoaSkpe3ZhciBmPWhbaV07XCJmdW5jdGlvblwiPT10eXBlb2YgZiYmKGY9Zi5jYWxsKHIsYSkpLGMrPVwiL1wiK2krXCIgXCIrZitcIiBcIixyLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5pbmRleE9mKGYpPj0wfHxyLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKGYpfX1lbHNlXCJmdW5jdGlvblwiPT10eXBlb2YoZj1oKSYmKGY9Zi5jYWxsKHIsYSkpLGMrPVwiL1wiK2krXCIgXCIrZixyLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5pbmRleE9mKGYpPj0wfHxyLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKGYpO2MrPVwiPj5cIn1vLnB1c2goe2tleTpcIkFQXCIsdmFsdWU6XCI8PFxcblwiK2MrXCI+PlwifSl9ci5pbnRlcm5hbC5wdXRTdHJlYW0oe2FkZGl0aW9uYWxLZXlWYWx1ZXM6byxvYmplY3RJZDphLm9iaklkfSksci5pbnRlcm5hbC5vdXQoXCJlbmRvYmpcIil9biYmZnVuY3Rpb24oZSxyKXtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pKXt2YXIgaT1uLGE9ZVtuXTtyLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oYS5vYmpJZCwhMCksXCJvYmplY3RcIj09PXQoYSkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEucHV0U3RyZWFtJiZhLnB1dFN0cmVhbSgpLGRlbGV0ZSBlW2ldfX0oci5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMscil9KHIsZSl9KSxlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmlzSW5pdGlhbGl6ZWQ9ITB9fSxzdD1SLl9fYWNyb2Zvcm1fXy5hcnJheVRvUGRmQXJyYXk9ZnVuY3Rpb24oZSxyLG4pe3ZhciBpPWZ1bmN0aW9uKHQpe3JldHVybiB0fTtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIGE9XCJbXCIsbz0wO288ZS5sZW5ndGg7bysrKXN3aXRjaCgwIT09byYmKGErPVwiIFwiKSx0KGVbb10pKXtjYXNlXCJib29sZWFuXCI6Y2FzZVwibnVtYmVyXCI6Y2FzZVwib2JqZWN0XCI6YSs9ZVtvXS50b1N0cmluZygpO2JyZWFrO2Nhc2VcInN0cmluZ1wiOlwiL1wiPT09ZVtvXS5zdWJzdHIoMCwxKT9hKz1cIi9cIitVKGVbb10uc3Vic3RyKDEpKToodm9pZCAwIT09ciYmbiYmKGk9bi5pbnRlcm5hbC5nZXRFbmNyeXB0b3IocikpLGErPVwiKFwiK1QoaShlW29dLnRvU3RyaW5nKCkpKStcIilcIil9cmV0dXJuIGErXCJdXCJ9dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuX19hY3JvZm9ybV9fLmFycmF5VG9QZGZBcnJheVwiKX0sdXQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWZ1bmN0aW9uKHQpe3JldHVybiB0fTtyZXR1cm4gdm9pZCAwIT09ZSYmciYmKG49ci5pbnRlcm5hbC5nZXRFbmNyeXB0b3IoZSkpLCh0PXR8fFwiXCIpLnRvU3RyaW5nKCksXCIoXCIrVChuKHQpKStcIilcIn0sY3Q9ZnVuY3Rpb24oKXt0aGlzLl9vYmpJZD12b2lkIDAsdGhpcy5fc2NvcGU9dm9pZCAwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwib2JqSWRcIix7Z2V0OmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy5fb2JqSWQpe2lmKHZvaWQgMD09PXRoaXMuc2NvcGUpcmV0dXJuO3RoaXMuX29iaklkPXRoaXMuc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWQoKX1yZXR1cm4gdGhpcy5fb2JqSWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vYmpJZD10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwic2NvcGVcIix7dmFsdWU6dGhpcy5fc2NvcGUsd3JpdGFibGU6ITB9KX07Y3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2JqSWQrXCIgMCBSXCJ9LGN0LnByb3RvdHlwZS5wdXRTdHJlYW09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSgpO3RoaXMuc2NvcGUuaW50ZXJuYWwucHV0U3RyZWFtKHtkYXRhOnRoaXMuc3RyZWFtLGFkZGl0aW9uYWxLZXlWYWx1ZXM6dCxvYmplY3RJZDp0aGlzLm9iaklkfSksdGhpcy5zY29wZS5pbnRlcm5hbC5vdXQoXCJlbmRvYmpcIil9LGN0LnByb3RvdHlwZS5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW09ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm5cImNvbnRlbnRcIiE9dCYmXCJhcHBlYXJhbmNlU3RyZWFtQ29udGVudFwiIT10JiZcInNjb3BlXCIhPXQmJlwib2JqSWRcIiE9dCYmXCJfXCIhPXQuc3Vic3RyaW5nKDAsMSl9KTtmb3IodmFyIHIgaW4gZSlpZighMT09PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcyxlW3JdKS5jb25maWd1cmFibGUpe3ZhciBuPWVbcl0saT10aGlzW25dO2kmJihBcnJheS5pc0FycmF5KGkpP3QucHVzaCh7a2V5Om4sdmFsdWU6c3QoaSx0aGlzLm9iaklkLHRoaXMuc2NvcGUpfSk6aSBpbnN0YW5jZW9mIGN0PyhpLnNjb3BlPXRoaXMuc2NvcGUsdC5wdXNoKHtrZXk6bix2YWx1ZTppLm9iaklkK1wiIDAgUlwifSkpOlwiZnVuY3Rpb25cIiE9dHlwZW9mIGkmJnQucHVzaCh7a2V5Om4sdmFsdWU6aX0pKX1yZXR1cm4gdH07dmFyIGx0PWZ1bmN0aW9uKCl7Y3QuY2FsbCh0aGlzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIlR5cGVcIix7dmFsdWU6XCIvWE9iamVjdFwiLGNvbmZpZ3VyYWJsZTohMSx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiU3VidHlwZVwiLHt2YWx1ZTpcIi9Gb3JtXCIsY29uZmlndXJhYmxlOiExLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJGb3JtVHlwZVwiLHt2YWx1ZToxLGNvbmZpZ3VyYWJsZTohMSx3cml0YWJsZTohMH0pO3ZhciB0LGU9W107T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJCQm94XCIse2NvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX0sc2V0OmZ1bmN0aW9uKHQpe2U9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIlJlc291cmNlc1wiLHt2YWx1ZTpcIjIgMCBSXCIsY29uZmlndXJhYmxlOiExLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJzdHJlYW1cIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITAsc2V0OmZ1bmN0aW9uKGUpe3Q9ZS50cmltKCl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0fHxudWxsfX0pfTtWKGx0LGN0KTt2YXIgaHQ9ZnVuY3Rpb24oKXtjdC5jYWxsKHRoaXMpO3ZhciB0LGU9W107T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJLaWRzXCIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLmxlbmd0aD4wP2U6dm9pZCAwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiRmllbGRzXCIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiBlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiREFcIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7aWYodCl7dmFyIGU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3JldHVybiB0aGlzLnNjb3BlJiYoZT10aGlzLnNjb3BlLmludGVybmFsLmdldEVuY3J5cHRvcih0aGlzLm9iaklkKSksXCIoXCIrVChlKHQpKStcIilcIn19LHNldDpmdW5jdGlvbihlKXt0PWV9fSl9O1YoaHQsY3QpO3ZhciBmdD1mdW5jdGlvbiB0KCl7Y3QuY2FsbCh0aGlzKTt2YXIgZT00O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiRlwiLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX0sc2V0OmZ1bmN0aW9uKHQpe2lmKGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicrdCsnXCIgZm9yIGF0dHJpYnV0ZSBGIHN1cHBsaWVkLicpO2U9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInNob3dXaGVuUHJpbnRlZFwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKGUsMykpfSxzZXQ6ZnVuY3Rpb24odCl7ITA9PT1Cb29sZWFuKHQpP3RoaXMuRj0kKGUsMyk6dGhpcy5GPVEoZSwzKX19KTt2YXIgcj0wO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiRmZcIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldDpmdW5jdGlvbih0KXtpZihpc05hTih0KSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInK3QrJ1wiIGZvciBhdHRyaWJ1dGUgRmYgc3VwcGxpZWQuJyk7cj10fX0pO3ZhciBuPVtdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiUmVjdFwiLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtpZigwIT09bi5sZW5ndGgpcmV0dXJuIG59LHNldDpmdW5jdGlvbih0KXtuPXZvaWQgMCE9PXQ/dDpbXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInhcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIW58fGlzTmFOKG5bMF0pPzA6blswXX0sc2V0OmZ1bmN0aW9uKHQpe25bMF09dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInlcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIW58fGlzTmFOKG5bMV0pPzA6blsxXX0sc2V0OmZ1bmN0aW9uKHQpe25bMV09dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIndpZHRoXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiFufHxpc05hTihuWzJdKT8wOm5bMl19LHNldDpmdW5jdGlvbih0KXtuWzJdPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJoZWlnaHRcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIW58fGlzTmFOKG5bM10pPzA6blszXX0sc2V0OmZ1bmN0aW9uKHQpe25bM109dH19KTt2YXIgaT1cIlwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiRlRcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZVwiL0J0blwiOmNhc2VcIi9UeFwiOmNhc2VcIi9DaFwiOmNhc2VcIi9TaWdcIjppPXQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInK3QrJ1wiIGZvciBhdHRyaWJ1dGUgRlQgc3VwcGxpZWQuJyl9fX0pO3ZhciBhPW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJUXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe2lmKCFhfHxhLmxlbmd0aDwxKXtpZih0aGlzIGluc3RhbmNlb2Ygd3QpcmV0dXJuO2E9XCJGaWVsZE9iamVjdFwiK3QuRmllbGROdW0rK312YXIgZT1mdW5jdGlvbih0KXtyZXR1cm4gdH07cmV0dXJuIHRoaXMuc2NvcGUmJihlPXRoaXMuc2NvcGUuaW50ZXJuYWwuZ2V0RW5jcnlwdG9yKHRoaXMub2JqSWQpKSxcIihcIitUKGUoYSkpK1wiKVwifSxzZXQ6ZnVuY3Rpb24odCl7YT10LnRvU3RyaW5nKCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJmaWVsZE5hbWVcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldDpmdW5jdGlvbih0KXthPXR9fSk7dmFyIG89XCJoZWx2ZXRpY2FcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImZvbnROYW1lXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvfSxzZXQ6ZnVuY3Rpb24odCl7bz10fX0pO3ZhciBzPVwibm9ybWFsXCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJmb250U3R5bGVcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9LHNldDpmdW5jdGlvbih0KXtzPXR9fSk7dmFyIHU9MDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImZvbnRTaXplXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB1fSxzZXQ6ZnVuY3Rpb24odCl7dT10fX0pO3ZhciBjPXZvaWQgMDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm1heEZvbnRTaXplXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1jPzUwL0Q6Y30sc2V0OmZ1bmN0aW9uKHQpe2M9dH19KTt2YXIgbD1cImJsYWNrXCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJjb2xvclwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sc2V0OmZ1bmN0aW9uKHQpe2w9dH19KTt2YXIgaD1cIi9GMSAwIFRmIDAgZ1wiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiREFcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7aWYoISghaHx8dGhpcyBpbnN0YW5jZW9mIHd0fHx0aGlzIGluc3RhbmNlb2YgTHQpKXJldHVybiB1dChoLHRoaXMub2JqSWQsdGhpcy5zY29wZSl9LHNldDpmdW5jdGlvbih0KXt0PXQudG9TdHJpbmcoKSxoPXR9fSk7dmFyIGY9bnVsbDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIkRWXCIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe2lmKGYpcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiB2dD09MD91dChmLHRoaXMub2JqSWQsdGhpcy5zY29wZSk6Zn0sc2V0OmZ1bmN0aW9uKHQpe3Q9dC50b1N0cmluZygpLGY9dGhpcyBpbnN0YW5jZW9mIHZ0PT0wP1wiKFwiPT09dC5zdWJzdHIoMCwxKT96KHQuc3Vic3RyKDEsdC5sZW5ndGgtMikpOnoodCk6dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImRlZmF1bHRWYWx1ZVwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHZ0PT0xP3ooZi5zdWJzdHIoMSxmLmxlbmd0aC0xKSk6Zn0sc2V0OmZ1bmN0aW9uKHQpe3Q9dC50b1N0cmluZygpLGY9dGhpcyBpbnN0YW5jZW9mIHZ0PT0xP1wiL1wiK1UodCk6dH19KTt2YXIgZD1udWxsO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiX1ZcIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7aWYoZClyZXR1cm4gZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuVj10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiVlwiLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtpZihkKXJldHVybiB0aGlzIGluc3RhbmNlb2YgdnQ9PTA/dXQoZCx0aGlzLm9iaklkLHRoaXMuc2NvcGUpOmR9LHNldDpmdW5jdGlvbih0KXt0PXQudG9TdHJpbmcoKSxkPXRoaXMgaW5zdGFuY2VvZiB2dD09MD9cIihcIj09PXQuc3Vic3RyKDAsMSk/eih0LnN1YnN0cigxLHQubGVuZ3RoLTIpKTp6KHQpOnR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ2YWx1ZVwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHZ0PT0xP3ooZC5zdWJzdHIoMSxkLmxlbmd0aC0xKSk6ZH0sc2V0OmZ1bmN0aW9uKHQpe3Q9dC50b1N0cmluZygpLGQ9dGhpcyBpbnN0YW5jZW9mIHZ0PT0xP1wiL1wiK1UodCk6dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImhhc0Fubm90YXRpb25cIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUmVjdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIlR5cGVcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzQW5ub3RhdGlvbj9cIi9Bbm5vdFwiOm51bGx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJTdWJ0eXBlXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc0Fubm90YXRpb24/XCIvV2lkZ2V0XCI6bnVsbH19KTt2YXIgcCxnPSExO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiaGFzQXBwZWFyYW5jZVN0cmVhbVwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKHQpe3Q9Qm9vbGVhbih0KSxnPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJwYWdlXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHApcmV0dXJuIHB9LHNldDpmdW5jdGlvbih0KXtwPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJyZWFkT25seVwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKHRoaXMuRmYsMSkpfSxzZXQ6ZnVuY3Rpb24odCl7ITA9PT1Cb29sZWFuKHQpP3RoaXMuRmY9JCh0aGlzLkZmLDEpOnRoaXMuRmY9USh0aGlzLkZmLDEpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicmVxdWlyZWRcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oWih0aGlzLkZmLDIpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPSQodGhpcy5GZiwyKTp0aGlzLkZmPVEodGhpcy5GZiwyKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm5vRXhwb3J0XCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKFoodGhpcy5GZiwzKSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj0kKHRoaXMuRmYsMyk6dGhpcy5GZj1RKHRoaXMuRmYsMyl9fSk7dmFyIG09bnVsbDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIlFcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7aWYobnVsbCE9PW0pcmV0dXJuIG19LHNldDpmdW5jdGlvbih0KXtpZigtMT09PVswLDEsMl0uaW5kZXhPZih0KSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInK3QrJ1wiIGZvciBhdHRyaWJ1dGUgUSBzdXBwbGllZC4nKTttPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ0ZXh0QWxpZ25cIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ7c3dpdGNoKG0pe2Nhc2UgMDpkZWZhdWx0OnQ9XCJsZWZ0XCI7YnJlYWs7Y2FzZSAxOnQ9XCJjZW50ZXJcIjticmVhaztjYXNlIDI6dD1cInJpZ2h0XCJ9cmV0dXJuIHR9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZVwicmlnaHRcIjpjYXNlIDI6bT0yO2JyZWFrO2Nhc2VcImNlbnRlclwiOmNhc2UgMTptPTE7YnJlYWs7ZGVmYXVsdDptPTB9fX0pfTtWKGZ0LGN0KTt2YXIgZHQ9ZnVuY3Rpb24oKXtmdC5jYWxsKHRoaXMpLHRoaXMuRlQ9XCIvQ2hcIix0aGlzLlY9XCIoKVwiLHRoaXMuZm9udE5hbWU9XCJ6YXBmZGluZ2JhdHNcIjt2YXIgdD0wO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiVElcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHR9LHNldDpmdW5jdGlvbihlKXt0PWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ0b3BJbmRleFwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdH0sc2V0OmZ1bmN0aW9uKGUpe3Q9ZX19KTt2YXIgZT1bXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIk9wdFwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc3QoZSx0aGlzLm9iaklkLHRoaXMuc2NvcGUpfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIHIsbjtuPVtdLFwic3RyaW5nXCI9PXR5cGVvZihyPXQpJiYobj1mdW5jdGlvbih0LGUscil7cnx8KHI9MSk7Zm9yKHZhciBuLGk9W107bj1lLmV4ZWModCk7KWkucHVzaChuW3JdKTtyZXR1cm4gaX0ociwvXFwoKC4qPylcXCkvZykpLGU9bn19KSx0aGlzLmdldE9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sdGhpcy5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2U9dCx0aGlzLnNvcnQmJmUuc29ydCgpfSx0aGlzLmFkZE9wdGlvbj1mdW5jdGlvbih0KXt0PSh0PXR8fFwiXCIpLnRvU3RyaW5nKCksZS5wdXNoKHQpLHRoaXMuc29ydCYmZS5zb3J0KCl9LHRoaXMucmVtb3ZlT3B0aW9uPWZ1bmN0aW9uKHQscil7Zm9yKHI9cnx8ITEsdD0odD10fHxcIlwiKS50b1N0cmluZygpOy0xIT09ZS5pbmRleE9mKHQpJiYoZS5zcGxpY2UoZS5pbmRleE9mKHQpLDEpLCExIT09cik7KTt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiY29tYm9cIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oWih0aGlzLkZmLDE4KSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj0kKHRoaXMuRmYsMTgpOnRoaXMuRmY9USh0aGlzLkZmLDE4KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImVkaXRcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oWih0aGlzLkZmLDE5KSl9LHNldDpmdW5jdGlvbih0KXshMD09PXRoaXMuY29tYm8mJighMD09PUJvb2xlYW4odCk/dGhpcy5GZj0kKHRoaXMuRmYsMTkpOnRoaXMuRmY9USh0aGlzLkZmLDE5KSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJzb3J0XCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKFoodGhpcy5GZiwyMCkpfSxzZXQ6ZnVuY3Rpb24odCl7ITA9PT1Cb29sZWFuKHQpPyh0aGlzLkZmPSQodGhpcy5GZiwyMCksZS5zb3J0KCkpOnRoaXMuRmY9USh0aGlzLkZmLDIwKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm11bHRpU2VsZWN0XCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKFoodGhpcy5GZiwyMikpfSxzZXQ6ZnVuY3Rpb24odCl7ITA9PT1Cb29sZWFuKHQpP3RoaXMuRmY9JCh0aGlzLkZmLDIyKTp0aGlzLkZmPVEodGhpcy5GZiwyMil9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJkb05vdFNwZWxsQ2hlY2tcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oWih0aGlzLkZmLDIzKSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj0kKHRoaXMuRmYsMjMpOnRoaXMuRmY9USh0aGlzLkZmLDIzKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImNvbW1pdE9uU2VsQ2hhbmdlXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKFoodGhpcy5GZiwyNykpfSxzZXQ6ZnVuY3Rpb24odCl7ITA9PT1Cb29sZWFuKHQpP3RoaXMuRmY9JCh0aGlzLkZmLDI3KTp0aGlzLkZmPVEodGhpcy5GZiwyNyl9fSksdGhpcy5oYXNBcHBlYXJhbmNlU3RyZWFtPSExfTtWKGR0LGZ0KTt2YXIgcHQ9ZnVuY3Rpb24oKXtkdC5jYWxsKHRoaXMpLHRoaXMuZm9udE5hbWU9XCJoZWx2ZXRpY2FcIix0aGlzLmNvbWJvPSExfTtWKHB0LGR0KTt2YXIgZ3Q9ZnVuY3Rpb24oKXtwdC5jYWxsKHRoaXMpLHRoaXMuY29tYm89ITB9O1YoZ3QscHQpO3ZhciBtdD1mdW5jdGlvbigpe2d0LmNhbGwodGhpcyksdGhpcy5lZGl0PSEwfTtWKG10LGd0KTt2YXIgdnQ9ZnVuY3Rpb24oKXtmdC5jYWxsKHRoaXMpLHRoaXMuRlQ9XCIvQnRuXCIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJub1RvZ2dsZVRvT2ZmXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKFoodGhpcy5GZiwxNSkpfSxzZXQ6ZnVuY3Rpb24odCl7ITA9PT1Cb29sZWFuKHQpP3RoaXMuRmY9JCh0aGlzLkZmLDE1KTp0aGlzLkZmPVEodGhpcy5GZiwxNSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJyYWRpb1wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKHRoaXMuRmYsMTYpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPSQodGhpcy5GZiwxNik6dGhpcy5GZj1RKHRoaXMuRmYsMTYpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicHVzaEJ1dHRvblwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKHRoaXMuRmYsMTcpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPSQodGhpcy5GZiwxNyk6dGhpcy5GZj1RKHRoaXMuRmYsMTcpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicmFkaW9Jc1VuaXNvblwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKHRoaXMuRmYsMjYpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPSQodGhpcy5GZiwyNik6dGhpcy5GZj1RKHRoaXMuRmYsMjYpfX0pO3ZhciBlLHI9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJNS1wiLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbih0KXtyZXR1cm4gdH07aWYodGhpcy5zY29wZSYmKHQ9dGhpcy5zY29wZS5pbnRlcm5hbC5nZXRFbmNyeXB0b3IodGhpcy5vYmpJZCkpLDAhPT1PYmplY3Qua2V5cyhyKS5sZW5ndGgpe3ZhciBlLG49W107Zm9yKGUgaW4gbi5wdXNoKFwiPDxcIiksciluLnB1c2goXCIvXCIrZStcIiAoXCIrVCh0KHJbZV0pKStcIilcIik7cmV0dXJuIG4ucHVzaChcIj4+XCIpLG4uam9pbihcIlxcblwiKX19LHNldDpmdW5jdGlvbihlKXtcIm9iamVjdFwiPT09dChlKSYmKHI9ZSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJjYXB0aW9uXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLkNBfHxcIlwifSxzZXQ6ZnVuY3Rpb24odCl7XCJzdHJpbmdcIj09dHlwZW9mIHQmJihyLkNBPXQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiQVNcIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNldDpmdW5jdGlvbih0KXt2YXIgcj1udWxsPT10P1wiXCI6dC50b1N0cmluZygpO1wiL1wiPT09ci5zdWJzdHIoMCwxKSYmKHI9ci5zdWJzdHIoMSkpLGU9XCIvXCIrVShyKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImFwcGVhcmFuY2VTdGF0ZVwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5zdWJzdHIoMSxlLmxlbmd0aC0xKX0sc2V0OmZ1bmN0aW9uKHQpe2U9XCIvXCIrVSh0KX19KX07Vih2dCxmdCk7dmFyIGJ0PWZ1bmN0aW9uKCl7dnQuY2FsbCh0aGlzKSx0aGlzLnB1c2hCdXR0b249ITB9O1YoYnQsdnQpO3ZhciB5dD1mdW5jdGlvbigpe3Z0LmNhbGwodGhpcyksdGhpcy5yYWRpbz0hMCx0aGlzLnB1c2hCdXR0b249ITE7dmFyIHQ9W107T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJLaWRzXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0fSxzZXQ6ZnVuY3Rpb24oZSl7dD12b2lkIDAhPT1lP2U6W119fSl9O1YoeXQsdnQpO3ZhciB3dD1mdW5jdGlvbigpe3ZhciBlLHI7ZnQuY2FsbCh0aGlzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIlBhcmVudFwiLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX0sc2V0OmZ1bmN0aW9uKHQpe2U9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm9wdGlvbk5hbWVcIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldDpmdW5jdGlvbih0KXtyPXR9fSk7dmFyIG4saT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIk1LXCIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQpe3JldHVybiB0fTt0aGlzLnNjb3BlJiYodD10aGlzLnNjb3BlLmludGVybmFsLmdldEVuY3J5cHRvcih0aGlzLm9iaklkKSk7dmFyIGUscj1bXTtmb3IoZSBpbiByLnB1c2goXCI8PFwiKSxpKXIucHVzaChcIi9cIitlK1wiIChcIitUKHQoaVtlXSkpK1wiKVwiKTtyZXR1cm4gci5wdXNoKFwiPj5cIiksci5qb2luKFwiXFxuXCIpfSxzZXQ6ZnVuY3Rpb24oZSl7XCJvYmplY3RcIj09PXQoZSkmJihpPWUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiY2FwdGlvblwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5DQXx8XCJcIn0sc2V0OmZ1bmN0aW9uKHQpe1wic3RyaW5nXCI9PXR5cGVvZiB0JiYoaS5DQT10KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIkFTXCIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiBufSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9bnVsbD09dD9cIlwiOnQudG9TdHJpbmcoKTtcIi9cIj09PWUuc3Vic3RyKDAsMSkmJihlPWUuc3Vic3RyKDEpKSxuPVwiL1wiK1UoZSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJhcHBlYXJhbmNlU3RhdGVcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uc3Vic3RyKDEsbi5sZW5ndGgtMSl9LHNldDpmdW5jdGlvbih0KXt2YXIgZT1udWxsPT10P1wiXCI6dC50b1N0cmluZygpO1wiL1wiPT09ZS5zdWJzdHIoMCwxKSYmKGU9ZS5zdWJzdHIoMSkpLG49XCIvXCIrVShlKX19KSx0aGlzLmNhcHRpb249XCJsXCIsdGhpcy5hcHBlYXJhbmNlU3RhdGU9XCJPZmZcIix0aGlzLl9BcHBlYXJhbmNlVHlwZT1BdC5SYWRpb0J1dHRvbi5DaXJjbGUsdGhpcy5hcHBlYXJhbmNlU3RyZWFtQ29udGVudD10aGlzLl9BcHBlYXJhbmNlVHlwZS5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHRoaXMub3B0aW9uTmFtZSl9O1Yod3QsZnQpLHl0LnByb3RvdHlwZS5zZXRBcHBlYXJhbmNlPWZ1bmN0aW9uKHQpe2lmKCEoXCJjcmVhdGVBcHBlYXJhbmNlU3RyZWFtXCJpbiB0KXx8IShcImdldENBXCJpbiB0KSl0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBhc3NpZ24gQXBwZWFyYW5jZSB0byBSYWRpb0J1dHRvbi4gQXBwZWFyYW5jZSB3YXMgSW52YWxpZCFcIik7Zm9yKHZhciBlIGluIHRoaXMuS2lkcylpZih0aGlzLktpZHMuaGFzT3duUHJvcGVydHkoZSkpe3ZhciByPXRoaXMuS2lkc1tlXTtyLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50PXQuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbShyLm9wdGlvbk5hbWUpLHIuY2FwdGlvbj10LmdldENBKCl9fSx5dC5wcm90b3R5cGUuY3JlYXRlT3B0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB3dDtyZXR1cm4gZS5QYXJlbnQ9dGhpcyxlLm9wdGlvbk5hbWU9dCx0aGlzLktpZHMucHVzaChlKSxTdC5jYWxsKHRoaXMuc2NvcGUsZSksZX07dmFyIE50PWZ1bmN0aW9uKCl7dnQuY2FsbCh0aGlzKSx0aGlzLmZvbnROYW1lPVwiemFwZmRpbmdiYXRzXCIsdGhpcy5jYXB0aW9uPVwiM1wiLHRoaXMuYXBwZWFyYW5jZVN0YXRlPVwiT25cIix0aGlzLnZhbHVlPVwiT25cIix0aGlzLnRleHRBbGlnbj1cImNlbnRlclwiLHRoaXMuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ9QXQuQ2hlY2tCb3guY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSgpfTtWKE50LHZ0KTt2YXIgTHQ9ZnVuY3Rpb24oKXtmdC5jYWxsKHRoaXMpLHRoaXMuRlQ9XCIvVHhcIixPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm11bHRpbGluZVwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKHRoaXMuRmYsMTMpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPSQodGhpcy5GZiwxMyk6dGhpcy5GZj1RKHRoaXMuRmYsMTMpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiZmlsZVNlbGVjdFwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKHRoaXMuRmYsMjEpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPSQodGhpcy5GZiwyMSk6dGhpcy5GZj1RKHRoaXMuRmYsMjEpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiZG9Ob3RTcGVsbENoZWNrXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKFoodGhpcy5GZiwyMykpfSxzZXQ6ZnVuY3Rpb24odCl7ITA9PT1Cb29sZWFuKHQpP3RoaXMuRmY9JCh0aGlzLkZmLDIzKTp0aGlzLkZmPVEodGhpcy5GZiwyMyl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJkb05vdFNjcm9sbFwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKHRoaXMuRmYsMjQpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPSQodGhpcy5GZiwyNCk6dGhpcy5GZj1RKHRoaXMuRmYsMjQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiY29tYlwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKHRoaXMuRmYsMjUpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPSQodGhpcy5GZiwyNSk6dGhpcy5GZj1RKHRoaXMuRmYsMjUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicmljaFRleHRcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oWih0aGlzLkZmLDI2KSl9LHNldDpmdW5jdGlvbih0KXshMD09PUJvb2xlYW4odCk/dGhpcy5GZj0kKHRoaXMuRmYsMjYpOnRoaXMuRmY9USh0aGlzLkZmLDI2KX19KTt2YXIgdD1udWxsO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiTWF4TGVuXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0fSxzZXQ6ZnVuY3Rpb24oZSl7dD1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwibWF4TGVuZ3RoXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0fSxzZXQ6ZnVuY3Rpb24oZSl7TnVtYmVyLmlzSW50ZWdlcihlKSYmKHQ9ZSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJoYXNBcHBlYXJhbmNlU3RyZWFtXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ8fHRoaXMuRFZ9fSl9O1YoTHQsZnQpO3ZhciB4dD1mdW5jdGlvbigpe0x0LmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJwYXNzd29yZFwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbihaKHRoaXMuRmYsMTQpKX0sc2V0OmZ1bmN0aW9uKHQpeyEwPT09Qm9vbGVhbih0KT90aGlzLkZmPSQodGhpcy5GZiwxNCk6dGhpcy5GZj1RKHRoaXMuRmYsMTQpfX0pLHRoaXMucGFzc3dvcmQ9ITB9O1YoeHQsTHQpO3ZhciBBdD17Q2hlY2tCb3g6e2NyZWF0ZUFwcGVhcmFuY2VTdHJlYW06ZnVuY3Rpb24oKXtyZXR1cm57Tjp7T246QXQuQ2hlY2tCb3guWWVzTm9ybWFsfSxEOntPbjpBdC5DaGVja0JveC5ZZXNQdXNoRG93bixPZmY6QXQuQ2hlY2tCb3guT2ZmUHVzaERvd259fX0sWWVzUHVzaERvd246ZnVuY3Rpb24odCl7dmFyIGU9WSh0KTtlLnNjb3BlPXQuc2NvcGU7dmFyIHI9W10sbj10LnNjb3BlLmludGVybmFsLmdldEZvbnQodC5mb250TmFtZSx0LmZvbnRTdHlsZSkuaWQsaT10LnNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKHQuY29sb3IpLGE9cnQodCx0LmNhcHRpb24pO3JldHVybiByLnB1c2goXCIwLjc0OTAyMyBnXCIpLHIucHVzaChcIjAgMCBcIitIKEF0LmludGVybmFsLmdldFdpZHRoKHQpKStcIiBcIitIKEF0LmludGVybmFsLmdldEhlaWdodCh0KSkrXCIgcmVcIiksci5wdXNoKFwiZlwiKSxyLnB1c2goXCJCTUNcIiksci5wdXNoKFwicVwiKSxyLnB1c2goXCIwIDAgMSByZ1wiKSxyLnB1c2goXCIvXCIrbitcIiBcIitIKGEuZm9udFNpemUpK1wiIFRmIFwiK2kpLHIucHVzaChcIkJUXCIpLHIucHVzaChhLnRleHQpLHIucHVzaChcIkVUXCIpLHIucHVzaChcIlFcIiksci5wdXNoKFwiRU1DXCIpLGUuc3RyZWFtPXIuam9pbihcIlxcblwiKSxlfSxZZXNOb3JtYWw6ZnVuY3Rpb24odCl7dmFyIGU9WSh0KTtlLnNjb3BlPXQuc2NvcGU7dmFyIHI9dC5zY29wZS5pbnRlcm5hbC5nZXRGb250KHQuZm9udE5hbWUsdC5mb250U3R5bGUpLmlkLG49dC5zY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyh0LmNvbG9yKSxpPVtdLGE9QXQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpLG89QXQuaW50ZXJuYWwuZ2V0V2lkdGgodCkscz1ydCh0LHQuY2FwdGlvbik7cmV0dXJuIGkucHVzaChcIjEgZ1wiKSxpLnB1c2goXCIwIDAgXCIrSChvKStcIiBcIitIKGEpK1wiIHJlXCIpLGkucHVzaChcImZcIiksaS5wdXNoKFwicVwiKSxpLnB1c2goXCIwIDAgMSByZ1wiKSxpLnB1c2goXCIwIDAgXCIrSChvLTEpK1wiIFwiK0goYS0xKStcIiByZVwiKSxpLnB1c2goXCJXXCIpLGkucHVzaChcIm5cIiksaS5wdXNoKFwiMCBnXCIpLGkucHVzaChcIkJUXCIpLGkucHVzaChcIi9cIityK1wiIFwiK0gocy5mb250U2l6ZSkrXCIgVGYgXCIrbiksaS5wdXNoKHMudGV4dCksaS5wdXNoKFwiRVRcIiksaS5wdXNoKFwiUVwiKSxlLnN0cmVhbT1pLmpvaW4oXCJcXG5cIiksZX0sT2ZmUHVzaERvd246ZnVuY3Rpb24odCl7dmFyIGU9WSh0KTtlLnNjb3BlPXQuc2NvcGU7dmFyIHI9W107cmV0dXJuIHIucHVzaChcIjAuNzQ5MDIzIGdcIiksci5wdXNoKFwiMCAwIFwiK0goQXQuaW50ZXJuYWwuZ2V0V2lkdGgodCkpK1wiIFwiK0goQXQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpKStcIiByZVwiKSxyLnB1c2goXCJmXCIpLGUuc3RyZWFtPXIuam9pbihcIlxcblwiKSxlfX0sUmFkaW9CdXR0b246e0NpcmNsZTp7Y3JlYXRlQXBwZWFyYW5jZVN0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT17RDp7T2ZmOkF0LlJhZGlvQnV0dG9uLkNpcmNsZS5PZmZQdXNoRG93bn0sTjp7fX07cmV0dXJuIGUuTlt0XT1BdC5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzTm9ybWFsLGUuRFt0XT1BdC5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzUHVzaERvd24sZX0sZ2V0Q0E6ZnVuY3Rpb24oKXtyZXR1cm5cImxcIn0sWWVzTm9ybWFsOmZ1bmN0aW9uKHQpe3ZhciBlPVkodCk7ZS5zY29wZT10LnNjb3BlO3ZhciByPVtdLG49QXQuaW50ZXJuYWwuZ2V0V2lkdGgodCk8PUF0LmludGVybmFsLmdldEhlaWdodCh0KT9BdC5pbnRlcm5hbC5nZXRXaWR0aCh0KS80OkF0LmludGVybmFsLmdldEhlaWdodCh0KS80O249TnVtYmVyKCguOSpuKS50b0ZpeGVkKDUpKTt2YXIgaT1BdC5pbnRlcm5hbC5CZXppZXJfQyxhPU51bWJlcigobippKS50b0ZpeGVkKDUpKTtyZXR1cm4gci5wdXNoKFwicVwiKSxyLnB1c2goXCIxIDAgMCAxIFwiK1coQXQuaW50ZXJuYWwuZ2V0V2lkdGgodCkvMikrXCIgXCIrVyhBdC5pbnRlcm5hbC5nZXRIZWlnaHQodCkvMikrXCIgY21cIiksci5wdXNoKG4rXCIgMCBtXCIpLHIucHVzaChuK1wiIFwiK2ErXCIgXCIrYStcIiBcIituK1wiIDAgXCIrbitcIiBjXCIpLHIucHVzaChcIi1cIithK1wiIFwiK24rXCIgLVwiK24rXCIgXCIrYStcIiAtXCIrbitcIiAwIGNcIiksci5wdXNoKFwiLVwiK24rXCIgLVwiK2ErXCIgLVwiK2ErXCIgLVwiK24rXCIgMCAtXCIrbitcIiBjXCIpLHIucHVzaChhK1wiIC1cIituK1wiIFwiK24rXCIgLVwiK2ErXCIgXCIrbitcIiAwIGNcIiksci5wdXNoKFwiZlwiKSxyLnB1c2goXCJRXCIpLGUuc3RyZWFtPXIuam9pbihcIlxcblwiKSxlfSxZZXNQdXNoRG93bjpmdW5jdGlvbih0KXt2YXIgZT1ZKHQpO2Uuc2NvcGU9dC5zY29wZTt2YXIgcj1bXSxuPUF0LmludGVybmFsLmdldFdpZHRoKHQpPD1BdC5pbnRlcm5hbC5nZXRIZWlnaHQodCk/QXQuaW50ZXJuYWwuZ2V0V2lkdGgodCkvNDpBdC5pbnRlcm5hbC5nZXRIZWlnaHQodCkvNDtuPU51bWJlcigoLjkqbikudG9GaXhlZCg1KSk7dmFyIGk9TnVtYmVyKCgyKm4pLnRvRml4ZWQoNSkpLGE9TnVtYmVyKChpKkF0LmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKSxvPU51bWJlcigobipBdC5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSk7cmV0dXJuIHIucHVzaChcIjAuNzQ5MDIzIGdcIiksci5wdXNoKFwicVwiKSxyLnB1c2goXCIxIDAgMCAxIFwiK1coQXQuaW50ZXJuYWwuZ2V0V2lkdGgodCkvMikrXCIgXCIrVyhBdC5pbnRlcm5hbC5nZXRIZWlnaHQodCkvMikrXCIgY21cIiksci5wdXNoKGkrXCIgMCBtXCIpLHIucHVzaChpK1wiIFwiK2ErXCIgXCIrYStcIiBcIitpK1wiIDAgXCIraStcIiBjXCIpLHIucHVzaChcIi1cIithK1wiIFwiK2krXCIgLVwiK2krXCIgXCIrYStcIiAtXCIraStcIiAwIGNcIiksci5wdXNoKFwiLVwiK2krXCIgLVwiK2ErXCIgLVwiK2ErXCIgLVwiK2krXCIgMCAtXCIraStcIiBjXCIpLHIucHVzaChhK1wiIC1cIitpK1wiIFwiK2krXCIgLVwiK2ErXCIgXCIraStcIiAwIGNcIiksci5wdXNoKFwiZlwiKSxyLnB1c2goXCJRXCIpLHIucHVzaChcIjAgZ1wiKSxyLnB1c2goXCJxXCIpLHIucHVzaChcIjEgMCAwIDEgXCIrVyhBdC5pbnRlcm5hbC5nZXRXaWR0aCh0KS8yKStcIiBcIitXKEF0LmludGVybmFsLmdldEhlaWdodCh0KS8yKStcIiBjbVwiKSxyLnB1c2gobitcIiAwIG1cIiksci5wdXNoKG4rXCIgXCIrbytcIiBcIitvK1wiIFwiK24rXCIgMCBcIituK1wiIGNcIiksci5wdXNoKFwiLVwiK28rXCIgXCIrbitcIiAtXCIrbitcIiBcIitvK1wiIC1cIituK1wiIDAgY1wiKSxyLnB1c2goXCItXCIrbitcIiAtXCIrbytcIiAtXCIrbytcIiAtXCIrbitcIiAwIC1cIituK1wiIGNcIiksci5wdXNoKG8rXCIgLVwiK24rXCIgXCIrbitcIiAtXCIrbytcIiBcIituK1wiIDAgY1wiKSxyLnB1c2goXCJmXCIpLHIucHVzaChcIlFcIiksZS5zdHJlYW09ci5qb2luKFwiXFxuXCIpLGV9LE9mZlB1c2hEb3duOmZ1bmN0aW9uKHQpe3ZhciBlPVkodCk7ZS5zY29wZT10LnNjb3BlO3ZhciByPVtdLG49QXQuaW50ZXJuYWwuZ2V0V2lkdGgodCk8PUF0LmludGVybmFsLmdldEhlaWdodCh0KT9BdC5pbnRlcm5hbC5nZXRXaWR0aCh0KS80OkF0LmludGVybmFsLmdldEhlaWdodCh0KS80O249TnVtYmVyKCguOSpuKS50b0ZpeGVkKDUpKTt2YXIgaT1OdW1iZXIoKDIqbikudG9GaXhlZCg1KSksYT1OdW1iZXIoKGkqQXQuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO3JldHVybiByLnB1c2goXCIwLjc0OTAyMyBnXCIpLHIucHVzaChcInFcIiksci5wdXNoKFwiMSAwIDAgMSBcIitXKEF0LmludGVybmFsLmdldFdpZHRoKHQpLzIpK1wiIFwiK1coQXQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpLzIpK1wiIGNtXCIpLHIucHVzaChpK1wiIDAgbVwiKSxyLnB1c2goaStcIiBcIithK1wiIFwiK2ErXCIgXCIraStcIiAwIFwiK2krXCIgY1wiKSxyLnB1c2goXCItXCIrYStcIiBcIitpK1wiIC1cIitpK1wiIFwiK2ErXCIgLVwiK2krXCIgMCBjXCIpLHIucHVzaChcIi1cIitpK1wiIC1cIithK1wiIC1cIithK1wiIC1cIitpK1wiIDAgLVwiK2krXCIgY1wiKSxyLnB1c2goYStcIiAtXCIraStcIiBcIitpK1wiIC1cIithK1wiIFwiK2krXCIgMCBjXCIpLHIucHVzaChcImZcIiksci5wdXNoKFwiUVwiKSxlLnN0cmVhbT1yLmpvaW4oXCJcXG5cIiksZX19LENyb3NzOntjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOmZ1bmN0aW9uKHQpe3ZhciBlPXtEOntPZmY6QXQuUmFkaW9CdXR0b24uQ3Jvc3MuT2ZmUHVzaERvd259LE46e319O3JldHVybiBlLk5bdF09QXQuUmFkaW9CdXR0b24uQ3Jvc3MuWWVzTm9ybWFsLGUuRFt0XT1BdC5SYWRpb0J1dHRvbi5Dcm9zcy5ZZXNQdXNoRG93bixlfSxnZXRDQTpmdW5jdGlvbigpe3JldHVyblwiOFwifSxZZXNOb3JtYWw6ZnVuY3Rpb24odCl7dmFyIGU9WSh0KTtlLnNjb3BlPXQuc2NvcGU7dmFyIHI9W10sbj1BdC5pbnRlcm5hbC5jYWxjdWxhdGVDcm9zcyh0KTtyZXR1cm4gci5wdXNoKFwicVwiKSxyLnB1c2goXCIxIDEgXCIrSChBdC5pbnRlcm5hbC5nZXRXaWR0aCh0KS0yKStcIiBcIitIKEF0LmludGVybmFsLmdldEhlaWdodCh0KS0yKStcIiByZVwiKSxyLnB1c2goXCJXXCIpLHIucHVzaChcIm5cIiksci5wdXNoKEgobi54MS54KStcIiBcIitIKG4ueDEueSkrXCIgbVwiKSxyLnB1c2goSChuLngyLngpK1wiIFwiK0gobi54Mi55KStcIiBsXCIpLHIucHVzaChIKG4ueDQueCkrXCIgXCIrSChuLng0LnkpK1wiIG1cIiksci5wdXNoKEgobi54My54KStcIiBcIitIKG4ueDMueSkrXCIgbFwiKSxyLnB1c2goXCJzXCIpLHIucHVzaChcIlFcIiksZS5zdHJlYW09ci5qb2luKFwiXFxuXCIpLGV9LFllc1B1c2hEb3duOmZ1bmN0aW9uKHQpe3ZhciBlPVkodCk7ZS5zY29wZT10LnNjb3BlO3ZhciByPUF0LmludGVybmFsLmNhbGN1bGF0ZUNyb3NzKHQpLG49W107cmV0dXJuIG4ucHVzaChcIjAuNzQ5MDIzIGdcIiksbi5wdXNoKFwiMCAwIFwiK0goQXQuaW50ZXJuYWwuZ2V0V2lkdGgodCkpK1wiIFwiK0goQXQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpKStcIiByZVwiKSxuLnB1c2goXCJmXCIpLG4ucHVzaChcInFcIiksbi5wdXNoKFwiMSAxIFwiK0goQXQuaW50ZXJuYWwuZ2V0V2lkdGgodCktMikrXCIgXCIrSChBdC5pbnRlcm5hbC5nZXRIZWlnaHQodCktMikrXCIgcmVcIiksbi5wdXNoKFwiV1wiKSxuLnB1c2goXCJuXCIpLG4ucHVzaChIKHIueDEueCkrXCIgXCIrSChyLngxLnkpK1wiIG1cIiksbi5wdXNoKEgoci54Mi54KStcIiBcIitIKHIueDIueSkrXCIgbFwiKSxuLnB1c2goSChyLng0LngpK1wiIFwiK0goci54NC55KStcIiBtXCIpLG4ucHVzaChIKHIueDMueCkrXCIgXCIrSChyLngzLnkpK1wiIGxcIiksbi5wdXNoKFwic1wiKSxuLnB1c2goXCJRXCIpLGUuc3RyZWFtPW4uam9pbihcIlxcblwiKSxlfSxPZmZQdXNoRG93bjpmdW5jdGlvbih0KXt2YXIgZT1ZKHQpO2Uuc2NvcGU9dC5zY29wZTt2YXIgcj1bXTtyZXR1cm4gci5wdXNoKFwiMC43NDkwMjMgZ1wiKSxyLnB1c2goXCIwIDAgXCIrSChBdC5pbnRlcm5hbC5nZXRXaWR0aCh0KSkrXCIgXCIrSChBdC5pbnRlcm5hbC5nZXRIZWlnaHQodCkpK1wiIHJlXCIpLHIucHVzaChcImZcIiksZS5zdHJlYW09ci5qb2luKFwiXFxuXCIpLGV9fX0sY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2VTdHJlYW06ZnVuY3Rpb24odCl7dmFyIGU9dC5zY29wZS5pbnRlcm5hbC5nZXRGb250KHQuZm9udE5hbWUsdC5mb250U3R5bGUpLmlkLHI9dC5zY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyh0LmNvbG9yKTtyZXR1cm5cIi9cIitlK1wiIFwiK3QuZm9udFNpemUrXCIgVGYgXCIrcn19O0F0LmludGVybmFsPXtCZXppZXJfQzouNTUxOTE1MDI0NDk0LGNhbGN1bGF0ZUNyb3NzOmZ1bmN0aW9uKHQpe3ZhciBlPUF0LmludGVybmFsLmdldFdpZHRoKHQpLHI9QXQuaW50ZXJuYWwuZ2V0SGVpZ2h0KHQpLG49TWF0aC5taW4oZSxyKTtyZXR1cm57eDE6e3g6KGUtbikvMix5OihyLW4pLzIrbn0seDI6e3g6KGUtbikvMituLHk6KHItbikvMn0seDM6e3g6KGUtbikvMix5OihyLW4pLzJ9LHg0Ont4OihlLW4pLzIrbix5OihyLW4pLzIrbn19fX0sQXQuaW50ZXJuYWwuZ2V0V2lkdGg9ZnVuY3Rpb24oZSl7dmFyIHI9MDtyZXR1cm5cIm9iamVjdFwiPT09dChlKSYmKHI9RyhlLlJlY3RbMl0pKSxyfSxBdC5pbnRlcm5hbC5nZXRIZWlnaHQ9ZnVuY3Rpb24oZSl7dmFyIHI9MDtyZXR1cm5cIm9iamVjdFwiPT09dChlKSYmKHI9RyhlLlJlY3RbM10pKSxyfTt2YXIgU3Q9Ui5hZGRGaWVsZD1mdW5jdGlvbih0KXtpZihvdCh0aGlzLHQpLCEodCBpbnN0YW5jZW9mIGZ0KSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRGaWVsZC5cIik7dmFyIGU7cmV0dXJuKGU9dCkuc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ucHJpbnRlZE91dCYmKGUuc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ucHJpbnRlZE91dD0hMSxlLnNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Q9bnVsbCksZS5zY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcy5wdXNoKGUpLHQucGFnZT10LnNjb3BlLmludGVybmFsLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIsdGhpc307Ui5BY3JvRm9ybUNob2ljZUZpZWxkPWR0LFIuQWNyb0Zvcm1MaXN0Qm94PXB0LFIuQWNyb0Zvcm1Db21ib0JveD1ndCxSLkFjcm9Gb3JtRWRpdEJveD1tdCxSLkFjcm9Gb3JtQnV0dG9uPXZ0LFIuQWNyb0Zvcm1QdXNoQnV0dG9uPWJ0LFIuQWNyb0Zvcm1SYWRpb0J1dHRvbj15dCxSLkFjcm9Gb3JtQ2hlY2tCb3g9TnQsUi5BY3JvRm9ybVRleHRGaWVsZD1MdCxSLkFjcm9Gb3JtUGFzc3dvcmRGaWVsZD14dCxSLkFjcm9Gb3JtQXBwZWFyYW5jZT1BdCxSLkFjcm9Gb3JtPXtDaG9pY2VGaWVsZDpkdCxMaXN0Qm94OnB0LENvbWJvQm94Omd0LEVkaXRCb3g6bXQsQnV0dG9uOnZ0LFB1c2hCdXR0b246YnQsUmFkaW9CdXR0b246eXQsQ2hlY2tCb3g6TnQsVGV4dEZpZWxkOkx0LFBhc3N3b3JkRmllbGQ6eHQsQXBwZWFyYW5jZTpBdH0sRS5BY3JvRm9ybT17Q2hvaWNlRmllbGQ6ZHQsTGlzdEJveDpwdCxDb21ib0JveDpndCxFZGl0Qm94Om10LEJ1dHRvbjp2dCxQdXNoQnV0dG9uOmJ0LFJhZGlvQnV0dG9uOnl0LENoZWNrQm94Ok50LFRleHRGaWVsZDpMdCxQYXNzd29yZEZpZWxkOnh0LEFwcGVhcmFuY2U6QXR9O3ZhciBfdD1FLkFjcm9Gb3JtO2Z1bmN0aW9uIFB0KHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LGUscil7cmV0dXJuIHRbZV09cix0fSx7fSl9IWZ1bmN0aW9uKGUpe3ZhciByPVwiYWRkSW1hZ2VfXCI7ZS5fX2FkZGltYWdlX189e307dmFyIG49XCJVTktOT1dOXCIsaT17UE5HOltbMTM3LDgwLDc4LDcxXV0sVElGRjpbWzc3LDc3LDAsNDJdLFs3Myw3Myw0MiwwXV0sSlBFRzpbWzI1NSwyMTYsMjU1LDIyNCx2b2lkIDAsdm9pZCAwLDc0LDcwLDczLDcwLDBdLFsyNTUsMjE2LDI1NSwyMjUsdm9pZCAwLHZvaWQgMCw2OSwxMjAsMTA1LDEwMiwwLDBdLFsyNTUsMjE2LDI1NSwyMTldLFsyNTUsMjE2LDI1NSwyMzhdXSxKUEVHMjAwMDpbWzAsMCwwLDEyLDEwNiw4MCwzMiwzMl1dLEdJRjg3YTpbWzcxLDczLDcwLDU2LDU1LDk3XV0sR0lGODlhOltbNzEsNzMsNzAsNTYsNTcsOTddXSxXRUJQOltbODIsNzMsNzAsNzAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLDg3LDY5LDY2LDgwXV0sQk1QOltbNjYsNzddLFs2Niw2NV0sWzY3LDczXSxbNjcsODBdLFs3Myw2N10sWzgwLDg0XV19LGE9ZS5fX2FkZGltYWdlX18uZ2V0SW1hZ2VGaWxlVHlwZUJ5SW1hZ2VEYXRhPWZ1bmN0aW9uKHQsZSl7dmFyIHIsYSxvLHMsdSxjPW47aWYoXCJSR0JBXCI9PT0oZT1lfHxuKXx8dm9pZCAwIT09dC5kYXRhJiZ0LmRhdGEgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSYmXCJoZWlnaHRcImluIHQmJlwid2lkdGhcImluIHQpcmV0dXJuXCJSR0JBXCI7aWYoQSh0KSlmb3IodSBpbiBpKWZvcihvPWlbdV0scj0wO3I8by5sZW5ndGg7cis9MSl7Zm9yKHM9ITAsYT0wO2E8b1tyXS5sZW5ndGg7YSs9MSlpZih2b2lkIDAhPT1vW3JdW2FdJiZvW3JdW2FdIT09dFthXSl7cz0hMTticmVha31pZighMD09PXMpe2M9dTticmVha319ZWxzZSBmb3IodSBpbiBpKWZvcihvPWlbdV0scj0wO3I8by5sZW5ndGg7cis9MSl7Zm9yKHM9ITAsYT0wO2E8b1tyXS5sZW5ndGg7YSs9MSlpZih2b2lkIDAhPT1vW3JdW2FdJiZvW3JdW2FdIT09dC5jaGFyQ29kZUF0KGEpKXtzPSExO2JyZWFrfWlmKCEwPT09cyl7Yz11O2JyZWFrfX1yZXR1cm4gYz09PW4mJmUhPT1uJiYoYz1lKSxjfSxvPWZ1bmN0aW9uIHQoZSl7Zm9yKHZhciByPXRoaXMuaW50ZXJuYWwud3JpdGUsbj10aGlzLmludGVybmFsLnB1dFN0cmVhbSxpPSgwLHRoaXMuaW50ZXJuYWwuZ2V0RmlsdGVycykoKTstMSE9PWkuaW5kZXhPZihcIkZsYXRlRW5jb2RlXCIpOylpLnNwbGljZShpLmluZGV4T2YoXCJGbGF0ZUVuY29kZVwiKSwxKTtlLm9iamVjdElkPXRoaXMuaW50ZXJuYWwubmV3T2JqZWN0KCk7dmFyIGE9W107aWYoYS5wdXNoKHtrZXk6XCJUeXBlXCIsdmFsdWU6XCIvWE9iamVjdFwifSksYS5wdXNoKHtrZXk6XCJTdWJ0eXBlXCIsdmFsdWU6XCIvSW1hZ2VcIn0pLGEucHVzaCh7a2V5OlwiV2lkdGhcIix2YWx1ZTplLndpZHRofSksYS5wdXNoKHtrZXk6XCJIZWlnaHRcIix2YWx1ZTplLmhlaWdodH0pLGUuY29sb3JTcGFjZT09PXkuSU5ERVhFRD9hLnB1c2goe2tleTpcIkNvbG9yU3BhY2VcIix2YWx1ZTpcIlsvSW5kZXhlZCAvRGV2aWNlUkdCIFwiKyhlLnBhbGV0dGUubGVuZ3RoLzMtMSkrXCIgXCIrKFwic01hc2tcImluIGUmJnZvaWQgMCE9PWUuc01hc2s/ZS5vYmplY3RJZCsyOmUub2JqZWN0SWQrMSkrXCIgMCBSXVwifSk6KGEucHVzaCh7a2V5OlwiQ29sb3JTcGFjZVwiLHZhbHVlOlwiL1wiK2UuY29sb3JTcGFjZX0pLGUuY29sb3JTcGFjZT09PXkuREVWSUNFX0NNWUsmJmEucHVzaCh7a2V5OlwiRGVjb2RlXCIsdmFsdWU6XCJbMSAwIDEgMCAxIDAgMSAwXVwifSkpLGEucHVzaCh7a2V5OlwiQml0c1BlckNvbXBvbmVudFwiLHZhbHVlOmUuYml0c1BlckNvbXBvbmVudH0pLFwiZGVjb2RlUGFyYW1ldGVyc1wiaW4gZSYmdm9pZCAwIT09ZS5kZWNvZGVQYXJhbWV0ZXJzJiZhLnB1c2goe2tleTpcIkRlY29kZVBhcm1zXCIsdmFsdWU6XCI8PFwiK2UuZGVjb2RlUGFyYW1ldGVycytcIj4+XCJ9KSxcInRyYW5zcGFyZW5jeVwiaW4gZSYmQXJyYXkuaXNBcnJheShlLnRyYW5zcGFyZW5jeSkmJmUudHJhbnNwYXJlbmN5Lmxlbmd0aD4wKXtmb3IodmFyIG89XCJcIixzPTAsdT1lLnRyYW5zcGFyZW5jeS5sZW5ndGg7czx1O3MrKylvKz1lLnRyYW5zcGFyZW5jeVtzXStcIiBcIitlLnRyYW5zcGFyZW5jeVtzXStcIiBcIjthLnB1c2goe2tleTpcIk1hc2tcIix2YWx1ZTpcIltcIitvK1wiXVwifSl9dm9pZCAwIT09ZS5zTWFzayYmYS5wdXNoKHtrZXk6XCJTTWFza1wiLHZhbHVlOmUub2JqZWN0SWQrMStcIiAwIFJcIn0pO3ZhciBjPXZvaWQgMCE9PWUuZmlsdGVyP1tcIi9cIitlLmZpbHRlcl06dm9pZCAwO2lmKG4oe2RhdGE6ZS5kYXRhLGFkZGl0aW9uYWxLZXlWYWx1ZXM6YSxhbHJlYWR5QXBwbGllZEZpbHRlcnM6YyxvYmplY3RJZDplLm9iamVjdElkfSkscihcImVuZG9ialwiKSxcInNNYXNrXCJpbiBlJiZ2b2lkIDAhPT1lLnNNYXNrKXt2YXIgbCxoPW51bGwhPT0obD1lLnNNYXNrQml0c1BlckNvbXBvbmVudCkmJnZvaWQgMCE9PWw/bDplLmJpdHNQZXJDb21wb25lbnQsZj17d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHQsY29sb3JTcGFjZTpcIkRldmljZUdyYXlcIixiaXRzUGVyQ29tcG9uZW50OmgsZGF0YTplLnNNYXNrfTtcImZpbHRlclwiaW4gZSYmKGYuZGVjb2RlUGFyYW1ldGVycz1cIi9QcmVkaWN0b3IgXCIuY29uY2F0KGUucHJlZGljdG9yLFwiIC9Db2xvcnMgMSAvQml0c1BlckNvbXBvbmVudCBcIikuY29uY2F0KGgsXCIgL0NvbHVtbnMgXCIpLmNvbmNhdChlLndpZHRoKSxmLmZpbHRlcj1lLmZpbHRlciksdC5jYWxsKHRoaXMsZil9aWYoZS5jb2xvclNwYWNlPT09eS5JTkRFWEVEKXt2YXIgZD10aGlzLmludGVybmFsLm5ld09iamVjdCgpO24oe2RhdGE6XyhuZXcgVWludDhBcnJheShlLnBhbGV0dGUpKSxvYmplY3RJZDpkfSkscihcImVuZG9ialwiKX19LHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmludGVybmFsLmNvbGxlY3Rpb25zW3IrXCJpbWFnZXNcIl07Zm9yKHZhciBlIGluIHQpby5jYWxsKHRoaXMsdFtlXSl9LHU9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuaW50ZXJuYWwuY29sbGVjdGlvbnNbcitcImltYWdlc1wiXSxuPXRoaXMuaW50ZXJuYWwud3JpdGU7Zm9yKHZhciBpIGluIGUpbihcIi9JXCIrKHQ9ZVtpXSkuaW5kZXgsdC5vYmplY3RJZCxcIjBcIixcIlJcIil9LGM9ZnVuY3Rpb24oKXt0aGlzLmludGVybmFsLmNvbGxlY3Rpb25zW3IrXCJpbWFnZXNcIl18fCh0aGlzLmludGVybmFsLmNvbGxlY3Rpb25zW3IrXCJpbWFnZXNcIl09e30sdGhpcy5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKFwicHV0UmVzb3VyY2VzXCIscyksdGhpcy5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKFwicHV0WG9iamVjdERpY3RcIix1KSl9LGw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmludGVybmFsLmNvbGxlY3Rpb25zW3IrXCJpbWFnZXNcIl07cmV0dXJuIGMuY2FsbCh0aGlzKSx0fSxoPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaW50ZXJuYWwuY29sbGVjdGlvbnNbcitcImltYWdlc1wiXSkubGVuZ3RofSxkPWZ1bmN0aW9uKHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGVbXCJwcm9jZXNzXCIrdC50b1VwcGVyQ2FzZSgpXX0scD1mdW5jdGlvbihlKXtyZXR1cm5cIm9iamVjdFwiPT09dChlKSYmMT09PWUubm9kZVR5cGV9LGc9ZnVuY3Rpb24odCxyKXtpZihcIklNR1wiPT09dC5ub2RlTmFtZSYmdC5oYXNBdHRyaWJ1dGUoXCJzcmNcIikpe3ZhciBuPVwiXCIrdC5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7aWYoMD09PW4uaW5kZXhPZihcImRhdGE6aW1hZ2UvXCIpKXJldHVybiBmKHVuZXNjYXBlKG4pLnNwbGl0KFwiYmFzZTY0LFwiKS5wb3AoKSk7dmFyIGk9ZS5sb2FkRmlsZShuLCEwKTtpZih2b2lkIDAhPT1pKXJldHVybiBpfWlmKFwiQ0FOVkFTXCI9PT10Lm5vZGVOYW1lKXtpZigwPT09dC53aWR0aHx8MD09PXQuaGVpZ2h0KXRocm93IG5ldyBFcnJvcihcIkdpdmVuIGNhbnZhcyBtdXN0IGhhdmUgZGF0YS4gQ2FudmFzIHdpZHRoOiBcIit0LndpZHRoK1wiLCBoZWlnaHQ6IFwiK3QuaGVpZ2h0KTt2YXIgYTtzd2l0Y2gocil7Y2FzZVwiUE5HXCI6YT1cImltYWdlL3BuZ1wiO2JyZWFrO2Nhc2VcIldFQlBcIjphPVwiaW1hZ2Uvd2VicFwiO2JyZWFrO2RlZmF1bHQ6YT1cImltYWdlL2pwZWdcIn1yZXR1cm4gZih0LnRvRGF0YVVSTChhLDEpLnNwbGl0KFwiYmFzZTY0LFwiKS5wb3AoKSl9fSxtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW50ZXJuYWwuY29sbGVjdGlvbnNbcitcImltYWdlc1wiXTtpZihlKWZvcih2YXIgbiBpbiBlKWlmKHQ9PT1lW25dLmFsaWFzKXJldHVybiBlW25dfSx2PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdHx8ZXx8KHQ9LTk2LGU9LTk2KSx0PDAmJih0PS0xKnIud2lkdGgqNzIvdC90aGlzLmludGVybmFsLnNjYWxlRmFjdG9yKSxlPDAmJihlPS0xKnIuaGVpZ2h0KjcyL2UvdGhpcy5pbnRlcm5hbC5zY2FsZUZhY3RvciksMD09PXQmJih0PWUqci53aWR0aC9yLmhlaWdodCksMD09PWUmJihlPXQqci5oZWlnaHQvci53aWR0aCksW3QsZV19LGI9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3ZhciBvPXYuY2FsbCh0aGlzLHIsbixpKSxzPXRoaXMuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyx1PXRoaXMuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nLGM9bC5jYWxsKHRoaXMpO2lmKHI9b1swXSxuPW9bMV0sY1tpLmluZGV4XT1pLGEpe2EqPU1hdGguUEkvMTgwO3ZhciBoPU1hdGguY29zKGEpLGY9TWF0aC5zaW4oYSksZD1mdW5jdGlvbih0KXtyZXR1cm4gdC50b0ZpeGVkKDQpfSxwPVtkKGgpLGQoZiksZCgtMSpmKSxkKGgpLDAsMCxcImNtXCJdfXRoaXMuaW50ZXJuYWwud3JpdGUoXCJxXCIpLGE/KHRoaXMuaW50ZXJuYWwud3JpdGUoWzEsXCIwXCIsXCIwXCIsMSxzKHQpLHUoZStuKSxcImNtXCJdLmpvaW4oXCIgXCIpKSx0aGlzLmludGVybmFsLndyaXRlKHAuam9pbihcIiBcIikpLHRoaXMuaW50ZXJuYWwud3JpdGUoW3MociksXCIwXCIsXCIwXCIscyhuKSxcIjBcIixcIjBcIixcImNtXCJdLmpvaW4oXCIgXCIpKSk6dGhpcy5pbnRlcm5hbC53cml0ZShbcyhyKSxcIjBcIixcIjBcIixzKG4pLHModCksdShlK24pLFwiY21cIl0uam9pbihcIiBcIikpLHRoaXMuaXNBZHZhbmNlZEFQSSgpJiZ0aGlzLmludGVybmFsLndyaXRlKFsxLDAsMCwtMSwwLDAsXCJjbVwiXS5qb2luKFwiIFwiKSksdGhpcy5pbnRlcm5hbC53cml0ZShcIi9JXCIraS5pbmRleCtcIiBEb1wiKSx0aGlzLmludGVybmFsLndyaXRlKFwiUVwiKX0seT1lLmNvbG9yX3NwYWNlcz17REVWSUNFX1JHQjpcIkRldmljZVJHQlwiLERFVklDRV9HUkFZOlwiRGV2aWNlR3JheVwiLERFVklDRV9DTVlLOlwiRGV2aWNlQ01ZS1wiLENBTF9HUkVZOlwiQ2FsR3JheVwiLENBTF9SR0I6XCJDYWxSR0JcIixMQUI6XCJMYWJcIixJQ0NfQkFTRUQ6XCJJQ0NCYXNlZFwiLElOREVYRUQ6XCJJbmRleGVkXCIsUEFUVEVSTjpcIlBhdHRlcm5cIixTRVBBUkFUSU9OOlwiU2VwYXJhdGlvblwiLERFVklDRV9OOlwiRGV2aWNlTlwifTtlLmRlY29kZT17RENUX0RFQ09ERTpcIkRDVERlY29kZVwiLEZMQVRFX0RFQ09ERTpcIkZsYXRlRGVjb2RlXCIsTFpXX0RFQ09ERTpcIkxaV0RlY29kZVwiLEpQWF9ERUNPREU6XCJKUFhEZWNvZGVcIixKQklHMl9ERUNPREU6XCJKQklHMkRlY29kZVwiLEFTQ0lJODVfREVDT0RFOlwiQVNDSUk4NURlY29kZVwiLEFTQ0lJX0hFWF9ERUNPREU6XCJBU0NJSUhleERlY29kZVwiLFJVTl9MRU5HVEhfREVDT0RFOlwiUnVuTGVuZ3RoRGVjb2RlXCIsQ0NJVFRfRkFYX0RFQ09ERTpcIkNDSVRURmF4RGVjb2RlXCJ9O3ZhciB3PWUuaW1hZ2VfY29tcHJlc3Npb249e05PTkU6XCJOT05FXCIsRkFTVDpcIkZBU1RcIixNRURJVU06XCJNRURJVU1cIixTTE9XOlwiU0xPV1wifSxOPWUuX19hZGRpbWFnZV9fLnNIYXNoQ29kZT1mdW5jdGlvbih0KXt2YXIgZSxyLG49MDtpZihcInN0cmluZ1wiPT10eXBlb2YgdClmb3Iocj10Lmxlbmd0aCxlPTA7ZTxyO2UrKyluPShuPDw1KS1uK3QuY2hhckNvZGVBdChlKSxufD0wO2Vsc2UgaWYoQSh0KSlmb3Iocj10LmJ5dGVMZW5ndGgvMixlPTA7ZTxyO2UrKyluPShuPDw1KS1uK3RbZV0sbnw9MDtyZXR1cm4gbn0sTD1lLl9fYWRkaW1hZ2VfXy52YWxpZGF0ZVN0cmluZ0FzQmFzZTY0PWZ1bmN0aW9uKHQpeyh0PXR8fFwiXCIpLnRvU3RyaW5nKCkudHJpbSgpO3ZhciBlPSEwO3JldHVybiAwPT09dC5sZW5ndGgmJihlPSExKSx0Lmxlbmd0aCU0IT0wJiYoZT0hMSksITE9PT0vXltBLVphLXowLTkrL10rJC8udGVzdCh0LnN1YnN0cigwLHQubGVuZ3RoLTIpKSYmKGU9ITEpLCExPT09L15bQS1aYS16MC05L11bQS1aYS16MC05Ky9dfFtBLVphLXowLTkrL109fD09JC8udGVzdCh0LnN1YnN0cigtMikpJiYoZT0hMSksZX0seD1lLl9fYWRkaW1hZ2VfXy5leHRyYWN0SW1hZ2VGcm9tRGF0YVVybD1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiBudWxsO2lmKCEodD10LnRyaW0oKSkuc3RhcnRzV2l0aChcImRhdGE6XCIpKXJldHVybiBudWxsO3ZhciBlPXQuaW5kZXhPZihcIixcIik7cmV0dXJuIGU8MD9udWxsOnQuc3Vic3RyaW5nKDAsZSkudHJpbSgpLmVuZHNXaXRoKFwiYmFzZTY0XCIpP3Quc3Vic3RyaW5nKGUrMSk6bnVsbH07ZS5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfTt2YXIgQT1lLl9fYWRkaW1hZ2VfXy5pc0FycmF5QnVmZmVyVmlldz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEludDhBcnJheXx8dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheXx8dCBpbnN0YW5jZW9mIEludDE2QXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50MTZBcnJheXx8dCBpbnN0YW5jZW9mIEludDMyQXJyYXl8fHQgaW5zdGFuY2VvZiBVaW50MzJBcnJheXx8dCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheXx8dCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheX0sUz1lLl9fYWRkaW1hZ2VfXy5iaW5hcnlTdHJpbmdUb1VpbnQ4QXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IFVpbnQ4QXJyYXkoZSksbj0wO248ZTtuKyspcltuXT10LmNoYXJDb2RlQXQobik7cmV0dXJuIHJ9LF89ZS5fX2FkZGltYWdlX18uYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZz1mdW5jdGlvbih0KXtmb3IodmFyIGU9XCJcIixyPUEodCk/dDpuZXcgVWludDhBcnJheSh0KSxuPTA7bjxyLmxlbmd0aDtuKz04MTkyKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxyLnN1YmFycmF5KG4sbis4MTkyKSk7cmV0dXJuIGV9O2UuYWRkSW1hZ2U9ZnVuY3Rpb24oKXt2YXIgZSxyLGksYSxvLHMsdSxsLGg7aWYoXCJudW1iZXJcIj09dHlwZW9mIGFyZ3VtZW50c1sxXT8ocj1uLGk9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdLG89YXJndW1lbnRzWzNdLHM9YXJndW1lbnRzWzRdLHU9YXJndW1lbnRzWzVdLGw9YXJndW1lbnRzWzZdLGg9YXJndW1lbnRzWzddKToocj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM10sbz1hcmd1bWVudHNbNF0scz1hcmd1bWVudHNbNV0sdT1hcmd1bWVudHNbNl0sbD1hcmd1bWVudHNbN10saD1hcmd1bWVudHNbOF0pLFwib2JqZWN0XCI9PT10KGU9YXJndW1lbnRzWzBdKSYmIXAoZSkmJlwiaW1hZ2VEYXRhXCJpbiBlKXt2YXIgZj1lO2U9Zi5pbWFnZURhdGEscj1mLmZvcm1hdHx8cnx8bixpPWYueHx8aXx8MCxhPWYueXx8YXx8MCxvPWYud3x8Zi53aWR0aHx8byxzPWYuaHx8Zi5oZWlnaHR8fHMsdT1mLmFsaWFzfHx1LGw9Zi5jb21wcmVzc2lvbnx8bCxoPWYucm90YXRpb258fGYuYW5nbGV8fGh9dmFyIGQ9dGhpcy5pbnRlcm5hbC5nZXRGaWx0ZXJzKCk7aWYodm9pZCAwPT09bCYmLTEhPT1kLmluZGV4T2YoXCJGbGF0ZUVuY29kZVwiKSYmKGw9XCJTTE9XXCIpLGlzTmFOKGkpfHxpc05hTihhKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvb3JkaW5hdGVzIHBhc3NlZCB0byBqc1BERi5hZGRJbWFnZVwiKTtjLmNhbGwodGhpcyk7dmFyIGc9UC5jYWxsKHRoaXMsZSxyLHUsbCk7cmV0dXJuIGIuY2FsbCh0aGlzLGksYSxvLHMsZyxoKSx0aGlzfTt2YXIgUD1mdW5jdGlvbih0LHIsaSxvKXt2YXIgcyx1LGM7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQmJmEodCk9PT1uKXt0PXVuZXNjYXBlKHQpO3ZhciBsPWsodCwhMSk7KFwiXCIhPT1sfHx2b2lkIDAhPT0obD1lLmxvYWRGaWxlKHQsITApKSkmJih0PWwpfWlmKHAodCkmJih0PWcodCxyKSkscj1hKHQsciksIWQocikpdGhyb3cgbmV3IEVycm9yKFwiYWRkSW1hZ2UgZG9lcyBub3Qgc3VwcG9ydCBmaWxlcyBvZiB0eXBlICdcIityK1wiJywgcGxlYXNlIGVuc3VyZSB0aGF0IGEgcGx1Z2luIGZvciAnXCIrcitcIicgc3VwcG9ydCBpcyBhZGRlZC5cIik7aWYoKG51bGw9PShjPWkpfHwwPT09Yy5sZW5ndGgpJiYoaT1mdW5jdGlvbih0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdHx8QSh0KT9OKHQpOkEodC5kYXRhKT9OKHQuZGF0YSk6bnVsbH0odCkpLChzPW0uY2FsbCh0aGlzLGkpKXx8KHQgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxcIlJHQkFcIj09PXJ8fCh1PXQsdD1TKHQpKSxzPXRoaXNbXCJwcm9jZXNzXCIrci50b1VwcGVyQ2FzZSgpXSh0LGguY2FsbCh0aGlzKSxpLGZ1bmN0aW9uKHQpe3JldHVybiB0JiZcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9dC50b1VwcGVyQ2FzZSgpKSx0IGluIGUuaW1hZ2VfY29tcHJlc3Npb24/dDp3Lk5PTkV9KG8pLHUpKSwhcyl0aHJvdyBuZXcgRXJyb3IoXCJBbiB1bmtub3duIGVycm9yIG9jY3VycmVkIHdoaWxzdCBwcm9jZXNzaW5nIHRoZSBpbWFnZS5cIik7cmV0dXJuIHN9LGs9ZS5fX2FkZGltYWdlX18uY29udmVydEJhc2U2NFRvQmluYXJ5U3RyaW5nPWZ1bmN0aW9uKHQsZSl7ZT1cImJvb2xlYW5cIiE9dHlwZW9mIGV8fGU7dmFyIHIsbj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXt2YXIgaTtyPW51bGwhPT0oaT14KHQpKSYmdm9pZCAwIT09aT9pOnQ7dHJ5e249ZihyKX1jYXRjaChhKXtpZihlKXRocm93IEwocik/bmV3IEVycm9yKFwiYXRvYi1FcnJvciBpbiBqc1BERi5jb252ZXJ0QmFzZTY0VG9CaW5hcnlTdHJpbmcgXCIrYS5tZXNzYWdlKTpuZXcgRXJyb3IoXCJTdXBwbGllZCBEYXRhIGlzIG5vdCBhIHZhbGlkIGJhc2U2NC1TdHJpbmcganNQREYuY29udmVydEJhc2U2NFRvQmluYXJ5U3RyaW5nIFwiKX19cmV0dXJuIG59O2UuZ2V0SW1hZ2VQcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe3ZhciByLGksbz1cIlwiO2lmKHAodCkmJih0PWcodCkpLFwic3RyaW5nXCI9PXR5cGVvZiB0JiZhKHQpPT09biYmKFwiXCI9PT0obz1rKHQsITEpKSYmKG89ZS5sb2FkRmlsZSh0KXx8XCJcIiksdD1vKSxpPWEodCksIWQoaSkpdGhyb3cgbmV3IEVycm9yKFwiYWRkSW1hZ2UgZG9lcyBub3Qgc3VwcG9ydCBmaWxlcyBvZiB0eXBlICdcIitpK1wiJywgcGxlYXNlIGVuc3VyZSB0aGF0IGEgcGx1Z2luIGZvciAnXCIraStcIicgc3VwcG9ydCBpcyBhZGRlZC5cIik7aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCh0PVModCkpLCEocj10aGlzW1wicHJvY2Vzc1wiK2kudG9VcHBlckNhc2UoKV0odCkpKXRocm93IG5ldyBFcnJvcihcIkFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQgd2hpbHN0IHByb2Nlc3NpbmcgdGhlIGltYWdlXCIpO3JldHVybiByLmZpbGVUeXBlPWkscn19KEUuQVBJKSxcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNCBTdGV2ZW4gU3B1bmdpbiAoVHdlbHZlVG9uZSBMTEMpICBzdGV2ZW5AdHdlbHZldG9uZS50dlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10JiZcIlwiIT10KXJldHVybiEwfTtFLkFQSS5ldmVudHMucHVzaChbXCJhZGRQYWdlXCIsZnVuY3Rpb24odCl7dGhpcy5pbnRlcm5hbC5nZXRQYWdlSW5mbyh0LnBhZ2VOdW1iZXIpLnBhZ2VDb250ZXh0LmFubm90YXRpb25zPVtdfV0pLHQuZXZlbnRzLnB1c2goW1wicHV0UGFnZVwiLGZ1bmN0aW9uKHQpe2Zvcih2YXIgcixuLGksYT10aGlzLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcsbz10aGlzLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyxzPXRoaXMuaW50ZXJuYWwuZ2V0UGFnZUluZm9CeU9iaklkKHQub2JqSWQpLHU9dC5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucyxjPSExLGw9MDtsPHUubGVuZ3RoJiYhYztsKyspc3dpdGNoKChyPXVbbF0pLnR5cGUpe2Nhc2VcImxpbmtcIjooZShyLm9wdGlvbnMudXJsKXx8ZShyLm9wdGlvbnMucGFnZU51bWJlcikpJiYoYz0hMCk7YnJlYWs7Y2FzZVwicmVmZXJlbmNlXCI6Y2FzZVwidGV4dFwiOmNhc2VcImZyZWV0ZXh0XCI6Yz0hMH1pZigwIT1jKXt0aGlzLmludGVybmFsLndyaXRlKFwiL0Fubm90cyBbXCIpO2Zvcih2YXIgaD0wO2g8dS5sZW5ndGg7aCsrKXtyPXVbaF07dmFyIGY9dGhpcy5pbnRlcm5hbC5wZGZFc2NhcGUsZD10aGlzLmludGVybmFsLmdldEVuY3J5cHRvcih0Lm9iaklkKTtzd2l0Y2goci50eXBlKXtjYXNlXCJyZWZlcmVuY2VcIjp0aGlzLmludGVybmFsLndyaXRlKFwiIFwiK3Iub2JqZWN0Lm9iaklkK1wiIDAgUiBcIik7YnJlYWs7Y2FzZVwidGV4dFwiOnZhciBwPXRoaXMuaW50ZXJuYWwubmV3QWRkaXRpb25hbE9iamVjdCgpLGc9dGhpcy5pbnRlcm5hbC5uZXdBZGRpdGlvbmFsT2JqZWN0KCksbT10aGlzLmludGVybmFsLmdldEVuY3J5cHRvcihwLm9iaklkKSx2PXIudGl0bGV8fFwiTm90ZVwiO2k9XCI8PC9UeXBlIC9Bbm5vdCAvU3VidHlwZSAvVGV4dCBcIisobj1cIi9SZWN0IFtcIithKHIuYm91bmRzLngpK1wiIFwiK28oci5ib3VuZHMueStyLmJvdW5kcy5oKStcIiBcIithKHIuYm91bmRzLngrci5ib3VuZHMudykrXCIgXCIrbyhyLmJvdW5kcy55KStcIl0gXCIpK1wiL0NvbnRlbnRzIChcIitmKG0oci5jb250ZW50cykpK1wiKVwiLGkrPVwiIC9Qb3B1cCBcIitnLm9iaklkK1wiIDAgUlwiLGkrPVwiIC9QIFwiK3Mub2JqSWQrXCIgMCBSXCIsaSs9XCIgL1QgKFwiK2YobSh2KSkrXCIpID4+XCIscC5jb250ZW50PWk7dmFyIGI9cC5vYmpJZCtcIiAwIFJcIjtpPVwiPDwvVHlwZSAvQW5ub3QgL1N1YnR5cGUgL1BvcHVwIFwiKyhuPVwiL1JlY3QgW1wiK2Eoci5ib3VuZHMueCszMCkrXCIgXCIrbyhyLmJvdW5kcy55K3IuYm91bmRzLmgpK1wiIFwiK2Eoci5ib3VuZHMueCtyLmJvdW5kcy53KzMwKStcIiBcIitvKHIuYm91bmRzLnkpK1wiXSBcIikrXCIgL1BhcmVudCBcIitiLHIub3BlbiYmKGkrPVwiIC9PcGVuIHRydWVcIiksaSs9XCIgPj5cIixnLmNvbnRlbnQ9aSx0aGlzLmludGVybmFsLndyaXRlKHAub2JqSWQsXCIwIFJcIixnLm9iaklkLFwiMCBSXCIpO2JyZWFrO2Nhc2VcImZyZWV0ZXh0XCI6bj1cIi9SZWN0IFtcIithKHIuYm91bmRzLngpK1wiIFwiK28oci5ib3VuZHMueSkrXCIgXCIrYShyLmJvdW5kcy54K3IuYm91bmRzLncpK1wiIFwiK28oci5ib3VuZHMueStyLmJvdW5kcy5oKStcIl0gXCI7dmFyIHk9XCJmb250OiBIZWx2ZXRpY2Esc2Fucy1zZXJpZiAxMi4wcHQ7IHRleHQtYWxpZ246bGVmdDsgY29sb3I6I1wiKyhyLmNvbG9yfHxcIiMwMDAwMDBcIik7aT1cIjw8L1R5cGUgL0Fubm90IC9TdWJ0eXBlIC9GcmVlVGV4dCBcIituK1wiL0NvbnRlbnRzIChcIitmKGQoci5jb250ZW50cykpK1wiKVwiLGkrPVwiIC9EUyhcIitmKGQoeSkpK1wiKVwiLGkrPVwiIC9Cb3JkZXIgWzAgMCAwXVwiLGkrPVwiID4+XCIsdGhpcy5pbnRlcm5hbC53cml0ZShpKTticmVhaztjYXNlXCJsaW5rXCI6aWYoci5vcHRpb25zLm5hbWUpe3ZhciB3PXRoaXMuYW5ub3RhdGlvbnMuX25hbWVNYXBbci5vcHRpb25zLm5hbWVdO3Iub3B0aW9ucy5wYWdlTnVtYmVyPXcucGFnZSxyLm9wdGlvbnMudG9wPXcueX1lbHNlIHIub3B0aW9ucy50b3B8fChyLm9wdGlvbnMudG9wPTApO2lmKG49XCIvUmVjdCBbXCIrci5maW5hbEJvdW5kcy54K1wiIFwiK3IuZmluYWxCb3VuZHMueStcIiBcIityLmZpbmFsQm91bmRzLncrXCIgXCIrci5maW5hbEJvdW5kcy5oK1wiXSBcIixpPVwiXCIsci5vcHRpb25zLnVybClpPVwiPDwvVHlwZSAvQW5ub3QgL1N1YnR5cGUgL0xpbmsgXCIrbitcIi9Cb3JkZXIgWzAgMCAwXSAvQSA8PC9TIC9VUkkgL1VSSSAoXCIrZihkKHIub3B0aW9ucy51cmwpKStcIikgPj5cIjtlbHNlIGlmKHIub3B0aW9ucy5wYWdlTnVtYmVyKXN3aXRjaChpPVwiPDwvVHlwZSAvQW5ub3QgL1N1YnR5cGUgL0xpbmsgXCIrbitcIi9Cb3JkZXIgWzAgMCAwXSAvRGVzdCBbXCIrdGhpcy5pbnRlcm5hbC5nZXRQYWdlSW5mbyhyLm9wdGlvbnMucGFnZU51bWJlcikub2JqSWQrXCIgMCBSXCIsci5vcHRpb25zLm1hZ0ZhY3Rvcj1yLm9wdGlvbnMubWFnRmFjdG9yfHxcIlhZWlwiLHIub3B0aW9ucy5tYWdGYWN0b3Ipe2Nhc2VcIkZpdFwiOmkrPVwiIC9GaXRdXCI7YnJlYWs7Y2FzZVwiRml0SFwiOmkrPVwiIC9GaXRIIFwiK3Iub3B0aW9ucy50b3ArXCJdXCI7YnJlYWs7Y2FzZVwiRml0VlwiOnIub3B0aW9ucy5sZWZ0PXIub3B0aW9ucy5sZWZ0fHwwLGkrPVwiIC9GaXRWIFwiK3Iub3B0aW9ucy5sZWZ0K1wiXVwiO2JyZWFrO2RlZmF1bHQ6dmFyIE49byhyLm9wdGlvbnMudG9wKTtyLm9wdGlvbnMubGVmdD1yLm9wdGlvbnMubGVmdHx8MCx2b2lkIDA9PT1yLm9wdGlvbnMuem9vbSYmKHIub3B0aW9ucy56b29tPTApLGkrPVwiIC9YWVogXCIrci5vcHRpb25zLmxlZnQrXCIgXCIrTitcIiBcIityLm9wdGlvbnMuem9vbStcIl1cIn1cIlwiIT1pJiYoaSs9XCIgPj5cIix0aGlzLmludGVybmFsLndyaXRlKGkpKX19dGhpcy5pbnRlcm5hbC53cml0ZShcIl1cIil9fV0pLHQuY3JlYXRlQW5ub3RhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmludGVybmFsLmdldEN1cnJlbnRQYWdlSW5mbygpO3N3aXRjaCh0LnR5cGUpe2Nhc2VcImxpbmtcIjp0aGlzLmxpbmsodC5ib3VuZHMueCx0LmJvdW5kcy55LHQuYm91bmRzLncsdC5ib3VuZHMuaCx0KTticmVhaztjYXNlXCJ0ZXh0XCI6Y2FzZVwiZnJlZXRleHRcIjplLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLnB1c2godCl9fSx0Lmxpbms9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYT10aGlzLmludGVybmFsLmdldEN1cnJlbnRQYWdlSW5mbygpLG89dGhpcy5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nLHM9dGhpcy5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmc7YS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5wdXNoKHtmaW5hbEJvdW5kczp7eDpvKHQpLHk6cyhlKSx3Om8odCtyKSxoOnMoZStuKX0sb3B0aW9uczppLHR5cGU6XCJsaW5rXCJ9KX0sdC50ZXh0V2l0aExpbms9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGksYSxvPXRoaXMuZ2V0VGV4dFdpZHRoKHQpLHM9dGhpcy5pbnRlcm5hbC5nZXRMaW5lSGVpZ2h0KCkvdGhpcy5pbnRlcm5hbC5zY2FsZUZhY3RvcjtpZih2b2lkIDAhPT1uLm1heFdpZHRoKXthPW4ubWF4V2lkdGg7dmFyIHU9dGhpcy5zcGxpdFRleHRUb1NpemUodCxhKS5sZW5ndGg7aT1NYXRoLmNlaWwocyp1KX1lbHNlIGE9byxpPXM7cmV0dXJuIHRoaXMudGV4dCh0LGUscixuKSxyKz0uMipzLFwiY2VudGVyXCI9PT1uLmFsaWduJiYoZS09by8yKSxcInJpZ2h0XCI9PT1uLmFsaWduJiYoZS09byksdGhpcy5saW5rKGUsci1zLGEsaSxuKSxvfSx0LmdldFRleHRXaWR0aD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmludGVybmFsLmdldEZvbnRTaXplKCk7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nVW5pdFdpZHRoKHQpKmUvdGhpcy5pbnRlcm5hbC5zY2FsZUZhY3Rvcn19KEUuQVBJKSxcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNyBBcmFzIEFiYmFzaVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5mdW5jdGlvbih0KXt2YXIgZT17MTU2OTpbNjUxNTJdLDE1NzA6WzY1MTUzLDY1MTU0XSwxNTcxOls2NTE1NSw2NTE1Nl0sMTU3MjpbNjUxNTcsNjUxNThdLDE1NzM6WzY1MTU5LDY1MTYwXSwxNTc0Ols2NTE2MSw2NTE2Miw2NTE2Myw2NTE2NF0sMTU3NTpbNjUxNjUsNjUxNjZdLDE1NzY6WzY1MTY3LDY1MTY4LDY1MTY5LDY1MTcwXSwxNTc3Ols2NTE3MSw2NTE3Ml0sMTU3ODpbNjUxNzMsNjUxNzQsNjUxNzUsNjUxNzZdLDE1Nzk6WzY1MTc3LDY1MTc4LDY1MTc5LDY1MTgwXSwxNTgwOls2NTE4MSw2NTE4Miw2NTE4Myw2NTE4NF0sMTU4MTpbNjUxODUsNjUxODYsNjUxODcsNjUxODhdLDE1ODI6WzY1MTg5LDY1MTkwLDY1MTkxLDY1MTkyXSwxNTgzOls2NTE5Myw2NTE5NF0sMTU4NDpbNjUxOTUsNjUxOTZdLDE1ODU6WzY1MTk3LDY1MTk4XSwxNTg2Ols2NTE5OSw2NTIwMF0sMTU4NzpbNjUyMDEsNjUyMDIsNjUyMDMsNjUyMDRdLDE1ODg6WzY1MjA1LDY1MjA2LDY1MjA3LDY1MjA4XSwxNTg5Ols2NTIwOSw2NTIxMCw2NTIxMSw2NTIxMl0sMTU5MDpbNjUyMTMsNjUyMTQsNjUyMTUsNjUyMTZdLDE1OTE6WzY1MjE3LDY1MjE4LDY1MjE5LDY1MjIwXSwxNTkyOls2NTIyMSw2NTIyMiw2NTIyMyw2NTIyNF0sMTU5MzpbNjUyMjUsNjUyMjYsNjUyMjcsNjUyMjhdLDE1OTQ6WzY1MjI5LDY1MjMwLDY1MjMxLDY1MjMyXSwxNjAxOls2NTIzMyw2NTIzNCw2NTIzNSw2NTIzNl0sMTYwMjpbNjUyMzcsNjUyMzgsNjUyMzksNjUyNDBdLDE2MDM6WzY1MjQxLDY1MjQyLDY1MjQzLDY1MjQ0XSwxNjA0Ols2NTI0NSw2NTI0Niw2NTI0Nyw2NTI0OF0sMTYwNTpbNjUyNDksNjUyNTAsNjUyNTEsNjUyNTJdLDE2MDY6WzY1MjUzLDY1MjU0LDY1MjU1LDY1MjU2XSwxNjA3Ols2NTI1Nyw2NTI1OCw2NTI1OSw2NTI2MF0sMTYwODpbNjUyNjEsNjUyNjJdLDE2MDk6WzY1MjYzLDY1MjY0LDY0NDg4LDY0NDg5XSwxNjEwOls2NTI2NSw2NTI2Niw2NTI2Nyw2NTI2OF0sMTY0OTpbNjQzMzYsNjQzMzddLDE2NTU6WzY0NDc3XSwxNjU3Ols2NDM1OCw2NDM1OSw2NDM2MCw2NDM2MV0sMTY1ODpbNjQzNTAsNjQzNTEsNjQzNTIsNjQzNTNdLDE2NTk6WzY0MzM4LDY0MzM5LDY0MzQwLDY0MzQxXSwxNjYyOls2NDM0Miw2NDM0Myw2NDM0NCw2NDM0NV0sMTY2MzpbNjQzNTQsNjQzNTUsNjQzNTYsNjQzNTddLDE2NjQ6WzY0MzQ2LDY0MzQ3LDY0MzQ4LDY0MzQ5XSwxNjY3Ols2NDM3NCw2NDM3NSw2NDM3Niw2NDM3N10sMTY2ODpbNjQzNzAsNjQzNzEsNjQzNzIsNjQzNzNdLDE2NzA6WzY0Mzc4LDY0Mzc5LDY0MzgwLDY0MzgxXSwxNjcxOls2NDM4Miw2NDM4Myw2NDM4NCw2NDM4NV0sMTY3MjpbNjQzOTIsNjQzOTNdLDE2NzY6WzY0Mzg4LDY0Mzg5XSwxNjc3Ols2NDM4Niw2NDM4N10sMTY3ODpbNjQzOTAsNjQzOTFdLDE2ODE6WzY0Mzk2LDY0Mzk3XSwxNjg4Ols2NDM5NCw2NDM5NV0sMTcwMDpbNjQzNjIsNjQzNjMsNjQzNjQsNjQzNjVdLDE3MDI6WzY0MzY2LDY0MzY3LDY0MzY4LDY0MzY5XSwxNzA1Ols2NDM5OCw2NDM5OSw2NDQwMCw2NDQwMV0sMTcwOTpbNjQ0NjcsNjQ0NjgsNjQ0NjksNjQ0NzBdLDE3MTE6WzY0NDAyLDY0NDAzLDY0NDA0LDY0NDA1XSwxNzEzOls2NDQxMCw2NDQxMSw2NDQxMiw2NDQxM10sMTcxNTpbNjQ0MDYsNjQ0MDcsNjQ0MDgsNjQ0MDldLDE3MjI6WzY0NDE0LDY0NDE1XSwxNzIzOls2NDQxNiw2NDQxNyw2NDQxOCw2NDQxOV0sMTcyNjpbNjQ0MjYsNjQ0MjcsNjQ0MjgsNjQ0MjldLDE3Mjg6WzY0NDIwLDY0NDIxXSwxNzI5Ols2NDQyMiw2NDQyMyw2NDQyNCw2NDQyNV0sMTczMzpbNjQ0ODAsNjQ0ODFdLDE3MzQ6WzY0NDczLDY0NDc0XSwxNzM1Ols2NDQ3MSw2NDQ3Ml0sMTczNjpbNjQ0NzUsNjQ0NzZdLDE3Mzc6WzY0NDgyLDY0NDgzXSwxNzM5Ols2NDQ3OCw2NDQ3OV0sMTc0MDpbNjQ1MDgsNjQ1MDksNjQ1MTAsNjQ1MTFdLDE3NDQ6WzY0NDg0LDY0NDg1LDY0NDg2LDY0NDg3XSwxNzQ2Ols2NDQzMCw2NDQzMV0sMTc0NzpbNjQ0MzIsNjQ0MzNdfSxyPXs2NTI0Nzp7NjUxNTQ6NjUyNjksNjUxNTY6NjUyNzEsNjUxNjA6NjUyNzMsNjUxNjY6NjUyNzV9LDY1MjQ4Ons2NTE1NDo2NTI3MCw2NTE1Njo2NTI3Miw2NTE2MDo2NTI3NCw2NTE2Njo2NTI3Nn0sNjUxNjU6ezY1MjQ3Ons2NTI0ODp7NjUyNTg6NjUwMTB9fX0sMTYxNzp7MTYxMjo2NDYwNiwxNjEzOjY0NjA3LDE2MTQ6NjQ2MDgsMTYxNTo2NDYwOSwxNjE2OjY0NjEwfX0sbj17MTYxMjo2NDYwNiwxNjEzOjY0NjA3LDE2MTQ6NjQ2MDgsMTYxNTo2NDYwOSwxNjE2OjY0NjEwfSxpPVsxNTcwLDE1NzEsMTU3MywxNTc1XTt0Ll9fYXJhYmljUGFyc2VyX189e307dmFyIGE9dC5fX2FyYWJpY1BhcnNlcl9fLmlzSW5BcmFiaWNTdWJzdGl0dXRpb25BPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT1lW3QuY2hhckNvZGVBdCgwKV19LG89dC5fX2FyYWJpY1BhcnNlcl9fLmlzQXJhYmljTGV0dGVyPWZ1bmN0aW9uKHQpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0JiYvXltcXHUwNjAwLVxcdTA2RkZcXHUwNzUwLVxcdTA3N0ZcXHUwOEEwLVxcdTA4RkZcXHVGQjUwLVxcdUZERkZcXHVGRTcwLVxcdUZFRkZdKyQvLnRlc3QodCl9LHM9dC5fX2FyYWJpY1BhcnNlcl9fLmlzQXJhYmljRW5kTGV0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpJiZhKHQpJiZlW3QuY2hhckNvZGVBdCgwKV0ubGVuZ3RoPD0yfSx1PXQuX19hcmFiaWNQYXJzZXJfXy5pc0FyYWJpY0FsZkxldHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KSYmaS5pbmRleE9mKHQuY2hhckNvZGVBdCgwKSk+PTB9O3QuX19hcmFiaWNQYXJzZXJfXy5hcmFiaWNMZXR0ZXJIYXNJc29sYXRlZEZvcm09ZnVuY3Rpb24odCl7cmV0dXJuIG8odCkmJmEodCkmJmVbdC5jaGFyQ29kZUF0KDApXS5sZW5ndGg+PTF9O3ZhciBjPXQuX19hcmFiaWNQYXJzZXJfXy5hcmFiaWNMZXR0ZXJIYXNGaW5hbEZvcm09ZnVuY3Rpb24odCl7cmV0dXJuIG8odCkmJmEodCkmJmVbdC5jaGFyQ29kZUF0KDApXS5sZW5ndGg+PTJ9O3QuX19hcmFiaWNQYXJzZXJfXy5hcmFiaWNMZXR0ZXJIYXNJbml0aWFsRm9ybT1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KSYmYSh0KSYmZVt0LmNoYXJDb2RlQXQoMCldLmxlbmd0aD49M307dmFyIGw9dC5fX2FyYWJpY1BhcnNlcl9fLmFyYWJpY0xldHRlckhhc01lZGlhbEZvcm09ZnVuY3Rpb24odCl7cmV0dXJuIG8odCkmJmEodCkmJjQ9PWVbdC5jaGFyQ29kZUF0KDApXS5sZW5ndGh9LGg9dC5fX2FyYWJpY1BhcnNlcl9fLnJlc29sdmVMaWdhdHVyZXM9ZnVuY3Rpb24odCl7dmFyIGU9MCxuPXIsaT1cIlwiLGE9MDtmb3IoZT0wO2U8dC5sZW5ndGg7ZSs9MSl2b2lkIDAhPT1uW3QuY2hhckNvZGVBdChlKV0/KGErKyxcIm51bWJlclwiPT10eXBlb2Yobj1uW3QuY2hhckNvZGVBdChlKV0pJiYoaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuKSxuPXIsYT0wKSxlPT09dC5sZW5ndGgtMSYmKG49cixpKz10LmNoYXJBdChlLShhLTEpKSxlLT1hLTEsYT0wKSk6KG49cixpKz10LmNoYXJBdChlLWEpLGUtPWEsYT0wKTtyZXR1cm4gaX07dC5fX2FyYWJpY1BhcnNlcl9fLmlzQXJhYmljRGlhY3JpdGljPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10JiZ2b2lkIDAhPT1uW3QuY2hhckNvZGVBdCgwKV19O3ZhciBmPXQuX19hcmFiaWNQYXJzZXJfXy5nZXRDb3JyZWN0Rm9ybT1mdW5jdGlvbih0LGUscil7cmV0dXJuIG8odCk/ITE9PT1hKHQpPy0xOiFjKHQpfHwhbyhlKSYmIW8ocil8fCFvKHIpJiZzKGUpfHxzKHQpJiYhbyhlKXx8cyh0KSYmdShlKXx8cyh0KSYmcyhlKT8wOmwodCkmJm8oZSkmJiFzKGUpJiZvKHIpJiZjKHIpPzM6cyh0KXx8IW8ocik/MToyOi0xfSxkPWZ1bmN0aW9uKHQpe3ZhciByPTAsbj0wLGk9MCxhPVwiXCIscz1cIlwiLHU9XCJcIixjPSh0PXR8fFwiXCIpLnNwbGl0KFwiXFxcXHMrXCIpLGw9W107Zm9yKHI9MDtyPGMubGVuZ3RoO3IrPTEpe2ZvcihsLnB1c2goXCJcIiksbj0wO248Y1tyXS5sZW5ndGg7bis9MSlhPWNbcl1bbl0scz1jW3JdW24tMV0sdT1jW3JdW24rMV0sbyhhKT8oaT1mKGEscyx1KSxsW3JdKz0tMSE9PWk/U3RyaW5nLmZyb21DaGFyQ29kZShlW2EuY2hhckNvZGVBdCgwKV1baV0pOmEpOmxbcl0rPWE7bFtyXT1oKGxbcl0pfXJldHVybiBsLmpvaW4oXCIgXCIpfSxwPXQuX19hcmFiaWNQYXJzZXJfXy5wcm9jZXNzQXJhYmljPXQucHJvY2Vzc0FyYWJpYz1mdW5jdGlvbigpe3ZhciB0LGU9XCJzdHJpbmdcIj09dHlwZW9mIGFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06YXJndW1lbnRzWzBdLnRleHQscj1bXTtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbj0wO2ZvcihyPVtdLG49MDtuPGUubGVuZ3RoO24rPTEpQXJyYXkuaXNBcnJheShlW25dKT9yLnB1c2goW2QoZVtuXVswXSksZVtuXVsxXSxlW25dWzJdXSk6ci5wdXNoKFtkKGVbbl0pXSk7dD1yfWVsc2UgdD1kKGUpO3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBhcmd1bWVudHNbMF0/dDooYXJndW1lbnRzWzBdLnRleHQ9dCxhcmd1bWVudHNbMF0pfTt0LmV2ZW50cy5wdXNoKFtcInByZVByb2Nlc3NUZXh0XCIscF0pfShFLkFQSSksRS5BUEkuYXV0b1ByaW50PWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybih0PXR8fHt9KS52YXJpYW50PXQudmFyaWFudHx8XCJub24tY29uZm9ybVwiLFwiamF2YXNjcmlwdFwiPT09dC52YXJpYW50P3RoaXMuYWRkSlMoXCJwcmludCh7fSk7XCIpOih0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoXCJwb3N0UHV0UmVzb3VyY2VzXCIsZnVuY3Rpb24oKXtlPXRoaXMuaW50ZXJuYWwubmV3T2JqZWN0KCksdGhpcy5pbnRlcm5hbC5vdXQoXCI8PFwiKSx0aGlzLmludGVybmFsLm91dChcIi9TIC9OYW1lZFwiKSx0aGlzLmludGVybmFsLm91dChcIi9UeXBlIC9BY3Rpb25cIiksdGhpcy5pbnRlcm5hbC5vdXQoXCIvTiAvUHJpbnRcIiksdGhpcy5pbnRlcm5hbC5vdXQoXCI+PlwiKSx0aGlzLmludGVybmFsLm91dChcImVuZG9ialwiKX0pLHRoaXMuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZShcInB1dENhdGFsb2dcIixmdW5jdGlvbigpe3RoaXMuaW50ZXJuYWwub3V0KFwiL09wZW5BY3Rpb24gXCIrZStcIiAwIFJcIil9KSksdGhpc30sXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgU3RldmVuIFNwdW5naW4gKFR3ZWx2ZVRvbmUgTExDKSAgc3RldmVuQHR3ZWx2ZXRvbmUudHZcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXt2YXIgdD12b2lkIDA7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJwZGZcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHR9LHNldDpmdW5jdGlvbihlKXt0PWV9fSk7dmFyIGU9MTUwO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwid2lkdGhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNldDpmdW5jdGlvbih0KXtlPWlzTmFOKHQpfHwhMT09PU51bWJlci5pc0ludGVnZXIodCl8fHQ8MD8xNTA6dCx0aGlzLmdldENvbnRleHQoXCIyZFwiKS5wYWdlV3JhcFhFbmFibGVkJiYodGhpcy5nZXRDb250ZXh0KFwiMmRcIikucGFnZVdyYXBYPWUrMSl9fSk7dmFyIHI9MzAwO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiaGVpZ2h0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiByfSxzZXQ6ZnVuY3Rpb24odCl7cj1pc05hTih0KXx8ITE9PT1OdW1iZXIuaXNJbnRlZ2VyKHQpfHx0PDA/MzAwOnQsdGhpcy5nZXRDb250ZXh0KFwiMmRcIikucGFnZVdyYXBZRW5hYmxlZCYmKHRoaXMuZ2V0Q29udGV4dChcIjJkXCIpLnBhZ2VXcmFwWT1yKzEpfX0pO3ZhciBuPVtdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiY2hpbGROb2Rlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sc2V0OmZ1bmN0aW9uKHQpe249dH19KTt2YXIgaT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInN0eWxlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBpfSxzZXQ6ZnVuY3Rpb24odCl7aT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicGFyZW50Tm9kZVwiLHt9KX07ZS5wcm90b3R5cGUuZ2V0Q29udGV4dD1mdW5jdGlvbih0LGUpe3ZhciByO2lmKFwiMmRcIiE9PSh0PXR8fFwiMmRcIikpcmV0dXJuIG51bGw7Zm9yKHIgaW4gZSl0aGlzLnBkZi5jb250ZXh0MmQuaGFzT3duUHJvcGVydHkocikmJih0aGlzLnBkZi5jb250ZXh0MmRbcl09ZVtyXSk7cmV0dXJuIHRoaXMucGRmLmNvbnRleHQyZC5fY2FudmFzPXRoaXMsdGhpcy5wZGYuY29udGV4dDJkfSxlLnByb3RvdHlwZS50b0RhdGFVUkw9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0b0RhdGFVUkwgaXMgbm90IGltcGxlbWVudGVkLlwiKX0sdC5ldmVudHMucHVzaChbXCJpbml0aWFsaXplZFwiLGZ1bmN0aW9uKCl7dGhpcy5jYW52YXM9bmV3IGUsdGhpcy5jYW52YXMucGRmPXRoaXN9XSl9KEUuQVBJKSxmdW5jdGlvbihlKXt2YXIgcj17bGVmdDowLHRvcDowLGJvdHRvbTowLHJpZ2h0OjB9LG49ITEsaT1mdW5jdGlvbigpe3ZvaWQgMD09PXRoaXMuaW50ZXJuYWwuX19jZWxsX18mJih0aGlzLmludGVybmFsLl9fY2VsbF9fPXt9LHRoaXMuaW50ZXJuYWwuX19jZWxsX18ucGFkZGluZz0zLHRoaXMuaW50ZXJuYWwuX19jZWxsX18uaGVhZGVyRnVuY3Rpb249dm9pZCAwLHRoaXMuaW50ZXJuYWwuX19jZWxsX18ubWFyZ2lucz1PYmplY3QuYXNzaWduKHt9LHIpLHRoaXMuaW50ZXJuYWwuX19jZWxsX18ubWFyZ2lucy53aWR0aD10aGlzLmdldFBhZ2VXaWR0aCgpLGEuY2FsbCh0aGlzKSl9LGE9ZnVuY3Rpb24oKXt0aGlzLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsPW5ldyBvLHRoaXMuaW50ZXJuYWwuX19jZWxsX18ucGFnZXM9MX0sbz1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50c1swXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInhcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdH0sc2V0OmZ1bmN0aW9uKGUpe3Q9ZX19KTt2YXIgZT1hcmd1bWVudHNbMV07T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ5XCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNldDpmdW5jdGlvbih0KXtlPXR9fSk7dmFyIHI9YXJndW1lbnRzWzJdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwid2lkdGhcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sc2V0OmZ1bmN0aW9uKHQpe3I9dH19KTt2YXIgbj1hcmd1bWVudHNbM107T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJoZWlnaHRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sc2V0OmZ1bmN0aW9uKHQpe249dH19KTt2YXIgaT1hcmd1bWVudHNbNF07T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ0ZXh0XCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbih0KXtpPXR9fSk7dmFyIGE9YXJndW1lbnRzWzVdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwibGluZU51bWJlclwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhfSxzZXQ6ZnVuY3Rpb24odCl7YT10fX0pO3ZhciBvPWFyZ3VtZW50c1s2XTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJhbGlnblwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvfSxzZXQ6ZnVuY3Rpb24odCl7bz10fX0pLHRoaXN9O28ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKHRoaXMueCx0aGlzLnksdGhpcy53aWR0aCx0aGlzLmhlaWdodCx0aGlzLnRleHQsdGhpcy5saW5lTnVtYmVyLHRoaXMuYWxpZ24pfSxvLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMueCx0aGlzLnksdGhpcy53aWR0aCx0aGlzLmhlaWdodCx0aGlzLnRleHQsdGhpcy5saW5lTnVtYmVyLHRoaXMuYWxpZ25dfSxlLnNldEhlYWRlckZ1bmN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBpLmNhbGwodGhpcyksdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5oZWFkZXJGdW5jdGlvbj1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3Q6dm9pZCAwLHRoaXN9LGUuZ2V0VGV4dERpbWVuc2lvbnM9ZnVuY3Rpb24odCxlKXtpLmNhbGwodGhpcyk7dmFyIHI9KGU9ZXx8e30pLmZvbnRTaXplfHx0aGlzLmdldEZvbnRTaXplKCksbj1lLmZvbnR8fHRoaXMuZ2V0Rm9udCgpLGE9ZS5zY2FsZUZhY3Rvcnx8dGhpcy5pbnRlcm5hbC5zY2FsZUZhY3RvcixvPTAscz0wLHU9MCxjPXRoaXM7aWYoIUFycmF5LmlzQXJyYXkodCkmJlwic3RyaW5nXCIhPXR5cGVvZiB0KXtpZihcIm51bWJlclwiIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoXCJnZXRUZXh0RGltZW5zaW9ucyBleHBlY3RzIHRleHQtcGFyYW1ldGVyIHRvIGJlIG9mIHR5cGUgU3RyaW5nIG9yIHR5cGUgTnVtYmVyIG9yIGFuIEFycmF5IG9mIFN0cmluZ3MuXCIpO3Q9U3RyaW5nKHQpfXZhciBsPWUubWF4V2lkdGg7bD4wP1wic3RyaW5nXCI9PXR5cGVvZiB0P3Q9dGhpcy5zcGxpdFRleHRUb1NpemUodCxsKTpcIltvYmplY3QgQXJyYXldXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkmJih0PXQucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY29uY2F0KGMuc3BsaXRUZXh0VG9TaXplKGUsbCkpfSxbXSkpOnQ9QXJyYXkuaXNBcnJheSh0KT90Olt0XTtmb3IodmFyIGg9MDtoPHQubGVuZ3RoO2grKylvPCh1PXRoaXMuZ2V0U3RyaW5nVW5pdFdpZHRoKHRbaF0se2ZvbnQ6bn0pKnIpJiYobz11KTtyZXR1cm4gMCE9PW8mJihzPXQubGVuZ3RoKSx7dzpvLz1hLGg6TWF0aC5tYXgoKHMqcip0aGlzLmdldExpbmVIZWlnaHRGYWN0b3IoKS1yKih0aGlzLmdldExpbmVIZWlnaHRGYWN0b3IoKS0xKSkvYSwwKX19LGUuY2VsbEFkZFBhZ2U9ZnVuY3Rpb24oKXtpLmNhbGwodGhpcyksdGhpcy5hZGRQYWdlKCk7dmFyIHQ9dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5tYXJnaW5zfHxyO3JldHVybiB0aGlzLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsPW5ldyBvKHQubGVmdCx0LnRvcCx2b2lkIDAsdm9pZCAwKSx0aGlzLmludGVybmFsLl9fY2VsbF9fLnBhZ2VzKz0xLHRoaXN9O3ZhciBzPWUuY2VsbD1mdW5jdGlvbigpe3ZhciB0O3Q9YXJndW1lbnRzWzBdaW5zdGFuY2VvZiBvP2FyZ3VtZW50c1swXTpuZXcgbyhhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10sYXJndW1lbnRzWzRdLGFyZ3VtZW50c1s1XSxhcmd1bWVudHNbNl0pLGkuY2FsbCh0aGlzKTt2YXIgZT10aGlzLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLGE9dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5wYWRkaW5nLHM9dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5tYXJnaW5zfHxyLHU9dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy50YWJsZUhlYWRlclJvdyxjPXRoaXMuaW50ZXJuYWwuX19jZWxsX18ucHJpbnRIZWFkZXJzO3JldHVybiB2b2lkIDAhPT1lLmxpbmVOdW1iZXImJihlLmxpbmVOdW1iZXI9PT10LmxpbmVOdW1iZXI/KHQueD0oZS54fHwwKSsoZS53aWR0aHx8MCksdC55PWUueXx8MCk6ZS55K2UuaGVpZ2h0K3QuaGVpZ2h0K3MuYm90dG9tPnRoaXMuZ2V0UGFnZUhlaWdodCgpPyh0aGlzLmNlbGxBZGRQYWdlKCksdC55PXMudG9wLGMmJnUmJih0aGlzLnByaW50SGVhZGVyUm93KHQubGluZU51bWJlciwhMCksdC55Kz11WzBdLmhlaWdodCkpOnQueT1lLnkrZS5oZWlnaHR8fHQueSksdm9pZCAwIT09dC50ZXh0WzBdJiYodGhpcy5yZWN0KHQueCx0LnksdC53aWR0aCx0LmhlaWdodCwhMD09PW4/XCJGRFwiOnZvaWQgMCksXCJyaWdodFwiPT09dC5hbGlnbj90aGlzLnRleHQodC50ZXh0LHQueCt0LndpZHRoLWEsdC55K2Ese2FsaWduOlwicmlnaHRcIixiYXNlbGluZTpcInRvcFwifSk6XCJjZW50ZXJcIj09PXQuYWxpZ24/dGhpcy50ZXh0KHQudGV4dCx0LngrdC53aWR0aC8yLHQueSthLHthbGlnbjpcImNlbnRlclwiLGJhc2VsaW5lOlwidG9wXCIsbWF4V2lkdGg6dC53aWR0aC1hLWF9KTp0aGlzLnRleHQodC50ZXh0LHQueCthLHQueSthLHthbGlnbjpcImxlZnRcIixiYXNlbGluZTpcInRvcFwiLG1heFdpZHRoOnQud2lkdGgtYS1hfSkpLHRoaXMuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGw9dCx0aGlzfTtlLnRhYmxlPWZ1bmN0aW9uKGUsbixjLGwsaCl7aWYoaS5jYWxsKHRoaXMpLCFjKXRocm93IG5ldyBFcnJvcihcIk5vIGRhdGEgZm9yIFBERiB0YWJsZS5cIik7dmFyIGYsZCxwLGcsbT1bXSx2PVtdLGI9W10seT17fSx3PXt9LE49W10sTD1bXSx4PShoPWh8fHt9KS5hdXRvU2l6ZXx8ITEsQT0hMSE9PWgucHJpbnRIZWFkZXJzLFM9aC5jc3MmJnZvaWQgMCE9PWguY3NzW1wiZm9udC1zaXplXCJdPzE2KmguY3NzW1wiZm9udC1zaXplXCJdOmguZm9udFNpemV8fDEyLF89aC5tYXJnaW5zfHxPYmplY3QuYXNzaWduKHt3aWR0aDp0aGlzLmdldFBhZ2VXaWR0aCgpfSxyKSxQPVwibnVtYmVyXCI9PXR5cGVvZiBoLnBhZGRpbmc/aC5wYWRkaW5nOjMsaz1oLmhlYWRlckJhY2tncm91bmRDb2xvcnx8XCIjYzhjOGM4XCIsRj1oLmhlYWRlclRleHRDb2xvcnx8XCIjMDAwXCI7aWYoYS5jYWxsKHRoaXMpLHRoaXMuaW50ZXJuYWwuX19jZWxsX18ucHJpbnRIZWFkZXJzPUEsdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5tYXJnaW5zPV8sdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy50YWJsZV9mb250X3NpemU9Uyx0aGlzLmludGVybmFsLl9fY2VsbF9fLnBhZGRpbmc9UCx0aGlzLmludGVybmFsLl9fY2VsbF9fLmhlYWRlckJhY2tncm91bmRDb2xvcj1rLHRoaXMuaW50ZXJuYWwuX19jZWxsX18uaGVhZGVyVGV4dENvbG9yPUYsdGhpcy5zZXRGb250U2l6ZShTKSxudWxsPT1sKXY9bT1PYmplY3Qua2V5cyhjWzBdKSxiPW0ubWFwKGZ1bmN0aW9uKCl7cmV0dXJuXCJsZWZ0XCJ9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkobCkmJlwib2JqZWN0XCI9PT10KGxbMF0pKWZvcihtPWwubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWV9KSx2PWwubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnByb21wdHx8dC5uYW1lfHxcIlwifSksYj1sLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5hbGlnbnx8XCJsZWZ0XCJ9KSxmPTA7ZjxsLmxlbmd0aDtmKz0xKXdbbFtmXS5uYW1lXT0uNzQ5OTk5MDU1MTE4MTEwMypsW2ZdLndpZHRoO2Vsc2UgQXJyYXkuaXNBcnJheShsKSYmXCJzdHJpbmdcIj09dHlwZW9mIGxbMF0mJih2PW09bCxiPW0ubWFwKGZ1bmN0aW9uKCl7cmV0dXJuXCJsZWZ0XCJ9KSk7aWYoeHx8QXJyYXkuaXNBcnJheShsKSYmXCJzdHJpbmdcIj09dHlwZW9mIGxbMF0pZm9yKGY9MDtmPG0ubGVuZ3RoO2YrPTEpe2Zvcih5W2c9bVtmXV09Yy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHRbZ119KSx0aGlzLnNldEZvbnQodm9pZCAwLFwiYm9sZFwiKSxOLnB1c2godGhpcy5nZXRUZXh0RGltZW5zaW9ucyh2W2ZdLHtmb250U2l6ZTp0aGlzLmludGVybmFsLl9fY2VsbF9fLnRhYmxlX2ZvbnRfc2l6ZSxzY2FsZUZhY3Rvcjp0aGlzLmludGVybmFsLnNjYWxlRmFjdG9yfSkudyksZD15W2ddLHRoaXMuc2V0Rm9udCh2b2lkIDAsXCJub3JtYWxcIikscD0wO3A8ZC5sZW5ndGg7cCs9MSlOLnB1c2godGhpcy5nZXRUZXh0RGltZW5zaW9ucyhkW3BdLHtmb250U2l6ZTp0aGlzLmludGVybmFsLl9fY2VsbF9fLnRhYmxlX2ZvbnRfc2l6ZSxzY2FsZUZhY3Rvcjp0aGlzLmludGVybmFsLnNjYWxlRmFjdG9yfSkudyk7d1tnXT1NYXRoLm1heC5hcHBseShudWxsLE4pK1ArUCxOPVtdfWlmKEEpe3ZhciBJPXt9O2ZvcihmPTA7ZjxtLmxlbmd0aDtmKz0xKUlbbVtmXV09e30sSVttW2ZdXS50ZXh0PXZbZl0sSVttW2ZdXS5hbGlnbj1iW2ZdO3ZhciBDPXUuY2FsbCh0aGlzLEksdyk7TD1tLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8oZSxuLHdbdF0sQyxJW3RdLnRleHQsdm9pZCAwLElbdF0uYWxpZ24pfSksdGhpcy5zZXRUYWJsZUhlYWRlclJvdyhMKSx0aGlzLnByaW50SGVhZGVyUm93KDEsITEpfXZhciBqPWwucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZS5uYW1lXT1lLmFsaWduLHR9LHt9KTtmb3IoZj0wO2Y8Yy5sZW5ndGg7Zis9MSl7XCJyb3dTdGFydFwiaW4gaCYmaC5yb3dTdGFydCBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZoLnJvd1N0YXJ0KHtyb3c6ZixkYXRhOmNbZl19LHRoaXMpO3ZhciBPPXUuY2FsbCh0aGlzLGNbZl0sdyk7Zm9yKHA9MDtwPG0ubGVuZ3RoO3ArPTEpe3ZhciBCPWNbZl1bbVtwXV07XCJjZWxsU3RhcnRcImluIGgmJmguY2VsbFN0YXJ0IGluc3RhbmNlb2YgRnVuY3Rpb24mJmguY2VsbFN0YXJ0KHtyb3c6Zixjb2w6cCxkYXRhOkJ9LHRoaXMpLHMuY2FsbCh0aGlzLG5ldyBvKGUsbix3W21bcF1dLE8sQixmKzIsalttW3BdXSkpfX1yZXR1cm4gdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy50YWJsZV94PWUsdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy50YWJsZV95PW4sdGhpc307dmFyIHU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmludGVybmFsLl9fY2VsbF9fLnBhZGRpbmcsbj10aGlzLmludGVybmFsLl9fY2VsbF9fLnRhYmxlX2ZvbnRfc2l6ZSxpPXRoaXMuaW50ZXJuYWwuc2NhbGVGYWN0b3I7cmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihuKXt2YXIgaT10W25dO3JldHVybiB0aGlzLnNwbGl0VGV4dFRvU2l6ZShpLmhhc093blByb3BlcnR5KFwidGV4dFwiKT9pLnRleHQ6aSxlW25dLXItcil9LHRoaXMpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRMaW5lSGVpZ2h0RmFjdG9yKCkqdC5sZW5ndGgqbi9pK3Ircn0sdGhpcykucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsZSl9LDApfTtlLnNldFRhYmxlSGVhZGVyUm93PWZ1bmN0aW9uKHQpe2kuY2FsbCh0aGlzKSx0aGlzLmludGVybmFsLl9fY2VsbF9fLnRhYmxlSGVhZGVyUm93PXR9LGUucHJpbnRIZWFkZXJSb3c9ZnVuY3Rpb24odCxlKXtpZihpLmNhbGwodGhpcyksIXRoaXMuaW50ZXJuYWwuX19jZWxsX18udGFibGVIZWFkZXJSb3cpdGhyb3cgbmV3IEVycm9yKFwiUHJvcGVydHkgdGFibGVIZWFkZXJSb3cgZG9lcyBub3QgZXhpc3QuXCIpO3ZhciByO2lmKG49ITAsXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5oZWFkZXJGdW5jdGlvbil7dmFyIGE9dGhpcy5pbnRlcm5hbC5fX2NlbGxfXy5oZWFkZXJGdW5jdGlvbih0aGlzLHRoaXMuaW50ZXJuYWwuX19jZWxsX18ucGFnZXMpO3RoaXMuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGw9bmV3IG8oYVswXSxhWzFdLGFbMl0sYVszXSx2b2lkIDAsLTEpfXRoaXMuc2V0Rm9udCh2b2lkIDAsXCJib2xkXCIpO2Zvcih2YXIgdT1bXSxjPTA7Yzx0aGlzLmludGVybmFsLl9fY2VsbF9fLnRhYmxlSGVhZGVyUm93Lmxlbmd0aDtjKz0xKXtyPXRoaXMuaW50ZXJuYWwuX19jZWxsX18udGFibGVIZWFkZXJSb3dbY10uY2xvbmUoKSxlJiYoci55PXRoaXMuaW50ZXJuYWwuX19jZWxsX18ubWFyZ2lucy50b3B8fDAsdS5wdXNoKHIpKSxyLmxpbmVOdW1iZXI9dDt2YXIgbD10aGlzLmdldFRleHRDb2xvcigpO3RoaXMuc2V0VGV4dENvbG9yKHRoaXMuaW50ZXJuYWwuX19jZWxsX18uaGVhZGVyVGV4dENvbG9yKSx0aGlzLnNldEZpbGxDb2xvcih0aGlzLmludGVybmFsLl9fY2VsbF9fLmhlYWRlckJhY2tncm91bmRDb2xvcikscy5jYWxsKHRoaXMsciksdGhpcy5zZXRUZXh0Q29sb3IobCl9dS5sZW5ndGg+MCYmdGhpcy5zZXRUYWJsZUhlYWRlclJvdyh1KSx0aGlzLnNldEZvbnQodm9pZCAwLFwibm9ybWFsXCIpLG49ITF9fShFLkFQSSk7dmFyIGt0PXtpdGFsaWM6W1wiaXRhbGljXCIsXCJvYmxpcXVlXCIsXCJub3JtYWxcIl0sb2JsaXF1ZTpbXCJvYmxpcXVlXCIsXCJpdGFsaWNcIixcIm5vcm1hbFwiXSxub3JtYWw6W1wibm9ybWFsXCIsXCJvYmxpcXVlXCIsXCJpdGFsaWNcIl19LEZ0PVtcInVsdHJhLWNvbmRlbnNlZFwiLFwiZXh0cmEtY29uZGVuc2VkXCIsXCJjb25kZW5zZWRcIixcInNlbWktY29uZGVuc2VkXCIsXCJub3JtYWxcIixcInNlbWktZXhwYW5kZWRcIixcImV4cGFuZGVkXCIsXCJleHRyYS1leHBhbmRlZFwiLFwidWx0cmEtZXhwYW5kZWRcIl0sSXQ9UHQoRnQpLEN0PVsxMDAsMjAwLDMwMCw0MDAsNTAwLDYwMCw3MDAsODAwLDkwMF0sanQ9UHQoQ3QpO2Z1bmN0aW9uIE90KHQpe3ZhciBlPXQuZmFtaWx5LnJlcGxhY2UoL1wifCcvZyxcIlwiKS50b0xvd2VyQ2FzZSgpLHI9ZnVuY3Rpb24odCl7cmV0dXJuIGt0W3Q9dHx8XCJub3JtYWxcIl0/dDpcIm5vcm1hbFwifSh0LnN0eWxlKSxuPWZ1bmN0aW9uKHQpe3JldHVybiB0P1wibnVtYmVyXCI9PXR5cGVvZiB0P3Q+PTEwMCYmdDw9OTAwJiZ0JTEwMD09MD90OjQwMDovXlxcZDAwJC8udGVzdCh0KT9wYXJzZUludCh0KTpcImJvbGRcIj09PXQ/NzAwOjQwMDo0MDB9KHQud2VpZ2h0KSxpPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBJdFt0PXR8fFwibm9ybWFsXCJdP3Q6XCJub3JtYWxcIn0odC5zdHJldGNoKTtyZXR1cm57ZmFtaWx5OmUsc3R5bGU6cix3ZWlnaHQ6bixzdHJldGNoOmksc3JjOnQuc3JjfHxbXSxyZWY6dC5yZWZ8fHtuYW1lOmUsc3R5bGU6W2kscixuXS5qb2luKFwiIFwiKX19fWZ1bmN0aW9uIEJ0KHQsZSxyLG4pe3ZhciBpO2ZvcihpPXI7aT49MCYmaTxlLmxlbmd0aDtpKz1uKWlmKHRbZVtpXV0pcmV0dXJuIHRbZVtpXV07Zm9yKGk9cjtpPj0wJiZpPGUubGVuZ3RoO2ktPW4paWYodFtlW2ldXSlyZXR1cm4gdFtlW2ldXX12YXIgTXQ9e1wic2Fucy1zZXJpZlwiOlwiaGVsdmV0aWNhXCIsZml4ZWQ6XCJjb3VyaWVyXCIsbW9ub3NwYWNlOlwiY291cmllclwiLHRlcm1pbmFsOlwiY291cmllclwiLGN1cnNpdmU6XCJ0aW1lc1wiLGZhbnRhc3k6XCJ0aW1lc1wiLHNlcmlmOlwidGltZXNcIn0scXQ9e2NhcHRpb246XCJ0aW1lc1wiLGljb246XCJ0aW1lc1wiLG1lbnU6XCJ0aW1lc1wiLFwibWVzc2FnZS1ib3hcIjpcInRpbWVzXCIsXCJzbWFsbC1jYXB0aW9uXCI6XCJ0aW1lc1wiLFwic3RhdHVzLWJhclwiOlwidGltZXNcIn07ZnVuY3Rpb24gRXQodCl7cmV0dXJuW3Quc3RyZXRjaCx0LnN0eWxlLHQud2VpZ2h0LHQuZmFtaWx5XS5qb2luKFwiIFwiKX1mdW5jdGlvbiBSdCh0KXtyZXR1cm4gdC50cmltTGVmdCgpfWZ1bmN0aW9uIER0KHQsZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDspe2lmKHQuY2hhckF0KHIpPT09ZSlyZXR1cm5bdC5zdWJzdHJpbmcoMCxyKSx0LnN1YnN0cmluZyhyKzEpXTtyKz0xfXJldHVybiBudWxsfWZ1bmN0aW9uIFR0KHQpe3ZhciBlPXQubWF0Y2goL14oLVthLXpfXXxbYS16X10pW2EtejAtOV8tXSovaSk7cmV0dXJuIG51bGw9PT1lP251bGw6W2VbMF0sdC5zdWJzdHJpbmcoZVswXS5sZW5ndGgpXX12YXIgenQsVXQsSHQsV3QsVnQsR3Q9W1widGltZXNcIl07ZnVuY3Rpb24gWXQodCxyLG4saSxhKXt2YXIgbz00LHM9S3Q7c3dpdGNoKGEpe2Nhc2UgRS5BUEkuaW1hZ2VfY29tcHJlc3Npb24uRkFTVDpvPTEscz1YdDticmVhaztjYXNlIEUuQVBJLmltYWdlX2NvbXByZXNzaW9uLk1FRElVTTpvPTYscz1adDticmVhaztjYXNlIEUuQVBJLmltYWdlX2NvbXByZXNzaW9uLlNMT1c6bz05LHM9JHR9dD1mdW5jdGlvbih0LGUscixuKXtmb3IodmFyIGksYT10Lmxlbmd0aC9lLG89bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgrYSkscz1bSnQsWHQsS3QsWnQsJHRdLHU9MDt1PGE7dSs9MSl7dmFyIGM9dSplLGw9dC5zdWJhcnJheShjLGMrZSk7aWYobilvLnNldChuKGwscixpKSxjK3UpO2Vsc2V7Zm9yKHZhciBoPXMubGVuZ3RoLGY9W10sZD0wO2Q8aDtkKz0xKWZbZF09c1tkXShsLHIsaSk7dmFyIHA9dGUoZi5jb25jYXQoKSk7by5zZXQoZltwXSxjK3UpfWk9bH1yZXR1cm4gb30odCxyLE1hdGguY2VpbChuKmkvOCkscyk7dmFyIHU9ZSh0LHtsZXZlbDpvfSk7cmV0dXJuIEUuQVBJLl9fYWRkaW1hZ2VfXy5hcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKHUpfWZ1bmN0aW9uIEp0KHQpe3ZhciBlPUFycmF5LmFwcGx5KFtdLHQpO3JldHVybiBlLnVuc2hpZnQoMCksZX1mdW5jdGlvbiBYdCh0LGUpe3ZhciByPXQubGVuZ3RoLG49W107blswXT0xO2Zvcih2YXIgaT0wO2k8cjtpKz0xKXt2YXIgYT10W2ktZV18fDA7bltpKzFdPXRbaV0tYSsyNTYmMjU1fXJldHVybiBufWZ1bmN0aW9uIEt0KHQsZSxyKXt2YXIgbj10Lmxlbmd0aCxpPVtdO2lbMF09Mjtmb3IodmFyIGE9MDthPG47YSs9MSl7dmFyIG89ciYmclthXXx8MDtpW2ErMV09dFthXS1vKzI1NiYyNTV9cmV0dXJuIGl9ZnVuY3Rpb24gWnQodCxlLHIpe3ZhciBuPXQubGVuZ3RoLGk9W107aVswXT0zO2Zvcih2YXIgYT0wO2E8bjthKz0xKXt2YXIgbz10W2EtZV18fDAscz1yJiZyW2FdfHwwO2lbYSsxXT10W2FdKzI1Ni0obytzPj4+MSkmMjU1fXJldHVybiBpfWZ1bmN0aW9uICR0KHQsZSxyKXt2YXIgbj10Lmxlbmd0aCxpPVtdO2lbMF09NDtmb3IodmFyIGE9MDthPG47YSs9MSl7dmFyIG89UXQodFthLWVdfHwwLHImJnJbYV18fDAsciYmclthLWVdfHwwKTtpW2ErMV09dFthXS1vKzI1NiYyNTV9cmV0dXJuIGl9ZnVuY3Rpb24gUXQodCxlLHIpe2lmKHQ9PT1lJiZlPT09cilyZXR1cm4gdDt2YXIgbj1NYXRoLmFicyhlLXIpLGk9TWF0aC5hYnModC1yKSxhPU1hdGguYWJzKHQrZS1yLXIpO3JldHVybiBuPD1pJiZuPD1hP3Q6aTw9YT9lOnJ9ZnVuY3Rpb24gdGUodCl7dmFyIGU9dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrTWF0aC5hYnMoZSl9LDApfSk7cmV0dXJuIGUuaW5kZXhPZihNYXRoLm1pbi5hcHBseShudWxsLGUpKX1mdW5jdGlvbiBlZSh0LGUscil7dmFyIG49ZSpyLGk9TWF0aC5mbG9vcihuLzgpLGE9MTYtKG4tOCppK3IpLG89KDE8PHIpLTE7cmV0dXJuIG5lKHQsaSk+PmEmb31mdW5jdGlvbiByZSh0LGUscixuKXt2YXIgaT1yKm4sYT1NYXRoLmZsb29yKGkvOCksbz0xNi0oaS04KmErbikscz0oMTw8biktMSx1PShlJnMpPDxvOyFmdW5jdGlvbih0LGUscil7aWYoZSsxPHQuYnl0ZUxlbmd0aCl0LnNldFVpbnQxNihlLHIsITEpO2Vsc2V7dmFyIG49cj4+OCYyNTU7dC5zZXRVaW50OChlLG4pfX1cbi8qKlxuICogQGxpY2Vuc2VcbiAqIChjKSBEZWFuIE1jTmFtZWUgPGRlYW5AZ21haWwuY29tPiwgMjAxMy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vb21nZ2lmXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbiAqIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4gKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3JcbiAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1NcbiAqIElOIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKiBvbWdnaWYgaXMgYSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIGEgR0lGIDg5YSBlbmNvZGVyIGFuZCBkZWNvZGVyLFxuICogaW5jbHVkaW5nIGFuaW1hdGlvbiBhbmQgY29tcHJlc3Npb24uICBJdCBkb2VzIG5vdCByZWx5IG9uIGFueSBzcGVjaWZpY1xuICogdW5kZXJseWluZyBzeXN0ZW0sIHNvIHNob3VsZCBydW4gaW4gdGhlIGJyb3dzZXIsIE5vZGUsIG9yIFBsYXNrLlxuICovKHQsYSxuZSh0LGEpJn4oczw8bykmNjU1MzV8dSl9ZnVuY3Rpb24gbmUodCxlKXtyZXR1cm4gZSsxPHQuYnl0ZUxlbmd0aD90LmdldFVpbnQxNihlLCExKTp0LmdldFVpbnQ4KGUpPDw4fWZ1bmN0aW9uIGllKHQpe3ZhciBlPTA7aWYoNzEhPT10W2UrK118fDczIT09dFtlKytdfHw3MCE9PXRbZSsrXXx8NTYhPT10W2UrK118fDU2IT0odFtlKytdKzEmMjUzKXx8OTchPT10W2UrK10pdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBHSUYgODdhLzg5YSBoZWFkZXIuXCIpO3ZhciByPXRbZSsrXXx0W2UrK108PDgsbj10W2UrK118dFtlKytdPDw4LGk9dFtlKytdLGE9aT4+NyxvPTE8PDErKDcmaSk7dFtlKytdLHRbZSsrXTt2YXIgcz1udWxsLHU9bnVsbDthJiYocz1lLHU9byxlKz0zKm8pO3ZhciBjPSEwLGw9W10saD0wLGY9bnVsbCxkPTAscD1udWxsO2Zvcih0aGlzLndpZHRoPXIsdGhpcy5oZWlnaHQ9bjtjJiZlPHQubGVuZ3RoOylzd2l0Y2godFtlKytdKXtjYXNlIDMzOnN3aXRjaCh0W2UrK10pe2Nhc2UgMjU1OmlmKDExIT09dFtlXXx8Nzg9PXRbZSsxXSYmNjk9PXRbZSsyXSYmODQ9PXRbZSszXSYmODM9PXRbZSs0XSYmNjc9PXRbZSs1XSYmNjU9PXRbZSs2XSYmODA9PXRbZSs3XSYmNjk9PXRbZSs4XSYmNTA9PXRbZSs5XSYmNDY9PXRbZSsxMF0mJjQ4PT10W2UrMTFdJiYzPT10W2UrMTJdJiYxPT10W2UrMTNdJiYwPT10W2UrMTZdKWUrPTE0LHA9dFtlKytdfHRbZSsrXTw8OCxlKys7ZWxzZSBmb3IoZSs9MTI7Oyl7aWYoISgoUD10W2UrK10pPj0wKSl0aHJvdyBFcnJvcihcIkludmFsaWQgYmxvY2sgc2l6ZVwiKTtpZigwPT09UClicmVhaztlKz1QfWJyZWFrO2Nhc2UgMjQ5OmlmKDQhPT10W2UrK118fDAhPT10W2UrNF0pdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBncmFwaGljcyBleHRlbnNpb24gYmxvY2suXCIpO3ZhciBnPXRbZSsrXTtoPXRbZSsrXXx0W2UrK108PDgsZj10W2UrK10sMSZnfHwoZj1udWxsKSxkPWc+PjImNyxlKys7YnJlYWs7Y2FzZSAyNTQ6Zm9yKDs7KXtpZighKChQPXRbZSsrXSk+PTApKXRocm93IEVycm9yKFwiSW52YWxpZCBibG9jayBzaXplXCIpO2lmKDA9PT1QKWJyZWFrO2UrPVB9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGdyYXBoaWMgY29udHJvbCBsYWJlbDogMHhcIit0W2UtMV0udG9TdHJpbmcoMTYpKX1icmVhaztjYXNlIDQ0OnZhciBtPXRbZSsrXXx0W2UrK108PDgsdj10W2UrK118dFtlKytdPDw4LGI9dFtlKytdfHRbZSsrXTw8OCx5PXRbZSsrXXx0W2UrK108PDgsdz10W2UrK10sTj13Pj42JjEsTD0xPDwxKyg3JncpLHg9cyxBPXUsUz0hMTt3Pj43JiYoUz0hMCx4PWUsQT1MLGUrPTMqTCk7dmFyIF89ZTtmb3IoZSsrOzspe3ZhciBQO2lmKCEoKFA9dFtlKytdKT49MCkpdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGJsb2NrIHNpemVcIik7aWYoMD09PVApYnJlYWs7ZSs9UH1sLnB1c2goe3g6bSx5OnYsd2lkdGg6YixoZWlnaHQ6eSxoYXNfbG9jYWxfcGFsZXR0ZTpTLHBhbGV0dGVfb2Zmc2V0OngscGFsZXR0ZV9zaXplOkEsZGF0YV9vZmZzZXQ6XyxkYXRhX2xlbmd0aDplLV8sdHJhbnNwYXJlbnRfaW5kZXg6ZixpbnRlcmxhY2VkOiEhTixkZWxheTpoLGRpc3Bvc2FsOmR9KTticmVhaztjYXNlIDU5OmM9ITE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGdpZiBibG9jazogMHhcIit0W2UtMV0udG9TdHJpbmcoMTYpKX10aGlzLm51bUZyYW1lcz1mdW5jdGlvbigpe3JldHVybiBsLmxlbmd0aH0sdGhpcy5sb29wQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gcH0sdGhpcy5mcmFtZUluZm89ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj1sLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJGcmFtZSBpbmRleCBvdXQgb2YgcmFuZ2UuXCIpO3JldHVybiBsW3RdfSx0aGlzLmRlY29kZUFuZEJsaXRGcmFtZUJHUkE9ZnVuY3Rpb24oZSxuKXt2YXIgaT10aGlzLmZyYW1lSW5mbyhlKSxhPWkud2lkdGgqaS5oZWlnaHQ7aWYoYT41MzY4NzA5MTIpdGhyb3cgbmV3IEVycm9yKFwiSW1hZ2UgZGltZW5zaW9ucyBleGNlZWQgNTEyTUIsIHdoaWNoIGlzIHRvbyBsYXJnZS5cIik7dmFyIG89bmV3IFVpbnQ4QXJyYXkoYSk7YWUodCxpLmRhdGFfb2Zmc2V0LG8sYSk7dmFyIHM9aS5wYWxldHRlX29mZnNldCx1PWkudHJhbnNwYXJlbnRfaW5kZXg7bnVsbD09PXUmJih1PTI1Nik7dmFyIGM9aS53aWR0aCxsPXItYyxoPWMsZj00KihpLnkqcitpLngpLGQ9NCooKGkueStpLmhlaWdodCkqcitpLngpLHA9ZixnPTQqbDshMD09PWkuaW50ZXJsYWNlZCYmKGcrPTQqcio3KTtmb3IodmFyIG09OCx2PTAsYj1vLmxlbmd0aDt2PGI7Kyt2KXt2YXIgeT1vW3ZdO2lmKDA9PT1oJiYoaD1jLChwKz1nKT49ZCYmKGc9NCpsKzQqcioobS0xKSxwPWYrKGMrbCkqKG08PDEpLG0+Pj0xKSkseT09PXUpcCs9NDtlbHNle3ZhciB3PXRbcyszKnldLE49dFtzKzMqeSsxXSxMPXRbcyszKnkrMl07bltwKytdPUwsbltwKytdPU4sbltwKytdPXcsbltwKytdPTI1NX0tLWh9fSx0aGlzLmRlY29kZUFuZEJsaXRGcmFtZVJHQkE9ZnVuY3Rpb24oZSxuKXt2YXIgaT10aGlzLmZyYW1lSW5mbyhlKSxhPWkud2lkdGgqaS5oZWlnaHQ7aWYoYT41MzY4NzA5MTIpdGhyb3cgbmV3IEVycm9yKFwiSW1hZ2UgZGltZW5zaW9ucyBleGNlZWQgNTEyTUIsIHdoaWNoIGlzIHRvbyBsYXJnZS5cIik7dmFyIG89bmV3IFVpbnQ4QXJyYXkoYSk7YWUodCxpLmRhdGFfb2Zmc2V0LG8sYSk7dmFyIHM9aS5wYWxldHRlX29mZnNldCx1PWkudHJhbnNwYXJlbnRfaW5kZXg7bnVsbD09PXUmJih1PTI1Nik7dmFyIGM9aS53aWR0aCxsPXItYyxoPWMsZj00KihpLnkqcitpLngpLGQ9NCooKGkueStpLmhlaWdodCkqcitpLngpLHA9ZixnPTQqbDshMD09PWkuaW50ZXJsYWNlZCYmKGcrPTQqcio3KTtmb3IodmFyIG09OCx2PTAsYj1vLmxlbmd0aDt2PGI7Kyt2KXt2YXIgeT1vW3ZdO2lmKDA9PT1oJiYoaD1jLChwKz1nKT49ZCYmKGc9NCpsKzQqcioobS0xKSxwPWYrKGMrbCkqKG08PDEpLG0+Pj0xKSkseT09PXUpcCs9NDtlbHNle3ZhciB3PXRbcyszKnldLE49dFtzKzMqeSsxXSxMPXRbcyszKnkrMl07bltwKytdPXcsbltwKytdPU4sbltwKytdPUwsbltwKytdPTI1NX0tLWh9fX1mdW5jdGlvbiBhZSh0LGUscixuKXtmb3IodmFyIGk9dFtlKytdLGE9MTw8aSxzPWErMSx1PXMrMSxjPWkrMSxsPSgxPDxjKS0xLGg9MCxmPTAsZD0wLHA9dFtlKytdLGc9bmV3IEludDMyQXJyYXkoNDA5NiksbT1udWxsOzspe2Zvcig7aDwxNiYmMCE9PXA7KWZ8PXRbZSsrXTw8aCxoKz04LDE9PT1wP3A9dFtlKytdOi0tcDtpZihoPGMpYnJlYWs7dmFyIHY9ZiZsO2lmKGY+Pj1jLGgtPWMsdiE9PWEpe2lmKHY9PT1zKWJyZWFrO2Zvcih2YXIgYj12PHU/djptLHk9MCx3PWI7dz5hOyl3PWdbd10+PjgsKyt5O3ZhciBOPXc7aWYoZCt5KyhiIT09dj8xOjApPm4pcmV0dXJuIHZvaWQgby5sb2coXCJXYXJuaW5nLCBnaWYgc3RyZWFtIGxvbmdlciB0aGFuIGV4cGVjdGVkLlwiKTtyW2QrK109Tjt2YXIgTD1kKz15O2ZvcihiIT09diYmKHJbZCsrXT1OKSx3PWI7eS0tOyl3PWdbd10sclstLUxdPTI1NSZ3LHc+Pj04O251bGwhPT1tJiZ1PDQwOTYmJihnW3UrK109bTw8OHxOLHU+PWwrMSYmYzwxMiYmKCsrYyxsPWw8PDF8MSkpLG09dn1lbHNlIHU9cysxLGw9KDE8PChjPWkrMSkpLTEsbT1udWxsfXJldHVybiBkIT09biYmby5sb2coXCJXYXJuaW5nLCBnaWYgc3RyZWFtIHNob3J0ZXIgdGhhbiBleHBlY3RlZC5cIikscn1cbi8qKlxuICogQGxpY2Vuc2VcbiAgQ29weXJpZ2h0IChjKSAyMDA4LCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFxuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIFxuICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gIFxuICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBcbiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICBcbiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIG5vciB0aGUgbmFtZXMgb2YgaXRzIFxuICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIFxuICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTXG4gIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sXG4gIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVJcbiAgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBcbiAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXG4gIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTyxcbiAgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0ZcbiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9mdW5jdGlvbiBvZSh0KXt2YXIgZSxyLG4saSxhLG89TWF0aC5mbG9vcixzPW5ldyBBcnJheSg2NCksdT1uZXcgQXJyYXkoNjQpLGM9bmV3IEFycmF5KDY0KSxsPW5ldyBBcnJheSg2NCksaD1uZXcgQXJyYXkoNjU1MzUpLGY9bmV3IEFycmF5KDY1NTM1KSxkPW5ldyBBcnJheSg2NCkscD1uZXcgQXJyYXkoNjQpLGc9W10sbT0wLHY9NyxiPW5ldyBBcnJheSg2NCkseT1uZXcgQXJyYXkoNjQpLHc9bmV3IEFycmF5KDY0KSxOPW5ldyBBcnJheSgyNTYpLEw9bmV3IEFycmF5KDIwNDgpLHg9WzAsMSw1LDYsMTQsMTUsMjcsMjgsMiw0LDcsMTMsMTYsMjYsMjksNDIsMyw4LDEyLDE3LDI1LDMwLDQxLDQzLDksMTEsMTgsMjQsMzEsNDAsNDQsNTMsMTAsMTksMjMsMzIsMzksNDUsNTIsNTQsMjAsMjIsMzMsMzgsNDYsNTEsNTUsNjAsMjEsMzQsMzcsNDcsNTAsNTYsNTksNjEsMzUsMzYsNDgsNDksNTcsNTgsNjIsNjNdLEE9WzAsMCwxLDUsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMF0sUz1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMV0sXz1bMCwwLDIsMSwzLDMsMiw0LDMsNSw1LDQsNCwwLDAsMSwxMjVdLFA9WzEsMiwzLDAsNCwxNyw1LDE4LDMzLDQ5LDY1LDYsMTksODEsOTcsNywzNCwxMTMsMjAsNTAsMTI5LDE0NSwxNjEsOCwzNSw2NiwxNzcsMTkzLDIxLDgyLDIwOSwyNDAsMzYsNTEsOTgsMTE0LDEzMCw5LDEwLDIyLDIzLDI0LDI1LDI2LDM3LDM4LDM5LDQwLDQxLDQyLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MF0saz1bMCwwLDMsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwXSxGPVswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExXSxJPVswLDAsMiwxLDIsNCw0LDMsNCw3LDUsNCw0LDAsMSwyLDExOV0sQz1bMCwxLDIsMywxNyw0LDUsMzMsNDksNiwxOCw2NSw4MSw3LDk3LDExMywxOSwzNCw1MCwxMjksOCwyMCw2NiwxNDUsMTYxLDE3NywxOTMsOSwzNSw1MSw4MiwyNDAsMjEsOTgsMTE0LDIwOSwxMCwyMiwzNiw1MiwyMjUsMzcsMjQxLDIzLDI0LDI1LDI2LDM4LDM5LDQwLDQxLDQyLDUzLDU0LDU1LDU2LDU3LDU4LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwXTtmdW5jdGlvbiBqKHQsZSl7Zm9yKHZhciByPTAsbj0wLGk9bmV3IEFycmF5LGE9MTthPD0xNjthKyspe2Zvcih2YXIgbz0xO288PXRbYV07bysrKWlbZVtuXV09W10saVtlW25dXVswXT1yLGlbZVtuXV1bMV09YSxuKysscisrO3IqPTJ9cmV0dXJuIGl9ZnVuY3Rpb24gTyh0KXtmb3IodmFyIGU9dFswXSxyPXRbMV0tMTtyPj0wOyllJjE8PHImJihtfD0xPDx2KSxyLS0sLS12PDAmJigyNTU9PW0/KEIoMjU1KSxCKDApKTpCKG0pLHY9NyxtPTApfWZ1bmN0aW9uIEIodCl7Zy5wdXNoKHQpfWZ1bmN0aW9uIE0odCl7Qih0Pj44JjI1NSksQigyNTUmdCl9ZnVuY3Rpb24gcSh0LGUscixuLGkpe2Zvcih2YXIgYSxvPWlbMF0scz1pWzI0MF0sdT1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxhLG8scyx1LGMsbCxoLGY9MDtmb3IobD0wO2w8ODsrK2wpe3I9dFtmXSxuPXRbZisxXSxpPXRbZisyXSxhPXRbZiszXSxvPXRbZis0XSxzPXRbZis1XSx1PXRbZis2XTt2YXIgcD1yKyhjPXRbZis3XSksZz1yLWMsbT1uK3Usdj1uLXUsYj1pK3MseT1pLXMsdz1hK28sTj1hLW8sTD1wK3cseD1wLXcsQT1tK2IsUz1tLWI7dFtmXT1MK0EsdFtmKzRdPUwtQTt2YXIgXz0uNzA3MTA2NzgxKihTK3gpO3RbZisyXT14K18sdFtmKzZdPXgtXzt2YXIgUD0uMzgyNjgzNDMzKigoTD1OK3kpLShTPXYrZykpLGs9LjU0MTE5NjEqTCtQLEY9MS4zMDY1NjI5NjUqUytQLEk9LjcwNzEwNjc4MSooQT15K3YpLEM9ZytJLGo9Zy1JO3RbZis1XT1qK2ssdFtmKzNdPWotayx0W2YrMV09QytGLHRbZis3XT1DLUYsZis9OH1mb3IoZj0wLGw9MDtsPDg7KytsKXtyPXRbZl0sbj10W2YrOF0saT10W2YrMTZdLGE9dFtmKzI0XSxvPXRbZiszMl0scz10W2YrNDBdLHU9dFtmKzQ4XTt2YXIgTz1yKyhjPXRbZis1Nl0pLEI9ci1jLE09bit1LHE9bi11LEU9aStzLFI9aS1zLEQ9YStvLFQ9YS1vLHo9TytELFU9Ty1ELEg9TStFLFc9TS1FO3RbZl09eitILHRbZiszMl09ei1IO3ZhciBWPS43MDcxMDY3ODEqKFcrVSk7dFtmKzE2XT1VK1YsdFtmKzQ4XT1VLVY7dmFyIEc9LjM4MjY4MzQzMyooKHo9VCtSKS0oVz1xK0IpKSxZPS41NDExOTYxKnorRyxKPTEuMzA2NTYyOTY1KlcrRyxYPS43MDcxMDY3ODEqKEg9UitxKSxLPUIrWCxaPUItWDt0W2YrNDBdPVorWSx0W2YrMjRdPVotWSx0W2YrOF09SytKLHRbZis1Nl09Sy1KLGYrK31mb3IobD0wO2w8NjQ7KytsKWg9dFtsXSplW2xdLGRbbF09aD4wP2grLjV8MDpoLS41fDA7cmV0dXJuIGR9KHQsZSksYz0wO2M8NjQ7KytjKXBbeFtjXV09dVtjXTt2YXIgbD1wWzBdLXI7cj1wWzBdLDA9PWw/TyhuWzBdKTooTyhuW2ZbYT0zMjc2NytsXV0pLE8oaFthXSkpO2Zvcih2YXIgZz02MztnPjAmJjA9PXBbZ107KWctLTtpZigwPT1nKXJldHVybiBPKG8pLHI7Zm9yKHZhciBtLHY9MTt2PD1nOyl7Zm9yKHZhciBiPXY7MD09cFt2XSYmdjw9ZzspKyt2O3ZhciB5PXYtYjtpZih5Pj0xNil7bT15Pj40O2Zvcih2YXIgdz0xO3c8PW07Kyt3KU8ocyk7eSY9MTV9YT0zMjc2NytwW3ZdLE8oaVsoeTw8NCkrZlthXV0pLE8oaFthXSksdisrfXJldHVybiA2MyE9ZyYmTyhvKSxyfWZ1bmN0aW9uIEUodCl7dD1NYXRoLm1pbihNYXRoLm1heCh0LDEpLDEwMCksYSE9dCYmKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bMTYsMTEsMTAsMTYsMjQsNDAsNTEsNjEsMTIsMTIsMTQsMTksMjYsNTgsNjAsNTUsMTQsMTMsMTYsMjQsNDAsNTcsNjksNTYsMTQsMTcsMjIsMjksNTEsODcsODAsNjIsMTgsMjIsMzcsNTYsNjgsMTA5LDEwMyw3NywyNCwzNSw1NSw2NCw4MSwxMDQsMTEzLDkyLDQ5LDY0LDc4LDg3LDEwMywxMjEsMTIwLDEwMSw3Miw5Miw5NSw5OCwxMTIsMTAwLDEwMyw5OV0scj0wO3I8NjQ7cisrKXt2YXIgbj1vKChlW3JdKnQrNTApLzEwMCk7bj1NYXRoLm1pbihNYXRoLm1heChuLDEpLDI1NSksc1t4W3JdXT1ufWZvcih2YXIgaT1bMTcsMTgsMjQsNDcsOTksOTksOTksOTksMTgsMjEsMjYsNjYsOTksOTksOTksOTksMjQsMjYsNTYsOTksOTksOTksOTksOTksNDcsNjYsOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTldLGE9MDthPDY0O2ErKyl7dmFyIGg9bygoaVthXSp0KzUwKS8xMDApO2g9TWF0aC5taW4oTWF0aC5tYXgoaCwxKSwyNTUpLHVbeFthXV09aH1mb3IodmFyIGY9WzEsMS4zODcwMzk4NDUsMS4zMDY1NjI5NjUsMS4xNzU4NzU2MDIsMSwuNzg1Njk0OTU4LC41NDExOTYxLC4yNzU4OTkzNzldLGQ9MCxwPTA7cDw4O3ArKylmb3IodmFyIGc9MDtnPDg7ZysrKWNbZF09MS8oc1t4W2RdXSpmW3BdKmZbZ10qOCksbFtkXT0xLyh1W3hbZF1dKmZbcF0qZltnXSo4KSxkKyt9KHQ8NTA/TWF0aC5mbG9vcig1ZTMvdCk6TWF0aC5mbG9vcigyMDAtMip0KSksYT10KX10aGlzLmVuY29kZT1mdW5jdGlvbih0LGEpe2EmJkUoYSksZz1uZXcgQXJyYXksbT0wLHY9NyxNKDY1NDk2KSxNKDY1NTA0KSxNKDE2KSxCKDc0KSxCKDcwKSxCKDczKSxCKDcwKSxCKDApLEIoMSksQigxKSxCKDApLE0oMSksTSgxKSxCKDApLEIoMCksZnVuY3Rpb24oKXtNKDY1NDk5KSxNKDEzMiksQigwKTtmb3IodmFyIHQ9MDt0PDY0O3QrKylCKHNbdF0pO0IoMSk7Zm9yKHZhciBlPTA7ZTw2NDtlKyspQih1W2VdKX0oKSxmdW5jdGlvbih0LGUpe00oNjU0NzIpLE0oMTcpLEIoOCksTShlKSxNKHQpLEIoMyksQigxKSxCKDE3KSxCKDApLEIoMiksQigxNyksQigxKSxCKDMpLEIoMTcpLEIoMSl9KHQud2lkdGgsdC5oZWlnaHQpLGZ1bmN0aW9uKCl7TSg2NTQ3NiksTSg0MTgpLEIoMCk7Zm9yKHZhciB0PTA7dDwxNjt0KyspQihBW3QrMV0pO2Zvcih2YXIgZT0wO2U8PTExO2UrKylCKFNbZV0pO0IoMTYpO2Zvcih2YXIgcj0wO3I8MTY7cisrKUIoX1tyKzFdKTtmb3IodmFyIG49MDtuPD0xNjE7bisrKUIoUFtuXSk7QigxKTtmb3IodmFyIGk9MDtpPDE2O2krKylCKGtbaSsxXSk7Zm9yKHZhciBhPTA7YTw9MTE7YSsrKUIoRlthXSk7QigxNyk7Zm9yKHZhciBvPTA7bzwxNjtvKyspQihJW28rMV0pO2Zvcih2YXIgcz0wO3M8PTE2MTtzKyspQihDW3NdKX0oKSxNKDY1NDk4KSxNKDEyKSxCKDMpLEIoMSksQigwKSxCKDIpLEIoMTcpLEIoMyksQigxNyksQigwKSxCKDYzKSxCKDApO3ZhciBvPTAsaD0wLGY9MDttPTAsdj03LHRoaXMuZW5jb2RlLmRpc3BsYXlOYW1lPVwiX2VuY29kZV9cIjtmb3IodmFyIGQscCxOLHgsaixSLEQsVCx6LFU9dC5kYXRhLEg9dC53aWR0aCxXPXQuaGVpZ2h0LFY9NCpILEc9MDtHPFc7KXtmb3IoZD0wO2Q8Vjspe2ZvcihqPVYqRytkLEQ9LTEsVD0wLHo9MDt6PDY0O3orKylSPWorKFQ9ej4+MykqVisoRD00Kig3JnopKSxHK1Q+PVcmJihSLT1WKihHKzErVC1XKSksZCtEPj1WJiYoUi09ZCtELVYrNCkscD1VW1IrK10sTj1VW1IrK10seD1VW1IrK10sYlt6XT0oTFtwXStMW04rMjU2fDBdK0xbeCs1MTJ8MF0+PjE2KS0xMjgseVt6XT0oTFtwKzc2OHwwXStMW04rMTAyNHwwXStMW3grMTI4MHwwXT4+MTYpLTEyOCx3W3pdPShMW3ArMTI4MHwwXStMW04rMTUzNnwwXStMW3grMTc5MnwwXT4+MTYpLTEyODtvPXEoYixjLG8sZSxuKSxoPXEoeSxsLGgscixpKSxmPXEodyxsLGYscixpKSxkKz0zMn1HKz04fWlmKHY+PTApe3ZhciBZPVtdO1lbMV09disxLFlbMF09KDE8PHYrMSktMSxPKFkpfXJldHVybiBNKDY1NDk3KSxuZXcgVWludDhBcnJheShnKX0sdD10fHw1MCxmdW5jdGlvbigpe2Zvcih2YXIgdD1TdHJpbmcuZnJvbUNoYXJDb2RlLGU9MDtlPDI1NjtlKyspTltlXT10KGUpfSgpLGU9aihBLFMpLHI9aihrLEYpLG49aihfLFApLGk9aihJLEMpLGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTEsZT0yLHI9MTtyPD0xNTtyKyspe2Zvcih2YXIgbj10O248ZTtuKyspZlszMjc2NytuXT1yLGhbMzI3Njcrbl09W10saFszMjc2NytuXVsxXT1yLGhbMzI3Njcrbl1bMF09bjtmb3IodmFyIGk9LShlLTEpO2k8PS10O2krKylmWzMyNzY3K2ldPXIsaFszMjc2NytpXT1bXSxoWzMyNzY3K2ldWzFdPXIsaFszMjc2NytpXVswXT1lLTEraTt0PDw9MSxlPDw9MX19KCksZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PDI1Njt0KyspTFt0XT0xOTU5NSp0LExbdCsyNTZ8MF09Mzg0NzAqdCxMW3QrNTEyfDBdPTc0NzEqdCszMjc2OCxMW3QrNzY4fDBdPS0xMTA1OSp0LExbdCsxMDI0fDBdPS0yMTcwOSp0LExbdCsxMjgwfDBdPTMyNzY4KnQrODQyMTM3NSxMW3QrMTUzNnwwXT0tMjc0MzkqdCxMW3QrMTc5MnwwXT0tNTMyOSp0fSgpLEUodCl9XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgQXJhcyBBYmJhc2lcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL2Z1bmN0aW9uIHNlKHQsZSl7aWYodGhpcy5wb3M9MCx0aGlzLmJ1ZmZlcj10LHRoaXMuZGF0YXY9bmV3IERhdGFWaWV3KHQuYnVmZmVyKSx0aGlzLmlzX3dpdGhfYWxwaGE9ISFlLHRoaXMuYm90dG9tX3VwPSEwLHRoaXMuZmxhZz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuYnVmZmVyWzBdKStTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuYnVmZmVyWzFdKSx0aGlzLnBvcys9MiwtMT09PVtcIkJNXCIsXCJCQVwiLFwiQ0lcIixcIkNQXCIsXCJJQ1wiLFwiUFRcIl0uaW5kZXhPZih0aGlzLmZsYWcpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgQk1QIEZpbGVcIik7dGhpcy5wYXJzZUhlYWRlcigpLHRoaXMucGFyc2VCR1IoKX1mdW5jdGlvbiB1ZSh0KXtmdW5jdGlvbiBlKHQpe2lmKCF0KXRocm93IEVycm9yKFwiYXNzZXJ0IDpQXCIpfWZ1bmN0aW9uIHIodCxlLHIpe2Zvcih2YXIgbj0wOzQ+bjtuKyspaWYodFtlK25dIT1yLmNoYXJDb2RlQXQobikpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gbih0LGUscixuLGkpe2Zvcih2YXIgYT0wO2E8aTthKyspdFtlK2FdPXJbbithXX1mdW5jdGlvbiBpKHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8bjtpKyspdFtlK2ldPXJ9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbmV3IEludDMyQXJyYXkodCl9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgcj1bXSxuPTA7bjx0O24rKylyLnB1c2gobmV3IGUpO3JldHVybiByfWZ1bmN0aW9uIHModCxlKXt2YXIgcj1bXTtyZXR1cm4gZnVuY3Rpb24gdChyLG4saSl7Zm9yKHZhciBhPWlbbl0sbz0wO288YSYmKHIucHVzaChpLmxlbmd0aD5uKzE/W106bmV3IGUpLCEoaS5sZW5ndGg8bisxKSk7bysrKXQocltvXSxuKzEsaSl9KHIsMCx0KSxyfXZhciB1PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztmdW5jdGlvbiB1KHQsZSl7Zm9yKHZhciByPTE8PGUtMT4+PjA7dCZyOylyPj4+PTE7cmV0dXJuIHI/KHQmci0xKStyOnR9ZnVuY3Rpb24gYyh0LHIsbixpLGEpe2UoIShpJW4pKTtkb3t0W3IrKGktPW4pXT1hfXdoaWxlKDA8aSl9ZnVuY3Rpb24gbCh0LHIsbixpLG8pe2lmKGUoMjMyOD49byksNTEyPj1vKXZhciBzPWEoNTEyKTtlbHNlIGlmKG51bGw9PShzPWEobykpKXJldHVybiAwO3JldHVybiBmdW5jdGlvbih0LHIsbixpLG8scyl7dmFyIGwsZixkPXIscD0xPDxuLGc9YSgxNiksbT1hKDE2KTtmb3IoZSgwIT1vKSxlKG51bGwhPWkpLGUobnVsbCE9dCksZSgwPG4pLGY9MDtmPG87KytmKXtpZigxNTxpW2ZdKXJldHVybiAwOysrZ1tpW2ZdXX1pZihnWzBdPT1vKXJldHVybiAwO2ZvcihtWzFdPTAsbD0xOzE1Pmw7KytsKXtpZihnW2xdPjE8PGwpcmV0dXJuIDA7bVtsKzFdPW1bbF0rZ1tsXX1mb3IoZj0wO2Y8bzsrK2YpbD1pW2ZdLDA8aVtmXSYmKHNbbVtsXSsrXT1mKTtpZigxPT1tWzE1XSlyZXR1cm4oaT1uZXcgaCkuZz0wLGkudmFsdWU9c1swXSxjKHQsZCwxLHAsaSkscDt2YXIgdixiPS0xLHk9cC0xLHc9MCxOPTEsTD0xLHg9MTw8bjtmb3IoZj0wLGw9MSxvPTI7bDw9bjsrK2wsbzw8PTEpe2lmKE4rPUw8PD0xLDA+KEwtPWdbbF0pKXJldHVybiAwO2Zvcig7MDxnW2xdOy0tZ1tsXSkoaT1uZXcgaCkuZz1sLGkudmFsdWU9c1tmKytdLGModCxkK3csbyx4LGkpLHc9dSh3LGwpfWZvcihsPW4rMSxvPTI7MTU+PWw7KytsLG88PD0xKXtpZihOKz1MPDw9MSwwPihMLT1nW2xdKSlyZXR1cm4gMDtmb3IoOzA8Z1tsXTstLWdbbF0pe2lmKGk9bmV3IGgsKHcmeSkhPWIpe2ZvcihkKz14LHY9MTw8KGI9bCktbjsxNT5iJiYhKDA+PSh2LT1nW2JdKSk7KSsrYix2PDw9MTtwKz14PTE8PCh2PWItbiksdFtyKyhiPXcmeSldLmc9dituLHRbcitiXS52YWx1ZT1kLXItYn1pLmc9bC1uLGkudmFsdWU9c1tmKytdLGModCxkKyh3Pj5uKSxvLHgsaSksdz11KHcsbCl9fXJldHVybiBOIT0yKm1bMTVdLTE/MDpwfSh0LHIsbixpLG8scyl9ZnVuY3Rpb24gaCgpe3RoaXMudmFsdWU9dGhpcy5nPTB9ZnVuY3Rpb24gZigpe3RoaXMudmFsdWU9dGhpcy5nPTB9ZnVuY3Rpb24gZCgpe3RoaXMuRz1vKDUsaCksdGhpcy5IPWEoNSksdGhpcy5qYz10aGlzLlFiPXRoaXMucWI9dGhpcy5uZD0wLHRoaXMucGQ9byhFcixmKX1mdW5jdGlvbiBwKHQscixuLGkpe2UobnVsbCE9dCksZShudWxsIT1yKSxlKDIxNDc0ODM2NDg+aSksdC5DYT0yNTQsdC5JPTAsdC5iPS04LHQuS2E9MCx0Lm9hPXIsdC5wYT1uLHQuSmQ9cix0LlljPW4raSx0LlpjPTQ8PWk/bitpLTQrMTpuLF8odCl9ZnVuY3Rpb24gZyh0LGUpe2Zvcih2YXIgcj0wOzA8ZS0tOylyfD1rKHQsMTI4KTw8ZTtyZXR1cm4gcn1mdW5jdGlvbiBtKHQsZSl7dmFyIHI9Zyh0LGUpO3JldHVybiBQKHQpPy1yOnJ9ZnVuY3Rpb24gdih0LHIsbixpKXt2YXIgYSxvPTA7Zm9yKGUobnVsbCE9dCksZShudWxsIT1yKSxlKDQyOTQ5NjcyODg+aSksdC5TYj1pLHQuUmE9MCx0LnU9MCx0Lmg9MCw0PGkmJihpPTQpLGE9MDthPGk7KythKW8rPXJbbithXTw8OCphO3QuUmE9byx0LmJiPWksdC5vYT1yLHQucGE9bn1mdW5jdGlvbiBiKHQpe2Zvcig7ODw9dC51JiZ0LmJiPHQuU2I7KXQuUmE+Pj49OCx0LlJhKz10Lm9hW3QucGErdC5iYl08PFRyLTg+Pj4wLCsrdC5iYix0LnUtPTg7eCh0KSYmKHQuaD0xLHQudT0wKX1mdW5jdGlvbiB5KHQscil7aWYoZSgwPD1yKSwhdC5oJiZyPD1Ecil7dmFyIG49TCh0KSZScltyXTtyZXR1cm4gdC51Kz1yLGIodCksbn1yZXR1cm4gdC5oPTEsdC51PTB9ZnVuY3Rpb24gdygpe3RoaXMuYj10aGlzLkNhPXRoaXMuST0wLHRoaXMub2E9W10sdGhpcy5wYT0wLHRoaXMuSmQ9W10sdGhpcy5ZYz0wLHRoaXMuWmM9W10sdGhpcy5LYT0wfWZ1bmN0aW9uIE4oKXt0aGlzLlJhPTAsdGhpcy5vYT1bXSx0aGlzLmg9dGhpcy51PXRoaXMuYmI9dGhpcy5TYj10aGlzLnBhPTB9ZnVuY3Rpb24gTCh0KXtyZXR1cm4gdC5SYT4+Pih0LnUmVHItMSk+Pj4wfWZ1bmN0aW9uIHgodCl7cmV0dXJuIGUodC5iYjw9dC5TYiksdC5ofHx0LmJiPT10LlNiJiZ0LnU+VHJ9ZnVuY3Rpb24gQSh0LGUpe3QudT1lLHQuaD14KHQpfWZ1bmN0aW9uIFModCl7dC51Pj16ciYmKGUodC51Pj16ciksYih0KSl9ZnVuY3Rpb24gXyh0KXtlKG51bGwhPXQmJm51bGwhPXQub2EpLHQucGE8dC5aYz8odC5JPSh0Lm9hW3QucGErK118dC5JPDw4KT4+PjAsdC5iKz04KTooZShudWxsIT10JiZudWxsIT10Lm9hKSx0LnBhPHQuWWM/KHQuYis9OCx0Lkk9dC5vYVt0LnBhKytdfHQuSTw8OCk6dC5LYT90LmI9MDoodC5JPDw9OCx0LmIrPTgsdC5LYT0xKSl9ZnVuY3Rpb24gUCh0KXtyZXR1cm4gZyh0LDEpfWZ1bmN0aW9uIGsodCxlKXt2YXIgcj10LkNhOzA+dC5iJiZfKHQpO3ZhciBuPXQuYixpPXIqZT4+PjgsYT0odC5JPj4+bj5pKSswO2ZvcihhPyhyLT1pLHQuSS09aSsxPDxuPj4+MCk6cj1pKzEsbj1yLGk9MDsyNTY8PW47KWkrPTgsbj4+PTg7cmV0dXJuIG49N15pK1VyW25dLHQuYi09bix0LkNhPShyPDxuKS0xLGF9ZnVuY3Rpb24gRih0LGUscil7dFtlKzBdPXI+PjI0JjI1NSx0W2UrMV09cj4+MTYmMjU1LHRbZSsyXT1yPj44JjI1NSx0W2UrM109MjU1JnJ9ZnVuY3Rpb24gSSh0LGUpe3JldHVybiB0W2UrMF18dFtlKzFdPDw4fWZ1bmN0aW9uIEModCxlKXtyZXR1cm4gSSh0LGUpfHRbZSsyXTw8MTZ9ZnVuY3Rpb24gaih0LGUpe3JldHVybiBJKHQsZSl8SSh0LGUrMik8PDE2fWZ1bmN0aW9uIE8odCxyKXt2YXIgbj0xPDxyO3JldHVybiBlKG51bGwhPXQpLGUoMDxyKSx0Llg9YShuKSxudWxsPT10Llg/MDoodC5NYj0zMi1yLHQuWGE9ciwxKX1mdW5jdGlvbiBCKHQscil7ZShudWxsIT10KSxlKG51bGwhPXIpLGUodC5YYT09ci5YYSksbihyLlgsMCx0LlgsMCwxPDxyLlhhKX1mdW5jdGlvbiBNKCl7dGhpcy5YPVtdLHRoaXMuWGE9dGhpcy5NYj0wfWZ1bmN0aW9uIHEodCxyLG4saSl7ZShudWxsIT1uKSxlKG51bGwhPWkpO3ZhciBhPW5bMF0sbz1pWzBdO3JldHVybiAwPT1hJiYoYT0odCpvK3IvMikvciksMD09byYmKG89KHIqYSt0LzIpL3QpLDA+PWF8fDA+PW8/MDooblswXT1hLGlbMF09bywxKX1mdW5jdGlvbiBFKHQsZSl7cmV0dXJuIHQrKDE8PGUpLTE+Pj5lfWZ1bmN0aW9uIFIodCxlKXtyZXR1cm4oKDQyNzgyNTUzNjAmdCkrKDQyNzgyNTUzNjAmZSk+Pj4wJjQyNzgyNTUzNjApKygoMTY3MTE5MzUmdCkrKDE2NzExOTM1JmUpPj4+MCYxNjcxMTkzNSk+Pj4wfWZ1bmN0aW9uIEQoZSxyKXt0W3JdPWZ1bmN0aW9uKHIsbixpLGEsbyxzLHUpe3ZhciBjO2ZvcihjPTA7YzxvOysrYyl7dmFyIGw9dFtlXShzW3UrYy0xXSxpLGErYyk7c1t1K2NdPVIocltuK2NdLGwpfX19ZnVuY3Rpb24gVCgpe3RoaXMudWQ9dGhpcy5oZD10aGlzLmpkPTB9ZnVuY3Rpb24geih0LGUpe3JldHVybigoNDI3ODEyNDI4NiYodF5lKSk+Pj4xKSsodCZlKT4+PjB9ZnVuY3Rpb24gVSh0KXtyZXR1cm4gMDw9dCYmMjU2PnQ/dDowPnQ/MDoyNTU8dD8yNTU6dm9pZCAwfWZ1bmN0aW9uIEgodCxlKXtyZXR1cm4gVSh0Kyh0LWUrLjU+PjEpKX1mdW5jdGlvbiBXKHQsZSxyKXtyZXR1cm4gTWF0aC5hYnMoZS1yKS1NYXRoLmFicyh0LXIpfWZ1bmN0aW9uIFYodCxlLHIsbixpLGEsbyl7Zm9yKG49YVtvLTFdLHI9MDtyPGk7KytyKWFbbytyXT1uPVIodFtlK3JdLG4pfWZ1bmN0aW9uIEcodCxlLHIsbixpKXt2YXIgYTtmb3IoYT0wO2E8cjsrK2Epe3ZhciBvPXRbZSthXSxzPW8+PjgmMjU1LHU9MTY3MTE5MzUmKHU9KHU9MTY3MTE5MzUmbykrKChzPDwxNikrcykpO25baSthXT0oNDI3ODI1NTM2MCZvKSt1Pj4+MH19ZnVuY3Rpb24gWSh0LGUpe2UuamQ9MjU1JnQsZS5oZD10Pj44JjI1NSxlLnVkPXQ+PjE2JjI1NX1mdW5jdGlvbiBKKHQsZSxyLG4saSxhKXt2YXIgbztmb3Iobz0wO288bjsrK28pe3ZhciBzPWVbcitvXSx1PXM+Pj44LGM9cyxsPTI1NSYobD0obD1zPj4+MTYpKygodC5qZDw8MjQ+PjI0KSoodTw8MjQ+PjI0KT4+PjUpKTtjPTI1NSYoYz0oYys9KHQuaGQ8PDI0Pj4yNCkqKHU8PDI0Pj4yNCk+Pj41KSsoKHQudWQ8PDI0Pj4yNCkqKGw8PDI0Pj4yNCk+Pj41KSksaVthK29dPSg0Mjc4MjU1MzYwJnMpKyhsPDwxNikrY319ZnVuY3Rpb24gWChlLHIsbixpLGEpe3Rbcl09ZnVuY3Rpb24odCxlLHIsbixvLHMsdSxjLGwpe2ZvcihuPXU7bjxjOysrbilmb3IodT0wO3U8bDsrK3Upb1tzKytdPWEocltpKHRbZSsrXSldKX0sdFtlXT1mdW5jdGlvbihlLHIsbyxzLHUsYyxsKXt2YXIgaD04Pj5lLmIsZj1lLkVhLGQ9ZS5LWzBdLHA9ZS53O2lmKDg+aClmb3IoZT0oMTw8ZS5iKS0xLHA9KDE8PGgpLTE7cjxvOysrcil7dmFyIGcsbT0wO2ZvcihnPTA7ZzxmOysrZylnJmV8fChtPWkoc1t1KytdKSksY1tsKytdPWEoZFttJnBdKSxtPj49aH1lbHNlIHRbXCJWUDhMTWFwQ29sb3JcIituXShzLHUsZCxwLGMsbCxyLG8sZil9fWZ1bmN0aW9uIEsodCxlLHIsbixpKXtmb3Iocj1lK3I7ZTxyOyl7dmFyIGE9dFtlKytdO25baSsrXT1hPj4xNiYyNTUsbltpKytdPWE+PjgmMjU1LG5baSsrXT0yNTUmYX19ZnVuY3Rpb24gWih0LGUscixuLGkpe2ZvcihyPWUrcjtlPHI7KXt2YXIgYT10W2UrK107bltpKytdPWE+PjE2JjI1NSxuW2krK109YT4+OCYyNTUsbltpKytdPTI1NSZhLG5baSsrXT1hPj4yNCYyNTV9fWZ1bmN0aW9uICQodCxlLHIsbixpKXtmb3Iocj1lK3I7ZTxyOyl7dmFyIGE9KG89dFtlKytdKT4+MTYmMjQwfG8+PjEyJjE1LG89MjQwJm98bz4+MjgmMTU7bltpKytdPWEsbltpKytdPW99fWZ1bmN0aW9uIFEodCxlLHIsbixpKXtmb3Iocj1lK3I7ZTxyOyl7dmFyIGE9KG89dFtlKytdKT4+MTYmMjQ4fG8+PjEzJjcsbz1vPj41JjIyNHxvPj4zJjMxO25baSsrXT1hLG5baSsrXT1vfX1mdW5jdGlvbiB0dCh0LGUscixuLGkpe2ZvcihyPWUrcjtlPHI7KXt2YXIgYT10W2UrK107bltpKytdPTI1NSZhLG5baSsrXT1hPj44JjI1NSxuW2krK109YT4+MTYmMjU1fX1mdW5jdGlvbiBldCh0LGUscixpLGEsbyl7aWYoMD09bylmb3Iocj1lK3I7ZTxyOylGKGksKChvPXRbZSsrXSlbMF0+PjI0fG9bMV0+PjgmNjUyODB8b1syXTw8OCYxNjcxMTY4MHxvWzNdPDwyNCk+Pj4wKSxhKz0zMjtlbHNlIG4oaSxhLHQsZSxyKX1mdW5jdGlvbiBydChlLHIpe3Rbcl1bMF09dFtlK1wiMFwiXSx0W3JdWzFdPXRbZStcIjFcIl0sdFtyXVsyXT10W2UrXCIyXCJdLHRbcl1bM109dFtlK1wiM1wiXSx0W3JdWzRdPXRbZStcIjRcIl0sdFtyXVs1XT10W2UrXCI1XCJdLHRbcl1bNl09dFtlK1wiNlwiXSx0W3JdWzddPXRbZStcIjdcIl0sdFtyXVs4XT10W2UrXCI4XCJdLHRbcl1bOV09dFtlK1wiOVwiXSx0W3JdWzEwXT10W2UrXCIxMFwiXSx0W3JdWzExXT10W2UrXCIxMVwiXSx0W3JdWzEyXT10W2UrXCIxMlwiXSx0W3JdWzEzXT10W2UrXCIxM1wiXSx0W3JdWzE0XT10W2UrXCIwXCJdLHRbcl1bMTVdPXRbZStcIjBcIl19ZnVuY3Rpb24gbnQodCl7cmV0dXJuIHQ9PVVufHx0PT1Ibnx8dD09V258fHQ9PVZufWZ1bmN0aW9uIGl0KCl7dGhpcy5lYj1bXSx0aGlzLnNpemU9dGhpcy5BPXRoaXMuZmI9MH1mdW5jdGlvbiBhdCgpe3RoaXMueT1bXSx0aGlzLmY9W10sdGhpcy5lYT1bXSx0aGlzLkY9W10sdGhpcy5UYz10aGlzLkVkPXRoaXMuQ2Q9dGhpcy5GZD10aGlzLmxiPXRoaXMuRGI9dGhpcy5BYj10aGlzLmZhPXRoaXMuSj10aGlzLlc9dGhpcy5OPXRoaXMuTz0wfWZ1bmN0aW9uIG90KCl7dGhpcy5SZD10aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMuUz0wLHRoaXMuZj17fSx0aGlzLmYuUkdCQT1uZXcgaXQsdGhpcy5mLmtiPW5ldyBhdCx0aGlzLnNkPW51bGx9ZnVuY3Rpb24gc3QoKXt0aGlzLndpZHRoPVswXSx0aGlzLmhlaWdodD1bMF0sdGhpcy5QZD1bMF0sdGhpcy5RZD1bMF0sdGhpcy5mb3JtYXQ9WzBdfWZ1bmN0aW9uIHV0KCl7dGhpcy5JZD10aGlzLmZkPXRoaXMuTWQ9dGhpcy5oYj10aGlzLmliPXRoaXMuZGE9dGhpcy5iZD10aGlzLmNkPXRoaXMuaj10aGlzLnY9dGhpcy5EYT10aGlzLlNkPXRoaXMub2I9MH1mdW5jdGlvbiBjdCh0KXtyZXR1cm4gYWxlcnQoXCJ0b2RvOldlYlBTYW1wbGVyUHJvY2Vzc1BsYW5lXCIpLHQuVH1mdW5jdGlvbiBsdCh0LGUpe3ZhciByPXQuVCxpPWUuYmEuZi5SR0JBLGE9aS5lYixvPWkuZmIrdC5rYSppLkEscz1taVtlLmJhLlNdLHU9dC55LGM9dC5PLGw9dC5mLGg9dC5OLGY9dC5lYSxkPXQuVyxwPWUuY2MsZz1lLmRjLG09ZS5NYyx2PWUuTmMsYj10LmthLHk9dC5rYSt0LlQsdz10LlUsTj13KzE+PjE7Zm9yKDA9PWI/cyh1LGMsbnVsbCxudWxsLGwsaCxmLGQsbCxoLGYsZCxhLG8sbnVsbCxudWxsLHcpOihzKGUuZWMsZS5mYyx1LGMscCxnLG0sdixsLGgsZixkLGEsby1pLkEsYSxvLHcpLCsrcik7YisyPHk7Yis9MilwPWwsZz1oLG09Zix2PWQsaCs9dC5SYyxkKz10LlJjLG8rPTIqaS5BLHModSwoYys9Mip0LmZhKS10LmZhLHUsYyxwLGcsbSx2LGwsaCxmLGQsYSxvLWkuQSxhLG8sdyk7cmV0dXJuIGMrPXQuZmEsdC5qK3k8dC5vPyhuKGUuZWMsZS5mYyx1LGMsdyksbihlLmNjLGUuZGMsbCxoLE4pLG4oZS5NYyxlLk5jLGYsZCxOKSxyLS0pOjEmeXx8cyh1LGMsbnVsbCxudWxsLGwsaCxmLGQsbCxoLGYsZCxhLG8raS5BLG51bGwsbnVsbCx3KSxyfWZ1bmN0aW9uIGh0KHQscixuKXt2YXIgaT10LkYsYT1bdC5KXTtpZihudWxsIT1pKXt2YXIgbz10LlUscz1yLmJhLlMsdT1zPT1Ebnx8cz09V247cj1yLmJhLmYuUkdCQTt2YXIgYz1bMF0sbD10LmthO2NbMF09dC5ULHQuS2ImJigwPT1sPy0tY1swXTooLS1sLGFbMF0tPXQud2lkdGgpLHQuait0LmthK3QuVD09dC5vJiYoY1swXT10Lm8tdC5qLWwpKTt2YXIgaD1yLmViO2w9ci5mYitsKnIuQSx0PUFuKGksYVswXSx0LndpZHRoLG8sYyxoLGwrKHU/MDozKSxyLkEpLGUobj09YyksdCYmbnQocykmJkxuKGgsbCx1LG8sYyxyLkEpfXJldHVybiAwfWZ1bmN0aW9uIGZ0KHQpe3ZhciBlPXQubWEscj1lLmJhLlMsbj0xMT5yLGk9cj09cW58fHI9PVJufHxyPT1Ebnx8cj09VG58fDEyPT1yfHxudChyKTtpZihlLm1lbW9yeT1udWxsLGUuSWI9bnVsbCxlLkpiPW51bGwsZS5OZD1udWxsLCFCcihlLk9hLHQsaT8xMToxMikpcmV0dXJuIDA7aWYoaSYmbnQocikmJnZyKCksdC5kYSlhbGVydChcInRvZG86dXNlX3NjYWxpbmdcIik7ZWxzZXtpZihuKXtpZihlLkliPWN0LHQuS2Ipe2lmKHI9dC5VKzE+PjEsZS5tZW1vcnk9YSh0LlUrMipyKSxudWxsPT1lLm1lbW9yeSlyZXR1cm4gMDtlLmVjPWUubWVtb3J5LGUuZmM9MCxlLmNjPWUuZWMsZS5kYz1lLmZjK3QuVSxlLk1jPWUuY2MsZS5OYz1lLmRjK3IsZS5JYj1sdCx2cigpfX1lbHNlIGFsZXJ0KFwidG9kbzpFbWl0WVVWXCIpO2kmJihlLkpiPWh0LG4mJmdyKCkpfWlmKG4mJiFJaSl7Zm9yKHQ9MDsyNTY+dDsrK3QpQ2lbdF09ODk4NTgqKHQtMTI4KStTaT4+QWksQmlbdF09LTIyMDE0Kih0LTEyOCkrU2ksT2lbdF09LTQ1NzczKih0LTEyOCksamlbdF09MTEzNjE4Kih0LTEyOCkrU2k+PkFpO2Zvcih0PV9pO3Q8UGk7Kyt0KWU9NzYyODMqKHQtMTYpK1NpPj5BaSxNaVt0LV9pXT1WdChlLDI1NSkscWlbdC1faV09VnQoZSs4Pj40LDE1KTtJaT0xfXJldHVybiAxfWZ1bmN0aW9uIGR0KHQpe3ZhciByPXQubWEsbj10LlUsaT10LlQ7cmV0dXJuIGUoISgxJnQua2EpKSwwPj1ufHwwPj1pPzA6KG49ci5JYih0LHIpLG51bGwhPXIuSmImJnIuSmIodCxyLG4pLHIuRGMrPW4sMSl9ZnVuY3Rpb24gcHQodCl7dC5tYS5tZW1vcnk9bnVsbH1mdW5jdGlvbiBndCh0LGUscixuKXtyZXR1cm4gNDchPXkodCw4KT8wOihlWzBdPXkodCwxNCkrMSxyWzBdPXkodCwxNCkrMSxuWzBdPXkodCwxKSwwIT15KHQsMyk/MDohdC5oKX1mdW5jdGlvbiBtdCh0LGUpe2lmKDQ+dClyZXR1cm4gdCsxO3ZhciByPXQtMj4+MTtyZXR1cm4oMisoMSZ0KTw8cikreShlLHIpKzF9ZnVuY3Rpb24gdnQodCxlKXtyZXR1cm4gMTIwPGU/ZS0xMjA6MTw9KHI9KChyPVpuW2UtMV0pPj40KSp0Kyg4LSgxNSZyKSkpP3I6MTt2YXIgcn1mdW5jdGlvbiBidCh0LGUscil7dmFyIG49TChyKSxpPXRbZSs9MjU1Jm5dLmctODtyZXR1cm4gMDxpJiYoQShyLHIudSs4KSxuPUwociksZSs9dFtlXS52YWx1ZSxlKz1uJigxPDxpKS0xKSxBKHIsci51K3RbZV0uZyksdFtlXS52YWx1ZX1mdW5jdGlvbiB5dCh0LHIsbil7cmV0dXJuIG4uZys9dC5nLG4udmFsdWUrPXQudmFsdWU8PHI+Pj4wLGUoOD49bi5nKSx0Lmd9ZnVuY3Rpb24gd3QodCxyLG4pe3ZhciBpPXQueGM7cmV0dXJuIGUoKHI9MD09aT8wOnQudmNbdC5tZCoobj4+aSkrKHI+PmkpXSk8dC5XYiksdC5ZYVtyXX1mdW5jdGlvbiBOdCh0LHIsaSxhKXt2YXIgbz10LmFiLHM9dC5jKnIsdT10LkM7cj11K3I7dmFyIGM9aSxsPWE7Zm9yKGE9dC5UYSxpPXQuVWE7MDxvLS07KXt2YXIgaD10LmdjW29dLGY9dSxkPXIscD1jLGc9bCxtPShsPWEsYz1pLGguRWEpO3N3aXRjaChlKGY8ZCksZShkPD1oLm5jKSxoLmhjKXtjYXNlIDI6VnIocCxnLChkLWYpKm0sbCxjKTticmVhaztjYXNlIDA6dmFyIHY9ZixiPWQseT1sLHc9YyxOPShfPWgpLkVhOzA9PXYmJihIcihwLGcsbnVsbCxudWxsLDEseSx3KSxWKHAsZysxLDAsMCxOLTEseSx3KzEpLGcrPU4sdys9TiwrK3YpO2Zvcih2YXIgTD0xPDxfLmIseD1MLTEsQT1FKE4sXy5iKSxTPV8uSyxfPV8udysodj4+Xy5iKSpBO3Y8Yjspe3ZhciBQPVMsaz1fLEY9MTtmb3IoV3IocCxnLHksdy1OLDEseSx3KTtGPE47KXt2YXIgST0oRiZ+eCkrTDtJPk4mJihJPU4pLCgwLEtyW1BbaysrXT4+OCYxNV0pKHAsZysgK0YseSx3K0YtTixJLUYseSx3K0YpLEY9SX1nKz1OLHcrPU4sKyt2Jnh8fChfKz1BKX1kIT1oLm5jJiZuKGwsYy1tLGwsYysoZC1mLTEpKm0sbSk7YnJlYWs7Y2FzZSAxOmZvcihtPXAsYj1nLE49KHA9aC5FYSktKHc9cCZ+KHk9KGc9MTw8aC5iKS0xKSksdj1FKHAsaC5iKSxMPWguSyxoPWgudysoZj4+aC5iKSp2O2Y8ZDspe2Zvcih4PUwsQT1oLFM9bmV3IFQsXz1iK3csUD1iK3A7YjxfOylZKHhbQSsrXSxTKSxacihTLG0sYixnLGwsYyksYis9ZyxjKz1nO2I8UCYmKFkoeFtBKytdLFMpLFpyKFMsbSxiLE4sbCxjKSxiKz1OLGMrPU4pLCsrZiZ5fHwoaCs9dil9YnJlYWs7Y2FzZSAzOmlmKHA9PWwmJmc9PWMmJjA8aC5iKXtmb3IoYj1sLHA9bT1jKyhkLWYpKm0tKHc9KGQtZikqRShoLkVhLGguYikpLGc9bCx5PWMsdj1bXSx3PShOPXcpLTE7MDw9dzstLXcpdlt3XT1nW3krd107Zm9yKHc9Ti0xOzA8PXc7LS13KWJbcCt3XT12W3ddO0dyKGgsZixkLGwsbSxsLGMpfWVsc2UgR3IoaCxmLGQscCxnLGwsYyl9Yz1hLGw9aX1sIT1pJiZuKGEsaSxjLGwscyl9ZnVuY3Rpb24gTHQodCxyKXt2YXIgbj10LlYsaT10LkJhK3QuYyp0LkMsYT1yLXQuQztpZihlKHI8PXQubC5vKSxlKDE2Pj1hKSwwPGEpe3ZhciBvPXQubCxzPXQuVGEsdT10LlVhLGM9by53aWR0aDtpZihOdCh0LGEsbixpKSxhPXU9W3VdLGUoKG49dC5DKTwoaT1yKSksZShvLnY8by52YSksaT5vLm8mJihpPW8ubyksbjxvLmope3ZhciBsPW8uai1uO249by5qLGFbMF0rPWwqY31pZihuPj1pP249MDooYVswXSs9NCpvLnYsby5rYT1uLW8uaixvLlU9by52YS1vLnYsby5UPWktbixuPTEpLG4pe2lmKHU9dVswXSwxMT4obj10LmNhKS5TKXt2YXIgaD1uLmYuUkdCQSxmPShpPW4uUyxhPW8uVSxvPW8uVCxsPWguZWIsaC5BKSxkPW87Zm9yKGg9aC5mYit0Lk1hKmguQTswPGQtLTspe3ZhciBwPXMsZz11LG09YSx2PWwsYj1oO3N3aXRjaChpKXtjYXNlIE1uOiRyKHAsZyxtLHYsYik7YnJlYWs7Y2FzZSBxbjpRcihwLGcsbSx2LGIpO2JyZWFrO2Nhc2UgVW46UXIocCxnLG0sdixiKSxMbih2LGIsMCxtLDEsMCk7YnJlYWs7Y2FzZSBFbjpybihwLGcsbSx2LGIpO2JyZWFrO2Nhc2UgUm46ZXQocCxnLG0sdixiLDEpO2JyZWFrO2Nhc2UgSG46ZXQocCxnLG0sdixiLDEpLExuKHYsYiwwLG0sMSwwKTticmVhaztjYXNlIERuOmV0KHAsZyxtLHYsYiwwKTticmVhaztjYXNlIFduOmV0KHAsZyxtLHYsYiwwKSxMbih2LGIsMSxtLDEsMCk7YnJlYWs7Y2FzZSBUbjp0bihwLGcsbSx2LGIpO2JyZWFrO2Nhc2UgVm46dG4ocCxnLG0sdixiKSx4bih2LGIsbSwxLDApO2JyZWFrO2Nhc2Ugem46ZW4ocCxnLG0sdixiKTticmVhaztkZWZhdWx0OmUoMCl9dSs9YyxoKz1mfXQuTWErPW99ZWxzZSBhbGVydChcInRvZG86RW1pdFJlc2NhbGVkUm93c1lVVkFcIik7ZSh0Lk1hPD1uLmhlaWdodCl9fXQuQz1yLGUodC5DPD10LmkpfWZ1bmN0aW9uIHh0KHQpe3ZhciBlO2lmKDA8dC51YSlyZXR1cm4gMDtmb3IoZT0wO2U8dC5XYjsrK2Upe3ZhciByPXQuWWFbZV0uRyxuPXQuWWFbZV0uSDtpZigwPHJbMV1bblsxXSswXS5nfHwwPHJbMl1bblsyXSswXS5nfHwwPHJbM11bblszXSswXS5nKXJldHVybiAwfXJldHVybiAxfWZ1bmN0aW9uIEF0KHQscixuLGksYSxvKXtpZigwIT10Llope3ZhciBzPXQucWQsdT10LnJkO2ZvcihlKG51bGwhPWdpW3QuWl0pO3I8bjsrK3IpZ2lbdC5aXShzLHUsaSxhLGksYSxvKSxzPWksdT1hLGErPW87dC5xZD1zLHQucmQ9dX19ZnVuY3Rpb24gU3QodCxyKXt2YXIgbj10LmwubWEsaT0wPT1uLlp8fDE9PW4uWj90Lmwuajp0LkM7aWYoaT10LkM8aT9pOnQuQyxlKHI8PXQubC5vKSxyPmkpe3ZhciBhPXQubC53aWR0aCxvPW4uY2Escz1uLnRiK2EqaSx1PXQuVixjPXQuQmErdC5jKmksbD10LmdjO2UoMT09dC5hYiksZSgzPT1sWzBdLmhjKSxKcihsWzBdLGkscix1LGMsbyxzKSxBdChuLGkscixvLHMsYSl9dC5DPXQuTWE9cn1mdW5jdGlvbiBfdCh0LHIsbixpLGEsbyxzKXt2YXIgdT10LiQvaSxjPXQuJCVpLGw9dC5tLGg9dC5zLGY9bit0LiQsZD1mO2E9bitpKmE7dmFyIHA9bitpKm8sZz0yODAraC51YSxtPXQuUGI/dToxNjc3NzIxNix2PTA8aC51YT9oLldhOm51bGwsYj1oLndjLHk9ZjxwP3d0KGgsYyx1KTpudWxsO2UodC5DPG8pLGUocDw9YSk7dmFyIHc9ITE7dDpmb3IoOzspe2Zvcig7d3x8ZjxwOyl7dmFyIE49MDtpZih1Pj1tKXt2YXIgXz1mLW47ZSgobT10KS5QYiksbS53ZD1tLm0sbS54ZD1fLDA8bS5zLnVhJiZCKG0ucy5XYSxtLnMudmIpLG09dStRbn1pZihjJmJ8fCh5PXd0KGgsYyx1KSksZShudWxsIT15KSx5LlFiJiYocltmXT15LnFiLHc9ITApLCF3KWlmKFMobCkseS5qYyl7Tj1sLF89cjt2YXIgUD1mLGs9eS5wZFtMKE4pJkVyLTFdO2UoeS5qYyksMjU2PmsuZz8oQShOLE4udStrLmcpLF9bUF09ay52YWx1ZSxOPTApOihBKE4sTi51K2suZy0yNTYpLGUoMjU2PD1rLnZhbHVlKSxOPWsudmFsdWUpLDA9PU4mJih3PSEwKX1lbHNlIE49YnQoeS5HWzBdLHkuSFswXSxsKTtpZihsLmgpYnJlYWs7aWYod3x8MjU2Pk4pe2lmKCF3KWlmKHkubmQpcltmXT0oeS5xYnxOPDw4KT4+PjA7ZWxzZXtpZihTKGwpLHc9YnQoeS5HWzFdLHkuSFsxXSxsKSxTKGwpLF89YnQoeS5HWzJdLHkuSFsyXSxsKSxQPWJ0KHkuR1szXSx5LkhbM10sbCksbC5oKWJyZWFrO3JbZl09KFA8PDI0fHc8PDE2fE48PDh8Xyk+Pj4wfWlmKHc9ITEsKytmLCsrYz49aSYmKGM9MCwrK3UsbnVsbCE9cyYmdTw9byYmISh1JTE2KSYmcyh0LHUpLG51bGwhPXYpKWZvcig7ZDxmOylOPXJbZCsrXSx2LlhbKDUwNjgzMjgyOSpOJjQyOTQ5NjcyOTUpPj4+di5NYl09Tn1lbHNlIGlmKDI4MD5OKXtpZihOPW10KE4tMjU2LGwpLF89YnQoeS5HWzRdLHkuSFs0XSxsKSxTKGwpLF89dnQoaSxfPW10KF8sbCkpLGwuaClicmVhaztpZihmLW48X3x8YS1mPE4pYnJlYWsgdDtmb3IoUD0wO1A8TjsrK1ApcltmK1BdPXJbZitQLV9dO2ZvcihmKz1OLGMrPU47Yz49aTspYy09aSwrK3UsbnVsbCE9cyYmdTw9byYmISh1JTE2KSYmcyh0LHUpO2lmKGUoZjw9YSksYyZiJiYoeT13dChoLGMsdSkpLG51bGwhPXYpZm9yKDtkPGY7KU49cltkKytdLHYuWFsoNTA2ODMyODI5Kk4mNDI5NDk2NzI5NSk+Pj52Lk1iXT1OfWVsc2V7aWYoIShOPGcpKWJyZWFrIHQ7Zm9yKHc9Ti0yODAsZShudWxsIT12KTtkPGY7KU49cltkKytdLHYuWFsoNTA2ODMyODI5Kk4mNDI5NDk2NzI5NSk+Pj52Lk1iXT1OO049ZixlKCEodz4+PihfPXYpLlhhKSkscltOXT1fLlhbd10sdz0hMH13fHxlKGwuaD09eChsKSl9aWYodC5QYiYmbC5oJiZmPGEpZSh0Lm0uaCksdC5hPTUsdC5tPXQud2QsdC4kPXQueGQsMDx0LnMudWEmJkIodC5zLnZiLHQucy5XYSk7ZWxzZXtpZihsLmgpYnJlYWsgdDtudWxsIT1zJiZzKHQsdT5vP286dSksdC5hPTAsdC4kPWYtbn1yZXR1cm4gMX1yZXR1cm4gdC5hPTMsMH1mdW5jdGlvbiBQdCh0KXtlKG51bGwhPXQpLHQudmM9bnVsbCx0LnljPW51bGwsdC5ZYT1udWxsO3ZhciByPXQuV2E7bnVsbCE9ciYmKHIuWD1udWxsKSx0LnZiPW51bGwsZShudWxsIT10KX1mdW5jdGlvbiBrdCgpe3ZhciBlPW5ldyBhcjtyZXR1cm4gbnVsbD09ZT9udWxsOihlLmE9MCxlLnhiPXBpLHJ0KFwiUHJlZGljdG9yXCIsXCJWUDhMUHJlZGljdG9yc1wiKSxydChcIlByZWRpY3RvclwiLFwiVlA4TFByZWRpY3RvcnNfQ1wiKSxydChcIlByZWRpY3RvckFkZFwiLFwiVlA4TFByZWRpY3RvcnNBZGRcIikscnQoXCJQcmVkaWN0b3JBZGRcIixcIlZQOExQcmVkaWN0b3JzQWRkX0NcIiksVnI9Ryxacj1KLCRyPUssUXI9Wix0bj0kLGVuPVEscm49dHQsdC5WUDhMTWFwQ29sb3IzMmI9WXIsdC5WUDhMTWFwQ29sb3I4Yj1YcixlKX1mdW5jdGlvbiBGdCh0LHIsbixzLHUpe3ZhciBjPTEsZj1bdF0scD1bcl0sZz1zLm0sbT1zLnMsdj1udWxsLGI9MDt0OmZvcig7Oyl7aWYobilmb3IoO2MmJnkoZywxKTspe3ZhciB3PWYsTj1wLHg9cyxfPTEsUD14Lm0saz14LmdjW3guYWJdLEY9eShQLDIpO2lmKHguT2MmMTw8RiljPTA7ZWxzZXtzd2l0Y2goeC5PY3w9MTw8RixrLmhjPUYsay5FYT13WzBdLGsubmM9TlswXSxrLks9W251bGxdLCsreC5hYixlKDQ+PXguYWIpLEYpe2Nhc2UgMDpjYXNlIDE6ay5iPXkoUCwzKSsyLF89RnQoRShrLkVhLGsuYiksRShrLm5jLGsuYiksMCx4LGsuSyksay5LPWsuS1swXTticmVhaztjYXNlIDM6dmFyIEksQz15KFAsOCkrMSxqPTE2PEM/MDo0PEM/MToyPEM/MjozO2lmKHdbMF09RShrLkVhLGopLGsuYj1qLEk9Xz1GdChDLDEsMCx4LGsuSykpe3ZhciBCLE09QyxxPWssRD0xPDwoOD4+cS5iKSxUPWEoRCk7aWYobnVsbD09VClJPTA7ZWxzZXt2YXIgej1xLktbMF0sVT1xLnc7Zm9yKFRbMF09cS5LWzBdWzBdLEI9MTtCPDEqTTsrK0IpVFtCXT1SKHpbVStCXSxUW0ItMV0pO2Zvcig7Qjw0KkQ7KytCKVRbQl09MDtxLktbMF09bnVsbCxxLktbMF09VCxJPTF9fV89STticmVhaztjYXNlIDI6YnJlYWs7ZGVmYXVsdDplKDApfWM9X319aWYoZj1mWzBdLHA9cFswXSxjJiZ5KGcsMSkmJiEoYz0xPD0oYj15KGcsNCkpJiYxMT49Yikpe3MuYT0zO2JyZWFrIHR9dmFyIEg7aWYoSD1jKWU6e3ZhciBXLFYsRyxZPXMsSj1mLFg9cCxLPWIsWj1uLCQ9WS5tLFE9WS5zLHR0PVtudWxsXSxldD0xLHJ0PTAsbnQ9JG5bS107cjpmb3IoOzspe2lmKFomJnkoJCwxKSl7dmFyIGl0PXkoJCwzKSsyLGF0PUUoSixpdCksb3Q9RShYLGl0KSxzdD1hdCpvdDtpZighRnQoYXQsb3QsMCxZLHR0KSlicmVhayByO2Zvcih0dD10dFswXSxRLnhjPWl0LFc9MDtXPHN0OysrVyl7dmFyIHV0PXR0W1ddPj44JjY1NTM1O3R0W1ddPXV0LHV0Pj1ldCYmKGV0PXV0KzEpfX1pZigkLmgpYnJlYWsgcjtmb3IoVj0wOzU+VjsrK1Ype3ZhciBjdD1KbltWXTshViYmMDxLJiYoY3QrPTE8PEspLHJ0PGN0JiYocnQ9Y3QpfXZhciBsdD1vKGV0Km50LGgpLGh0PWV0LGZ0PW8oaHQsZCk7aWYobnVsbD09ZnQpdmFyIGR0PW51bGw7ZWxzZSBlKDY1NTM2Pj1odCksZHQ9ZnQ7dmFyIHB0PWEocnQpO2lmKG51bGw9PWR0fHxudWxsPT1wdHx8bnVsbD09bHQpe1kuYT0xO2JyZWFrIHJ9dmFyIGd0PWx0O2ZvcihXPUc9MDtXPGV0OysrVyl7dmFyIG10PWR0W1ddLHZ0PW10LkcsYnQ9bXQuSCx3dD0wLE50PTEsTHQ9MDtmb3IoVj0wOzU+VjsrK1Ype2N0PUpuW1ZdLHZ0W1ZdPWd0LGJ0W1ZdPUcsIVYmJjA8SyYmKGN0Kz0xPDxLKTtuOnt2YXIgeHQsQXQ9Y3QsU3Q9WSxrdD1wdCxJdD1ndCxDdD1HLGp0PTAsT3Q9U3QubSxCdD15KE90LDEpO2lmKGkoa3QsMCwwLEF0KSxCdCl7dmFyIE10PXkoT3QsMSkrMSxxdD15KE90LDEpLEV0PXkoT3QsMD09cXQ/MTo4KTtrdFtFdF09MSwyPT1NdCYmKGt0W0V0PXkoT3QsOCldPTEpO3ZhciBSdD0xfWVsc2V7dmFyIER0PWEoMTkpLFR0PXkoT3QsNCkrNDtpZigxOTxUdCl7U3QuYT0zO3ZhciB6dD0wO2JyZWFrIG59Zm9yKHh0PTA7eHQ8VHQ7Kyt4dClEdFtLblt4dF1dPXkoT3QsMyk7dmFyIFV0PXZvaWQgMCxIdD12b2lkIDAsV3Q9U3QsVnQ9RHQsR3Q9QXQsWXQ9a3QsSnQ9MCxYdD1XdC5tLEt0PTgsWnQ9bygxMjgsaCk7aTpmb3IoO2woWnQsMCw3LFZ0LDE5KTspe2lmKHkoWHQsMSkpe3ZhciAkdD0yKzIqeShYdCwzKTtpZigoVXQ9Mit5KFh0LCR0KSk+R3QpYnJlYWsgaX1lbHNlIFV0PUd0O2ZvcihIdD0wO0h0PEd0JiZVdC0tOyl7UyhYdCk7dmFyIFF0PVp0WzArKDEyNyZMKFh0KSldO0EoWHQsWHQudStRdC5nKTt2YXIgdGU9UXQudmFsdWU7aWYoMTY+dGUpWXRbSHQrK109dGUsMCE9dGUmJihLdD10ZSk7ZWxzZXt2YXIgZWU9MTY9PXRlLHJlPXRlLTE2LG5lPVluW3JlXSxpZT15KFh0LEduW3JlXSkrbmU7aWYoSHQraWU+R3QpYnJlYWsgaTtmb3IodmFyIGFlPWVlP0t0OjA7MDxpZS0tOylZdFtIdCsrXT1hZX19SnQ9MTticmVhayBpfUp0fHwoV3QuYT0zKSxSdD1KdH0oUnQ9UnQmJiFPdC5oKSYmKGp0PWwoSXQsQ3QsOCxrdCxBdCkpLFJ0JiYwIT1qdD96dD1qdDooU3QuYT0zLHp0PTApfWlmKDA9PXp0KWJyZWFrIHI7aWYoTnQmJjE9PVhuW1ZdJiYoTnQ9MD09Z3RbR10uZyksd3QrPWd0W0ddLmcsRys9enQsMz49Vil7dmFyIG9lLHNlPXB0WzBdO2ZvcihvZT0xO29lPGN0Oysrb2UpcHRbb2VdPnNlJiYoc2U9cHRbb2VdKTtMdCs9c2V9fWlmKG10Lm5kPU50LG10LlFiPTAsTnQmJihtdC5xYj0odnRbM11bYnRbM10rMF0udmFsdWU8PDI0fHZ0WzFdW2J0WzFdKzBdLnZhbHVlPDwxNnx2dFsyXVtidFsyXSswXS52YWx1ZSk+Pj4wLDA9PXd0JiYyNTY+dnRbMF1bYnRbMF0rMF0udmFsdWUmJihtdC5RYj0xLG10LnFiKz12dFswXVtidFswXSswXS52YWx1ZTw8OCkpLG10LmpjPSFtdC5RYiYmNj5MdCxtdC5qYyl7dmFyIHVlLGNlPW10O2Zvcih1ZT0wO3VlPEVyOysrdWUpe3ZhciBsZT11ZSxoZT1jZS5wZFtsZV0sZmU9Y2UuR1swXVtjZS5IWzBdK2xlXTsyNTY8PWZlLnZhbHVlPyhoZS5nPWZlLmcrMjU2LGhlLnZhbHVlPWZlLnZhbHVlKTooaGUuZz0wLGhlLnZhbHVlPTAsbGU+Pj15dChmZSw4LGhlKSxsZT4+PXl0KGNlLkdbMV1bY2UuSFsxXStsZV0sMTYsaGUpLGxlPj49eXQoY2UuR1syXVtjZS5IWzJdK2xlXSwwLGhlKSx5dChjZS5HWzNdW2NlLkhbM10rbGVdLDI0LGhlKSl9fX1RLnZjPXR0LFEuV2I9ZXQsUS5ZYT1kdCxRLnljPWx0LEg9MTticmVhayBlfUg9MH1pZighKGM9SCkpe3MuYT0zO2JyZWFrIHR9aWYoMDxiKXtpZihtLnVhPTE8PGIsIU8obS5XYSxiKSl7cy5hPTEsYz0wO2JyZWFrIHR9fWVsc2UgbS51YT0wO3ZhciBkZT1zLHBlPWYsZ2U9cCxtZT1kZS5zLHZlPW1lLnhjO2lmKGRlLmM9cGUsZGUuaT1nZSxtZS5tZD1FKHBlLHZlKSxtZS53Yz0wPT12ZT8tMTooMTw8dmUpLTEsbil7cy54Yj1kaTticmVhayB0fWlmKG51bGw9PSh2PWEoZipwKSkpe3MuYT0xLGM9MDticmVhayB0fWM9KGM9X3Qocyx2LDAsZixwLHAsbnVsbCkpJiYhZy5oO2JyZWFrIHR9cmV0dXJuIGM/KG51bGwhPXU/dVswXT12OihlKG51bGw9PXYpLGUobikpLHMuJD0wLG58fFB0KG0pKTpQdChtKSxjfWZ1bmN0aW9uIEl0KHQscil7dmFyIG49dC5jKnQuaSxpPW4rcisxNipyO3JldHVybiBlKHQuYzw9ciksdC5WPWEoaSksbnVsbD09dC5WPyh0LlRhPW51bGwsdC5VYT0wLHQuYT0xLDApOih0LlRhPXQuVix0LlVhPXQuQmErbityLDEpfWZ1bmN0aW9uIEN0KHQscil7dmFyIG49dC5DLGk9ci1uLGE9dC5WLG89dC5CYSt0LmMqbjtmb3IoZShyPD10Lmwubyk7MDxpOyl7dmFyIHM9MTY8aT8xNjppLHU9dC5sLm1hLGM9dC5sLndpZHRoLGw9YypzLGg9dS5jYSxmPXUudGIrYypuLGQ9dC5UYSxwPXQuVWE7TnQodCxzLGEsbyksU24oZCxwLGgsZixsKSxBdCh1LG4sbitzLGgsZixjKSxpLT1zLGErPXMqdC5jLG4rPXN9ZShuPT1yKSx0LkM9dC5NYT1yfWZ1bmN0aW9uIGp0KCl7dGhpcy51Yj10aGlzLnlkPXRoaXMudGQ9dGhpcy5SYj0wfWZ1bmN0aW9uIE90KCl7dGhpcy5LZD10aGlzLkxkPXRoaXMuVWQ9dGhpcy5UZD10aGlzLmk9dGhpcy5jPTB9ZnVuY3Rpb24gQnQoKXt0aGlzLkZiPXRoaXMuQmI9dGhpcy5DYj0wLHRoaXMuWmI9YSg0KSx0aGlzLkxiPWEoNCl9ZnVuY3Rpb24gTXQoKXt0aGlzLlliPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIGZ1bmN0aW9uIHQoZSxyLG4pe2Zvcih2YXIgaT1uW3JdLGE9MDthPGkmJihlLnB1c2gobi5sZW5ndGg+cisxP1tdOjApLCEobi5sZW5ndGg8cisxKSk7YSsrKXQoZVthXSxyKzEsbil9KHQsMCxbMywxMV0pLHR9KCl9ZnVuY3Rpb24gcXQoKXt0aGlzLmpiPWEoMyksdGhpcy5XYz1zKFs0LDhdLE10KSx0aGlzLlhjPXMoWzQsMTddLE10KX1mdW5jdGlvbiBFdCgpe3RoaXMuUGM9dGhpcy53Yj10aGlzLlRiPXRoaXMuemQ9MCx0aGlzLnZkPW5ldyBhKDQpLHRoaXMub2Q9bmV3IGEoNCl9ZnVuY3Rpb24gUnQoKXt0aGlzLmxkPXRoaXMuTGE9dGhpcy5kZD10aGlzLnRjPTB9ZnVuY3Rpb24gRHQoKXt0aGlzLk5hPXRoaXMubGE9MH1mdW5jdGlvbiBUdCgpe3RoaXMuU2M9WzAsMF0sdGhpcy5FYj1bMCwwXSx0aGlzLlFjPVswLDBdLHRoaXMuaWE9dGhpcy5sYz0wfWZ1bmN0aW9uIHp0KCl7dGhpcy5hZD1hKDM4NCksdGhpcy5aYT0wLHRoaXMuT2I9YSgxNiksdGhpcy4kYj10aGlzLkFkPXRoaXMuaWE9dGhpcy5HYz10aGlzLkhjPXRoaXMuRGQ9MH1mdW5jdGlvbiBVdCgpe3RoaXMudWM9dGhpcy5NPXRoaXMuTmI9MCx0aGlzLndhPUFycmF5KG5ldyBSdCksdGhpcy5ZPTAsdGhpcy55YT1BcnJheShuZXcgenQpLHRoaXMuYWE9MCx0aGlzLmw9bmV3IEd0fWZ1bmN0aW9uIEh0KCl7dGhpcy55PWEoMTYpLHRoaXMuZj1hKDgpLHRoaXMuZWE9YSg4KX1mdW5jdGlvbiBXdCgpe3RoaXMuY2I9dGhpcy5hPTAsdGhpcy5zYz1cIlwiLHRoaXMubT1uZXcgdyx0aGlzLk9kPW5ldyBqdCx0aGlzLktjPW5ldyBPdCx0aGlzLmVkPW5ldyBFdCx0aGlzLlFhPW5ldyBCdCx0aGlzLkljPXRoaXMuJGM9dGhpcy5BYT0wLHRoaXMuRD1uZXcgVXQsdGhpcy5YYj10aGlzLlZhPXRoaXMuSGI9dGhpcy56Yj10aGlzLnliPXRoaXMuVWI9dGhpcy56YT0wLHRoaXMuSmM9byg4LHcpLHRoaXMuaWE9MCx0aGlzLnBiPW8oNCxUdCksdGhpcy5QYT1uZXcgcXQsdGhpcy5CZD10aGlzLmtjPTAsdGhpcy5BYz1bXSx0aGlzLkJjPTAsdGhpcy56Yz1bMCwwLDAsMF0sdGhpcy5HZD1BcnJheShuZXcgSHQpLHRoaXMuSGQ9MCx0aGlzLnJiPUFycmF5KG5ldyBEdCksdGhpcy5zYj0wLHRoaXMud2E9QXJyYXkobmV3IFJ0KSx0aGlzLlk9MCx0aGlzLm9jPVtdLHRoaXMucGM9MCx0aGlzLnNhPVtdLHRoaXMudGE9MCx0aGlzLnFhPVtdLHRoaXMucmE9MCx0aGlzLkhhPVtdLHRoaXMuQj10aGlzLlI9dGhpcy5JYT0wLHRoaXMuRWM9W10sdGhpcy5NPXRoaXMuamE9dGhpcy5WYj10aGlzLkZjPTAsdGhpcy55YT1BcnJheShuZXcgenQpLHRoaXMuTD10aGlzLmFhPTAsdGhpcy5nZD1zKFs0LDJdLFJ0KSx0aGlzLmdhPW51bGwsdGhpcy5GYT1bXSx0aGlzLkNjPXRoaXMucWM9dGhpcy5QPTAsdGhpcy5HYj1bXSx0aGlzLlVjPTAsdGhpcy5tYj1bXSx0aGlzLm5iPTAsdGhpcy5yYz1bXSx0aGlzLkdhPXRoaXMuVmM9MH1mdW5jdGlvbiBWdCh0LGUpe3JldHVybiAwPnQ/MDp0PmU/ZTp0fWZ1bmN0aW9uIEd0KCl7dGhpcy5UPXRoaXMuVT10aGlzLmthPXRoaXMuaGVpZ2h0PXRoaXMud2lkdGg9MCx0aGlzLnk9W10sdGhpcy5mPVtdLHRoaXMuZWE9W10sdGhpcy5SYz10aGlzLmZhPXRoaXMuVz10aGlzLk49dGhpcy5PPTAsdGhpcy5tYT1cInZvaWRcIix0aGlzLnB1dD1cIlZQOElvUHV0SG9va1wiLHRoaXMuYWM9XCJWUDhJb1NldHVwSG9va1wiLHRoaXMuYmM9XCJWUDhJb1RlYXJkb3duSG9va1wiLHRoaXMuaGE9dGhpcy5LYj0wLHRoaXMuZGF0YT1bXSx0aGlzLmhiPXRoaXMuaWI9dGhpcy5kYT10aGlzLm89dGhpcy5qPXRoaXMudmE9dGhpcy52PXRoaXMuRGE9dGhpcy5vYj10aGlzLnc9MCx0aGlzLkY9W10sdGhpcy5KPTB9ZnVuY3Rpb24gWXQoKXt2YXIgdD1uZXcgV3Q7cmV0dXJuIG51bGwhPXQmJih0LmE9MCx0LnNjPVwiT0tcIix0LmNiPTAsdC5YYj0wLHJpfHwocmk9WnQpKSx0fWZ1bmN0aW9uIEp0KHQsZSxyKXtyZXR1cm4gMD09dC5hJiYodC5hPWUsdC5zYz1yLHQuY2I9MCksMH1mdW5jdGlvbiBYdCh0LGUscil7cmV0dXJuIDM8PXImJjE1Nz09dFtlKzBdJiYxPT10W2UrMV0mJjQyPT10W2UrMl19ZnVuY3Rpb24gS3QodCxyKXtpZihudWxsPT10KXJldHVybiAwO2lmKHQuYT0wLHQuc2M9XCJPS1wiLG51bGw9PXIpcmV0dXJuIEp0KHQsMixcIm51bGwgVlA4SW8gcGFzc2VkIHRvIFZQOEdldEhlYWRlcnMoKVwiKTt2YXIgbj1yLmRhdGEsYT1yLncsbz1yLmhhO2lmKDQ+bylyZXR1cm4gSnQodCw3LFwiVHJ1bmNhdGVkIGhlYWRlci5cIik7dmFyIHM9blthKzBdfG5bYSsxXTw8OHxuW2ErMl08PDE2LHU9dC5PZDtpZih1LlJiPSEoMSZzKSx1LnRkPXM+PjEmNyx1LnlkPXM+PjQmMSx1LnViPXM+PjUsMzx1LnRkKXJldHVybiBKdCh0LDMsXCJJbmNvcnJlY3Qga2V5ZnJhbWUgcGFyYW1ldGVycy5cIik7aWYoIXUueWQpcmV0dXJuIEp0KHQsNCxcIkZyYW1lIG5vdCBkaXNwbGF5YWJsZS5cIik7YSs9MyxvLT0zO3ZhciBjPXQuS2M7aWYodS5SYil7aWYoNz5vKXJldHVybiBKdCh0LDcsXCJjYW5ub3QgcGFyc2UgcGljdHVyZSBoZWFkZXJcIik7aWYoIVh0KG4sYSxvKSlyZXR1cm4gSnQodCwzLFwiQmFkIGNvZGUgd29yZFwiKTtjLmM9MTYzODMmKG5bYSs0XTw8OHxuW2ErM10pLGMuVGQ9blthKzRdPj42LGMuaT0xNjM4MyYoblthKzZdPDw4fG5bYSs1XSksYy5VZD1uW2ErNl0+PjYsYSs9NyxvLT03LHQuemE9Yy5jKzE1Pj40LHQuVWI9Yy5pKzE1Pj40LHIud2lkdGg9Yy5jLHIuaGVpZ2h0PWMuaSxyLkRhPTAsci5qPTAsci52PTAsci52YT1yLndpZHRoLHIubz1yLmhlaWdodCxyLmRhPTAsci5pYj1yLndpZHRoLHIuaGI9ci5oZWlnaHQsci5VPXIud2lkdGgsci5UPXIuaGVpZ2h0LGkoKHM9dC5QYSkuamIsMCwyNTUscy5qYi5sZW5ndGgpLGUobnVsbCE9KHM9dC5RYSkpLHMuQ2I9MCxzLkJiPTAscy5GYj0xLGkocy5aYiwwLDAscy5aYi5sZW5ndGgpLGkocy5MYiwwLDAscy5MYil9aWYodS51Yj5vKXJldHVybiBKdCh0LDcsXCJiYWQgcGFydGl0aW9uIGxlbmd0aFwiKTtwKHM9dC5tLG4sYSx1LnViKSxhKz11LnViLG8tPXUudWIsdS5SYiYmKGMuTGQ9UChzKSxjLktkPVAocykpLGM9dC5RYTt2YXIgbCxoPXQuUGE7aWYoZShudWxsIT1zKSxlKG51bGwhPWMpLGMuQ2I9UChzKSxjLkNiKXtpZihjLkJiPVAocyksUChzKSl7Zm9yKGMuRmI9UChzKSxsPTA7ND5sOysrbCljLlpiW2xdPVAocyk/bShzLDcpOjA7Zm9yKGw9MDs0Pmw7KytsKWMuTGJbbF09UChzKT9tKHMsNik6MH1pZihjLkJiKWZvcihsPTA7Mz5sOysrbCloLmpiW2xdPVAocyk/ZyhzLDgpOjI1NX1lbHNlIGMuQmI9MDtpZihzLkthKXJldHVybiBKdCh0LDMsXCJjYW5ub3QgcGFyc2Ugc2VnbWVudCBoZWFkZXJcIik7aWYoKGM9dC5lZCkuemQ9UChzKSxjLlRiPWcocyw2KSxjLndiPWcocywzKSxjLlBjPVAocyksYy5QYyYmUChzKSl7Zm9yKGg9MDs0Pmg7KytoKVAocykmJihjLnZkW2hdPW0ocyw2KSk7Zm9yKGg9MDs0Pmg7KytoKVAocykmJihjLm9kW2hdPW0ocyw2KSl9aWYodC5MPTA9PWMuVGI/MDpjLnpkPzE6MixzLkthKXJldHVybiBKdCh0LDMsXCJjYW5ub3QgcGFyc2UgZmlsdGVyIGhlYWRlclwiKTt2YXIgZj1vO2lmKG89bD1hLGE9bCtmLGM9Zix0LlhiPSgxPDxnKHQubSwyKSktMSxmPDMqKGg9dC5YYikpbj03O2Vsc2V7Zm9yKGwrPTMqaCxjLT0zKmgsZj0wO2Y8aDsrK2Ype3ZhciBkPW5bbyswXXxuW28rMV08PDh8bltvKzJdPDwxNjtkPmMmJihkPWMpLHAodC5KY1srZl0sbixsLGQpLGwrPWQsYy09ZCxvKz0zfXAodC5KY1sraF0sbixsLGMpLG49bDxhPzA6NX1pZigwIT1uKXJldHVybiBKdCh0LG4sXCJjYW5ub3QgcGFyc2UgcGFydGl0aW9uc1wiKTtmb3Iobj1nKGw9dC5tLDcpLG89UChsKT9tKGwsNCk6MCxhPVAobCk/bShsLDQpOjAsYz1QKGwpP20obCw0KTowLGg9UChsKT9tKGwsNCk6MCxsPVAobCk/bShsLDQpOjAsZj10LlFhLGQ9MDs0PmQ7KytkKXtpZihmLkNiKXt2YXIgdj1mLlpiW2RdO2YuRmJ8fCh2Kz1uKX1lbHNle2lmKDA8ZCl7dC5wYltkXT10LnBiWzBdO2NvbnRpbnVlfXY9bn12YXIgYj10LnBiW2RdO2IuU2NbMF09dGlbVnQoditvLDEyNyldLGIuU2NbMV09ZWlbVnQodiswLDEyNyldLGIuRWJbMF09Mip0aVtWdCh2K2EsMTI3KV0sYi5FYlsxXT0xMDE1ODEqZWlbVnQoditjLDEyNyldPj4xNiw4PmIuRWJbMV0mJihiLkViWzFdPTgpLGIuUWNbMF09dGlbVnQoditoLDExNyldLGIuUWNbMV09ZWlbVnQoditsLDEyNyldLGIubGM9ditsfWlmKCF1LlJiKXJldHVybiBKdCh0LDQsXCJOb3QgYSBrZXkgZnJhbWUuXCIpO2ZvcihQKHMpLHU9dC5QYSxuPTA7ND5uOysrbil7Zm9yKG89MDs4Pm87KytvKWZvcihhPTA7Mz5hOysrYSlmb3IoYz0wOzExPmM7KytjKWg9ayhzLHVpW25dW29dW2FdW2NdKT9nKHMsOCk6b2lbbl1bb11bYV1bY10sdS5XY1tuXVtvXS5ZYlthXVtjXT1oO2ZvcihvPTA7MTc+bzsrK28pdS5YY1tuXVtvXT11LldjW25dW2NpW29dXX1yZXR1cm4gdC5rYz1QKHMpLHQua2MmJih0LkJkPWcocyw4KSksdC5jYj0xfWZ1bmN0aW9uIFp0KHQsZSxyLG4saSxhLG8pe3ZhciBzPWVbaV0uWWJbcl07Zm9yKHI9MDsxNj5pOysraSl7aWYoIWsodCxzW3IrMF0pKXJldHVybiBpO2Zvcig7IWsodCxzW3IrMV0pOylpZihzPWVbKytpXS5ZYlswXSxyPTAsMTY9PWkpcmV0dXJuIDE2O3ZhciB1PWVbaSsxXS5ZYjtpZihrKHQsc1tyKzJdKSl7dmFyIGM9dCxsPTA7aWYoayhjLChmPXMpWyhoPXIpKzNdKSlpZihrKGMsZltoKzZdKSl7Zm9yKHM9MCxoPTIqKGw9ayhjLGZbaCs4XSkpKyhmPWsoYyxmW2grOStsXSkpLGw9MCxmPW5pW2hdO2Zbc107KytzKWwrPWwrayhjLGZbc10pO2wrPTMrKDg8PGgpfWVsc2UgayhjLGZbaCs3XSk/KGw9NysyKmsoYywxNjUpLGwrPWsoYywxNDUpKTpsPTUrayhjLDE1OSk7ZWxzZSBsPWsoYyxmW2grNF0pPzMrayhjLGZbaCs1XSk6MjtzPXVbMl19ZWxzZSBsPTEscz11WzFdO3U9bytpaVtpXSwwPihjPXQpLmImJl8oYyk7dmFyIGgsZj1jLmIsZD0oaD1jLkNhPj4xKS0oYy5JPj5mKT4+MzE7LS1jLmIsYy5DYSs9ZCxjLkNhfD0xLGMuSS09KGgrMSZkKTw8ZixhW3VdPSgobF5kKS1kKSpuWygwPGkpKzBdfXJldHVybiAxNn1mdW5jdGlvbiAkdCh0KXt2YXIgZT10LnJiW3Quc2ItMV07ZS5sYT0wLGUuTmE9MCxpKHQuemMsMCwwLHQuemMubGVuZ3RoKSx0LmphPTB9ZnVuY3Rpb24gUXQodCxlLHIsbixpKXtpPXRbZStyKzMyKm5dKyhpPj4zKSx0W2UrciszMipuXT0tMjU2Jmk/MD5pPzA6MjU1Oml9ZnVuY3Rpb24gdGUodCxlLHIsbixpLGEpe1F0KHQsZSwwLHIsbitpKSxRdCh0LGUsMSxyLG4rYSksUXQodCxlLDIscixuLWEpLFF0KHQsZSwzLHIsbi1pKX1mdW5jdGlvbiBlZSh0KXtyZXR1cm4oMjAwOTEqdD4+MTYpK3R9ZnVuY3Rpb24gcmUodCxlLHIsbil7dmFyIGksbz0wLHM9YSgxNik7Zm9yKGk9MDs0Pmk7KytpKXt2YXIgdT10W2UrMF0rdFtlKzhdLGM9dFtlKzBdLXRbZSs4XSxsPSgzNTQ2OCp0W2UrNF0+PjE2KS1lZSh0W2UrMTJdKSxoPWVlKHRbZSs0XSkrKDM1NDY4KnRbZSsxMl0+PjE2KTtzW28rMF09dStoLHNbbysxXT1jK2wsc1tvKzJdPWMtbCxzW28rM109dS1oLG8rPTQsZSsrfWZvcihpPW89MDs0Pmk7KytpKXU9KHQ9c1tvKzBdKzQpK3Nbbys4XSxjPXQtc1tvKzhdLGw9KDM1NDY4KnNbbys0XT4+MTYpLWVlKHNbbysxMl0pLFF0KHIsbiwwLDAsdSsoaD1lZShzW28rNF0pKygzNTQ2OCpzW28rMTJdPj4xNikpKSxRdChyLG4sMSwwLGMrbCksUXQocixuLDIsMCxjLWwpLFF0KHIsbiwzLDAsdS1oKSxvKyssbis9MzJ9ZnVuY3Rpb24gbmUodCxlLHIsbil7dmFyIGk9dFtlKzBdKzQsYT0zNTQ2OCp0W2UrNF0+PjE2LG89ZWUodFtlKzRdKSxzPTM1NDY4KnRbZSsxXT4+MTY7dGUocixuLDAsaStvLHQ9ZWUodFtlKzFdKSxzKSx0ZShyLG4sMSxpK2EsdCxzKSx0ZShyLG4sMixpLWEsdCxzKSx0ZShyLG4sMyxpLW8sdCxzKX1mdW5jdGlvbiBpZSh0LGUscixuLGkpe3JlKHQsZSxyLG4pLGkmJnJlKHQsZSsxNixyLG4rNCl9ZnVuY3Rpb24gYWUodCxlLHIsbil7YW4odCxlKzAscixuLDEpLGFuKHQsZSszMixyLG4rMTI4LDEpfWZ1bmN0aW9uIG9lKHQsZSxyLG4pe3ZhciBpO2Zvcih0PXRbZSswXSs0LGk9MDs0Pmk7KytpKWZvcihlPTA7ND5lOysrZSlRdChyLG4sZSxpLHQpfWZ1bmN0aW9uIHNlKHQsZSxyLG4pe3RbZSswXSYmdW4odCxlKzAscixuKSx0W2UrMTZdJiZ1bih0LGUrMTYscixuKzQpLHRbZSszMl0mJnVuKHQsZSszMixyLG4rMTI4KSx0W2UrNDhdJiZ1bih0LGUrNDgscixuKzEyOCs0KX1mdW5jdGlvbiB1ZSh0LGUscixuKXt2YXIgaSxvPWEoMTYpO2ZvcihpPTA7ND5pOysraSl7dmFyIHM9dFtlKzAraV0rdFtlKzEyK2ldLHU9dFtlKzQraV0rdFtlKzgraV0sYz10W2UrNCtpXS10W2UrOCtpXSxsPXRbZSswK2ldLXRbZSsxMitpXTtvWzAraV09cyt1LG9bOCtpXT1zLXUsb1s0K2ldPWwrYyxvWzEyK2ldPWwtY31mb3IoaT0wOzQ+aTsrK2kpcz0odD1vWzArNCppXSszKStvWzMrNCppXSx1PW9bMSs0KmldK29bMis0KmldLGM9b1sxKzQqaV0tb1syKzQqaV0sbD10LW9bMys0KmldLHJbbiswXT1zK3U+PjMscltuKzE2XT1sK2M+PjMscltuKzMyXT1zLXU+PjMscltuKzQ4XT1sLWM+PjMsbis9NjR9ZnVuY3Rpb24gY2UodCxlLHIpe3ZhciBuLGk9ZS0zMixhPU9uLG89MjU1LXRbaS0xXTtmb3Iobj0wO248cjsrK24pe3ZhciBzLHU9YSxjPW8rdFtlLTFdO2ZvcihzPTA7czxyOysrcyl0W2Urc109dVtjK3RbaStzXV07ZSs9MzJ9fWZ1bmN0aW9uIGxlKHQsZSl7Y2UodCxlLDQpfWZ1bmN0aW9uIGhlKHQsZSl7Y2UodCxlLDgpfWZ1bmN0aW9uIGZlKHQsZSl7Y2UodCxlLDE2KX1mdW5jdGlvbiBkZSh0LGUpe3ZhciByO2ZvcihyPTA7MTY+cjsrK3Ipbih0LGUrMzIqcix0LGUtMzIsMTYpfWZ1bmN0aW9uIHBlKHQsZSl7dmFyIHI7Zm9yKHI9MTY7MDxyOy0tcilpKHQsZSx0W2UtMV0sMTYpLGUrPTMyfWZ1bmN0aW9uIGdlKHQsZSxyKXt2YXIgbjtmb3Iobj0wOzE2Pm47KytuKWkoZSxyKzMyKm4sdCwxNil9ZnVuY3Rpb24gbWUodCxlKXt2YXIgcixuPTE2O2ZvcihyPTA7MTY+cjsrK3Ipbis9dFtlLTErMzIqcl0rdFtlK3ItMzJdO2dlKG4+PjUsdCxlKX1mdW5jdGlvbiB2ZSh0LGUpe3ZhciByLG49ODtmb3Iocj0wOzE2PnI7KytyKW4rPXRbZS0xKzMyKnJdO2dlKG4+PjQsdCxlKX1mdW5jdGlvbiBiZSh0LGUpe3ZhciByLG49ODtmb3Iocj0wOzE2PnI7KytyKW4rPXRbZStyLTMyXTtnZShuPj40LHQsZSl9ZnVuY3Rpb24geWUodCxlKXtnZSgxMjgsdCxlKX1mdW5jdGlvbiB3ZSh0LGUscil7cmV0dXJuIHQrMiplK3IrMj4+Mn1mdW5jdGlvbiBOZSh0LGUpe3ZhciByLGk9ZS0zMjtmb3IoaT1uZXcgVWludDhBcnJheShbd2UodFtpLTFdLHRbaSswXSx0W2krMV0pLHdlKHRbaSswXSx0W2krMV0sdFtpKzJdKSx3ZSh0W2krMV0sdFtpKzJdLHRbaSszXSksd2UodFtpKzJdLHRbaSszXSx0W2krNF0pXSkscj0wOzQ+cjsrK3Ipbih0LGUrMzIqcixpLDAsaS5sZW5ndGgpfWZ1bmN0aW9uIExlKHQsZSl7dmFyIHI9dFtlLTFdLG49dFtlLTErMzJdLGk9dFtlLTErNjRdLGE9dFtlLTErOTZdO0YodCxlKzAsMTY4NDMwMDkqd2UodFtlLTEtMzJdLHIsbikpLEYodCxlKzMyLDE2ODQzMDA5KndlKHIsbixpKSksRih0LGUrNjQsMTY4NDMwMDkqd2UobixpLGEpKSxGKHQsZSs5NiwxNjg0MzAwOSp3ZShpLGEsYSkpfWZ1bmN0aW9uIHhlKHQsZSl7dmFyIHIsbj00O2ZvcihyPTA7ND5yOysrciluKz10W2Urci0zMl0rdFtlLTErMzIqcl07Zm9yKG4+Pj0zLHI9MDs0PnI7KytyKWkodCxlKzMyKnIsbiw0KX1mdW5jdGlvbiBBZSh0LGUpe3ZhciByPXRbZS0xKzBdLG49dFtlLTErMzJdLGk9dFtlLTErNjRdLGE9dFtlLTEtMzJdLG89dFtlKzAtMzJdLHM9dFtlKzEtMzJdLHU9dFtlKzItMzJdLGM9dFtlKzMtMzJdO3RbZSswKzk2XT13ZShuLGksdFtlLTErOTZdKSx0W2UrMSs5Nl09dFtlKzArNjRdPXdlKHIsbixpKSx0W2UrMis5Nl09dFtlKzErNjRdPXRbZSswKzMyXT13ZShhLHIsbiksdFtlKzMrOTZdPXRbZSsyKzY0XT10W2UrMSszMl09dFtlKzArMF09d2UobyxhLHIpLHRbZSszKzY0XT10W2UrMiszMl09dFtlKzErMF09d2UocyxvLGEpLHRbZSszKzMyXT10W2UrMiswXT13ZSh1LHMsbyksdFtlKzMrMF09d2UoYyx1LHMpfWZ1bmN0aW9uIFNlKHQsZSl7dmFyIHI9dFtlKzEtMzJdLG49dFtlKzItMzJdLGk9dFtlKzMtMzJdLGE9dFtlKzQtMzJdLG89dFtlKzUtMzJdLHM9dFtlKzYtMzJdLHU9dFtlKzctMzJdO3RbZSswKzBdPXdlKHRbZSswLTMyXSxyLG4pLHRbZSsxKzBdPXRbZSswKzMyXT13ZShyLG4saSksdFtlKzIrMF09dFtlKzErMzJdPXRbZSswKzY0XT13ZShuLGksYSksdFtlKzMrMF09dFtlKzIrMzJdPXRbZSsxKzY0XT10W2UrMCs5Nl09d2UoaSxhLG8pLHRbZSszKzMyXT10W2UrMis2NF09dFtlKzErOTZdPXdlKGEsbyxzKSx0W2UrMys2NF09dFtlKzIrOTZdPXdlKG8scyx1KSx0W2UrMys5Nl09d2Uocyx1LHUpfWZ1bmN0aW9uIF9lKHQsZSl7dmFyIHI9dFtlLTErMF0sbj10W2UtMSszMl0saT10W2UtMSs2NF0sYT10W2UtMS0zMl0sbz10W2UrMC0zMl0scz10W2UrMS0zMl0sdT10W2UrMi0zMl0sYz10W2UrMy0zMl07dFtlKzArMF09dFtlKzErNjRdPWErbysxPj4xLHRbZSsxKzBdPXRbZSsyKzY0XT1vK3MrMT4+MSx0W2UrMiswXT10W2UrMys2NF09cyt1KzE+PjEsdFtlKzMrMF09dStjKzE+PjEsdFtlKzArOTZdPXdlKGksbixyKSx0W2UrMCs2NF09d2UobixyLGEpLHRbZSswKzMyXT10W2UrMSs5Nl09d2UocixhLG8pLHRbZSsxKzMyXT10W2UrMis5Nl09d2UoYSxvLHMpLHRbZSsyKzMyXT10W2UrMys5Nl09d2UobyxzLHUpLHRbZSszKzMyXT13ZShzLHUsYyl9ZnVuY3Rpb24gUGUodCxlKXt2YXIgcj10W2UrMC0zMl0sbj10W2UrMS0zMl0saT10W2UrMi0zMl0sYT10W2UrMy0zMl0sbz10W2UrNC0zMl0scz10W2UrNS0zMl0sdT10W2UrNi0zMl0sYz10W2UrNy0zMl07dFtlKzArMF09cituKzE+PjEsdFtlKzErMF09dFtlKzArNjRdPW4raSsxPj4xLHRbZSsyKzBdPXRbZSsxKzY0XT1pK2ErMT4+MSx0W2UrMyswXT10W2UrMis2NF09YStvKzE+PjEsdFtlKzArMzJdPXdlKHIsbixpKSx0W2UrMSszMl09dFtlKzArOTZdPXdlKG4saSxhKSx0W2UrMiszMl09dFtlKzErOTZdPXdlKGksYSxvKSx0W2UrMyszMl09dFtlKzIrOTZdPXdlKGEsbyxzKSx0W2UrMys2NF09d2UobyxzLHUpLHRbZSszKzk2XT13ZShzLHUsYyl9ZnVuY3Rpb24ga2UodCxlKXt2YXIgcj10W2UtMSswXSxuPXRbZS0xKzMyXSxpPXRbZS0xKzY0XSxhPXRbZS0xKzk2XTt0W2UrMCswXT1yK24rMT4+MSx0W2UrMiswXT10W2UrMCszMl09bitpKzE+PjEsdFtlKzIrMzJdPXRbZSswKzY0XT1pK2ErMT4+MSx0W2UrMSswXT13ZShyLG4saSksdFtlKzMrMF09dFtlKzErMzJdPXdlKG4saSxhKSx0W2UrMyszMl09dFtlKzErNjRdPXdlKGksYSxhKSx0W2UrMys2NF09dFtlKzIrNjRdPXRbZSswKzk2XT10W2UrMSs5Nl09dFtlKzIrOTZdPXRbZSszKzk2XT1hfWZ1bmN0aW9uIEZlKHQsZSl7dmFyIHI9dFtlLTErMF0sbj10W2UtMSszMl0saT10W2UtMSs2NF0sYT10W2UtMSs5Nl0sbz10W2UtMS0zMl0scz10W2UrMC0zMl0sdT10W2UrMS0zMl0sYz10W2UrMi0zMl07dFtlKzArMF09dFtlKzIrMzJdPXIrbysxPj4xLHRbZSswKzMyXT10W2UrMis2NF09bityKzE+PjEsdFtlKzArNjRdPXRbZSsyKzk2XT1pK24rMT4+MSx0W2UrMCs5Nl09YStpKzE+PjEsdFtlKzMrMF09d2Uocyx1LGMpLHRbZSsyKzBdPXdlKG8scyx1KSx0W2UrMSswXT10W2UrMyszMl09d2UocixvLHMpLHRbZSsxKzMyXT10W2UrMys2NF09d2UobixyLG8pLHRbZSsxKzY0XT10W2UrMys5Nl09d2UoaSxuLHIpLHRbZSsxKzk2XT13ZShhLGksbil9ZnVuY3Rpb24gSWUodCxlKXt2YXIgcjtmb3Iocj0wOzg+cjsrK3Ipbih0LGUrMzIqcix0LGUtMzIsOCl9ZnVuY3Rpb24gQ2UodCxlKXt2YXIgcjtmb3Iocj0wOzg+cjsrK3IpaSh0LGUsdFtlLTFdLDgpLGUrPTMyfWZ1bmN0aW9uIGplKHQsZSxyKXt2YXIgbjtmb3Iobj0wOzg+bjsrK24paShlLHIrMzIqbix0LDgpfWZ1bmN0aW9uIE9lKHQsZSl7dmFyIHIsbj04O2ZvcihyPTA7OD5yOysrciluKz10W2Urci0zMl0rdFtlLTErMzIqcl07amUobj4+NCx0LGUpfWZ1bmN0aW9uIEJlKHQsZSl7dmFyIHIsbj00O2ZvcihyPTA7OD5yOysrciluKz10W2Urci0zMl07amUobj4+Myx0LGUpfWZ1bmN0aW9uIE1lKHQsZSl7dmFyIHIsbj00O2ZvcihyPTA7OD5yOysrciluKz10W2UtMSszMipyXTtqZShuPj4zLHQsZSl9ZnVuY3Rpb24gcWUodCxlKXtqZSgxMjgsdCxlKX1mdW5jdGlvbiBFZSh0LGUscil7dmFyIG49dFtlLXJdLGk9dFtlKzBdLGE9MyooaS1uKStDblsxMDIwK3RbZS0yKnJdLXRbZStyXV0sbz1qblsxMTIrKGErND4+MyldO3RbZS1yXT1PblsyNTUrbitqblsxMTIrKGErMz4+MyldXSx0W2UrMF09T25bMjU1K2ktb119ZnVuY3Rpb24gUmUodCxlLHIsbil7dmFyIGk9dFtlKzBdLGE9dFtlK3JdO3JldHVybiBCblsyNTUrdFtlLTIqcl0tdFtlLXJdXT5ufHxCblsyNTUrYS1pXT5ufWZ1bmN0aW9uIERlKHQsZSxyLG4pe3JldHVybiA0KkJuWzI1NSt0W2Utcl0tdFtlKzBdXStCblsyNTUrdFtlLTIqcl0tdFtlK3JdXTw9bn1mdW5jdGlvbiBUZSh0LGUscixuLGkpe3ZhciBhPXRbZS0zKnJdLG89dFtlLTIqcl0scz10W2Utcl0sdT10W2UrMF0sYz10W2Urcl0sbD10W2UrMipyXSxoPXRbZSszKnJdO3JldHVybiA0KkJuWzI1NStzLXVdK0JuWzI1NStvLWNdPm4/MDpCblsyNTUrdFtlLTQqcl0tYV08PWkmJkJuWzI1NSthLW9dPD1pJiZCblsyNTUrby1zXTw9aSYmQm5bMjU1K2gtbF08PWkmJkJuWzI1NStsLWNdPD1pJiZCblsyNTUrYy11XTw9aX1mdW5jdGlvbiB6ZSh0LGUscixuKXt2YXIgaT0yKm4rMTtmb3Iobj0wOzE2Pm47KytuKURlKHQsZStuLHIsaSkmJkVlKHQsZStuLHIpfWZ1bmN0aW9uIFVlKHQsZSxyLG4pe3ZhciBpPTIqbisxO2ZvcihuPTA7MTY+bjsrK24pRGUodCxlK24qciwxLGkpJiZFZSh0LGUrbipyLDEpfWZ1bmN0aW9uIEhlKHQsZSxyLG4pe3ZhciBpO2ZvcihpPTM7MDxpOy0taSl6ZSh0LGUrPTQqcixyLG4pfWZ1bmN0aW9uIFdlKHQsZSxyLG4pe3ZhciBpO2ZvcihpPTM7MDxpOy0taSlVZSh0LGUrPTQscixuKX1mdW5jdGlvbiBWZSh0LGUscixuLGksYSxvLHMpe2ZvcihhPTIqYSsxOzA8aS0tOyl7aWYoVGUodCxlLHIsYSxvKSlpZihSZSh0LGUscixzKSlFZSh0LGUscik7ZWxzZXt2YXIgdT10LGM9ZSxsPXIsaD11W2MtMipsXSxmPXVbYy1sXSxkPXVbYyswXSxwPXVbYytsXSxnPXVbYysyKmxdLG09MjcqKGI9Q25bMTAyMCszKihkLWYpK0NuWzEwMjAraC1wXV0pKzYzPj43LHY9MTgqYis2Mz4+NyxiPTkqYis2Mz4+Nzt1W2MtMypsXT1PblsyNTUrdVtjLTMqbF0rYl0sdVtjLTIqbF09T25bMjU1K2grdl0sdVtjLWxdPU9uWzI1NStmK21dLHVbYyswXT1PblsyNTUrZC1tXSx1W2MrbF09T25bMjU1K3Atdl0sdVtjKzIqbF09T25bMjU1K2ctYl19ZSs9bn19ZnVuY3Rpb24gR2UodCxlLHIsbixpLGEsbyxzKXtmb3IoYT0yKmErMTswPGktLTspe2lmKFRlKHQsZSxyLGEsbykpaWYoUmUodCxlLHIscykpRWUodCxlLHIpO2Vsc2V7dmFyIHU9dCxjPWUsbD1yLGg9dVtjLWxdLGY9dVtjKzBdLGQ9dVtjK2xdLHA9am5bMTEyKyg0KyhnPTMqKGYtaCkpPj4zKV0sZz1qblsxMTIrKGcrMz4+MyldLG09cCsxPj4xO3VbYy0yKmxdPU9uWzI1NSt1W2MtMipsXSttXSx1W2MtbF09T25bMjU1K2grZ10sdVtjKzBdPU9uWzI1NStmLXBdLHVbYytsXT1PblsyNTUrZC1tXX1lKz1ufX1mdW5jdGlvbiBZZSh0LGUscixuLGksYSl7VmUodCxlLHIsMSwxNixuLGksYSl9ZnVuY3Rpb24gSmUodCxlLHIsbixpLGEpe1ZlKHQsZSwxLHIsMTYsbixpLGEpfWZ1bmN0aW9uIFhlKHQsZSxyLG4saSxhKXt2YXIgbztmb3Iobz0zOzA8bzstLW8pR2UodCxlKz00KnIsciwxLDE2LG4saSxhKX1mdW5jdGlvbiBLZSh0LGUscixuLGksYSl7dmFyIG87Zm9yKG89MzswPG87LS1vKUdlKHQsZSs9NCwxLHIsMTYsbixpLGEpfWZ1bmN0aW9uIFplKHQsZSxyLG4saSxhLG8scyl7VmUodCxlLGksMSw4LGEsbyxzKSxWZShyLG4saSwxLDgsYSxvLHMpfWZ1bmN0aW9uICRlKHQsZSxyLG4saSxhLG8scyl7VmUodCxlLDEsaSw4LGEsbyxzKSxWZShyLG4sMSxpLDgsYSxvLHMpfWZ1bmN0aW9uIFFlKHQsZSxyLG4saSxhLG8scyl7R2UodCxlKzQqaSxpLDEsOCxhLG8scyksR2UocixuKzQqaSxpLDEsOCxhLG8scyl9ZnVuY3Rpb24gdHIodCxlLHIsbixpLGEsbyxzKXtHZSh0LGUrNCwxLGksOCxhLG8scyksR2UocixuKzQsMSxpLDgsYSxvLHMpfWZ1bmN0aW9uIGVyKCl7dGhpcy5iYT1uZXcgb3QsdGhpcy5lYz1bXSx0aGlzLmNjPVtdLHRoaXMuTWM9W10sdGhpcy5EYz10aGlzLk5jPXRoaXMuZGM9dGhpcy5mYz0wLHRoaXMuT2E9bmV3IHV0LHRoaXMubWVtb3J5PTAsdGhpcy5JYj1cIk91dHB1dEZ1bmNcIix0aGlzLkpiPVwiT3V0cHV0QWxwaGFGdW5jXCIsdGhpcy5OZD1cIk91dHB1dFJvd0Z1bmNcIn1mdW5jdGlvbiBycigpe3RoaXMuZGF0YT1bXSx0aGlzLm9mZnNldD10aGlzLmtkPXRoaXMuaGE9dGhpcy53PTAsdGhpcy5uYT1bXSx0aGlzLnhhPXRoaXMuZ2I9dGhpcy5KYT10aGlzLlNhPXRoaXMuUD0wfWZ1bmN0aW9uIG5yKCl7dGhpcy5uYz10aGlzLkVhPXRoaXMuYj10aGlzLmhjPTAsdGhpcy5LPVtdLHRoaXMudz0wfWZ1bmN0aW9uIGlyKCl7dGhpcy51YT0wLHRoaXMuV2E9bmV3IE0sdGhpcy52Yj1uZXcgTSx0aGlzLm1kPXRoaXMueGM9dGhpcy53Yz0wLHRoaXMudmM9W10sdGhpcy5XYj0wLHRoaXMuWWE9bmV3IGQsdGhpcy55Yz1uZXcgaH1mdW5jdGlvbiBhcigpe3RoaXMueGI9dGhpcy5hPTAsdGhpcy5sPW5ldyBHdCx0aGlzLmNhPW5ldyBvdCx0aGlzLlY9W10sdGhpcy5CYT0wLHRoaXMuVGE9W10sdGhpcy5VYT0wLHRoaXMubT1uZXcgTix0aGlzLlBiPTAsdGhpcy53ZD1uZXcgTix0aGlzLk1hPXRoaXMuJD10aGlzLkM9dGhpcy5pPXRoaXMuYz10aGlzLnhkPTAsdGhpcy5zPW5ldyBpcix0aGlzLmFiPTAsdGhpcy5nYz1vKDQsbnIpLHRoaXMuT2M9MH1mdW5jdGlvbiBvcigpe3RoaXMuTGM9dGhpcy5aPXRoaXMuJGE9dGhpcy5pPXRoaXMuYz0wLHRoaXMubD1uZXcgR3QsdGhpcy5pYz0wLHRoaXMuY2E9W10sdGhpcy50Yj0wLHRoaXMucWQ9bnVsbCx0aGlzLnJkPTB9ZnVuY3Rpb24gc3IodCxlLHIsbixpLGEsbyl7Zm9yKHQ9bnVsbD09dD8wOnRbZSswXSxlPTA7ZTxvOysrZSlpW2ErZV09dCtyW24rZV0mMjU1LHQ9aVthK2VdfWZ1bmN0aW9uIHVyKHQsZSxyLG4saSxhLG8pe3ZhciBzO2lmKG51bGw9PXQpc3IobnVsbCxudWxsLHIsbixpLGEsbyk7ZWxzZSBmb3Iocz0wO3M8bzsrK3MpaVthK3NdPXRbZStzXStyW24rc10mMjU1fWZ1bmN0aW9uIGNyKHQsZSxyLG4saSxhLG8pe2lmKG51bGw9PXQpc3IobnVsbCxudWxsLHIsbixpLGEsbyk7ZWxzZXt2YXIgcyx1PXRbZSswXSxjPXUsbD11O2ZvcihzPTA7czxvOysrcyljPWwrKHU9dFtlK3NdKS1jLGw9cltuK3NdKygtMjU2JmM/MD5jPzA6MjU1OmMpJjI1NSxjPXUsaVthK3NdPWx9fWZ1bmN0aW9uIGxyKHQscixpLG8pe3ZhciBzPXIud2lkdGgsdT1yLm87aWYoZShudWxsIT10JiZudWxsIT1yKSwwPml8fDA+PW98fGkrbz51KXJldHVybiBudWxsO2lmKCF0LkNjKXtpZihudWxsPT10LmdhKXt2YXIgYztpZih0LmdhPW5ldyBvciwoYz1udWxsPT10LmdhKXx8KGM9ci53aWR0aCpyLm8sZSgwPT10LkdiLmxlbmd0aCksdC5HYj1hKGMpLHQuVWM9MCxudWxsPT10LkdiP2M9MDoodC5tYj10LkdiLHQubmI9dC5VYyx0LnJjPW51bGwsYz0xKSxjPSFjKSwhYyl7Yz10LmdhO3ZhciBsPXQuRmEsaD10LlAsZj10LnFjLGQ9dC5tYixwPXQubmIsZz1oKzEsbT1mLTEsYj1jLmw7aWYoZShudWxsIT1sJiZudWxsIT1kJiZudWxsIT1yKSxnaVswXT1udWxsLGdpWzFdPXNyLGdpWzJdPXVyLGdpWzNdPWNyLGMuY2E9ZCxjLnRiPXAsYy5jPXIud2lkdGgsYy5pPXIuaGVpZ2h0LGUoMDxjLmMmJjA8Yy5pKSwxPj1mKXI9MDtlbHNlIGlmKGMuJGE9MyZsW2grMF0sYy5aPWxbaCswXT4+MiYzLGMuTGM9bFtoKzBdPj40JjMsaD1sW2grMF0+PjYmMywwPmMuJGF8fDE8Yy4kYXx8NDw9Yy5afHwxPGMuTGN8fGgpcj0wO2Vsc2UgaWYoYi5wdXQ9ZHQsYi5hYz1mdCxiLmJjPXB0LGIubWE9YyxiLndpZHRoPXIud2lkdGgsYi5oZWlnaHQ9ci5oZWlnaHQsYi5EYT1yLkRhLGIudj1yLnYsYi52YT1yLnZhLGIuaj1yLmosYi5vPXIubyxjLiRhKXQ6e2UoMT09Yy4kYSkscj1rdCgpO2U6Zm9yKDs7KXtpZihudWxsPT1yKXtyPTA7YnJlYWsgdH1pZihlKG51bGwhPWMpLGMubWM9cixyLmM9Yy5jLHIuaT1jLmksci5sPWMubCxyLmwubWE9YyxyLmwud2lkdGg9Yy5jLHIubC5oZWlnaHQ9Yy5pLHIuYT0wLHYoci5tLGwsZyxtKSwhRnQoYy5jLGMuaSwxLHIsbnVsbCkpYnJlYWsgZTtpZigxPT1yLmFiJiYzPT1yLmdjWzBdLmhjJiZ4dChyLnMpPyhjLmljPTEsbD1yLmMqci5pLHIuVGE9bnVsbCxyLlVhPTAsci5WPWEobCksci5CYT0wLG51bGw9PXIuVj8oci5hPTEscj0wKTpyPTEpOihjLmljPTAscj1JdChyLGMuYykpLCFyKWJyZWFrIGU7cj0xO2JyZWFrIHR9Yy5tYz1udWxsLHI9MH1lbHNlIHI9bT49Yy5jKmMuaTtjPSFyfWlmKGMpcmV0dXJuIG51bGw7MSE9dC5nYS5MYz90LkdhPTA6bz11LWl9ZShudWxsIT10LmdhKSxlKGkrbzw9dSk7dDp7aWYocj0obD10LmdhKS5jLHU9bC5sLm8sMD09bC4kYSl7aWYoZz10LnJjLG09dC5WYyxiPXQuRmEsaD10LlArMStpKnIsZj10Lm1iLGQ9dC5uYitpKnIsZShoPD10LlArdC5xYyksMCE9bC5aKWZvcihlKG51bGwhPWdpW2wuWl0pLGM9MDtjPG87KytjKWdpW2wuWl0oZyxtLGIsaCxmLGQsciksZz1mLG09ZCxkKz1yLGgrPXI7ZWxzZSBmb3IoYz0wO2M8bzsrK2MpbihmLGQsYixoLHIpLGc9ZixtPWQsZCs9cixoKz1yO3QucmM9Zyx0LlZjPW19ZWxzZXtpZihlKG51bGwhPWwubWMpLHI9aStvLGUobnVsbCE9KGM9bC5tYykpLGUocjw9Yy5pKSxjLkM+PXIpcj0xO2Vsc2UgaWYobC5pY3x8Z3IoKSxsLmljKXtsPWMuVixnPWMuQmEsbT1jLmM7dmFyIHk9Yy5pLHc9KGI9MSxoPWMuJC9tLGY9Yy4kJW0sZD1jLm0scD1jLnMsYy4kKSxOPW0qeSxMPW0qcixBPXAud2MsXz13PEw/d3QocCxmLGgpOm51bGw7ZSh3PD1OKSxlKHI8PXkpLGUoeHQocCkpO2U6Zm9yKDs7KXtmb3IoOyFkLmgmJnc8TDspe2lmKGYmQXx8KF89d3QocCxmLGgpKSxlKG51bGwhPV8pLFMoZCksMjU2Pih5PWJ0KF8uR1swXSxfLkhbMF0sZCkpKWxbZyt3XT15LCsrdywrK2Y+PW0mJihmPTAsKytoPD1yJiYhKGglMTYpJiZTdChjLGgpKTtlbHNle2lmKCEoMjgwPnkpKXtiPTA7YnJlYWsgZX15PW10KHktMjU2LGQpO3ZhciBQLGs9YnQoXy5HWzRdLF8uSFs0XSxkKTtpZihTKGQpLCEodz49KGs9dnQobSxrPW10KGssZCkpKSYmTi13Pj15KSl7Yj0wO2JyZWFrIGV9Zm9yKFA9MDtQPHk7KytQKWxbZyt3K1BdPWxbZyt3K1Ata107Zm9yKHcrPXksZis9eTtmPj1tOylmLT1tLCsraDw9ciYmIShoJTE2KSYmU3QoYyxoKTt3PEwmJmYmQSYmKF89d3QocCxmLGgpKX1lKGQuaD09eChkKSl9U3QoYyxoPnI/cjpoKTticmVhayBlfSFifHxkLmgmJnc8Tj8oYj0wLGMuYT1kLmg/NTozKTpjLiQ9dyxyPWJ9ZWxzZSByPV90KGMsYy5WLGMuQmEsYy5jLGMuaSxyLEN0KTtpZighcil7bz0wO2JyZWFrIHR9fWkrbz49dSYmKHQuQ2M9MSksbz0xfWlmKCFvKXJldHVybiBudWxsO2lmKHQuQ2MmJihudWxsIT0obz10LmdhKSYmKG8ubWM9bnVsbCksdC5nYT1udWxsLDA8dC5HYSkpcmV0dXJuIGFsZXJ0KFwidG9kbzpXZWJQRGVxdWFudGl6ZUxldmVsc1wiKSxudWxsfXJldHVybiB0Lm5iK2kqc31mdW5jdGlvbiBocih0LGUscixuLGksYSl7Zm9yKDswPGktLTspe3ZhciBvLHM9dCx1PWUrKHI/MTowKSxjPXQsbD1lKyhyPzA6Myk7Zm9yKG89MDtvPG47KytvKXt2YXIgaD1jW2wrNCpvXTsyNTUhPWgmJihoKj0zMjg5NyxzW3UrNCpvKzBdPXNbdSs0Km8rMF0qaD4+MjMsc1t1KzQqbysxXT1zW3UrNCpvKzFdKmg+PjIzLHNbdSs0Km8rMl09c1t1KzQqbysyXSpoPj4yMyl9ZSs9YX19ZnVuY3Rpb24gZnIodCxlLHIsbixpKXtmb3IoOzA8bi0tOyl7dmFyIGE7Zm9yKGE9MDthPHI7KythKXt2YXIgbz10W2UrMiphKzBdLHM9MTUmKGM9dFtlKzIqYSsxXSksdT00MzY5KnMsYz0oMjQwJmN8Yz4+NCkqdT4+MTY7dFtlKzIqYSswXT0oMjQwJm98bz4+NCkqdT4+MTYmMjQwfCgxNSZvfG88PDQpKnU+PjE2Pj40JjE1LHRbZSsyKmErMV09MjQwJmN8c31lKz1pfX1mdW5jdGlvbiBkcih0LGUscixuLGksYSxvLHMpe3ZhciB1LGMsbD0yNTU7Zm9yKGM9MDtjPGk7KytjKXtmb3IodT0wO3U8bjsrK3Upe3ZhciBoPXRbZSt1XTthW28rNCp1XT1oLGwmPWh9ZSs9cixvKz1zfXJldHVybiAyNTUhPWx9ZnVuY3Rpb24gcHIodCxlLHIsbixpKXt2YXIgYTtmb3IoYT0wO2E8aTsrK2EpcltuK2FdPXRbZSthXT4+OH1mdW5jdGlvbiBncigpe0xuPWhyLHhuPWZyLEFuPWRyLFNuPXByfWZ1bmN0aW9uIG1yKHIsbixpKXt0W3JdPWZ1bmN0aW9uKHQscixhLG8scyx1LGMsbCxoLGYsZCxwLGcsbSx2LGIseSl7dmFyIHcsTj15LTE+PjEsTD1zW3UrMF18Y1tsKzBdPDwxNix4PWhbZiswXXxkW3ArMF08PDE2O2UobnVsbCE9dCk7dmFyIEE9MypMK3grMTMxMDc0Pj4yO2ZvcihuKHRbciswXSwyNTUmQSxBPj4xNixnLG0pLG51bGwhPWEmJihBPTMqeCtMKzEzMTA3ND4+MixuKGFbbyswXSwyNTUmQSxBPj4xNix2LGIpKSx3PTE7dzw9TjsrK3cpe3ZhciBTPXNbdSt3XXxjW2wrd108PDE2LF89aFtmK3ddfGRbcCt3XTw8MTYsUD1MK1MreCtfKzUyNDI5NixrPVArMiooUyt4KT4+MztBPWsrTD4+MSxMPShQPVArMiooTCtfKT4+MykrUz4+MSxuKHRbcisyKnctMV0sMjU1JkEsQT4+MTYsZyxtKygyKnctMSkqaSksbih0W3IrMip3LTBdLDI1NSZMLEw+PjE2LGcsbSsoMip3LTApKmkpLG51bGwhPWEmJihBPVAreD4+MSxMPWsrXz4+MSxuKGFbbysyKnctMV0sMjU1JkEsQT4+MTYsdixiKygyKnctMSkqaSksbihhW28rMip3KzBdLDI1NSZMLEw+PjE2LHYsYisoMip3KzApKmkpKSxMPVMseD1ffTEmeXx8KEE9MypMK3grMTMxMDc0Pj4yLG4odFtyK3ktMV0sMjU1JkEsQT4+MTYsZyxtKyh5LTEpKmkpLG51bGwhPWEmJihBPTMqeCtMKzEzMTA3ND4+MixuKGFbbyt5LTFdLDI1NSZBLEE+PjE2LHYsYisoeS0xKSppKSkpfX1mdW5jdGlvbiB2cigpe21pW01uXT12aSxtaVtxbl09eWksbWlbRW5dPWJpLG1pW1JuXT13aSxtaVtEbl09TmksbWlbVG5dPUxpLG1pW3puXT14aSxtaVtVbl09eWksbWlbSG5dPXdpLG1pW1duXT1OaSxtaVtWbl09TGl9ZnVuY3Rpb24gYnIodCl7cmV0dXJuIHQmfkZpPzA+dD8wOjI1NTp0Pj5raX1mdW5jdGlvbiB5cih0LGUpe3JldHVybiBicigoMTkwNzcqdD4+OCkrKDI2MTQ5KmU+PjgpLTE0MjM0KX1mdW5jdGlvbiB3cih0LGUscil7cmV0dXJuIGJyKCgxOTA3Nyp0Pj44KS0oNjQxOSplPj44KS0oMTMzMjAqcj4+OCkrODcwOCl9ZnVuY3Rpb24gTnIodCxlKXtyZXR1cm4gYnIoKDE5MDc3KnQ+PjgpKygzMzA1MCplPj44KS0xNzY4NSl9ZnVuY3Rpb24gTHIodCxlLHIsbixpKXtuW2krMF09eXIodCxyKSxuW2krMV09d3IodCxlLHIpLG5baSsyXT1Ocih0LGUpfWZ1bmN0aW9uIHhyKHQsZSxyLG4saSl7bltpKzBdPU5yKHQsZSksbltpKzFdPXdyKHQsZSxyKSxuW2krMl09eXIodCxyKX1mdW5jdGlvbiBBcih0LGUscixuLGkpe3ZhciBhPXdyKHQsZSxyKTtlPWE8PDMmMjI0fE5yKHQsZSk+PjMsbltpKzBdPTI0OCZ5cih0LHIpfGE+PjUsbltpKzFdPWV9ZnVuY3Rpb24gU3IodCxlLHIsbixpKXt2YXIgYT0yNDAmTnIodCxlKXwxNTtuW2krMF09MjQwJnlyKHQscil8d3IodCxlLHIpPj40LG5baSsxXT1hfWZ1bmN0aW9uIF9yKHQsZSxyLG4saSl7bltpKzBdPTI1NSxMcih0LGUscixuLGkrMSl9ZnVuY3Rpb24gUHIodCxlLHIsbixpKXt4cih0LGUscixuLGkpLG5baSszXT0yNTV9ZnVuY3Rpb24ga3IodCxlLHIsbixpKXtMcih0LGUscixuLGkpLG5baSszXT0yNTV9ZnVuY3Rpb24gRnIoZSxyLG4pe3RbZV09ZnVuY3Rpb24odCxlLGksYSxvLHMsdSxjLGwpe2Zvcih2YXIgaD1jKygtMiZsKSpuO2MhPWg7KXIodFtlKzBdLGlbYSswXSxvW3MrMF0sdSxjKSxyKHRbZSsxXSxpW2ErMF0sb1tzKzBdLHUsYytuKSxlKz0yLCsrYSwrK3MsYys9MipuOzEmbCYmcih0W2UrMF0saVthKzBdLG9bcyswXSx1LGMpfX1mdW5jdGlvbiBJcih0LGUscil7cmV0dXJuIDA9PXI/MD09dD8wPT1lPzY6NTowPT1lPzQ6MDpyfWZ1bmN0aW9uIENyKHQsZSxyLG4saSl7c3dpdGNoKHQ+Pj4zMCl7Y2FzZSAzOmFuKGUscixuLGksMCk7YnJlYWs7Y2FzZSAyOm9uKGUscixuLGkpO2JyZWFrO2Nhc2UgMTp1bihlLHIsbixpKX19ZnVuY3Rpb24ganIodCxlKXt2YXIgcixhLG89ZS5NLHM9ZS5OYix1PXQub2MsYz10LnBjKzQwLGw9dC5vYyxoPXQucGMrNTg0LGY9dC5vYyxkPXQucGMrNjAwO2ZvcihyPTA7MTY+cjsrK3IpdVtjKzMyKnItMV09MTI5O2ZvcihyPTA7OD5yOysrcilsW2grMzIqci0xXT0xMjksZltkKzMyKnItMV09MTI5O2ZvcigwPG8/dVtjLTEtMzJdPWxbaC0xLTMyXT1mW2QtMS0zMl09MTI5OihpKHUsYy0zMi0xLDEyNywyMSksaShsLGgtMzItMSwxMjcsOSksaShmLGQtMzItMSwxMjcsOSkpLGE9MDthPHQuemE7KythKXt2YXIgcD1lLnlhW2UuYWErYV07aWYoMDxhKXtmb3Iocj0tMTsxNj5yOysrciluKHUsYyszMipyLTQsdSxjKzMyKnIrMTIsNCk7Zm9yKHI9LTE7OD5yOysrciluKGwsaCszMipyLTQsbCxoKzMyKnIrNCw0KSxuKGYsZCszMipyLTQsZixkKzMyKnIrNCw0KX12YXIgZz10LkdkLG09dC5IZCthLHY9cC5hZCxiPXAuSGM7aWYoMDxvJiYobih1LGMtMzIsZ1ttXS55LDAsMTYpLG4obCxoLTMyLGdbbV0uZiwwLDgpLG4oZixkLTMyLGdbbV0uZWEsMCw4KSkscC5aYSl7dmFyIHk9dSx3PWMtMzIrMTY7Zm9yKDA8byYmKGE+PXQuemEtMT9pKHksdyxnW21dLnlbMTVdLDQpOm4oeSx3LGdbbSsxXS55LDAsNCkpLHI9MDs0PnI7cisrKXlbdysxMjgrcl09eVt3KzI1NityXT15W3crMzg0K3JdPXlbdyswK3JdO2ZvcihyPTA7MTY+cjsrK3IsYjw8PTIpeT11LHc9YytFaVtyXSxoaVtwLk9iW3JdXSh5LHcpLENyKGIsdiwxNiorcix5LHcpfWVsc2UgaWYoeT1JcihhLG8scC5PYlswXSksbGlbeV0odSxjKSwwIT1iKWZvcihyPTA7MTY+cjsrK3IsYjw8PTIpQ3IoYix2LDE2KityLHUsYytFaVtyXSk7Zm9yKHI9cC5HYyx5PUlyKGEsbyxwLkRkKSxmaVt5XShsLGgpLGZpW3ldKGYsZCksYj12LHk9bCx3PWgsMjU1JihwPTB8cikmJigxNzAmcD9zbihiLDI1Nix5LHcpOmNuKGIsMjU2LHksdykpLHA9ZixiPWQsMjU1JihyPj49OCkmJigxNzAmcj9zbih2LDMyMCxwLGIpOmNuKHYsMzIwLHAsYikpLG88dC5VYi0xJiYobihnW21dLnksMCx1LGMrNDgwLDE2KSxuKGdbbV0uZiwwLGwsaCsyMjQsOCksbihnW21dLmVhLDAsZixkKzIyNCw4KSkscj04KnMqdC5CLGc9dC5zYSxtPXQudGErMTYqYSsxNipzKnQuUix2PXQucWEscD10LnJhKzgqYStyLGI9dC5IYSx5PXQuSWErOCphK3Iscj0wOzE2PnI7KytyKW4oZyxtK3IqdC5SLHUsYyszMipyLDE2KTtmb3Iocj0wOzg+cjsrK3Ipbih2LHArcip0LkIsbCxoKzMyKnIsOCksbihiLHkrcip0LkIsZixkKzMyKnIsOCl9fWZ1bmN0aW9uIE9yKHQsbixpLGEsbyxzLHUsYyxsKXt2YXIgaD1bMF0sZj1bMF0sZD0wLHA9bnVsbCE9bD9sLmtkOjAsZz1udWxsIT1sP2w6bmV3IHJyO2lmKG51bGw9PXR8fDEyPmkpcmV0dXJuIDc7Zy5kYXRhPXQsZy53PW4sZy5oYT1pLG49W25dLGk9W2ldLGcuZ2I9W2cuZ2JdO3Q6e3ZhciBtPW4sYj1pLHk9Zy5nYjtpZihlKG51bGwhPXQpLGUobnVsbCE9YiksZShudWxsIT15KSx5WzBdPTAsMTI8PWJbMF0mJiFyKHQsbVswXSxcIlJJRkZcIikpe2lmKHIodCxtWzBdKzgsXCJXRUJQXCIpKXt5PTM7YnJlYWsgdH12YXIgdz1qKHQsbVswXSs0KTtpZigxMj53fHw0Mjk0OTY3Mjg2PHcpe3k9MzticmVhayB0fWlmKHAmJnc+YlswXS04KXt5PTc7YnJlYWsgdH15WzBdPXcsbVswXSs9MTIsYlswXS09MTJ9eT0wfWlmKDAhPXkpcmV0dXJuIHk7Zm9yKHc9MDxnLmdiWzBdLGk9aVswXTs7KXt0Ont2YXIgTD10O2I9bix5PWk7dmFyIHg9aCxBPWYsUz1tPVswXTtpZigoaz1kPVtkXSlbMF09MCw4PnlbMF0peT03O2Vsc2V7aWYoIXIoTCxiWzBdLFwiVlA4WFwiKSl7aWYoMTAhPWooTCxiWzBdKzQpKXt5PTM7YnJlYWsgdH1pZigxOD55WzBdKXt5PTc7YnJlYWsgdH12YXIgXz1qKEwsYlswXSs4KSxQPTErQyhMLGJbMF0rMTIpO2lmKDIxNDc0ODM2NDg8PVAqKEw9MStDKEwsYlswXSsxNSkpKXt5PTM7YnJlYWsgdH1udWxsIT1TJiYoU1swXT1fKSxudWxsIT14JiYoeFswXT1QKSxudWxsIT1BJiYoQVswXT1MKSxiWzBdKz0xOCx5WzBdLT0xOCxrWzBdPTF9eT0wfX1pZihkPWRbMF0sbT1tWzBdLDAhPXkpcmV0dXJuIHk7aWYoYj0hISgyJm0pLCF3JiZkKXJldHVybiAzO2lmKG51bGwhPXMmJihzWzBdPSEhKDE2Jm0pKSxudWxsIT11JiYodVswXT1iKSxudWxsIT1jJiYoY1swXT0wKSx1PWhbMF0sbT1mWzBdLGQmJmImJm51bGw9PWwpe3k9MDticmVha31pZig0Pmkpe3k9NzticmVha31pZih3JiZkfHwhdyYmIWQmJiFyKHQsblswXSxcIkFMUEhcIikpe2k9W2ldLGcubmE9W2cubmFdLGcuUD1bZy5QXSxnLlNhPVtnLlNhXTt0OntfPXQseT1uLHc9aTt2YXIgaz1nLmdiO3g9Zy5uYSxBPWcuUCxTPWcuU2EsUD0yMixlKG51bGwhPV8pLGUobnVsbCE9dyksTD15WzBdO3ZhciBGPXdbMF07Zm9yKGUobnVsbCE9eCksZShudWxsIT1TKSx4WzBdPW51bGwsQVswXT1udWxsLFNbMF09MDs7KXtpZih5WzBdPUwsd1swXT1GLDg+Ril7eT03O2JyZWFrIHR9dmFyIEk9aihfLEwrNCk7aWYoNDI5NDk2NzI4NjxJKXt5PTM7YnJlYWsgdH12YXIgTz04K0krMSYtMjtpZihQKz1PLDA8ayYmUD5rKXt5PTM7YnJlYWsgdH1pZighcihfLEwsXCJWUDggXCIpfHwhcihfLEwsXCJWUDhMXCIpKXt5PTA7YnJlYWsgdH1pZihGWzBdPE8pe3k9NzticmVhayB0fXIoXyxMLFwiQUxQSFwiKXx8KHhbMF09XyxBWzBdPUwrOCxTWzBdPUkpLEwrPU8sRi09T319aWYoaT1pWzBdLGcubmE9Zy5uYVswXSxnLlA9Zy5QWzBdLGcuU2E9Zy5TYVswXSwwIT15KWJyZWFrfWk9W2ldLGcuSmE9W2cuSmFdLGcueGE9W2cueGFdO3Q6aWYoaz10LHk9bix3PWkseD1nLmdiWzBdLEE9Zy5KYSxTPWcueGEsXz15WzBdLEw9IXIoayxfLFwiVlA4IFwiKSxQPSFyKGssXyxcIlZQOExcIiksZShudWxsIT1rKSxlKG51bGwhPXcpLGUobnVsbCE9QSksZShudWxsIT1TKSw4PndbMF0peT03O2Vsc2V7aWYoTHx8UCl7aWYoaz1qKGssXys0KSwxMjw9eCYmaz54LTEyKXt5PTM7YnJlYWsgdH1pZihwJiZrPndbMF0tOCl7eT03O2JyZWFrIHR9QVswXT1rLHlbMF0rPTgsd1swXS09OCxTWzBdPVB9ZWxzZSBTWzBdPTU8PXdbMF0mJjQ3PT1rW18rMF0mJiEoa1tfKzRdPj41KSxBWzBdPXdbMF07eT0wfWlmKGk9aVswXSxnLkphPWcuSmFbMF0sZy54YT1nLnhhWzBdLG49blswXSwwIT15KWJyZWFrO2lmKDQyOTQ5NjcyODY8Zy5KYSlyZXR1cm4gMztpZihudWxsPT1jfHxifHwoY1swXT1nLnhhPzI6MSksdT1bdV0sbT1bbV0sZy54YSl7aWYoNT5pKXt5PTc7YnJlYWt9Yz11LHA9bSxiPXMsbnVsbD09dHx8NT5pP3Q9MDo1PD1pJiY0Nz09dFtuKzBdJiYhKHRbbis0XT4+NSk/KHc9WzBdLGs9WzBdLHg9WzBdLHYoQT1uZXcgTix0LG4saSksZ3QoQSx3LGsseCk/KG51bGwhPWMmJihjWzBdPXdbMF0pLG51bGwhPXAmJihwWzBdPWtbMF0pLG51bGwhPWImJihiWzBdPXhbMF0pLHQ9MSk6dD0wKTp0PTB9ZWxzZXtpZigxMD5pKXt5PTc7YnJlYWt9Yz1tLG51bGw9PXR8fDEwPml8fCFYdCh0LG4rMyxpLTMpP3Q9MDoocD10W24rMF18dFtuKzFdPDw4fHRbbisyXTw8MTYsYj0xNjM4MyYodFtuKzddPDw4fHRbbis2XSksdD0xNjM4MyYodFtuKzldPDw4fHRbbis4XSksMSZwfHwzPChwPj4xJjcpfHwhKHA+PjQmMSl8fHA+PjU+PWcuSmF8fCFifHwhdD90PTA6KHUmJih1WzBdPWIpLGMmJihjWzBdPXQpLHQ9MSkpfWlmKCF0KXJldHVybiAzO2lmKHU9dVswXSxtPW1bMF0sZCYmKGhbMF0hPXV8fGZbMF0hPW0pKXJldHVybiAzO251bGwhPWwmJihsWzBdPWcsbC5vZmZzZXQ9bi1sLncsZSg0Mjk0OTY3Mjg2Pm4tbC53KSxlKGwub2Zmc2V0PT1sLmhhLWkpKTticmVha31yZXR1cm4gMD09eXx8Nz09eSYmZCYmbnVsbD09bD8obnVsbCE9cyYmKHNbMF18PW51bGwhPWcubmEmJjA8Zy5uYS5sZW5ndGgpLG51bGwhPWEmJihhWzBdPXUpLG51bGwhPW8mJihvWzBdPW0pLDApOnl9ZnVuY3Rpb24gQnIodCxlLHIpe3ZhciBuPWUud2lkdGgsaT1lLmhlaWdodCxhPTAsbz0wLHM9bix1PWk7aWYoZS5EYT1udWxsIT10JiYwPHQuRGEsZS5EYSYmKHM9dC5jZCx1PXQuYmQsYT10LnYsbz10LmosMTE+cnx8KGEmPS0yLG8mPS0yKSwwPmF8fDA+b3x8MD49c3x8MD49dXx8YStzPm58fG8rdT5pKSlyZXR1cm4gMDtpZihlLnY9YSxlLmo9byxlLnZhPWErcyxlLm89byt1LGUuVT1zLGUuVD11LGUuZGE9bnVsbCE9dCYmMDx0LmRhLGUuZGEpe2lmKCFxKHMsdSxyPVt0LmliXSxhPVt0LmhiXSkpcmV0dXJuIDA7ZS5pYj1yWzBdLGUuaGI9YVswXX1yZXR1cm4gZS5vYj1udWxsIT10JiZ0Lm9iLGUuS2I9bnVsbD09dHx8IXQuU2QsZS5kYSYmKGUub2I9ZS5pYjwzKm4vNCYmZS5oYjwzKmkvNCxlLktiPTApLDF9ZnVuY3Rpb24gTXIodCl7aWYobnVsbD09dClyZXR1cm4gMjtpZigxMT50LlMpe3ZhciBlPXQuZi5SR0JBO2UuZmIrPSh0LmhlaWdodC0xKSplLkEsZS5BPS1lLkF9ZWxzZSBlPXQuZi5rYix0PXQuaGVpZ2h0LGUuTys9KHQtMSkqZS5mYSxlLmZhPS1lLmZhLGUuTis9KHQtMT4+MSkqZS5BYixlLkFiPS1lLkFiLGUuVys9KHQtMT4+MSkqZS5EYixlLkRiPS1lLkRiLG51bGwhPWUuRiYmKGUuSis9KHQtMSkqZS5sYixlLmxiPS1lLmxiKTtyZXR1cm4gMH1mdW5jdGlvbiBxcih0LGUscixuKXtpZihudWxsPT1ufHwwPj10fHwwPj1lKXJldHVybiAyO2lmKG51bGwhPXIpe2lmKHIuRGEpe3ZhciBpPXIuY2Qsbz1yLmJkLHM9LTImci52LHU9LTImci5qO2lmKDA+c3x8MD51fHwwPj1pfHwwPj1vfHxzK2k+dHx8dStvPmUpcmV0dXJuIDI7dD1pLGU9b31pZihyLmRhKXtpZighcSh0LGUsaT1bci5pYl0sbz1bci5oYl0pKXJldHVybiAyO3Q9aVswXSxlPW9bMF19fW4ud2lkdGg9dCxuLmhlaWdodD1lO3Q6e3ZhciBjPW4ud2lkdGgsbD1uLmhlaWdodDtpZih0PW4uUywwPj1jfHwwPj1sfHwhKHQ+PU1uJiYxMz50KSl0PTI7ZWxzZXtpZigwPj1uLlJkJiZudWxsPT1uLnNkKXtzPW89aT1lPTA7dmFyIGg9KHU9Yyp6aVt0XSkqbDtpZigxMT50fHwobz0obCsxKS8yKihlPShjKzEpLzIpLDEyPT10JiYocz0oaT1jKSpsKSksbnVsbD09KGw9YShoKzIqbytzKSkpe3Q9MTticmVhayB0fW4uc2Q9bCwxMT50PygoYz1uLmYuUkdCQSkuZWI9bCxjLmZiPTAsYy5BPXUsYy5zaXplPWgpOigoYz1uLmYua2IpLnk9bCxjLk89MCxjLmZhPXUsYy5GZD1oLGMuZj1sLGMuTj0wK2gsYy5BYj1lLGMuQ2Q9byxjLmVhPWwsYy5XPTAraCtvLGMuRGI9ZSxjLkVkPW8sMTI9PXQmJihjLkY9bCxjLko9MCtoKzIqbyksYy5UYz1zLGMubGI9aSl9aWYoZT0xLGk9bi5TLG89bi53aWR0aCxzPW4uaGVpZ2h0LGk+PU1uJiYxMz5pKWlmKDExPmkpdD1uLmYuUkdCQSxlJj0odT1NYXRoLmFicyh0LkEpKSoocy0xKStvPD10LnNpemUsZSY9dT49byp6aVtpXSxlJj1udWxsIT10LmViO2Vsc2V7dD1uLmYua2IsdT0obysxKS8yLGg9KHMrMSkvMixjPU1hdGguYWJzKHQuZmEpLGw9TWF0aC5hYnModC5BYik7dmFyIGY9TWF0aC5hYnModC5EYiksZD1NYXRoLmFicyh0LmxiKSxwPWQqKHMtMSkrbztlJj1jKihzLTEpK288PXQuRmQsZSY9bCooaC0xKSt1PD10LkNkLGU9KGUmPWYqKGgtMSkrdTw9dC5FZCkmYz49byZsPj11JmY+PXUsZSY9bnVsbCE9dC55LGUmPW51bGwhPXQuZixlJj1udWxsIT10LmVhLDEyPT1pJiYoZSY9ZD49byxlJj1wPD10LlRjLGUmPW51bGwhPXQuRil9ZWxzZSBlPTA7dD1lPzA6Mn19cmV0dXJuIDAhPXR8fG51bGwhPXImJnIuZmQmJih0PU1yKG4pKSx0fXZhciBFcj02NCxScj1bMCwxLDMsNywxNSwzMSw2MywxMjcsMjU1LDUxMSwxMDIzLDIwNDcsNDA5NSw4MTkxLDE2MzgzLDMyNzY3LDY1NTM1LDEzMTA3MSwyNjIxNDMsNTI0Mjg3LDEwNDg1NzUsMjA5NzE1MSw0MTk0MzAzLDgzODg2MDcsMTY3NzcyMTVdLERyPTI0LFRyPTMyLHpyPTgsVXI9WzAsMCwxLDEsMiwyLDIsMiwzLDMsMywzLDMsMywzLDMsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDddO0QoXCJQcmVkaWN0b3IwXCIsXCJQcmVkaWN0b3JBZGQwXCIpLHQuUHJlZGljdG9yMD1mdW5jdGlvbigpe3JldHVybiA0Mjc4MTkwMDgwfSx0LlByZWRpY3RvcjE9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHQuUHJlZGljdG9yMj1mdW5jdGlvbih0LGUscil7cmV0dXJuIGVbciswXX0sdC5QcmVkaWN0b3IzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZVtyKzFdfSx0LlByZWRpY3RvcjQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlW3ItMV19LHQuUHJlZGljdG9yNT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHooeih0LGVbcisxXSksZVtyKzBdKX0sdC5QcmVkaWN0b3I2PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4geih0LGVbci0xXSl9LHQuUHJlZGljdG9yNz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHoodCxlW3IrMF0pfSx0LlByZWRpY3Rvcjg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB6KGVbci0xXSxlW3IrMF0pfSx0LlByZWRpY3Rvcjk9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB6KGVbciswXSxlW3IrMV0pfSx0LlByZWRpY3RvcjEwPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4geih6KHQsZVtyLTFdKSx6KGVbciswXSxlW3IrMV0pKX0sdC5QcmVkaWN0b3IxMT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVtyKzBdO3JldHVybiAwPj1XKG4+PjI0JjI1NSx0Pj4yNCYyNTUsKGU9ZVtyLTFdKT4+MjQmMjU1KStXKG4+PjE2JjI1NSx0Pj4xNiYyNTUsZT4+MTYmMjU1KStXKG4+PjgmMjU1LHQ+PjgmMjU1LGU+PjgmMjU1KStXKDI1NSZuLDI1NSZ0LDI1NSZlKT9uOnR9LHQuUHJlZGljdG9yMTI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbciswXTtyZXR1cm4oVSgodD4+MjQmMjU1KSsobj4+MjQmMjU1KS0oKGU9ZVtyLTFdKT4+MjQmMjU1KSk8PDI0fFUoKHQ+PjE2JjI1NSkrKG4+PjE2JjI1NSktKGU+PjE2JjI1NSkpPDwxNnxVKCh0Pj44JjI1NSkrKG4+PjgmMjU1KS0oZT4+OCYyNTUpKTw8OHxVKCgyNTUmdCkrKDI1NSZuKS0oMjU1JmUpKSk+Pj4wfSx0LlByZWRpY3RvcjEzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lW3ItMV07cmV0dXJuKEgoKHQ9eih0LGVbciswXSkpPj4yNCYyNTUsbj4+MjQmMjU1KTw8MjR8SCh0Pj4xNiYyNTUsbj4+MTYmMjU1KTw8MTZ8SCh0Pj44JjI1NSxuPj44JjI1NSk8PDh8SCgyNTUmdCwyNTUmbikpPj4+MH07dmFyIEhyPXQuUHJlZGljdG9yQWRkMDt0LlByZWRpY3RvckFkZDE9VixEKFwiUHJlZGljdG9yMlwiLFwiUHJlZGljdG9yQWRkMlwiKSxEKFwiUHJlZGljdG9yM1wiLFwiUHJlZGljdG9yQWRkM1wiKSxEKFwiUHJlZGljdG9yNFwiLFwiUHJlZGljdG9yQWRkNFwiKSxEKFwiUHJlZGljdG9yNVwiLFwiUHJlZGljdG9yQWRkNVwiKSxEKFwiUHJlZGljdG9yNlwiLFwiUHJlZGljdG9yQWRkNlwiKSxEKFwiUHJlZGljdG9yN1wiLFwiUHJlZGljdG9yQWRkN1wiKSxEKFwiUHJlZGljdG9yOFwiLFwiUHJlZGljdG9yQWRkOFwiKSxEKFwiUHJlZGljdG9yOVwiLFwiUHJlZGljdG9yQWRkOVwiKSxEKFwiUHJlZGljdG9yMTBcIixcIlByZWRpY3RvckFkZDEwXCIpLEQoXCJQcmVkaWN0b3IxMVwiLFwiUHJlZGljdG9yQWRkMTFcIiksRChcIlByZWRpY3RvcjEyXCIsXCJQcmVkaWN0b3JBZGQxMlwiKSxEKFwiUHJlZGljdG9yMTNcIixcIlByZWRpY3RvckFkZDEzXCIpO3ZhciBXcj10LlByZWRpY3RvckFkZDI7WChcIkNvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtXCIsXCJNYXBBUkdCXCIsXCIzMmJcIixmdW5jdGlvbih0KXtyZXR1cm4gdD4+OCYyNTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0fSksWChcIlZQOExDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybUFscGhhXCIsXCJNYXBBbHBoYVwiLFwiOGJcIixmdW5jdGlvbih0KXtyZXR1cm4gdH0sZnVuY3Rpb24odCl7cmV0dXJuIHQ+PjgmMjU1fSk7dmFyIFZyLEdyPXQuQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm0sWXI9dC5NYXBBUkdCLEpyPXQuVlA4TENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtQWxwaGEsWHI9dC5NYXBBbHBoYSxLcj10LlZQOExQcmVkaWN0b3JzQWRkPVtdO0tyLmxlbmd0aD0xNiwodC5WUDhMUHJlZGljdG9ycz1bXSkubGVuZ3RoPTE2LCh0LlZQOExQcmVkaWN0b3JzQWRkX0M9W10pLmxlbmd0aD0xNiwodC5WUDhMUHJlZGljdG9yc19DPVtdKS5sZW5ndGg9MTY7dmFyIFpyLCRyLFFyLHRuLGVuLHJuLG5uLGFuLG9uLHNuLHVuLGNuLGxuLGhuLGZuLGRuLHBuLGduLG1uLHZuLGJuLHluLHduLE5uLExuLHhuLEFuLFNuLF9uPWEoNTExKSxQbj1hKDIwNDEpLGtuPWEoMjI1KSxGbj1hKDc2NyksSW49MCxDbj1Qbixqbj1rbixPbj1GbixCbj1fbixNbj0wLHFuPTEsRW49MixSbj0zLERuPTQsVG49NSx6bj02LFVuPTcsSG49OCxXbj05LFZuPTEwLEduPVsyLDMsN10sWW49WzMsMywxMV0sSm49WzI4MCwyNTYsMjU2LDI1Niw0MF0sWG49WzAsMSwxLDEsMF0sS249WzE3LDE4LDAsMSwyLDMsNCw1LDE2LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTVdLFpuPVsyNCw3LDIzLDI1LDQwLDYsMzksNDEsMjIsMjYsMzgsNDIsNTYsNSw1NSw1NywyMSwyNyw1NCw1OCwzNyw0Myw3Miw0LDcxLDczLDIwLDI4LDUzLDU5LDcwLDc0LDM2LDQ0LDg4LDY5LDc1LDUyLDYwLDMsODcsODksMTksMjksODYsOTAsMzUsNDUsNjgsNzYsODUsOTEsNTEsNjEsMTA0LDIsMTAzLDEwNSwxOCwzMCwxMDIsMTA2LDM0LDQ2LDg0LDkyLDY3LDc3LDEwMSwxMDcsNTAsNjIsMTIwLDEsMTE5LDEyMSw4Myw5MywxNywzMSwxMDAsMTA4LDY2LDc4LDExOCwxMjIsMzMsNDcsMTE3LDEyMyw0OSw2Myw5OSwxMDksODIsOTQsMCwxMTYsMTI0LDY1LDc5LDE2LDMyLDk4LDExMCw0OCwxMTUsMTI1LDgxLDk1LDY0LDExNCwxMjYsOTcsMTExLDgwLDExMywxMjcsOTYsMTEyXSwkbj1bMjk1NCwyOTU2LDI5NTgsMjk2MiwyOTcwLDI5ODYsMzAxOCwzMDgyLDMyMTIsMzQ2OCwzOTgwLDUwMDRdLFFuPTgsdGk9WzQsNSw2LDcsOCw5LDEwLDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE3LDE4LDE5LDIwLDIwLDIxLDIxLDIyLDIyLDIzLDIzLDI0LDI1LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkxLDkzLDk1LDk2LDk4LDEwMCwxMDEsMTAyLDEwNCwxMDYsMTA4LDExMCwxMTIsMTE0LDExNiwxMTgsMTIyLDEyNCwxMjYsMTI4LDEzMCwxMzIsMTM0LDEzNiwxMzgsMTQwLDE0MywxNDUsMTQ4LDE1MSwxNTQsMTU3XSxlaT1bNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNjAsNjIsNjQsNjYsNjgsNzAsNzIsNzQsNzYsNzgsODAsODIsODQsODYsODgsOTAsOTIsOTQsOTYsOTgsMTAwLDEwMiwxMDQsMTA2LDEwOCwxMTAsMTEyLDExNCwxMTYsMTE5LDEyMiwxMjUsMTI4LDEzMSwxMzQsMTM3LDE0MCwxNDMsMTQ2LDE0OSwxNTIsMTU1LDE1OCwxNjEsMTY0LDE2NywxNzAsMTczLDE3NywxODEsMTg1LDE4OSwxOTMsMTk3LDIwMSwyMDUsMjA5LDIxMywyMTcsMjIxLDIyNSwyMjksMjM0LDIzOSwyNDUsMjQ5LDI1NCwyNTksMjY0LDI2OSwyNzQsMjc5LDI4NF0scmk9bnVsbCxuaT1bWzE3MywxNDgsMTQwLDBdLFsxNzYsMTU1LDE0MCwxMzUsMF0sWzE4MCwxNTcsMTQxLDEzNCwxMzAsMF0sWzI1NCwyNTQsMjQzLDIzMCwxOTYsMTc3LDE1MywxNDAsMTMzLDEzMCwxMjksMF1dLGlpPVswLDEsNCw4LDUsMiwzLDYsOSwxMiwxMywxMCw3LDExLDE0LDE1XSxhaT1bLTAsMSwtMSwyLC0yLDMsNCw2LC0zLDUsLTQsLTUsLTYsNywtNyw4LC04LC05XSxvaT1bW1tbMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XV0sW1syNTMsMTM2LDI1NCwyNTUsMjI4LDIxOSwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTg5LDEyOSwyNDIsMjU1LDIyNywyMTMsMjU1LDIxOSwxMjgsMTI4LDEyOF0sWzEwNiwxMjYsMjI3LDI1MiwyMTQsMjA5LDI1NSwyNTUsMTI4LDEyOCwxMjhdXSxbWzEsOTgsMjQ4LDI1NSwyMzYsMjI2LDI1NSwyNTUsMTI4LDEyOCwxMjhdLFsxODEsMTMzLDIzOCwyNTQsMjIxLDIzNCwyNTUsMTU0LDEyOCwxMjgsMTI4XSxbNzgsMTM0LDIwMiwyNDcsMTk4LDE4MCwyNTUsMjE5LDEyOCwxMjgsMTI4XV0sW1sxLDE4NSwyNDksMjU1LDI0MywyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzE4NCwxNTAsMjQ3LDI1NSwyMzYsMjI0LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFs3NywxMTAsMjE2LDI1NSwyMzYsMjMwLDEyOCwxMjgsMTI4LDEyOCwxMjhdXSxbWzEsMTAxLDI1MSwyNTUsMjQxLDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTcwLDEzOSwyNDEsMjUyLDIzNiwyMDksMjU1LDI1NSwxMjgsMTI4LDEyOF0sWzM3LDExNiwxOTYsMjQzLDIyOCwyNTUsMjU1LDI1NSwxMjgsMTI4LDEyOF1dLFtbMSwyMDQsMjU0LDI1NSwyNDUsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsyMDcsMTYwLDI1MCwyNTUsMjM4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTAyLDEwMywyMzEsMjU1LDIxMSwxNzEsMTI4LDEyOCwxMjgsMTI4LDEyOF1dLFtbMSwxNTIsMjUyLDI1NSwyNDAsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsxNzcsMTM1LDI0MywyNTUsMjM0LDIyNSwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbODAsMTI5LDIxMSwyNTUsMTk0LDIyNCwxMjgsMTI4LDEyOCwxMjgsMTI4XV0sW1sxLDEsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsyNDYsMSwyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdXV0sW1tbMTk4LDM1LDIzNywyMjMsMTkzLDE4NywxNjIsMTYwLDE0NSwxNTUsNjJdLFsxMzEsNDUsMTk4LDIyMSwxNzIsMTc2LDIyMCwxNTcsMjUyLDIyMSwxXSxbNjgsNDcsMTQ2LDIwOCwxNDksMTY3LDIyMSwxNjIsMjU1LDIyMywxMjhdXSxbWzEsMTQ5LDI0MSwyNTUsMjIxLDIyNCwyNTUsMjU1LDEyOCwxMjgsMTI4XSxbMTg0LDE0MSwyMzQsMjUzLDIyMiwyMjAsMjU1LDE5OSwxMjgsMTI4LDEyOF0sWzgxLDk5LDE4MSwyNDIsMTc2LDE5MCwyNDksMjAyLDI1NSwyNTUsMTI4XV0sW1sxLDEyOSwyMzIsMjUzLDIxNCwxOTcsMjQyLDE5NiwyNTUsMjU1LDEyOF0sWzk5LDEyMSwyMTAsMjUwLDIwMSwxOTgsMjU1LDIwMiwxMjgsMTI4LDEyOF0sWzIzLDkxLDE2MywyNDIsMTcwLDE4NywyNDcsMjEwLDI1NSwyNTUsMTI4XV0sW1sxLDIwMCwyNDYsMjU1LDIzNCwyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzEwOSwxNzgsMjQxLDI1NSwyMzEsMjQ1LDI1NSwyNTUsMTI4LDEyOCwxMjhdLFs0NCwxMzAsMjAxLDI1MywyMDUsMTkyLDI1NSwyNTUsMTI4LDEyOCwxMjhdXSxbWzEsMTMyLDIzOSwyNTEsMjE5LDIwOSwyNTUsMTY1LDEyOCwxMjgsMTI4XSxbOTQsMTM2LDIyNSwyNTEsMjE4LDE5MCwyNTUsMjU1LDEyOCwxMjgsMTI4XSxbMjIsMTAwLDE3NCwyNDUsMTg2LDE2MSwyNTUsMTk5LDEyOCwxMjgsMTI4XV0sW1sxLDE4MiwyNDksMjU1LDIzMiwyMzUsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzEyNCwxNDMsMjQxLDI1NSwyMjcsMjM0LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFszNSw3NywxODEsMjUxLDE5MywyMTEsMjU1LDIwNSwxMjgsMTI4LDEyOF1dLFtbMSwxNTcsMjQ3LDI1NSwyMzYsMjMxLDI1NSwyNTUsMTI4LDEyOCwxMjhdLFsxMjEsMTQxLDIzNSwyNTUsMjI1LDIyNywyNTUsMjU1LDEyOCwxMjgsMTI4XSxbNDUsOTksMTg4LDI1MSwxOTUsMjE3LDI1NSwyMjQsMTI4LDEyOCwxMjhdXSxbWzEsMSwyNTEsMjU1LDIxMywyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzIwMywxLDI0OCwyNTUsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTM3LDEsMTc3LDI1NSwyMjQsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjhdXV0sW1tbMjUzLDksMjQ4LDI1MSwyMDcsMjA4LDI1NSwxOTIsMTI4LDEyOCwxMjhdLFsxNzUsMTMsMjI0LDI0MywxOTMsMTg1LDI0OSwxOTgsMjU1LDI1NSwxMjhdLFs3MywxNywxNzEsMjIxLDE2MSwxNzksMjM2LDE2NywyNTUsMjM0LDEyOF1dLFtbMSw5NSwyNDcsMjUzLDIxMiwxODMsMjU1LDI1NSwxMjgsMTI4LDEyOF0sWzIzOSw5MCwyNDQsMjUwLDIxMSwyMDksMjU1LDI1NSwxMjgsMTI4LDEyOF0sWzE1NSw3NywxOTUsMjQ4LDE4OCwxOTUsMjU1LDI1NSwxMjgsMTI4LDEyOF1dLFtbMSwyNCwyMzksMjUxLDIxOCwyMTksMjU1LDIwNSwxMjgsMTI4LDEyOF0sWzIwMSw1MSwyMTksMjU1LDE5NiwxODYsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzY5LDQ2LDE5MCwyMzksMjAxLDIxOCwyNTUsMjI4LDEyOCwxMjgsMTI4XV0sW1sxLDE5MSwyNTEsMjU1LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzIyMywxNjUsMjQ5LDI1NSwyMTMsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsxNDEsMTI0LDI0OCwyNTUsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XV0sW1sxLDE2LDI0OCwyNTUsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTkwLDM2LDIzMCwyNTUsMjM2LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTQ5LDEsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdXSxbWzEsMjI2LDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMjQ3LDE5MiwyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzI0MCwxMjgsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdXSxbWzEsMTM0LDI1MiwyNTUsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMjEzLDYyLDI1MCwyNTUsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbNTUsOTMsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdXSxbWzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdLFsxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF1dXSxbW1syMDIsMjQsMjEzLDIzNSwxODYsMTkxLDIyMCwxNjAsMjQwLDE3NSwyNTVdLFsxMjYsMzgsMTgyLDIzMiwxNjksMTg0LDIyOCwxNzQsMjU1LDE4NywxMjhdLFs2MSw0NiwxMzgsMjE5LDE1MSwxNzgsMjQwLDE3MCwyNTUsMjE2LDEyOF1dLFtbMSwxMTIsMjMwLDI1MCwxOTksMTkxLDI0NywxNTksMjU1LDI1NSwxMjhdLFsxNjYsMTA5LDIyOCwyNTIsMjExLDIxNSwyNTUsMTc0LDEyOCwxMjgsMTI4XSxbMzksNzcsMTYyLDIzMiwxNzIsMTgwLDI0NSwxNzgsMjU1LDI1NSwxMjhdXSxbWzEsNTIsMjIwLDI0NiwxOTgsMTk5LDI0OSwyMjAsMjU1LDI1NSwxMjhdLFsxMjQsNzQsMTkxLDI0MywxODMsMTkzLDI1MCwyMjEsMjU1LDI1NSwxMjhdLFsyNCw3MSwxMzAsMjE5LDE1NCwxNzAsMjQzLDE4MiwyNTUsMjU1LDEyOF1dLFtbMSwxODIsMjI1LDI0OSwyMTksMjQwLDI1NSwyMjQsMTI4LDEyOCwxMjhdLFsxNDksMTUwLDIyNiwyNTIsMjE2LDIwNSwyNTUsMTcxLDEyOCwxMjgsMTI4XSxbMjgsMTA4LDE3MCwyNDIsMTgzLDE5NCwyNTQsMjIzLDI1NSwyNTUsMTI4XV0sW1sxLDgxLDIzMCwyNTIsMjA0LDIwMywyNTUsMTkyLDEyOCwxMjgsMTI4XSxbMTIzLDEwMiwyMDksMjQ3LDE4OCwxOTYsMjU1LDIzMywxMjgsMTI4LDEyOF0sWzIwLDk1LDE1MywyNDMsMTY0LDE3MywyNTUsMjAzLDEyOCwxMjgsMTI4XV0sW1sxLDIyMiwyNDgsMjU1LDIxNiwyMTMsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzE2OCwxNzUsMjQ2LDI1MiwyMzUsMjA1LDI1NSwyNTUsMTI4LDEyOCwxMjhdLFs0NywxMTYsMjE1LDI1NSwyMTEsMjEyLDI1NSwyNTUsMTI4LDEyOCwxMjhdXSxbWzEsMTIxLDIzNiwyNTMsMjEyLDIxNCwyNTUsMjU1LDEyOCwxMjgsMTI4XSxbMTQxLDg0LDIxMywyNTIsMjAxLDIwMiwyNTUsMjE5LDEyOCwxMjgsMTI4XSxbNDIsODAsMTYwLDI0MCwxNjIsMTg1LDI1NSwyMDUsMTI4LDEyOCwxMjhdXSxbWzEsMSwyNTUsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOF0sWzI0NCwxLDI1NSwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4XSxbMjM4LDEsMjU1LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjhdXV1dLHNpPVtbWzIzMSwxMjAsNDgsODksMTE1LDExMywxMjAsMTUyLDExMl0sWzE1MiwxNzksNjQsMTI2LDE3MCwxMTgsNDYsNzAsOTVdLFsxNzUsNjksMTQzLDgwLDg1LDgyLDcyLDE1NSwxMDNdLFs1Niw1OCwxMCwxNzEsMjE4LDE4OSwxNywxMywxNTJdLFsxMTQsMjYsMTcsMTYzLDQ0LDE5NSwyMSwxMCwxNzNdLFsxMjEsMjQsODAsMTk1LDI2LDYyLDQ0LDY0LDg1XSxbMTQ0LDcxLDEwLDM4LDE3MSwyMTMsMTQ0LDM0LDI2XSxbMTcwLDQ2LDU1LDE5LDEzNiwxNjAsMzMsMjA2LDcxXSxbNjMsMjAsOCwxMTQsMTE0LDIwOCwxMiw5LDIyNl0sWzgxLDQwLDExLDk2LDE4Miw4NCwyOSwxNiwzNl1dLFtbMTM0LDE4Myw4OSwxMzcsOTgsMTAxLDEwNiwxNjUsMTQ4XSxbNzIsMTg3LDEwMCwxMzAsMTU3LDExMSwzMiw3NSw4MF0sWzY2LDEwMiwxNjcsOTksNzQsNjIsNDAsMjM0LDEyOF0sWzQxLDUzLDksMTc4LDI0MSwxNDEsMjYsOCwxMDddLFs3NCw0MywyNiwxNDYsNzMsMTY2LDQ5LDIzLDE1N10sWzY1LDM4LDEwNSwxNjAsNTEsNTIsMzEsMTE1LDEyOF0sWzEwNCw3OSwxMiwyNywyMTcsMjU1LDg3LDE3LDddLFs4Nyw2OCw3MSw0NCwxMTQsNTEsMTUsMTg2LDIzXSxbNDcsNDEsMTQsMTEwLDE4MiwxODMsMjEsMTcsMTk0XSxbNjYsNDUsMjUsMTAyLDE5NywxODksMjMsMTgsMjJdXSxbWzg4LDg4LDE0NywxNTAsNDIsNDYsNDUsMTk2LDIwNV0sWzQzLDk3LDE4MywxMTcsODUsMzgsMzUsMTc5LDYxXSxbMzksNTMsMjAwLDg3LDI2LDIxLDQzLDIzMiwxNzFdLFs1NiwzNCw1MSwxMDQsMTE0LDEwMiwyOSw5Myw3N10sWzM5LDI4LDg1LDE3MSw1OCwxNjUsOTAsOTgsNjRdLFszNCwyMiwxMTYsMjA2LDIzLDM0LDQzLDE2Niw3M10sWzEwNyw1NCwzMiwyNiw1MSwxLDgxLDQzLDMxXSxbNjgsMjUsMTA2LDIyLDY0LDE3MSwzNiwyMjUsMTE0XSxbMzQsMTksMjEsMTAyLDEzMiwxODgsMTYsNzYsMTI0XSxbNjIsMTgsNzgsOTUsODUsNTcsNTAsNDgsNTFdXSxbWzE5MywxMDEsMzUsMTU5LDIxNSwxMTEsODksNDYsMTExXSxbNjAsMTQ4LDMxLDE3MiwyMTksMjI4LDIxLDE4LDExMV0sWzExMiwxMTMsNzcsODUsMTc5LDI1NSwzOCwxMjAsMTE0XSxbNDAsNDIsMSwxOTYsMjQ1LDIwOSwxMCwyNSwxMDldLFs4OCw0MywyOSwxNDAsMTY2LDIxMywzNyw0MywxNTRdLFs2MSw2MywzMCwxNTUsNjcsNDUsNjgsMSwyMDldLFsxMDAsODAsOCw0MywxNTQsMSw1MSwyNiw3MV0sWzE0Miw3OCw3OCwxNiwyNTUsMTI4LDM0LDE5NywxNzFdLFs0MSw0MCw1LDEwMiwyMTEsMTgzLDQsMSwyMjFdLFs1MSw1MCwxNywxNjgsMjA5LDE5MiwyMywyNSw4Ml1dLFtbMTM4LDMxLDM2LDE3MSwyNywxNjYsMzgsNDQsMjI5XSxbNjcsODcsNTgsMTY5LDgyLDExNSwyNiw1OSwxNzldLFs2Myw1OSw5MCwxODAsNTksMTY2LDkzLDczLDE1NF0sWzQwLDQwLDIxLDExNiwxNDMsMjA5LDM0LDM5LDE3NV0sWzQ3LDE1LDE2LDE4MywzNCwyMjMsNDksNDUsMTgzXSxbNDYsMTcsMzMsMTgzLDYsOTgsMTUsMzIsMTgzXSxbNTcsNDYsMjIsMjQsMTI4LDEsNTQsMTcsMzddLFs2NSwzMiw3MywxMTUsMjgsMTI4LDIzLDEyOCwyMDVdLFs0MCwzLDksMTE1LDUxLDE5MiwxOCw2LDIyM10sWzg3LDM3LDksMTE1LDU5LDc3LDY0LDIxLDQ3XV0sW1sxMDQsNTUsNDQsMjE4LDksNTQsNTMsMTMwLDIyNl0sWzY0LDkwLDcwLDIwNSw0MCw0MSwyMywyNiw1N10sWzU0LDU3LDExMiwxODQsNSw0MSwzOCwxNjYsMjEzXSxbMzAsMzQsMjYsMTMzLDE1MiwxMTYsMTAsMzIsMTM0XSxbMzksMTksNTMsMjIxLDI2LDExNCwzMiw3MywyNTVdLFszMSw5LDY1LDIzNCwyLDE1LDEsMTE4LDczXSxbNzUsMzIsMTIsNTEsMTkyLDI1NSwxNjAsNDMsNTFdLFs4OCwzMSwzNSw2NywxMDIsODUsNTUsMTg2LDg1XSxbNTYsMjEsMjMsMTExLDU5LDIwNSw0NSwzNywxOTJdLFs1NSwzOCw3MCwxMjQsNzMsMTAyLDEsMzQsOThdXSxbWzEyNSw5OCw0Miw4OCwxMDQsODUsMTE3LDE3NSw4Ml0sWzk1LDg0LDUzLDg5LDEyOCwxMDAsMTEzLDEwMSw0NV0sWzc1LDc5LDEyMyw0Nyw1MSwxMjgsODEsMTcxLDFdLFs1NywxNyw1LDcxLDEwMiw1Nyw1Myw0MSw0OV0sWzM4LDMzLDEzLDEyMSw1Nyw3MywyNiwxLDg1XSxbNDEsMTAsNjcsMTM4LDc3LDExMCw5MCw0NywxMTRdLFsxMTUsMjEsMiwxMCwxMDIsMjU1LDE2NiwyMyw2XSxbMTAxLDI5LDE2LDEwLDg1LDEyOCwxMDEsMTk2LDI2XSxbNTcsMTgsMTAsMTAyLDEwMiwyMTMsMzQsMjAsNDNdLFsxMTcsMjAsMTUsMzYsMTYzLDEyOCw2OCwxLDI2XV0sW1sxMDIsNjEsNzEsMzcsMzQsNTMsMzEsMjQzLDE5Ml0sWzY5LDYwLDcxLDM4LDczLDExOSwyOCwyMjIsMzddLFs2OCw0NSwxMjgsMzQsMSw0NywxMSwyNDUsMTcxXSxbNjIsMTcsMTksNzAsMTQ2LDg1LDU1LDYyLDcwXSxbMzcsNDMsMzcsMTU0LDEwMCwxNjMsODUsMTYwLDFdLFs2Myw5LDkyLDEzNiwyOCw2NCwzMiwyMDEsODVdLFs3NSwxNSw5LDksNjQsMjU1LDE4NCwxMTksMTZdLFs4Niw2LDI4LDUsNjQsMjU1LDI1LDI0OCwxXSxbNTYsOCwxNywxMzIsMTM3LDI1NSw1NSwxMTYsMTI4XSxbNTgsMTUsMjAsODIsMTM1LDU3LDI2LDEyMSw0MF1dLFtbMTY0LDUwLDMxLDEzNywxNTQsMTMzLDI1LDM1LDIxOF0sWzUxLDEwMyw0NCwxMzEsMTMxLDEyMywzMSw2LDE1OF0sWzg2LDQwLDY0LDEzNSwxNDgsMjI0LDQ1LDE4MywxMjhdLFsyMiwyNiwxNywxMzEsMjQwLDE1NCwxNCwxLDIwOV0sWzQ1LDE2LDIxLDkxLDY0LDIyMiw3LDEsMTk3XSxbNTYsMjEsMzksMTU1LDYwLDEzOCwyMywxMDIsMjEzXSxbODMsMTIsMTMsNTQsMTkyLDI1NSw2OCw0NywyOF0sWzg1LDI2LDg1LDg1LDEyOCwxMjgsMzIsMTQ2LDE3MV0sWzE4LDExLDcsNjMsMTQ0LDE3MSw0LDQsMjQ2XSxbMzUsMjcsMTAsMTQ2LDE3NCwxNzEsMTIsMjYsMTI4XV0sW1sxOTAsODAsMzUsOTksMTgwLDgwLDEyNiw1NCw0NV0sWzg1LDEyNiw0Nyw4NywxNzYsNTEsNDEsMjAsMzJdLFsxMDEsNzUsMTI4LDEzOSwxMTgsMTQ2LDExNiwxMjgsODVdLFs1Niw0MSwxNSwxNzYsMjM2LDg1LDM3LDksNjJdLFs3MSwzMCwxNywxMTksMTE4LDI1NSwxNywxOCwxMzhdLFsxMDEsMzgsNjAsMTM4LDU1LDcwLDQzLDI2LDE0Ml0sWzE0NiwzNiwxOSwzMCwxNzEsMjU1LDk3LDI3LDIwXSxbMTM4LDQ1LDYxLDYyLDIxOSwxLDgxLDE4OCw2NF0sWzMyLDQxLDIwLDExNywxNTEsMTQyLDIwLDIxLDE2M10sWzExMiwxOSwxMiw2MSwxOTUsMTI4LDQ4LDQsMjRdXV0sdWk9W1tbWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMTc2LDI0NiwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzIyMywyNDEsMjUyLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNDksMjUzLDI1MywyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjQ0LDI1MiwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjM0LDI1NCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1MywyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNDYsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyMzksMjUzLDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU0LDI1NSwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI0OCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1MSwyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjUzLDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUxLDI1NCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NCwyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTQsMjUzLDI1NSwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTAsMjU1LDI1NCwyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV1dLFtbWzIxNywyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyMjUsMjUyLDI0MSwyNTMsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTUsMjU1XSxbMjM0LDI1MCwyNDEsMjUwLDI1MywyNTUsMjUzLDI1NCwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzIyMywyNTQsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyMzgsMjUzLDI1NCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjQ4LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjQ5LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTMsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNDcsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1MywyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1MiwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjU0LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUzLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTQsMjUzLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTAsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV1dLFtbWzE4NiwyNTEsMjUwLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyMzQsMjUxLDI0NCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUxLDI1MSwyNDMsMjUzLDI1NCwyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1MywyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzIzNiwyNTMsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTEsMjUzLDI1MywyNTQsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjU0LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU0LDI1NCwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTQsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV1dLFtbWzI0OCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTAsMjU0LDI1MiwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjQ4LDI1NCwyNDksMjUzLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1MywyNTMsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI0NiwyNTMsMjUzLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTIsMjU0LDI1MSwyNTQsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjU0LDI1MiwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjQ4LDI1NCwyNTMsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1MywyNTUsMjU0LDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTEsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNDUsMjUxLDI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjUzLDI1MywyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1MSwyNTMsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1MiwyNTMsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV0sW1syNTUsMjUyLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjQ5LDI1NSwyNTQsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NSwyNTUsMjU0LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdXSxbWzI1NSwyNTUsMjUzLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTAsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV1dLFtbMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0sWzI1NCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1XV1dXSxjaT1bMCwxLDIsMyw2LDQsNSw2LDYsNiw2LDYsNiw2LDYsNywwXSxsaT1bXSxoaT1bXSxmaT1bXSxkaT0xLHBpPTIsZ2k9W10sbWk9W107bXIoXCJVcHNhbXBsZVJnYkxpbmVQYWlyXCIsTHIsMyksbXIoXCJVcHNhbXBsZUJnckxpbmVQYWlyXCIseHIsMyksbXIoXCJVcHNhbXBsZVJnYmFMaW5lUGFpclwiLGtyLDQpLG1yKFwiVXBzYW1wbGVCZ3JhTGluZVBhaXJcIixQciw0KSxtcihcIlVwc2FtcGxlQXJnYkxpbmVQYWlyXCIsX3IsNCksbXIoXCJVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJcIixTciwyKSxtcihcIlVwc2FtcGxlUmdiNTY1TGluZVBhaXJcIixBciwyKTt2YXIgdmk9dC5VcHNhbXBsZVJnYkxpbmVQYWlyLGJpPXQuVXBzYW1wbGVCZ3JMaW5lUGFpcix5aT10LlVwc2FtcGxlUmdiYUxpbmVQYWlyLHdpPXQuVXBzYW1wbGVCZ3JhTGluZVBhaXIsTmk9dC5VcHNhbXBsZUFyZ2JMaW5lUGFpcixMaT10LlVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcix4aT10LlVwc2FtcGxlUmdiNTY1TGluZVBhaXIsQWk9MTYsU2k9MTw8QWktMSxfaT0tMjI3LFBpPTQ4MixraT02LEZpPSgyNTY8PGtpKS0xLElpPTAsQ2k9YSgyNTYpLGppPWEoMjU2KSxPaT1hKDI1NiksQmk9YSgyNTYpLE1pPWEoUGktX2kpLHFpPWEoUGktX2kpO0ZyKFwiWXV2VG9SZ2JSb3dcIixMciwzKSxGcihcIll1dlRvQmdyUm93XCIseHIsMyksRnIoXCJZdXZUb1JnYmFSb3dcIixrciw0KSxGcihcIll1dlRvQmdyYVJvd1wiLFByLDQpLEZyKFwiWXV2VG9BcmdiUm93XCIsX3IsNCksRnIoXCJZdXZUb1JnYmE0NDQ0Um93XCIsU3IsMiksRnIoXCJZdXZUb1JnYjU2NVJvd1wiLEFyLDIpO3ZhciBFaT1bMCw0LDgsMTIsMTI4LDEzMiwxMzYsMTQwLDI1NiwyNjAsMjY0LDI2OCwzODQsMzg4LDM5MiwzOTZdLFJpPVswLDIsOF0sRGk9WzgsNyw2LDQsNCwyLDIsMiwxLDEsMSwxXSxUaT0xO3RoaXMuV2ViUERlY29kZVJHQkE9ZnVuY3Rpb24odCxyLHMsdSxjKXt2YXIgbD1xbixoPW5ldyBlcixmPW5ldyBvdDtoLmJhPWYsZi5TPWwsZi53aWR0aD1bZi53aWR0aF0sZi5oZWlnaHQ9W2YuaGVpZ2h0XTt2YXIgZD1mLndpZHRoLHA9Zi5oZWlnaHQsZz1uZXcgc3Q7aWYobnVsbD09Z3x8bnVsbD09dCl2YXIgbT0yO2Vsc2UgZShudWxsIT1nKSxtPU9yKHQscixzLGcud2lkdGgsZy5oZWlnaHQsZy5QZCxnLlFkLGcuZm9ybWF0LG51bGwpO2lmKDAhPW0/ZD0wOihudWxsIT1kJiYoZFswXT1nLndpZHRoWzBdKSxudWxsIT1wJiYocFswXT1nLmhlaWdodFswXSksZD0xKSxkKXtmLndpZHRoPWYud2lkdGhbMF0sZi5oZWlnaHQ9Zi5oZWlnaHRbMF0sbnVsbCE9dSYmKHVbMF09Zi53aWR0aCksbnVsbCE9YyYmKGNbMF09Zi5oZWlnaHQpO3Q6e2lmKHU9bmV3IEd0LChjPW5ldyBycikuZGF0YT10LGMudz1yLGMuaGE9cyxjLmtkPTEscj1bMF0sZShudWxsIT1jKSwoMD09KHQ9T3IoYy5kYXRhLGMudyxjLmhhLG51bGwsbnVsbCxudWxsLHIsbnVsbCxjKSl8fDc9PXQpJiZyWzBdJiYodD00KSwwPT0ocj10KSl7aWYoZShudWxsIT1oKSx1LmRhdGE9Yy5kYXRhLHUudz1jLncrYy5vZmZzZXQsdS5oYT1jLmhhLWMub2Zmc2V0LHUucHV0PWR0LHUuYWM9ZnQsdS5iYz1wdCx1Lm1hPWgsYy54YSl7aWYobnVsbD09KHQ9a3QoKSkpe2g9MTticmVhayB0fWlmKGZ1bmN0aW9uKHQscil7dmFyIG49WzBdLGk9WzBdLGE9WzBdO2U6Zm9yKDs7KXtpZihudWxsPT10KXJldHVybiAwO2lmKG51bGw9PXIpcmV0dXJuIHQuYT0yLDA7aWYodC5sPXIsdC5hPTAsdih0Lm0sci5kYXRhLHIudyxyLmhhKSwhZ3QodC5tLG4saSxhKSl7dC5hPTM7YnJlYWsgZX1pZih0LnhiPXBpLHIud2lkdGg9blswXSxyLmhlaWdodD1pWzBdLCFGdChuWzBdLGlbMF0sMSx0LG51bGwpKWJyZWFrIGU7cmV0dXJuIDF9cmV0dXJuIGUoMCE9dC5hKSwwfSh0LHUpKXtpZih1PTA9PShyPXFyKHUud2lkdGgsdS5oZWlnaHQsaC5PYSxoLmJhKSkpe2U6e3U9dDtyOmZvcig7Oyl7aWYobnVsbD09dSl7dT0wO2JyZWFrIGV9aWYoZShudWxsIT11LnMueWMpLGUobnVsbCE9dS5zLllhKSxlKDA8dS5zLldiKSxlKG51bGwhPShzPXUubCkpLGUobnVsbCE9KGM9cy5tYSkpLDAhPXUueGIpe2lmKHUuY2E9Yy5iYSx1LnRiPWMudGIsZShudWxsIT11LmNhKSwhQnIoYy5PYSxzLFJuKSl7dS5hPTI7YnJlYWsgcn1pZighSXQodSxzLndpZHRoKSlicmVhayByO2lmKHMuZGEpYnJlYWsgcjtpZigocy5kYXx8bnQodS5jYS5TKSkmJmdyKCksMTE+dS5jYS5TfHwoYWxlcnQoXCJ0b2RvOldlYlBJbml0Q29udmVydEFSR0JUb1lVVlwiKSxudWxsIT11LmNhLmYua2IuRiYmZ3IoKSksdS5QYiYmMDx1LnMudWEmJm51bGw9PXUucy52Yi5YJiYhTyh1LnMudmIsdS5zLldhLlhhKSl7dS5hPTE7YnJlYWsgcn11LnhiPTB9aWYoIV90KHUsdS5WLHUuQmEsdS5jLHUuaSxzLm8sTHQpKWJyZWFrIHI7Yy5EYz11Lk1hLHU9MTticmVhayBlfWUoMCE9dS5hKSx1PTB9dT0hdX11JiYocj10LmEpfWVsc2Ugcj10LmF9ZWxzZXtpZihudWxsPT0odD1uZXcgWXQpKXtoPTE7YnJlYWsgdH1pZih0LkZhPWMubmEsdC5QPWMuUCx0LnFjPWMuU2EsS3QodCx1KSl7aWYoMD09KHI9cXIodS53aWR0aCx1LmhlaWdodCxoLk9hLGguYmEpKSl7aWYodC5BYT0wLHM9aC5PYSxlKG51bGwhPShjPXQpKSxudWxsIT1zKXtpZigwPChkPTA+KGQ9cy5NZCk/MDoxMDA8ZD8yNTU6MjU1KmQvMTAwKSl7Zm9yKHA9Zz0wOzQ+cDsrK3ApMTI+KG09Yy5wYltwXSkubGMmJihtLmlhPWQqRGlbMD5tLmxjPzA6bS5sY10+PjMpLGd8PW0uaWE7ZyYmKGFsZXJ0KFwidG9kbzpWUDhJbml0UmFuZG9tXCIpLGMuaWE9MSl9Yy5HYT1zLklkLDEwMDxjLkdhP2MuR2E9MTAwOjA+Yy5HYSYmKGMuR2E9MCl9KGZ1bmN0aW9uKHQscil7aWYobnVsbD09dClyZXR1cm4gMDtpZihudWxsPT1yKXJldHVybiBKdCh0LDIsXCJOVUxMIFZQOElvIHBhcmFtZXRlciBpbiBWUDhEZWNvZGUoKS5cIik7aWYoIXQuY2ImJiFLdCh0LHIpKXJldHVybiAwO2lmKGUodC5jYiksbnVsbD09ci5hY3x8ci5hYyhyKSl7ci5vYiYmKHQuTD0wKTt2YXIgcz1SaVt0LkxdO2lmKDI9PXQuTD8odC55Yj0wLHQuemI9MCk6KHQueWI9ci52LXM+PjQsdC56Yj1yLmotcz4+NCwwPnQueWImJih0LnliPTApLDA+dC56YiYmKHQuemI9MCkpLHQuVmE9ci5vKzE1K3M+PjQsdC5IYj1yLnZhKzE1K3M+PjQsdC5IYj50LnphJiYodC5IYj10LnphKSx0LlZhPnQuVWImJih0LlZhPXQuVWIpLDA8dC5MKXt2YXIgdT10LmVkO2ZvcihzPTA7ND5zOysrcyl7dmFyIGM7aWYodC5RYS5DYil7dmFyIGw9dC5RYS5MYltzXTt0LlFhLkZifHwobCs9dS5UYil9ZWxzZSBsPXUuVGI7Zm9yKGM9MDsxPj1jOysrYyl7dmFyIGg9dC5nZFtzXVtjXSxmPWw7aWYodS5QYyYmKGYrPXUudmRbMF0sYyYmKGYrPXUub2RbMF0pKSwwPChmPTA+Zj8wOjYzPGY/NjM6Zikpe3ZhciBkPWY7MDx1LndiJiYoZD00PHUud2I/ZD4+MjpkPj4xKT45LXUud2ImJihkPTktdS53YiksMT5kJiYoZD0xKSxoLmRkPWQsaC50Yz0yKmYrZCxoLmxkPTQwPD1mPzI6MTU8PWY/MTowfWVsc2UgaC50Yz0wO2guTGE9Y319fXM9MH1lbHNlIEp0KHQsNixcIkZyYW1lIHNldHVwIGZhaWxlZFwiKSxzPXQuYTtpZihzPTA9PXMpe2lmKHMpe3QuJGM9MCwwPHQuQWF8fCh0LkljPVRpKTtlOntzPXQuSWMsdT00KihkPXQuemEpO3ZhciBwPTMyKmQsZz1kKzEsbT0wPHQuTD9kKigwPHQuQWE/MjoxKTowLHY9KDI9PXQuQWE/MjoxKSpkO2lmKChoPXUrODMyKyhjPTMqKDE2KnMrUmlbdC5MXSkvMipwKSsobD1udWxsIT10LkZhJiYwPHQuRmEubGVuZ3RoP3QuS2MuYyp0LktjLmk6MCkpIT1oKXM9MDtlbHNle2lmKGg+dC5WYil7aWYodC5WYj0wLHQuRWM9YShoKSx0LkZjPTAsbnVsbD09dC5FYyl7cz1KdCh0LDEsXCJubyBtZW1vcnkgZHVyaW5nIGZyYW1lIGluaXRpYWxpemF0aW9uLlwiKTticmVhayBlfXQuVmI9aH1oPXQuRWMsZj10LkZjLHQuQWM9aCx0LkJjPWYsZis9dSx0LkdkPW8ocCxIdCksdC5IZD0wLHQucmI9byhnKzEsRHQpLHQuc2I9MSx0LndhPW0/byhtLFJ0KTpudWxsLHQuWT0wLHQuRC5OYj0wLHQuRC53YT10LndhLHQuRC5ZPXQuWSwwPHQuQWEmJih0LkQuWSs9ZCksZSghMCksdC5vYz1oLHQucGM9ZixmKz04MzIsdC55YT1vKHYsenQpLHQuYWE9MCx0LkQueWE9dC55YSx0LkQuYWE9dC5hYSwyPT10LkFhJiYodC5ELmFhKz1kKSx0LlI9MTYqZCx0LkI9OCpkLGQ9KHA9UmlbdC5MXSkqdC5SLHA9cC8yKnQuQix0LnNhPWgsdC50YT1mK2QsdC5xYT10LnNhLHQucmE9dC50YSsxNipzKnQuUitwLHQuSGE9dC5xYSx0LklhPXQucmErOCpzKnQuQitwLHQuJGM9MCxmKz1jLHQubWI9bD9oOm51bGwsdC5uYj1sP2Y6bnVsbCxlKGYrbDw9dC5GYyt0LlZiKSwkdCh0KSxpKHQuQWMsdC5CYywwLHUpLHM9MX19aWYocyl7aWYoci5rYT0wLHIueT10LnNhLHIuTz10LnRhLHIuZj10LnFhLHIuTj10LnJhLHIuZWE9dC5IYSxyLlZkPXQuSWEsci5mYT10LlIsci5SYz10LkIsci5GPW51bGwsci5KPTAsIUluKXtmb3Iocz0tMjU1OzI1NT49czsrK3MpX25bMjU1K3NdPTA+cz8tczpzO2ZvcihzPS0xMDIwOzEwMjA+PXM7KytzKVBuWzEwMjArc109LTEyOD5zPy0xMjg6MTI3PHM/MTI3OnM7Zm9yKHM9LTExMjsxMTI+PXM7KytzKWtuWzExMitzXT0tMTY+cz8tMTY6MTU8cz8xNTpzO2ZvcihzPS0yNTU7NTEwPj1zOysrcylGblsyNTUrc109MD5zPzA6MjU1PHM/MjU1OnM7SW49MX1ubj11ZSxhbj1pZSxzbj1hZSx1bj1vZSxjbj1zZSxvbj1uZSxsbj1ZZSxobj1KZSxmbj1aZSxkbj0kZSxwbj1YZSxnbj1LZSxtbj1RZSx2bj10cixibj16ZSx5bj1VZSx3bj1IZSxObj1XZSxoaVswXT14ZSxoaVsxXT1sZSxoaVsyXT1OZSxoaVszXT1MZSxoaVs0XT1BZSxoaVs1XT1fZSxoaVs2XT1TZSxoaVs3XT1QZSxoaVs4XT1GZSxoaVs5XT1rZSxsaVswXT1tZSxsaVsxXT1mZSxsaVsyXT1kZSxsaVszXT1wZSxsaVs0XT12ZSxsaVs1XT1iZSxsaVs2XT15ZSxmaVswXT1PZSxmaVsxXT1oZSxmaVsyXT1JZSxmaVszXT1DZSxmaVs0XT1NZSxmaVs1XT1CZSxmaVs2XT1xZSxzPTF9ZWxzZSBzPTB9cyYmKHM9ZnVuY3Rpb24odCxyKXtmb3IodC5NPTA7dC5NPHQuVmE7Kyt0Lk0pe3ZhciBvLHM9dC5KY1t0Lk0mdC5YYl0sdT10Lm0sYz10O2ZvcihvPTA7bzxjLnphOysrbyl7dmFyIGw9dSxoPWMsZj1oLkFjLGQ9aC5CYys0Km8scD1oLnpjLGc9aC55YVtoLmFhK29dO2lmKGguUWEuQmI/Zy4kYj1rKGwsaC5QYS5qYlswXSk/MitrKGwsaC5QYS5qYlsyXSk6ayhsLGguUGEuamJbMV0pOmcuJGI9MCxoLmtjJiYoZy5BZD1rKGwsaC5CZCkpLGcuWmE9IWsobCwxNDUpKzAsZy5aYSl7dmFyIG09Zy5PYix2PTA7Zm9yKGg9MDs0Pmg7KytoKXt2YXIgYix5PXBbMCtoXTtmb3IoYj0wOzQ+YjsrK2Ipe3k9c2lbZltkK2JdXVt5XTtmb3IodmFyIHc9YWlbayhsLHlbMF0pXTswPHc7KXc9YWlbMip3K2sobCx5W3ddKV07eT0tdyxmW2QrYl09eX1uKG0sdixmLGQsNCksdis9NCxwWzAraF09eX19ZWxzZSB5PWsobCwxNTYpP2sobCwxMjgpPzE6MzprKGwsMTYzKT8yOjAsZy5PYlswXT15LGkoZixkLHksNCksaShwLDAseSw0KTtnLkRkPWsobCwxNDIpP2sobCwxMTQpP2sobCwxODMpPzE6MzoyOjB9aWYoYy5tLkthKXJldHVybiBKdCh0LDcsXCJQcmVtYXR1cmUgZW5kLW9mLXBhcnRpdGlvbjAgZW5jb3VudGVyZWQuXCIpO2Zvcig7dC5qYTx0LnphOysrdC5qYSl7aWYoYz1zLGw9KHU9dCkucmJbdS5zYi0xXSxmPXUucmJbdS5zYit1LmphXSxvPXUueWFbdS5hYSt1LmphXSxkPXUua2M/by5BZDowKWwubGE9Zi5sYT0wLG8uWmF8fChsLk5hPWYuTmE9MCksby5IYz0wLG8uR2M9MCxvLmlhPTA7ZWxzZXt2YXIgTixMO2lmKGw9ZixmPWMsZD11LlBhLlhjLHA9dS55YVt1LmFhK3UuamFdLGc9dS5wYltwLiRiXSxoPXAuYWQsbT0wLHY9dS5yYlt1LnNiLTFdLHk9Yj0wLGkoaCxtLDAsMzg0KSxwLlphKXZhciB4PTAsQT1kWzNdO2Vsc2V7dz1hKDE2KTt2YXIgUz1sLk5hK3YuTmE7aWYoUz1yaShmLGRbMV0sUyxnLkViLDAsdywwKSxsLk5hPXYuTmE9KDA8UykrMCwxPFMpbm4odywwLGgsbSk7ZWxzZXt2YXIgXz13WzBdKzM+PjM7Zm9yKHc9MDsyNTY+dzt3Kz0xNiloW20rd109X314PTEsQT1kWzBdfXZhciBQPTE1JmwubGEsRj0xNSZ2LmxhO2Zvcih3PTA7ND53Oysrdyl7dmFyIEk9MSZGO2ZvcihfPUw9MDs0Pl87KytfKVA9UD4+MXwoST0oUz1yaShmLEEsUz1JKygxJlApLGcuU2MseCxoLG0pKT54KTw8NyxMPUw8PDJ8KDM8Uz8zOjE8Uz8yOjAhPWhbbSswXSksbSs9MTY7UD4+PTQsRj1GPj4xfEk8PDcsYj0oYjw8OHxMKT4+PjB9Zm9yKEE9UCx4PUY+PjQsTj0wOzQ+TjtOKz0yKXtmb3IoTD0wLFA9bC5sYT4+NCtOLEY9di5sYT4+NCtOLHc9MDsyPnc7Kyt3KXtmb3IoST0xJkYsXz0wOzI+XzsrK18pUz1JKygxJlApLFA9UD4+MXwoST0wPChTPXJpKGYsZFsyXSxTLGcuUWMsMCxoLG0pKSk8PDMsTD1MPDwyfCgzPFM/MzoxPFM/MjowIT1oW20rMF0pLG0rPTE2O1A+Pj0yLEY9Rj4+MXxJPDw1fXl8PUw8PDQqTixBfD1QPDw0PDxOLHh8PSgyNDAmRik8PE59bC5sYT1BLHYubGE9eCxwLkhjPWIscC5HYz15LHAuaWE9NDM2OTAmeT8wOmcuaWEsZD0hKGJ8eSl9aWYoMDx1LkwmJih1LndhW3UuWSt1LmphXT11LmdkW28uJGJdW28uWmFdLHUud2FbdS5ZK3UuamFdLkxhfD0hZCksYy5LYSlyZXR1cm4gSnQodCw3LFwiUHJlbWF0dXJlIGVuZC1vZi1maWxlIGVuY291bnRlcmVkLlwiKX1pZigkdCh0KSx1PXIsYz0xLG89KHM9dCkuRCxsPTA8cy5MJiZzLk0+PXMuemImJnMuTTw9cy5WYSwwPT1zLkFhKWU6e2lmKG8uTT1zLk0sby51Yz1sLGpyKHMsbyksYz0xLG89KEw9cy5EKS5OYixsPSh5PVJpW3MuTF0pKnMuUixmPXkvMipzLkIsdz0xNipvKnMuUixfPTgqbypzLkIsZD1zLnNhLHA9cy50YS1sK3csZz1zLnFhLGg9cy5yYS1mK18sbT1zLkhhLHY9cy5JYS1mK18sRj0wPT0oUD1MLk0pLGI9UD49cy5WYS0xLDI9PXMuQWEmJmpyKHMsTCksTC51Yylmb3IoST0oUz1zKS5ELk0sZShTLkQudWMpLEw9Uy55YjtMPFMuSGI7KytMKXt4PUwsQT1JO3ZhciBDPShqPSh6PVMpLkQpLk5iO049ei5SO3ZhciBqPWoud2Fbai5ZK3hdLE89ei5zYSxCPXoudGErMTYqQypOKzE2KngsTT1qLmRkLHE9ai50YztpZigwIT1xKWlmKGUoMzw9cSksMT09ei5MKTA8eCYmeW4oTyxCLE4scSs0KSxqLkxhJiZObihPLEIsTixxKSwwPEEmJmJuKE8sQixOLHErNCksai5MYSYmd24oTyxCLE4scSk7ZWxzZXt2YXIgRT16LkIsUj16LnFhLEQ9ei5yYSs4KkMqRSs4KngsVD16LkhhLHo9ei5JYSs4KkMqRSs4Kng7Qz1qLmxkLDA8eCYmKGhuKE8sQixOLHErNCxNLEMpLGRuKFIsRCxULHosRSxxKzQsTSxDKSksai5MYSYmKGduKE8sQixOLHEsTSxDKSx2bihSLEQsVCx6LEUscSxNLEMpKSwwPEEmJihsbihPLEIsTixxKzQsTSxDKSxmbihSLEQsVCx6LEUscSs0LE0sQykpLGouTGEmJihwbihPLEIsTixxLE0sQyksbW4oUixELFQseixFLHEsTSxDKSl9fWlmKHMuaWEmJmFsZXJ0KFwidG9kbzpEaXRoZXJSb3dcIiksbnVsbCE9dS5wdXQpe2lmKEw9MTYqUCxQPTE2KihQKzEpLEY/KHUueT1zLnNhLHUuTz1zLnRhK3csdS5mPXMucWEsdS5OPXMucmErXyx1LmVhPXMuSGEsdS5XPXMuSWErXyk6KEwtPXksdS55PWQsdS5PPXAsdS5mPWcsdS5OPWgsdS5lYT1tLHUuVz12KSxifHwoUC09eSksUD51Lm8mJihQPXUubyksdS5GPW51bGwsdS5KPW51bGwsbnVsbCE9cy5GYSYmMDxzLkZhLmxlbmd0aCYmTDxQJiYodS5KPWxyKHMsdSxMLFAtTCksdS5GPXMubWIsbnVsbD09dS5GJiYwPT11LkYubGVuZ3RoKSl7Yz1KdChzLDMsXCJDb3VsZCBub3QgZGVjb2RlIGFscGhhIGRhdGEuXCIpO2JyZWFrIGV9TDx1LmomJih5PXUuai1MLEw9dS5qLGUoISgxJnkpKSx1Lk8rPXMuUip5LHUuTis9cy5CKih5Pj4xKSx1LlcrPXMuQiooeT4+MSksbnVsbCE9dS5GJiYodS5KKz11LndpZHRoKnkpKSxMPFAmJih1Lk8rPXUudix1Lk4rPXUudj4+MSx1LlcrPXUudj4+MSxudWxsIT11LkYmJih1LkorPXUudiksdS5rYT1MLXUuaix1LlU9dS52YS11LnYsdS5UPVAtTCxjPXUucHV0KHUpKX1vKzEhPXMuSWN8fGJ8fChuKHMuc2Escy50YS1sLGQscCsxNipzLlIsbCksbihzLnFhLHMucmEtZixnLGgrOCpzLkIsZiksbihzLkhhLHMuSWEtZixtLHYrOCpzLkIsZikpfWlmKCFjKXJldHVybiBKdCh0LDYsXCJPdXRwdXQgYWJvcnRlZC5cIil9cmV0dXJuIDF9KHQscikpLG51bGwhPXIuYmMmJnIuYmMocikscyY9MX1yZXR1cm4gcz8odC5jYj0wLHMpOjB9KSh0LHUpfHwocj10LmEpfX1lbHNlIHI9dC5hfTA9PXImJm51bGwhPWguT2EmJmguT2EuZmQmJihyPU1yKGguYmEpKX1oPXJ9bD0wIT1oP251bGw6MTE+bD9mLmYuUkdCQS5lYjpmLmYua2IueX1lbHNlIGw9bnVsbDtyZXR1cm4gbH07dmFyIHppPVszLDQsMyw0LDQsMiwyLDQsNCw0LDIsMSwxXX07ZnVuY3Rpb24gYyh0LGUpe2Zvcih2YXIgcj1cIlwiLG49MDtuPDQ7bisrKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUodFtlKytdKTtyZXR1cm4gcn1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHRbZSswXXx0W2UrMV08PDh9ZnVuY3Rpb24gaCh0LGUpe3JldHVybih0W2UrMF18dFtlKzFdPDw4fHRbZSsyXTw8MTYpPj4+MH1mdW5jdGlvbiBmKHQsZSl7cmV0dXJuKHRbZSswXXx0W2UrMV08PDh8dFtlKzJdPDwxNnx0W2UrM108PDI0KT4+PjB9bmV3IHU7dmFyIGQ9WzBdLHA9WzBdLGc9W10sbT1uZXcgdSx2PXQsYj1mdW5jdGlvbih0LGUpe3ZhciByPXt9LG49MCxpPSExLGE9MCxvPTA7aWYoci5mcmFtZXM9W10sIVxuLyoqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCAoYykgMjAxNyBEb21pbmlrIEhvbWJlcmdlclxuICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gIGh0dHBzOi8vd2VicGpzLmFwcHNwb3QuY29tXG4gIFdlYlBSaWZmUGFyc2VyIGRvbWluaWtobGJnQGdtYWlsLmNvbVxuICAqL1xuZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MDtyPDQ7cisrKWlmKHRbZStyXSE9XCJSSUZGXCIuY2hhckNvZGVBdChyKSlyZXR1cm4hMDtyZXR1cm4hMX0odCxlKSl7Zm9yKGYodCxlKz00KSxlKz04O2U8dC5sZW5ndGg7KXt2YXIgcz1jKHQsZSksdT1mKHQsZSs9NCk7ZSs9NDt2YXIgZD11KygxJnUpO3N3aXRjaChzKXtjYXNlXCJWUDggXCI6Y2FzZVwiVlA4TFwiOnZvaWQgMD09PXIuZnJhbWVzW25dJiYoci5mcmFtZXNbbl09e30pLChtPXIuZnJhbWVzW25dKS5zcmNfb2ZmPWk/bzplLTgsbS5zcmNfc2l6ZT1hK3UrOCxuKyssaSYmKGk9ITEsYT0wLG89MCk7YnJlYWs7Y2FzZVwiVlA4WFwiOihtPXIuaGVhZGVyPXt9KS5mZWF0dXJlX2ZsYWdzPXRbZV07dmFyIHA9ZSs0O20uY2FudmFzX3dpZHRoPTEraCh0LHApLHArPTMsbS5jYW52YXNfaGVpZ2h0PTEraCh0LHApLHArPTM7YnJlYWs7Y2FzZVwiQUxQSFwiOmk9ITAsYT1kKzgsbz1lLTg7YnJlYWs7Y2FzZVwiQU5JTVwiOihtPXIuaGVhZGVyKS5iZ2NvbG9yPWYodCxlKSxwPWUrNCxtLmxvb3BfY291bnQ9bCh0LHApLHArPTI7YnJlYWs7Y2FzZVwiQU5NRlwiOnZhciBnLG07KG09ci5mcmFtZXNbbl09e30pLm9mZnNldF94PTIqaCh0LGUpLGUrPTMsbS5vZmZzZXRfeT0yKmgodCxlKSxlKz0zLG0ud2lkdGg9MStoKHQsZSksZSs9MyxtLmhlaWdodD0xK2godCxlKSxlKz0zLG0uZHVyYXRpb249aCh0LGUpLGUrPTMsZz10W2UrK10sbS5kaXNwb3NlPTEmZyxtLmJsZW5kPWc+PjEmMX1cIkFOTUZcIiE9cyYmKGUrPWQpfXJldHVybiByfX0odiwwKTtiLnJlc3BvbnNlPXYsYi5yZ2Jhb3V0cHV0PSEwLGIuZGF0YXVybD0hMTt2YXIgeT1iLmhlYWRlcj9iLmhlYWRlcjpudWxsLHc9Yi5mcmFtZXM/Yi5mcmFtZXM6bnVsbDtpZih5KXt5Lmxvb3BfY291bnRlcj15Lmxvb3BfY291bnQsZD1beS5jYW52YXNfaGVpZ2h0XSxwPVt5LmNhbnZhc193aWR0aF07Zm9yKHZhciBOPTA7Tjx3Lmxlbmd0aCYmMCE9d1tOXS5ibGVuZDtOKyspO312YXIgTD13WzBdLHg9bS5XZWJQRGVjb2RlUkdCQSh2LEwuc3JjX29mZixMLnNyY19zaXplLHAsZCk7TC5yZ2JhPXgsTC5pbWd3aWR0aD1wWzBdLEwuaW1naGVpZ2h0PWRbMF07Zm9yKHZhciBBPTA7QTxwWzBdKmRbMF0qNDtBKyspZ1tBXT14W0FdO3JldHVybiB0aGlzLndpZHRoPXAsdGhpcy5oZWlnaHQ9ZCx0aGlzLmRhdGE9Zyx0aGlzfVxuLyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBAbGljZW5zZVxuICoganNQREYgWE1QIG1ldGFkYXRhIHBsdWdpblxuICogQ29weXJpZ2h0IChjKSAyMDE2IEp1c3NpIFV0dW5lbiwgdS1qdXNzaUBzdW9taTI0LmZpXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbiAqIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvXG4gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG9cbiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbiAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkVcbiAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT05cbiAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5mdW5jdGlvbiBjZSgpe3ZhciB0LGU9dGhpcy5pbnRlcm5hbC5fX21ldGFkYXRhX18ubWV0YWRhdGEscj11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO3Q9dGhpcy5pbnRlcm5hbC5fX21ldGFkYXRhX18ucmF3WG1sP3I6Jzx4OnhtcG1ldGEgeG1sbnM6eD1cImFkb2JlOm5zOm1ldGEvXCI+PHJkZjpSREYgeG1sbnM6cmRmPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI1wiPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PVwiXCIgeG1sbnM6anNwZGY9XCInK3RoaXMuaW50ZXJuYWwuX19tZXRhZGF0YV9fLm5hbWVzcGFjZVVyaSsnXCI+PGpzcGRmOm1ldGFkYXRhPicrci5yZXBsYWNlKC8mL2csXCImYW1wO1wiKS5yZXBsYWNlKC88L2csXCImbHQ7XCIpLnJlcGxhY2UoLz4vZyxcIiZndDtcIikucmVwbGFjZSgvXCIvZyxcIiZxdW90O1wiKS5yZXBsYWNlKC8nL2csXCImYXBvcztcIikrXCI8L2pzcGRmOm1ldGFkYXRhPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT5cIix0aGlzLmludGVybmFsLl9fbWV0YWRhdGFfXy5tZXRhZGF0YU9iamVjdE51bWJlcj10aGlzLmludGVybmFsLm5ld09iamVjdCgpLHRoaXMuaW50ZXJuYWwud3JpdGUoXCI8PCAvVHlwZSAvTWV0YWRhdGEgL1N1YnR5cGUgL1hNTCAvTGVuZ3RoIFwiK3QubGVuZ3RoK1wiID4+XCIpLHRoaXMuaW50ZXJuYWwud3JpdGUoXCJzdHJlYW1cIiksdGhpcy5pbnRlcm5hbC53cml0ZSh0KSx0aGlzLmludGVybmFsLndyaXRlKFwiZW5kc3RyZWFtXCIpLHRoaXMuaW50ZXJuYWwud3JpdGUoXCJlbmRvYmpcIil9ZnVuY3Rpb24gbGUoKXt0aGlzLmludGVybmFsLl9fbWV0YWRhdGFfXy5tZXRhZGF0YU9iamVjdE51bWJlciYmdGhpcy5pbnRlcm5hbC53cml0ZShcIi9NZXRhZGF0YSBcIit0aGlzLmludGVybmFsLl9fbWV0YWRhdGFfXy5tZXRhZGF0YU9iamVjdE51bWJlcitcIiAwIFJcIil9IWZ1bmN0aW9uKGUpe3ZhciByLG4saSxhLHMsdSxjLGwsZixkPWZ1bmN0aW9uKHQpe3JldHVybiB0PXR8fHt9LHRoaXMuaXNTdHJva2VUcmFuc3BhcmVudD10LmlzU3Ryb2tlVHJhbnNwYXJlbnR8fCExLHRoaXMuc3Ryb2tlT3BhY2l0eT10LnN0cm9rZU9wYWNpdHl8fDEsdGhpcy5zdHJva2VTdHlsZT10LnN0cm9rZVN0eWxlfHxcIiMwMDAwMDBcIix0aGlzLmZpbGxTdHlsZT10LmZpbGxTdHlsZXx8XCIjMDAwMDAwXCIsdGhpcy5pc0ZpbGxUcmFuc3BhcmVudD10LmlzRmlsbFRyYW5zcGFyZW50fHwhMSx0aGlzLmZpbGxPcGFjaXR5PXQuZmlsbE9wYWNpdHl8fDEsdGhpcy5mb250PXQuZm9udHx8XCIxMHB4IHNhbnMtc2VyaWZcIix0aGlzLnRleHRCYXNlbGluZT10LnRleHRCYXNlbGluZXx8XCJhbHBoYWJldGljXCIsdGhpcy50ZXh0QWxpZ249dC50ZXh0QWxpZ258fFwibGVmdFwiLHRoaXMubGluZVdpZHRoPXQubGluZVdpZHRofHwxLHRoaXMubGluZUpvaW49dC5saW5lSm9pbnx8XCJtaXRlclwiLHRoaXMubGluZUNhcD10LmxpbmVDYXB8fFwiYnV0dFwiLHRoaXMucGF0aD10LnBhdGh8fFtdLHRoaXMudHJhbnNmb3JtPXZvaWQgMCE9PXQudHJhbnNmb3JtP3QudHJhbnNmb3JtLmNsb25lKCk6bmV3IGwsdGhpcy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb258fFwibm9ybWFsXCIsdGhpcy5nbG9iYWxBbHBoYT10Lmdsb2JhbEFscGhhfHwxLHRoaXMuY2xpcF9wYXRoPXQuY2xpcF9wYXRofHxbXSx0aGlzLmN1cnJlbnRQb2ludD10LmN1cnJlbnRQb2ludHx8bmV3IHUsdGhpcy5taXRlckxpbWl0PXQubWl0ZXJMaW1pdHx8MTAsdGhpcy5sYXN0UG9pbnQ9dC5sYXN0UG9pbnR8fG5ldyB1LHRoaXMubGluZURhc2hPZmZzZXQ9dC5saW5lRGFzaE9mZnNldHx8MCx0aGlzLmxpbmVEYXNoPXQubGluZURhc2h8fFtdLHRoaXMubWFyZ2luPXQubWFyZ2lufHxbMCwwLDAsMF0sdGhpcy5wcmV2UGFnZUxhc3RFbGVtT2Zmc2V0PXQucHJldlBhZ2VMYXN0RWxlbU9mZnNldHx8MCx0aGlzLmlnbm9yZUNsZWFyUmVjdD1cImJvb2xlYW5cIiE9dHlwZW9mIHQuaWdub3JlQ2xlYXJSZWN0fHx0Lmlnbm9yZUNsZWFyUmVjdCx0aGlzfTtlLmV2ZW50cy5wdXNoKFtcImluaXRpYWxpemVkXCIsZnVuY3Rpb24oKXt0aGlzLmNvbnRleHQyZD1uZXcgcCh0aGlzKSxyPXRoaXMuaW50ZXJuYWwuZjIsbj10aGlzLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcsaT10aGlzLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyxhPXRoaXMuaW50ZXJuYWwuZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUscz10aGlzLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZSx1PXRoaXMuaW50ZXJuYWwuUG9pbnQsYz10aGlzLmludGVybmFsLlJlY3RhbmdsZSxsPXRoaXMuaW50ZXJuYWwuTWF0cml4LGY9bmV3IGR9XSk7dmFyIHA9ZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJjYW52YXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue3BhcmVudE5vZGU6ITEsc3R5bGU6ITF9fX0pO3ZhciBlPXQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJwZGZcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9fSk7dmFyIHI9ITE7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJwYWdlV3JhcFhFbmFibGVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiByfSxzZXQ6ZnVuY3Rpb24odCl7cj1Cb29sZWFuKHQpfX0pO3ZhciBuPSExO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicGFnZVdyYXBZRW5hYmxlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sc2V0OmZ1bmN0aW9uKHQpe249Qm9vbGVhbih0KX19KTt2YXIgaT0wO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicG9zWFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sc2V0OmZ1bmN0aW9uKHQpe2lzTmFOKHQpfHwoaT10KX19KTt2YXIgYT0wO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicG9zWVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sc2V0OmZ1bmN0aW9uKHQpe2lzTmFOKHQpfHwoYT10KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm1hcmdpblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZi5tYXJnaW59LHNldDpmdW5jdGlvbih0KXt2YXIgZTtcIm51bWJlclwiPT10eXBlb2YgdD9lPVt0LHQsdCx0XTooKGU9bmV3IEFycmF5KDQpKVswXT10WzBdLGVbMV09dC5sZW5ndGg+PTI/dFsxXTplWzBdLGVbMl09dC5sZW5ndGg+PTM/dFsyXTplWzBdLGVbM109dC5sZW5ndGg+PTQ/dFszXTplWzFdKSxmLm1hcmdpbj1lfX0pO3ZhciBvPSExO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiYXV0b1BhZ2luZ1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb30sc2V0OmZ1bmN0aW9uKHQpe289dH19KTt2YXIgcz0wO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwibGFzdEJyZWFrXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBzfSxzZXQ6ZnVuY3Rpb24odCl7cz10fX0pO3ZhciB1PVtdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicGFnZUJyZWFrc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sc2V0OmZ1bmN0aW9uKHQpe3U9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImN0eFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZn0sc2V0OmZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBkJiYoZj10KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInBhdGhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGYucGF0aH0sc2V0OmZ1bmN0aW9uKHQpe2YucGF0aD10fX0pO3ZhciBjPVtdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiY3R4U3RhY2tcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGN9LHNldDpmdW5jdGlvbih0KXtjPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJmaWxsU3R5bGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmZpbGxTdHlsZX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlO2U9Zyh0KSx0aGlzLmN0eC5maWxsU3R5bGU9ZS5zdHlsZSx0aGlzLmN0eC5pc0ZpbGxUcmFuc3BhcmVudD0wPT09ZS5hLHRoaXMuY3R4LmZpbGxPcGFjaXR5PWUuYSx0aGlzLnBkZi5zZXRGaWxsQ29sb3IoZS5yLGUuZyxlLmIse2E6ZS5hfSksdGhpcy5wZGYuc2V0VGV4dENvbG9yKGUucixlLmcsZS5iLHthOmUuYX0pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwic3Ryb2tlU3R5bGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LnN0cm9rZVN0eWxlfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9Zyh0KTt0aGlzLmN0eC5zdHJva2VTdHlsZT1lLnN0eWxlLHRoaXMuY3R4LmlzU3Ryb2tlVHJhbnNwYXJlbnQ9MD09PWUuYSx0aGlzLmN0eC5zdHJva2VPcGFjaXR5PWUuYSwwPT09ZS5hP3RoaXMucGRmLnNldERyYXdDb2xvcigyNTUsMjU1LDI1NSk6KGUuYSx0aGlzLnBkZi5zZXREcmF3Q29sb3IoZS5yLGUuZyxlLmIpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImxpbmVDYXBcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmxpbmVDYXB9LHNldDpmdW5jdGlvbih0KXstMSE9PVtcImJ1dHRcIixcInJvdW5kXCIsXCJzcXVhcmVcIl0uaW5kZXhPZih0KSYmKHRoaXMuY3R4LmxpbmVDYXA9dCx0aGlzLnBkZi5zZXRMaW5lQ2FwKHQpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImxpbmVXaWR0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHgubGluZVdpZHRofSxzZXQ6ZnVuY3Rpb24odCl7aXNOYU4odCl8fCh0aGlzLmN0eC5saW5lV2lkdGg9dCx0aGlzLnBkZi5zZXRMaW5lV2lkdGgodCkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwibGluZUpvaW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmxpbmVKb2lufSxzZXQ6ZnVuY3Rpb24odCl7LTEhPT1bXCJiZXZlbFwiLFwicm91bmRcIixcIm1pdGVyXCJdLmluZGV4T2YodCkmJih0aGlzLmN0eC5saW5lSm9pbj10LHRoaXMucGRmLnNldExpbmVKb2luKHQpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm1pdGVyTGltaXRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4Lm1pdGVyTGltaXR9LHNldDpmdW5jdGlvbih0KXtpc05hTih0KXx8KHRoaXMuY3R4Lm1pdGVyTGltaXQ9dCx0aGlzLnBkZi5zZXRNaXRlckxpbWl0KHQpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInRleHRCYXNlbGluZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHgudGV4dEJhc2VsaW5lfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5jdHgudGV4dEJhc2VsaW5lPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ0ZXh0QWxpZ25cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LnRleHRBbGlnbn0sc2V0OmZ1bmN0aW9uKHQpey0xIT09W1wicmlnaHRcIixcImVuZFwiLFwiY2VudGVyXCIsXCJsZWZ0XCIsXCJzdGFydFwiXS5pbmRleE9mKHQpJiYodGhpcy5jdHgudGV4dEFsaWduPXQpfX0pO3ZhciBsPW51bGwsaD1udWxsO3ZhciBwPW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJmb250RmFjZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHB9LHNldDpmdW5jdGlvbih0KXtsPW51bGwsaD1udWxsLHA9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImZvbnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmZvbnR9LHNldDpmdW5jdGlvbih0KXt2YXIgZTtpZih0aGlzLmN0eC5mb250PXQsbnVsbCE9PShlPS9eXFxzKig/PSg/Oig/OlstYS16XStcXHMqKXswLDJ9KGl0YWxpY3xvYmxpcXVlKSk/KSg/PSg/Oig/OlstYS16XStcXHMqKXswLDJ9KHNtYWxsLWNhcHMpKT8pKD89KD86KD86Wy1hLXpdK1xccyopezAsMn0oYm9sZCg/OmVyKT98bGlnaHRlcnxbMS05XTAwKSk/KSg/Oig/Om5vcm1hbHxcXDF8XFwyfFxcMylcXHMqKXswLDN9KCg/Onh4Py0pPyg/OnNtYWxsfGxhcmdlKXxtZWRpdW18c21hbGxlcnxsYXJnZXJ8Wy5cXGRdKyg/OlxcJXxpbnxbY2VtXW18ZXh8cFtjdHhdKSkoPzpcXHMqXFwvXFxzKihub3JtYWx8Wy5cXGRdKyg/OlxcJXxpbnxbY2VtXW18ZXh8cFtjdHhdKSkpP1xccyooWy1fLFxcXCJcXCdcXHNhLXowLTldKz8pXFxzKiQvaS5leGVjKHQpKSl7dmFyIHI9ZVsxXTtlWzJdO3ZhciBuPWVbM10saT1lWzRdO2VbNV07dmFyIGE9ZVs2XSxvPS9eKFsuXFxkXSspKCg/OiV8aW58W2NlbV1tfGV4fHBbY3R4XSkpJC9pLmV4ZWMoaSlbMl07aT1cInB4XCI9PT1vP01hdGguZmxvb3IocGFyc2VGbG9hdChpKSp0aGlzLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3Rvcik6XCJlbVwiPT09bz9NYXRoLmZsb29yKHBhcnNlRmxvYXQoaSkqdGhpcy5wZGYuZ2V0Rm9udFNpemUoKSk6TWF0aC5mbG9vcihwYXJzZUZsb2F0KGkpKnRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yKSx0aGlzLnBkZi5zZXRGb250U2l6ZShpKTt2YXIgcz1mdW5jdGlvbih0KXt2YXIgZSxyLG49W10saT10LnRyaW0oKTtpZihcIlwiPT09aSlyZXR1cm4gR3Q7aWYoaSBpbiBxdClyZXR1cm5bcXRbaV1dO2Zvcig7XCJcIiE9PWk7KXtzd2l0Y2gocj1udWxsLGU9KGk9UnQoaSkpLmNoYXJBdCgwKSl7Y2FzZSdcIic6Y2FzZVwiJ1wiOnI9RHQoaS5zdWJzdHJpbmcoMSksZSk7YnJlYWs7ZGVmYXVsdDpyPVR0KGkpfWlmKG51bGw9PT1yKXJldHVybiBHdDtpZihuLnB1c2goclswXSksXCJcIiE9PShpPVJ0KHJbMV0pKSYmXCIsXCIhPT1pLmNoYXJBdCgwKSlyZXR1cm4gR3Q7aT1pLnJlcGxhY2UoL14sLyxcIlwiKX1yZXR1cm4gbn0oYSk7aWYodGhpcy5mb250RmFjZXMpe3ZhciB1PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5nZXRGb250TGlzdCgpLG49SlNPTi5zdHJpbmdpZnkocik7aWYobnVsbD09PWx8fGghPT1uKXt2YXIgaT1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihyKXt0W3JdLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49bnVsbDtzd2l0Y2godCl7Y2FzZVwiYm9sZFwiOm49e2ZhbWlseTpyLHdlaWdodDpcImJvbGRcIn07YnJlYWs7Y2FzZVwiaXRhbGljXCI6bj17ZmFtaWx5OnIsc3R5bGU6XCJpdGFsaWNcIn07YnJlYWs7Y2FzZVwiYm9sZGl0YWxpY1wiOm49e2ZhbWlseTpyLHdlaWdodDpcImJvbGRcIixzdHlsZTpcIml0YWxpY1wifTticmVhaztjYXNlXCJcIjpjYXNlXCJub3JtYWxcIjpuPXtmYW1pbHk6cn19bnVsbCE9PW4mJihuLnJlZj17bmFtZTpyLHN0eWxlOnR9LGUucHVzaChuKSl9KX0pLGV9KHIpO2w9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXt9LHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG49T3QodFtyXSksaT1uLmZhbWlseSxhPW4uc3RyZXRjaCxvPW4uc3R5bGUscz1uLndlaWdodDtlW2ldPWVbaV18fHt9LGVbaV1bYV09ZVtpXVthXXx8e30sZVtpXVthXVtvXT1lW2ldW2FdW29dfHx7fSxlW2ldW2FdW29dW3NdPW59cmV0dXJuIGV9KGkuY29uY2F0KGUpKSxoPW59cmV0dXJuIGx9KHRoaXMucGRmLHRoaXMuZm9udEZhY2VzKSxjPXMubWFwKGZ1bmN0aW9uKHQpe3JldHVybntmYW1pbHk6dCxzdHJldGNoOlwibm9ybWFsXCIsd2VpZ2h0Om4sc3R5bGU6cn19KSxmPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG49KHI9cnx8e30pLmRlZmF1bHRGb250RmFtaWx5fHxcInRpbWVzXCIsaT1PYmplY3QuYXNzaWduKHt9LE10LHIuZ2VuZXJpY0ZvbnRGYW1pbGllc3x8e30pLGE9bnVsbCxvPW51bGwscz0wO3M8ZS5sZW5ndGg7KytzKWlmKGlbKGE9T3QoZVtzXSkpLmZhbWlseV0mJihhLmZhbWlseT1pW2EuZmFtaWx5XSksdC5oYXNPd25Qcm9wZXJ0eShhLmZhbWlseSkpe289dFthLmZhbWlseV07YnJlYWt9aWYoIShvPW98fHRbbl0pKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGEgZm9udC1mYW1pbHkgZm9yIHRoZSBydWxlICdcIitFdChhKStcIicgYW5kIGRlZmF1bHQgZmFtaWx5ICdcIituK1wiJy5cIik7aWYobz1mdW5jdGlvbih0LGUpe2lmKGVbdF0pcmV0dXJuIGVbdF07dmFyIHI9SXRbdF0sbj1yPD1JdC5ub3JtYWw/LTE6MSxpPUJ0KGUsRnQscixuKTtpZighaSl0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIGZvbnQtc3RyZXRjaCB2YWx1ZSBmb3IgXCIrdCk7cmV0dXJuIGl9KGEuc3RyZXRjaCxvKSxvPWZ1bmN0aW9uKHQsZSl7aWYoZVt0XSlyZXR1cm4gZVt0XTtmb3IodmFyIHI9a3RbdF0sbj0wO248ci5sZW5ndGg7KytuKWlmKGVbcltuXV0pcmV0dXJuIGVbcltuXV07dGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgYSBtYXRjaGluZyBmb250LXN0eWxlIGZvciBcIit0KX0oYS5zdHlsZSxvKSwhKG89ZnVuY3Rpb24odCxlKXtpZihlW3RdKXJldHVybiBlW3RdO2lmKDQwMD09PXQmJmVbNTAwXSlyZXR1cm4gZVs1MDBdO2lmKDUwMD09PXQmJmVbNDAwXSlyZXR1cm4gZVs0MDBdO3ZhciByPWp0W3RdLG49QnQoZSxDdCxyLHQ8NDAwPy0xOjEpO2lmKCFuKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgZm9udC13ZWlnaHQgZm9yIHZhbHVlIFwiK3QpO3JldHVybiBufShhLndlaWdodCxvKSkpdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlc29sdmUgYSBmb250IGZvciB0aGUgcnVsZSAnXCIrRXQoYSkrXCInLlwiKTtyZXR1cm4gb30odSxjKTt0aGlzLnBkZi5zZXRGb250KGYucmVmLm5hbWUsZi5yZWYuc3R5bGUpfWVsc2V7dmFyIGQ9XCJcIjsoXCJib2xkXCI9PT1ufHxwYXJzZUludChuLDEwKT49NzAwfHxcImJvbGRcIj09PXIpJiYoZD1cImJvbGRcIiksXCJpdGFsaWNcIj09PXImJihkKz1cIml0YWxpY1wiKSwwPT09ZC5sZW5ndGgmJihkPVwibm9ybWFsXCIpO2Zvcih2YXIgcD1cIlwiLGc9e2FyaWFsOlwiSGVsdmV0aWNhXCIsQXJpYWw6XCJIZWx2ZXRpY2FcIix2ZXJkYW5hOlwiSGVsdmV0aWNhXCIsVmVyZGFuYTpcIkhlbHZldGljYVwiLGhlbHZldGljYTpcIkhlbHZldGljYVwiLEhlbHZldGljYTpcIkhlbHZldGljYVwiLFwic2Fucy1zZXJpZlwiOlwiSGVsdmV0aWNhXCIsZml4ZWQ6XCJDb3VyaWVyXCIsbW9ub3NwYWNlOlwiQ291cmllclwiLHRlcm1pbmFsOlwiQ291cmllclwiLGN1cnNpdmU6XCJUaW1lc1wiLGZhbnRhc3k6XCJUaW1lc1wiLHNlcmlmOlwiVGltZXNcIn0sbT0wO208cy5sZW5ndGg7bSsrKXtpZih2b2lkIDAhPT10aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KHNbbV0sZCx7bm9GYWxsYmFjazohMCxkaXNhYmxlV2FybmluZzohMH0pKXtwPXNbbV07YnJlYWt9aWYoXCJib2xkaXRhbGljXCI9PT1kJiZ2b2lkIDAhPT10aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KHNbbV0sXCJib2xkXCIse25vRmFsbGJhY2s6ITAsZGlzYWJsZVdhcm5pbmc6ITB9KSlwPXNbbV0sZD1cImJvbGRcIjtlbHNlIGlmKHZvaWQgMCE9PXRoaXMucGRmLmludGVybmFsLmdldEZvbnQoc1ttXSxcIm5vcm1hbFwiLHtub0ZhbGxiYWNrOiEwLGRpc2FibGVXYXJuaW5nOiEwfSkpe3A9c1ttXSxkPVwibm9ybWFsXCI7YnJlYWt9fWlmKFwiXCI9PT1wKWZvcih2YXIgdj0wO3Y8cy5sZW5ndGg7disrKWlmKGdbc1t2XV0pe3A9Z1tzW3ZdXTticmVha31wPVwiXCI9PT1wP1wiVGltZXNcIjpwLHRoaXMucGRmLnNldEZvbnQocCxkKX19fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb259LHNldDpmdW5jdGlvbih0KXt0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImdsb2JhbEFscGhhXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC5nbG9iYWxBbHBoYX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuY3R4Lmdsb2JhbEFscGhhPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJsaW5lRGFzaE9mZnNldFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHgubGluZURhc2hPZmZzZXR9LHNldDpmdW5jdGlvbih0KXt0aGlzLmN0eC5saW5lRGFzaE9mZnNldD10LFQuY2FsbCh0aGlzKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImxpbmVEYXNoXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC5saW5lRGFzaH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuY3R4LmxpbmVEYXNoPXQsVC5jYWxsKHRoaXMpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiaWdub3JlQ2xlYXJSZWN0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN0eC5pZ25vcmVDbGVhclJlY3R9LHNldDpmdW5jdGlvbih0KXt0aGlzLmN0eC5pZ25vcmVDbGVhclJlY3Q9Qm9vbGVhbih0KX19KX07cC5wcm90b3R5cGUuc2V0TGluZURhc2g9ZnVuY3Rpb24odCl7dGhpcy5saW5lRGFzaD10fSxwLnByb3RvdHlwZS5nZXRMaW5lRGFzaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmVEYXNoLmxlbmd0aCUyP3RoaXMubGluZURhc2guY29uY2F0KHRoaXMubGluZURhc2gpOnRoaXMubGluZURhc2guc2xpY2UoKX0scC5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbigpe3guY2FsbCh0aGlzLFwiZmlsbFwiLCExKX0scC5wcm90b3R5cGUuc3Ryb2tlPWZ1bmN0aW9uKCl7eC5jYWxsKHRoaXMsXCJzdHJva2VcIiwhMSl9LHAucHJvdG90eXBlLmJlZ2luUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aD1be3R5cGU6XCJiZWdpblwifV19LHAucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbih0LGUpe2lmKGlzTmFOKHQpfHxpc05hTihlKSl0aHJvdyBvLmVycm9yKFwianNQREYuY29udGV4dDJkLm1vdmVUbzogSW52YWxpZCBhcmd1bWVudHNcIixhcmd1bWVudHMpLG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQubW92ZVRvXCIpO3ZhciByPXRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseVRvUG9pbnQobmV3IHUodCxlKSk7dGhpcy5wYXRoLnB1c2goe3R5cGU6XCJtdFwiLHg6ci54LHk6ci55fSksdGhpcy5jdHgubGFzdFBvaW50PW5ldyB1KHQsZSl9LHAucHJvdG90eXBlLmNsb3NlUGF0aD1mdW5jdGlvbigpe3ZhciBlPW5ldyB1KDAsMCkscj0wO2ZvcihyPXRoaXMucGF0aC5sZW5ndGgtMTstMSE9PXI7ci0tKWlmKFwiYmVnaW5cIj09PXRoaXMucGF0aFtyXS50eXBlJiZcIm9iamVjdFwiPT09dCh0aGlzLnBhdGhbcisxXSkmJlwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLnBhdGhbcisxXS54KXtlPW5ldyB1KHRoaXMucGF0aFtyKzFdLngsdGhpcy5wYXRoW3IrMV0ueSk7YnJlYWt9dGhpcy5wYXRoLnB1c2goe3R5cGU6XCJjbG9zZVwifSksdGhpcy5jdHgubGFzdFBvaW50PW5ldyB1KGUueCxlLnkpfSxwLnByb3RvdHlwZS5saW5lVG89ZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgby5lcnJvcihcImpzUERGLmNvbnRleHQyZC5saW5lVG86IEludmFsaWQgYXJndW1lbnRzXCIsYXJndW1lbnRzKSxuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLmxpbmVUb1wiKTt2YXIgcj10aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHlUb1BvaW50KG5ldyB1KHQsZSkpO3RoaXMucGF0aC5wdXNoKHt0eXBlOlwibHRcIix4OnIueCx5OnIueX0pLHRoaXMuY3R4Lmxhc3RQb2ludD1uZXcgdShyLngsci55KX0scC5wcm90b3R5cGUuY2xpcD1mdW5jdGlvbigpe3RoaXMuY3R4LmNsaXBfcGF0aD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucGF0aCkpLHguY2FsbCh0aGlzLG51bGwsITApfSxwLnByb3RvdHlwZS5xdWFkcmF0aWNDdXJ2ZVRvPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGlzTmFOKHIpfHxpc05hTihuKXx8aXNOYU4odCl8fGlzTmFOKGUpKXRocm93IG8uZXJyb3IoXCJqc1BERi5jb250ZXh0MmQucXVhZHJhdGljQ3VydmVUbzogSW52YWxpZCBhcmd1bWVudHNcIixhcmd1bWVudHMpLG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQucXVhZHJhdGljQ3VydmVUb1wiKTt2YXIgaT10aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHlUb1BvaW50KG5ldyB1KHIsbikpLGE9dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5VG9Qb2ludChuZXcgdSh0LGUpKTt0aGlzLnBhdGgucHVzaCh7dHlwZTpcInFjdFwiLHgxOmEueCx5MTphLnkseDppLngseTppLnl9KSx0aGlzLmN0eC5sYXN0UG9pbnQ9bmV3IHUoaS54LGkueSl9LHAucHJvdG90eXBlLmJlemllckN1cnZlVG89ZnVuY3Rpb24odCxlLHIsbixpLGEpe2lmKGlzTmFOKGkpfHxpc05hTihhKXx8aXNOYU4odCl8fGlzTmFOKGUpfHxpc05hTihyKXx8aXNOYU4obikpdGhyb3cgby5lcnJvcihcImpzUERGLmNvbnRleHQyZC5iZXppZXJDdXJ2ZVRvOiBJbnZhbGlkIGFyZ3VtZW50c1wiLGFyZ3VtZW50cyksbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmNvbnRleHQyZC5iZXppZXJDdXJ2ZVRvXCIpO3ZhciBzPXRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseVRvUG9pbnQobmV3IHUoaSxhKSksYz10aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHlUb1BvaW50KG5ldyB1KHQsZSkpLGw9dGhpcy5jdHgudHJhbnNmb3JtLmFwcGx5VG9Qb2ludChuZXcgdShyLG4pKTt0aGlzLnBhdGgucHVzaCh7dHlwZTpcImJjdFwiLHgxOmMueCx5MTpjLnkseDI6bC54LHkyOmwueSx4OnMueCx5OnMueX0pLHRoaXMuY3R4Lmxhc3RQb2ludD1uZXcgdShzLngscy55KX0scC5wcm90b3R5cGUuYXJjPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKXx8aXNOYU4oaSkpdGhyb3cgby5lcnJvcihcImpzUERGLmNvbnRleHQyZC5hcmM6IEludmFsaWQgYXJndW1lbnRzXCIsYXJndW1lbnRzKSxuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLmFyY1wiKTtpZihhPUJvb2xlYW4oYSksIXRoaXMuY3R4LnRyYW5zZm9ybS5pc0lkZW50aXR5KXt2YXIgcz10aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHlUb1BvaW50KG5ldyB1KHQsZSkpO3Q9cy54LGU9cy55O3ZhciBjPXRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseVRvUG9pbnQobmV3IHUoMCxyKSksbD10aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHlUb1BvaW50KG5ldyB1KDAsMCkpO3I9TWF0aC5zcXJ0KE1hdGgucG93KGMueC1sLngsMikrTWF0aC5wb3coYy55LWwueSwyKSl9TWF0aC5hYnMoaS1uKT49MipNYXRoLlBJJiYobj0wLGk9MipNYXRoLlBJKSx0aGlzLnBhdGgucHVzaCh7dHlwZTpcImFyY1wiLHg6dCx5OmUscmFkaXVzOnIsc3RhcnRBbmdsZTpuLGVuZEFuZ2xlOmksY291bnRlcmNsb2Nrd2lzZTphfSl9LHAucHJvdG90eXBlLmFyY1RvPWZ1bmN0aW9uKHQsZSxyLG4saSl7dGhyb3cgbmV3IEVycm9yKFwiYXJjVG8gbm90IGltcGxlbWVudGVkLlwiKX0scC5wcm90b3R5cGUucmVjdD1mdW5jdGlvbih0LGUscixuKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKSl0aHJvdyBvLmVycm9yKFwianNQREYuY29udGV4dDJkLnJlY3Q6IEludmFsaWQgYXJndW1lbnRzXCIsYXJndW1lbnRzKSxuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLnJlY3RcIik7dGhpcy5tb3ZlVG8odCxlKSx0aGlzLmxpbmVUbyh0K3IsZSksdGhpcy5saW5lVG8odCtyLGUrbiksdGhpcy5saW5lVG8odCxlK24pLHRoaXMubGluZVRvKHQsZSksdGhpcy5saW5lVG8odCtyLGUpLHRoaXMubGluZVRvKHQsZSl9LHAucHJvdG90eXBlLmZpbGxSZWN0PWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGlzTmFOKHQpfHxpc05hTihlKXx8aXNOYU4ocil8fGlzTmFOKG4pKXRocm93IG8uZXJyb3IoXCJqc1BERi5jb250ZXh0MmQuZmlsbFJlY3Q6IEludmFsaWQgYXJndW1lbnRzXCIsYXJndW1lbnRzKSxuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLmZpbGxSZWN0XCIpO2lmKCFtLmNhbGwodGhpcykpe3ZhciBpPXt9O1wiYnV0dFwiIT09dGhpcy5saW5lQ2FwJiYoaS5saW5lQ2FwPXRoaXMubGluZUNhcCx0aGlzLmxpbmVDYXA9XCJidXR0XCIpLFwibWl0ZXJcIiE9PXRoaXMubGluZUpvaW4mJihpLmxpbmVKb2luPXRoaXMubGluZUpvaW4sdGhpcy5saW5lSm9pbj1cIm1pdGVyXCIpLHRoaXMuYmVnaW5QYXRoKCksdGhpcy5yZWN0KHQsZSxyLG4pLHRoaXMuZmlsbCgpLGkuaGFzT3duUHJvcGVydHkoXCJsaW5lQ2FwXCIpJiYodGhpcy5saW5lQ2FwPWkubGluZUNhcCksaS5oYXNPd25Qcm9wZXJ0eShcImxpbmVKb2luXCIpJiYodGhpcy5saW5lSm9pbj1pLmxpbmVKb2luKX19LHAucHJvdG90eXBlLnN0cm9rZVJlY3Q9ZnVuY3Rpb24odCxlLHIsbil7aWYoaXNOYU4odCl8fGlzTmFOKGUpfHxpc05hTihyKXx8aXNOYU4obikpdGhyb3cgby5lcnJvcihcImpzUERGLmNvbnRleHQyZC5zdHJva2VSZWN0OiBJbnZhbGlkIGFyZ3VtZW50c1wiLGFyZ3VtZW50cyksbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmNvbnRleHQyZC5zdHJva2VSZWN0XCIpO3YuY2FsbCh0aGlzKXx8KHRoaXMuYmVnaW5QYXRoKCksdGhpcy5yZWN0KHQsZSxyLG4pLHRoaXMuc3Ryb2tlKCkpfSxwLnByb3RvdHlwZS5jbGVhclJlY3Q9ZnVuY3Rpb24odCxlLHIsbil7aWYoaXNOYU4odCl8fGlzTmFOKGUpfHxpc05hTihyKXx8aXNOYU4obikpdGhyb3cgby5lcnJvcihcImpzUERGLmNvbnRleHQyZC5jbGVhclJlY3Q6IEludmFsaWQgYXJndW1lbnRzXCIsYXJndW1lbnRzKSxuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLmNsZWFyUmVjdFwiKTt0aGlzLmlnbm9yZUNsZWFyUmVjdHx8KHRoaXMuZmlsbFN0eWxlPVwiI2ZmZmZmZlwiLHRoaXMuZmlsbFJlY3QodCxlLHIsbikpfSxwLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKHQpe3Q9XCJib29sZWFuXCIhPXR5cGVvZiB0fHx0O2Zvcih2YXIgZT10aGlzLnBkZi5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyLHI9MDtyPHRoaXMucGRmLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKTtyKyspdGhpcy5wZGYuc2V0UGFnZShyKzEpLHRoaXMucGRmLmludGVybmFsLm91dChcInFcIik7aWYodGhpcy5wZGYuc2V0UGFnZShlKSx0KXt0aGlzLmN0eC5mb250U2l6ZT10aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250U2l6ZSgpO3ZhciBuPW5ldyBkKHRoaXMuY3R4KTt0aGlzLmN0eFN0YWNrLnB1c2godGhpcy5jdHgpLHRoaXMuY3R4PW59fSxwLnByb3RvdHlwZS5yZXN0b3JlPWZ1bmN0aW9uKHQpe3Q9XCJib29sZWFuXCIhPXR5cGVvZiB0fHx0O2Zvcih2YXIgZT10aGlzLnBkZi5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyLHI9MDtyPHRoaXMucGRmLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKTtyKyspdGhpcy5wZGYuc2V0UGFnZShyKzEpLHRoaXMucGRmLmludGVybmFsLm91dChcIlFcIik7dGhpcy5wZGYuc2V0UGFnZShlKSx0JiYwIT09dGhpcy5jdHhTdGFjay5sZW5ndGgmJih0aGlzLmN0eD10aGlzLmN0eFN0YWNrLnBvcCgpLHRoaXMuZmlsbFN0eWxlPXRoaXMuY3R4LmZpbGxTdHlsZSx0aGlzLnN0cm9rZVN0eWxlPXRoaXMuY3R4LnN0cm9rZVN0eWxlLHRoaXMuZm9udD10aGlzLmN0eC5mb250LHRoaXMubGluZUNhcD10aGlzLmN0eC5saW5lQ2FwLHRoaXMubGluZVdpZHRoPXRoaXMuY3R4LmxpbmVXaWR0aCx0aGlzLmxpbmVKb2luPXRoaXMuY3R4LmxpbmVKb2luLHRoaXMubGluZURhc2g9dGhpcy5jdHgubGluZURhc2gsdGhpcy5saW5lRGFzaE9mZnNldD10aGlzLmN0eC5saW5lRGFzaE9mZnNldCl9LHAucHJvdG90eXBlLnRvRGF0YVVSTD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcInRvRGF0YVVybCBub3QgaW1wbGVtZW50ZWQuXCIpfTt2YXIgZz1mdW5jdGlvbih0KXt2YXIgZSxyLG4saTtpZighMD09PXQuaXNDYW52YXNHcmFkaWVudCYmKHQ9dC5nZXRDb2xvcigpKSwhdClyZXR1cm57cjowLGc6MCxiOjAsYTowLHN0eWxlOnR9O2lmKC90cmFuc3BhcmVudHxyZ2JhXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyowK1xccypcXCkvLnRlc3QodCkpZT0wLHI9MCxuPTAsaT0wO2Vsc2V7dmFyIGE9L3JnYlxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKS8uZXhlYyh0KTtpZihudWxsIT09YSllPXBhcnNlSW50KGFbMV0pLHI9cGFyc2VJbnQoYVsyXSksbj1wYXJzZUludChhWzNdKSxpPTE7ZWxzZSBpZihudWxsIT09KGE9L3JnYmFcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihbXFxkLl0rKVxccypcXCkvLmV4ZWModCkpKWU9cGFyc2VJbnQoYVsxXSkscj1wYXJzZUludChhWzJdKSxuPXBhcnNlSW50KGFbM10pLGk9cGFyc2VGbG9hdChhWzRdKTtlbHNle2lmKGk9MSxcInN0cmluZ1wiPT10eXBlb2YgdCYmXCIjXCIhPT10LmNoYXJBdCgwKSl7dmFyIG89bmV3IGgodCk7dD1vLm9rP28udG9IZXgoKTpcIiMwMDAwMDBcIn00PT09dC5sZW5ndGg/KGU9dC5zdWJzdHJpbmcoMSwyKSxlKz1lLHI9dC5zdWJzdHJpbmcoMiwzKSxyKz1yLG49dC5zdWJzdHJpbmcoMyw0KSxuKz1uKTooZT10LnN1YnN0cmluZygxLDMpLHI9dC5zdWJzdHJpbmcoMyw1KSxuPXQuc3Vic3RyaW5nKDUsNykpLGU9cGFyc2VJbnQoZSwxNikscj1wYXJzZUludChyLDE2KSxuPXBhcnNlSW50KG4sMTYpfX1yZXR1cm57cjplLGc6cixiOm4sYTppLHN0eWxlOnR9fSxtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmlzRmlsbFRyYW5zcGFyZW50fHwwPT10aGlzLmdsb2JhbEFscGhhfSx2PWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5jdHguaXNTdHJva2VUcmFuc3BhcmVudHx8MD09dGhpcy5nbG9iYWxBbHBoYSl9O3AucHJvdG90eXBlLmZpbGxUZXh0PWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGlzTmFOKGUpfHxpc05hTihyKXx8XCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgby5lcnJvcihcImpzUERGLmNvbnRleHQyZC5maWxsVGV4dDogSW52YWxpZCBhcmd1bWVudHNcIixhcmd1bWVudHMpLG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQuZmlsbFRleHRcIik7aWYobj1pc05hTihuKT92b2lkIDA6biwhbS5jYWxsKHRoaXMpKXt2YXIgaT1FKHRoaXMuY3R4LnRyYW5zZm9ybS5yb3RhdGlvbiksYT10aGlzLmN0eC50cmFuc2Zvcm0uc2NhbGVYO0MuY2FsbCh0aGlzLHt0ZXh0OnQseDplLHk6cixzY2FsZTphLGFuZ2xlOmksYWxpZ246dGhpcy50ZXh0QWxpZ24sbWF4V2lkdGg6bn0pfX0scC5wcm90b3R5cGUuc3Ryb2tlVGV4dD1mdW5jdGlvbih0LGUscixuKXtpZihpc05hTihlKXx8aXNOYU4ocil8fFwic3RyaW5nXCIhPXR5cGVvZiB0KXRocm93IG8uZXJyb3IoXCJqc1BERi5jb250ZXh0MmQuc3Ryb2tlVGV4dDogSW52YWxpZCBhcmd1bWVudHNcIixhcmd1bWVudHMpLG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQuc3Ryb2tlVGV4dFwiKTtpZighdi5jYWxsKHRoaXMpKXtuPWlzTmFOKG4pP3ZvaWQgMDpuO3ZhciBpPUUodGhpcy5jdHgudHJhbnNmb3JtLnJvdGF0aW9uKSxhPXRoaXMuY3R4LnRyYW5zZm9ybS5zY2FsZVg7Qy5jYWxsKHRoaXMse3RleHQ6dCx4OmUseTpyLHNjYWxlOmEscmVuZGVyaW5nTW9kZTpcInN0cm9rZVwiLGFuZ2xlOmksYWxpZ246dGhpcy50ZXh0QWxpZ24sbWF4V2lkdGg6bn0pfX0scC5wcm90b3R5cGUubWVhc3VyZVRleHQ9ZnVuY3Rpb24odCl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgby5lcnJvcihcImpzUERGLmNvbnRleHQyZC5tZWFzdXJlVGV4dDogSW52YWxpZCBhcmd1bWVudHNcIixhcmd1bWVudHMpLG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5jb250ZXh0MmQubWVhc3VyZVRleHRcIik7dmFyIGU9dGhpcy5wZGYscj10aGlzLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcixuPWUuaW50ZXJuYWwuZ2V0Rm9udFNpemUoKSxpPWUuZ2V0U3RyaW5nVW5pdFdpZHRoKHQpKm4vZS5pbnRlcm5hbC5zY2FsZUZhY3RvcjtyZXR1cm4gbmV3IGZ1bmN0aW9uKHQpe3ZhciBlPSh0PXR8fHt9KS53aWR0aHx8MDtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ3aWR0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX19KSx0aGlzfSh7d2lkdGg6aSo9TWF0aC5yb3VuZCg5NipyLzcyKjFlNCkvMWU0fSl9LHAucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odCl8fGlzTmFOKGUpKXRocm93IG8uZXJyb3IoXCJqc1BERi5jb250ZXh0MmQuc2NhbGU6IEludmFsaWQgYXJndW1lbnRzXCIsYXJndW1lbnRzKSxuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLnNjYWxlXCIpO3ZhciByPW5ldyBsKHQsMCwwLGUsMCwwKTt0aGlzLmN0eC50cmFuc2Zvcm09dGhpcy5jdHgudHJhbnNmb3JtLm11bHRpcGx5KHIpfSxwLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24odCl7aWYoaXNOYU4odCkpdGhyb3cgby5lcnJvcihcImpzUERGLmNvbnRleHQyZC5yb3RhdGU6IEludmFsaWQgYXJndW1lbnRzXCIsYXJndW1lbnRzKSxuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLnJvdGF0ZVwiKTt2YXIgZT1uZXcgbChNYXRoLmNvcyh0KSxNYXRoLnNpbih0KSwtTWF0aC5zaW4odCksTWF0aC5jb3ModCksMCwwKTt0aGlzLmN0eC50cmFuc2Zvcm09dGhpcy5jdHgudHJhbnNmb3JtLm11bHRpcGx5KGUpfSxwLnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8aXNOYU4oZSkpdGhyb3cgby5lcnJvcihcImpzUERGLmNvbnRleHQyZC50cmFuc2xhdGU6IEludmFsaWQgYXJndW1lbnRzXCIsYXJndW1lbnRzKSxuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuY29udGV4dDJkLnRyYW5zbGF0ZVwiKTt2YXIgcj1uZXcgbCgxLDAsMCwxLHQsZSk7dGhpcy5jdHgudHJhbnNmb3JtPXRoaXMuY3R4LnRyYW5zZm9ybS5tdWx0aXBseShyKX0scC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXtpZihpc05hTih0KXx8aXNOYU4oZSl8fGlzTmFOKHIpfHxpc05hTihuKXx8aXNOYU4oaSl8fGlzTmFOKGEpKXRocm93IG8uZXJyb3IoXCJqc1BERi5jb250ZXh0MmQudHJhbnNmb3JtOiBJbnZhbGlkIGFyZ3VtZW50c1wiLGFyZ3VtZW50cyksbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLmNvbnRleHQyZC50cmFuc2Zvcm1cIik7dmFyIHM9bmV3IGwodCxlLHIsbixpLGEpO3RoaXMuY3R4LnRyYW5zZm9ybT10aGlzLmN0eC50cmFuc2Zvcm0ubXVsdGlwbHkocyl9LHAucHJvdG90eXBlLnNldFRyYW5zZm9ybT1mdW5jdGlvbih0LGUscixuLGksYSl7dD1pc05hTih0KT8xOnQsZT1pc05hTihlKT8wOmUscj1pc05hTihyKT8wOnIsbj1pc05hTihuKT8xOm4saT1pc05hTihpKT8wOmksYT1pc05hTihhKT8wOmEsdGhpcy5jdHgudHJhbnNmb3JtPW5ldyBsKHQsZSxyLG4saSxhKX07dmFyIGI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXJnaW5bMF0+MHx8dGhpcy5tYXJnaW5bMV0+MHx8dGhpcy5tYXJnaW5bMl0+MHx8dGhpcy5tYXJnaW5bM10+MH07cC5wcm90b3R5cGUuZHJhd0ltYWdlPWZ1bmN0aW9uKHQsZSxyLG4saSxhLG8scyx1KXt2YXIgaD10aGlzLnBkZi5nZXRJbWFnZVByb3BlcnRpZXModCksZj0xLGQ9MSxwPTEsZz0xO3ZvaWQgMCE9PW4mJnZvaWQgMCE9PXMmJihwPXMvbixnPXUvaSxmPWgud2lkdGgvbipzL24sZD1oLmhlaWdodC9pKnUvaSksdm9pZCAwPT09YSYmKGE9ZSxvPXIsZT0wLHI9MCksdm9pZCAwIT09biYmdm9pZCAwPT09cyYmKHM9bix1PWkpLHZvaWQgMD09PW4mJnZvaWQgMD09PXMmJihzPWgud2lkdGgsdT1oLmhlaWdodCk7dmFyIG09dGhpcy5jdHgudHJhbnNmb3JtLmRlY29tcG9zZSgpLHY9RShtLnJvdGF0ZS5zaHgpLHc9bmV3IGwseD0odz0odz0odz13Lm11bHRpcGx5KG0udHJhbnNsYXRlKSkubXVsdGlwbHkobS5za2V3KSkubXVsdGlwbHkobS5zY2FsZSkpLmFwcGx5VG9SZWN0YW5nbGUobmV3IGMoYS1lKnAsby1yKmcsbipmLGkqZCkpO2lmKHRoaXMuYXV0b1BhZ2luZyl7Zm9yKHZhciBTLF89eS5jYWxsKHRoaXMseCksUD1bXSxrPTA7azxfLmxlbmd0aDtrKz0xKS0xPT09UC5pbmRleE9mKF9ba10pJiZQLnB1c2goX1trXSk7TChQKTtmb3IodmFyIEY9UFswXSxJPVBbUC5sZW5ndGgtMV0sQz1GO0M8SSsxO0MrKyl7dGhpcy5wZGYuc2V0UGFnZShDKTt2YXIgaj10aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aC10aGlzLm1hcmdpblszXS10aGlzLm1hcmdpblsxXSxPPTE9PT1DP3RoaXMucG9zWSt0aGlzLm1hcmdpblswXTp0aGlzLm1hcmdpblswXSxCPXRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLmhlaWdodC10aGlzLnBvc1ktdGhpcy5tYXJnaW5bMF0tdGhpcy5tYXJnaW5bMl0sTT10aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQtdGhpcy5tYXJnaW5bMF0tdGhpcy5tYXJnaW5bMl0scT0xPT09Qz8wOkIrKEMtMikqTTtpZigwIT09dGhpcy5jdHguY2xpcF9wYXRoLmxlbmd0aCl7dmFyIFI9dGhpcy5wYXRoO1M9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmN0eC5jbGlwX3BhdGgpKSx0aGlzLnBhdGg9TihTLHRoaXMucG9zWCt0aGlzLm1hcmdpblszXSwtcStPK3RoaXMuY3R4LnByZXZQYWdlTGFzdEVsZW1PZmZzZXQpLEEuY2FsbCh0aGlzLFwiZmlsbFwiLCEwKSx0aGlzLnBhdGg9Un12YXIgRD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHgpKTtEPU4oW0RdLHRoaXMucG9zWCt0aGlzLm1hcmdpblszXSwtcStPK3RoaXMuY3R4LnByZXZQYWdlTGFzdEVsZW1PZmZzZXQpWzBdO3ZhciBUPShDPkZ8fEM8SSkmJmIuY2FsbCh0aGlzKTtUJiYodGhpcy5wZGYuc2F2ZUdyYXBoaWNzU3RhdGUoKSx0aGlzLnBkZi5yZWN0KHRoaXMubWFyZ2luWzNdLHRoaXMubWFyZ2luWzBdLGosTSxudWxsKS5jbGlwKCkuZGlzY2FyZFBhdGgoKSksdGhpcy5wZGYuYWRkSW1hZ2UodCxcIkpQRUdcIixELngsRC55LEQudyxELmgsbnVsbCxudWxsLHYpLFQmJnRoaXMucGRmLnJlc3RvcmVHcmFwaGljc1N0YXRlKCl9fWVsc2UgdGhpcy5wZGYuYWRkSW1hZ2UodCxcIkpQRUdcIix4LngseC55LHgudyx4LmgsbnVsbCxudWxsLHYpfTt2YXIgeT1mdW5jdGlvbih0LGUscil7dmFyIG49W107ZT1lfHx0aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCxyPXJ8fHRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLmhlaWdodC10aGlzLm1hcmdpblswXS10aGlzLm1hcmdpblsyXTt2YXIgaT10aGlzLnBvc1krdGhpcy5jdHgucHJldlBhZ2VMYXN0RWxlbU9mZnNldDtzd2l0Y2godC50eXBlKXtkZWZhdWx0OmNhc2VcIm10XCI6Y2FzZVwibHRcIjpuLnB1c2goTWF0aC5mbG9vcigodC55K2kpL3IpKzEpO2JyZWFrO2Nhc2VcImFyY1wiOm4ucHVzaChNYXRoLmZsb29yKCh0LnkraS10LnJhZGl1cykvcikrMSksbi5wdXNoKE1hdGguZmxvb3IoKHQueStpK3QucmFkaXVzKS9yKSsxKTticmVhaztjYXNlXCJxY3RcIjp2YXIgYT1SKHRoaXMuY3R4Lmxhc3RQb2ludC54LHRoaXMuY3R4Lmxhc3RQb2ludC55LHQueDEsdC55MSx0LngsdC55KTtuLnB1c2goTWF0aC5mbG9vcigoYS55K2kpL3IpKzEpLG4ucHVzaChNYXRoLmZsb29yKChhLnkrYS5oK2kpL3IpKzEpO2JyZWFrO2Nhc2VcImJjdFwiOnZhciBvPUQodGhpcy5jdHgubGFzdFBvaW50LngsdGhpcy5jdHgubGFzdFBvaW50LnksdC54MSx0LnkxLHQueDIsdC55Mix0LngsdC55KTtuLnB1c2goTWF0aC5mbG9vcigoby55K2kpL3IpKzEpLG4ucHVzaChNYXRoLmZsb29yKChvLnkrby5oK2kpL3IpKzEpO2JyZWFrO2Nhc2VcInJlY3RcIjpuLnB1c2goTWF0aC5mbG9vcigodC55K2kpL3IpKzEpLG4ucHVzaChNYXRoLmZsb29yKCh0LnkrdC5oK2kpL3IpKzEpfWZvcih2YXIgcz0wO3M8bi5sZW5ndGg7cys9MSlmb3IoO3RoaXMucGRmLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKTxuW3NdOyl3LmNhbGwodGhpcyk7cmV0dXJuIG59LHc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZpbGxTdHlsZSxlPXRoaXMuc3Ryb2tlU3R5bGUscj10aGlzLmZvbnQsbj10aGlzLmxpbmVDYXAsaT10aGlzLmxpbmVXaWR0aCxhPXRoaXMubGluZUpvaW47dGhpcy5wZGYuYWRkUGFnZSgpLHRoaXMuZmlsbFN0eWxlPXQsdGhpcy5zdHJva2VTdHlsZT1lLHRoaXMuZm9udD1yLHRoaXMubGluZUNhcD1uLHRoaXMubGluZVdpZHRoPWksdGhpcy5saW5lSm9pbj1hfSxOPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylzd2l0Y2godFtuXS50eXBlKXtjYXNlXCJiY3RcIjp0W25dLngyKz1lLHRbbl0ueTIrPXI7Y2FzZVwicWN0XCI6dFtuXS54MSs9ZSx0W25dLnkxKz1yO2RlZmF1bHQ6dFtuXS54Kz1lLHRbbl0ueSs9cn1yZXR1cm4gdH0sTD1mdW5jdGlvbih0KXtyZXR1cm4gdC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pfSx4PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5maWxsU3R5bGUsbj10aGlzLnN0cm9rZVN0eWxlLGk9dGhpcy5saW5lQ2FwLGE9dGhpcy5saW5lV2lkdGgsbz1NYXRoLmFicyhhKnRoaXMuY3R4LnRyYW5zZm9ybS5zY2FsZVgpLHM9dGhpcy5saW5lSm9pbjtpZih0aGlzLmF1dG9QYWdpbmcpe2Zvcih2YXIgdSxjLGw9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnBhdGgpKSxoPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5wYXRoKSksZj1bXSxkPTA7ZDxoLmxlbmd0aDtkKyspaWYodm9pZCAwIT09aFtkXS54KWZvcih2YXIgcD15LmNhbGwodGhpcyxoW2RdKSxnPTA7ZzxwLmxlbmd0aDtnKz0xKS0xPT09Zi5pbmRleE9mKHBbZ10pJiZmLnB1c2gocFtnXSk7Zm9yKHZhciBtPTA7bTxmLmxlbmd0aDttKyspZm9yKDt0aGlzLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCk8ZlttXTspdy5jYWxsKHRoaXMpO0woZik7Zm9yKHZhciB2PWZbMF0seD1mW2YubGVuZ3RoLTFdLFM9djtTPHgrMTtTKyspe3RoaXMucGRmLnNldFBhZ2UoUyksdGhpcy5maWxsU3R5bGU9cix0aGlzLnN0cm9rZVN0eWxlPW4sdGhpcy5saW5lQ2FwPWksdGhpcy5saW5lV2lkdGg9byx0aGlzLmxpbmVKb2luPXM7dmFyIF89dGhpcy5wZGYuaW50ZXJuYWwucGFnZVNpemUud2lkdGgtdGhpcy5tYXJnaW5bM10tdGhpcy5tYXJnaW5bMV0sUD0xPT09Uz90aGlzLnBvc1krdGhpcy5tYXJnaW5bMF06dGhpcy5tYXJnaW5bMF0saz10aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQtdGhpcy5wb3NZLXRoaXMubWFyZ2luWzBdLXRoaXMubWFyZ2luWzJdLEY9dGhpcy5wZGYuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0LXRoaXMubWFyZ2luWzBdLXRoaXMubWFyZ2luWzJdLEk9MT09PVM/MDprKyhTLTIpKkY7aWYoMCE9PXRoaXMuY3R4LmNsaXBfcGF0aC5sZW5ndGgpe3ZhciBDPXRoaXMucGF0aDt1PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jdHguY2xpcF9wYXRoKSksdGhpcy5wYXRoPU4odSx0aGlzLnBvc1grdGhpcy5tYXJnaW5bM10sLUkrUCt0aGlzLmN0eC5wcmV2UGFnZUxhc3RFbGVtT2Zmc2V0KSxBLmNhbGwodGhpcyx0LCEwKSx0aGlzLnBhdGg9Q31pZihjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobCkpLHRoaXMucGF0aD1OKGMsdGhpcy5wb3NYK3RoaXMubWFyZ2luWzNdLC1JK1ArdGhpcy5jdHgucHJldlBhZ2VMYXN0RWxlbU9mZnNldCksITE9PT1lfHwwPT09Uyl7dmFyIGo9KFM+dnx8Uzx4KSYmYi5jYWxsKHRoaXMpO2omJih0aGlzLnBkZi5zYXZlR3JhcGhpY3NTdGF0ZSgpLHRoaXMucGRmLnJlY3QodGhpcy5tYXJnaW5bM10sdGhpcy5tYXJnaW5bMF0sXyxGLG51bGwpLmNsaXAoKS5kaXNjYXJkUGF0aCgpKSxBLmNhbGwodGhpcyx0LGUpLGomJnRoaXMucGRmLnJlc3RvcmVHcmFwaGljc1N0YXRlKCl9dGhpcy5saW5lV2lkdGg9YX10aGlzLnBhdGg9bH1lbHNlIHRoaXMubGluZVdpZHRoPW8sQS5jYWxsKHRoaXMsdCxlKSx0aGlzLmxpbmVXaWR0aD1hfSxBPWZ1bmN0aW9uKHQsZSl7aWYoKFwic3Ryb2tlXCIhPT10fHxlfHwhdi5jYWxsKHRoaXMpKSYmKFwic3Ryb2tlXCI9PT10fHxlfHwhbS5jYWxsKHRoaXMpKSl7Zm9yKHZhciByLG4saT1bXSxhPXRoaXMucGF0aCxvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBzPWFbb107c3dpdGNoKHMudHlwZSl7Y2FzZVwiYmVnaW5cIjppLnB1c2goe2JlZ2luOiEwfSk7YnJlYWs7Y2FzZVwiY2xvc2VcIjppLnB1c2goe2Nsb3NlOiEwfSk7YnJlYWs7Y2FzZVwibXRcIjppLnB1c2goe3N0YXJ0OnMsZGVsdGFzOltdLGFiczpbXX0pO2JyZWFrO2Nhc2VcImx0XCI6dmFyIHU9aS5sZW5ndGg7aWYoYVtvLTFdJiYhaXNOYU4oYVtvLTFdLngpJiYocj1bcy54LWFbby0xXS54LHMueS1hW28tMV0ueV0sdT4wKSlmb3IoO3U+PTA7dS0tKWlmKCEwIT09aVt1LTFdLmNsb3NlJiYhMCE9PWlbdS0xXS5iZWdpbil7aVt1LTFdLmRlbHRhcy5wdXNoKHIpLGlbdS0xXS5hYnMucHVzaChzKTticmVha31icmVhaztjYXNlXCJiY3RcIjpyPVtzLngxLWFbby0xXS54LHMueTEtYVtvLTFdLnkscy54Mi1hW28tMV0ueCxzLnkyLWFbby0xXS55LHMueC1hW28tMV0ueCxzLnktYVtvLTFdLnldLGlbaS5sZW5ndGgtMV0uZGVsdGFzLnB1c2gocik7YnJlYWs7Y2FzZVwicWN0XCI6dmFyIGM9YVtvLTFdLngrMi8zKihzLngxLWFbby0xXS54KSxsPWFbby0xXS55KzIvMyoocy55MS1hW28tMV0ueSksaD1zLngrMi8zKihzLngxLXMueCksZj1zLnkrMi8zKihzLnkxLXMueSksZD1zLngscD1zLnk7cj1bYy1hW28tMV0ueCxsLWFbby0xXS55LGgtYVtvLTFdLngsZi1hW28tMV0ueSxkLWFbby0xXS54LHAtYVtvLTFdLnldLGlbaS5sZW5ndGgtMV0uZGVsdGFzLnB1c2gocik7YnJlYWs7Y2FzZVwiYXJjXCI6aS5wdXNoKHtkZWx0YXM6W10sYWJzOltdLGFyYzohMH0pLEFycmF5LmlzQXJyYXkoaVtpLmxlbmd0aC0xXS5hYnMpJiZpW2kubGVuZ3RoLTFdLmFicy5wdXNoKHMpfX1uPWU/bnVsbDpcInN0cm9rZVwiPT09dD9cInN0cm9rZVwiOlwiZmlsbFwiO2Zvcih2YXIgZz0hMSxiPTA7YjxpLmxlbmd0aDtiKyspaWYoaVtiXS5hcmMpZm9yKHZhciB5PWlbYl0uYWJzLHc9MDt3PHkubGVuZ3RoO3crKyl7dmFyIE49eVt3XTtcImFyY1wiPT09Ti50eXBlP1AuY2FsbCh0aGlzLE4ueCxOLnksTi5yYWRpdXMsTi5zdGFydEFuZ2xlLE4uZW5kQW5nbGUsTi5jb3VudGVyY2xvY2t3aXNlLHZvaWQgMCxlLCFnKTpqLmNhbGwodGhpcyxOLngsTi55KSxnPSEwfWVsc2UgaWYoITA9PT1pW2JdLmNsb3NlKXRoaXMucGRmLmludGVybmFsLm91dChcImhcIiksZz0hMTtlbHNlIGlmKCEwIT09aVtiXS5iZWdpbil7dmFyIEw9aVtiXS5zdGFydC54LHg9aVtiXS5zdGFydC55O08uY2FsbCh0aGlzLGlbYl0uZGVsdGFzLEwseCksZz0hMH1uJiZrLmNhbGwodGhpcyxuKSxlJiZGLmNhbGwodGhpcyl9fSxTPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCkvdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3Iscj1lKih0aGlzLnBkZi5pbnRlcm5hbC5nZXRMaW5lSGVpZ2h0RmFjdG9yKCktMSk7c3dpdGNoKHRoaXMuY3R4LnRleHRCYXNlbGluZSl7Y2FzZVwiYm90dG9tXCI6cmV0dXJuIHQtcjtjYXNlXCJ0b3BcIjpyZXR1cm4gdCtlLXI7Y2FzZVwiaGFuZ2luZ1wiOnJldHVybiB0K2UtMipyO2Nhc2VcIm1pZGRsZVwiOnJldHVybiB0K2UvMi1yO2RlZmF1bHQ6cmV0dXJuIHR9fSxfPWZ1bmN0aW9uKHQpe3JldHVybiB0K3RoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCkvdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3IqKHRoaXMucGRmLmludGVybmFsLmdldExpbmVIZWlnaHRGYWN0b3IoKS0xKX07cC5wcm90b3R5cGUuY3JlYXRlTGluZWFyR3JhZGllbnQ9ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbigpe307cmV0dXJuIHQuY29sb3JTdG9wcz1bXSx0LmFkZENvbG9yU3RvcD1mdW5jdGlvbih0LGUpe3RoaXMuY29sb3JTdG9wcy5wdXNoKFt0LGVdKX0sdC5nZXRDb2xvcj1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5jb2xvclN0b3BzLmxlbmd0aD9cIiMwMDAwMDBcIjp0aGlzLmNvbG9yU3RvcHNbMF1bMV19LHQuaXNDYW52YXNHcmFkaWVudD0hMCx0fSxwLnByb3RvdHlwZS5jcmVhdGVQYXR0ZXJuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3JlYXRlTGluZWFyR3JhZGllbnQoKX0scC5wcm90b3R5cGUuY3JlYXRlUmFkaWFsR3JhZGllbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jcmVhdGVMaW5lYXJHcmFkaWVudCgpfTt2YXIgUD1mdW5jdGlvbih0LGUscixuLGksYSxvLHMsdSl7Zm9yKHZhciBjPU0uY2FsbCh0aGlzLHIsbixpLGEpLGw9MDtsPGMubGVuZ3RoO2wrKyl7dmFyIGg9Y1tsXTswPT09bCYmKHU/SS5jYWxsKHRoaXMsaC54MSt0LGgueTErZSk6ai5jYWxsKHRoaXMsaC54MSt0LGgueTErZSkpLEIuY2FsbCh0aGlzLHQsZSxoLngyLGgueTIsaC54MyxoLnkzLGgueDQsaC55NCl9cz9GLmNhbGwodGhpcyk6ay5jYWxsKHRoaXMsbyl9LGs9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2VcInN0cm9rZVwiOnRoaXMucGRmLmludGVybmFsLm91dChcIlNcIik7YnJlYWs7Y2FzZVwiZmlsbFwiOnRoaXMucGRmLmludGVybmFsLm91dChcImZcIil9fSxGPWZ1bmN0aW9uKCl7dGhpcy5wZGYuY2xpcCgpLHRoaXMucGRmLmRpc2NhcmRQYXRoKCl9LEk9ZnVuY3Rpb24odCxlKXt0aGlzLnBkZi5pbnRlcm5hbC5vdXQobih0KStcIiBcIitpKGUpK1wiIG1cIil9LEM9ZnVuY3Rpb24odCl7dmFyIGU7c3dpdGNoKHQuYWxpZ24pe2Nhc2VcInJpZ2h0XCI6Y2FzZVwiZW5kXCI6ZT1cInJpZ2h0XCI7YnJlYWs7Y2FzZVwiY2VudGVyXCI6ZT1cImNlbnRlclwiO2JyZWFrO2RlZmF1bHQ6ZT1cImxlZnRcIn12YXIgcixuLGksYT10aGlzLnBkZi5nZXRUZXh0RGltZW5zaW9ucyh0LnRleHQpLG89Uy5jYWxsKHRoaXMsdC55KSxzPV8uY2FsbCh0aGlzLG8pLWEuaCxoPXRoaXMuY3R4LnRyYW5zZm9ybS5hcHBseVRvUG9pbnQobmV3IHUodC54LG8pKTtpZih0aGlzLmF1dG9QYWdpbmcpe3ZhciBmPXRoaXMuY3R4LnRyYW5zZm9ybS5kZWNvbXBvc2UoKSxkPW5ldyBsO2Q9KGQ9KGQ9ZC5tdWx0aXBseShmLnRyYW5zbGF0ZSkpLm11bHRpcGx5KGYuc2tldykpLm11bHRpcGx5KGYuc2NhbGUpO2Zvcih2YXIgcD10aGlzLmN0eC50cmFuc2Zvcm0uYXBwbHlUb1JlY3RhbmdsZShuZXcgYyh0LngsbyxhLncsYS5oKSksZz1kLmFwcGx5VG9SZWN0YW5nbGUobmV3IGModC54LHMsYS53LGEuaCkpLG09eS5jYWxsKHRoaXMsZyksdj1bXSx3PTA7dzxtLmxlbmd0aDt3Kz0xKS0xPT09di5pbmRleE9mKG1bd10pJiZ2LnB1c2gobVt3XSk7TCh2KTtmb3IodmFyIHg9dlswXSxQPXZbdi5sZW5ndGgtMV0saz14O2s8UCsxO2srKyl7dGhpcy5wZGYuc2V0UGFnZShrKTt2YXIgRj0xPT09az90aGlzLnBvc1krdGhpcy5tYXJnaW5bMF06dGhpcy5tYXJnaW5bMF0sST10aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQtdGhpcy5wb3NZLXRoaXMubWFyZ2luWzBdLXRoaXMubWFyZ2luWzJdLEM9dGhpcy5wZGYuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0LXRoaXMubWFyZ2luWzJdLGo9Qy10aGlzLm1hcmdpblswXSxPPXRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLndpZHRoLXRoaXMubWFyZ2luWzFdLEI9Ty10aGlzLm1hcmdpblszXSxNPTE9PT1rPzA6SSsoay0yKSpqO2lmKDAhPT10aGlzLmN0eC5jbGlwX3BhdGgubGVuZ3RoKXt2YXIgcT10aGlzLnBhdGg7cj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY3R4LmNsaXBfcGF0aCkpLHRoaXMucGF0aD1OKHIsdGhpcy5wb3NYK3RoaXMubWFyZ2luWzNdLC0xKk0rRiksQS5jYWxsKHRoaXMsXCJmaWxsXCIsITApLHRoaXMucGF0aD1xfXZhciBFPU4oW0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZykpXSx0aGlzLnBvc1grdGhpcy5tYXJnaW5bM10sLU0rRit0aGlzLmN0eC5wcmV2UGFnZUxhc3RFbGVtT2Zmc2V0KVswXTt0LnNjYWxlPj0uMDEmJihuPXRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCksdGhpcy5wZGYuc2V0Rm9udFNpemUobip0LnNjYWxlKSxpPXRoaXMubGluZVdpZHRoLHRoaXMubGluZVdpZHRoPWkqdC5zY2FsZSk7dmFyIFI9XCJ0ZXh0XCIhPT10aGlzLmF1dG9QYWdpbmc7aWYoUnx8RS55K0UuaDw9Qyl7aWYoUnx8RS55Pj1GJiZFLng8PU8pe3ZhciBEPVI/dC50ZXh0OnRoaXMucGRmLnNwbGl0VGV4dFRvU2l6ZSh0LnRleHQsdC5tYXhXaWR0aHx8Ty1FLngpWzBdLFQ9TihbSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwKSldLHRoaXMucG9zWCt0aGlzLm1hcmdpblszXSwtTStGK3RoaXMuY3R4LnByZXZQYWdlTGFzdEVsZW1PZmZzZXQpWzBdLHo9UiYmKGs+eHx8azxQKSYmYi5jYWxsKHRoaXMpO3omJih0aGlzLnBkZi5zYXZlR3JhcGhpY3NTdGF0ZSgpLHRoaXMucGRmLnJlY3QodGhpcy5tYXJnaW5bM10sdGhpcy5tYXJnaW5bMF0sQixqLG51bGwpLmNsaXAoKS5kaXNjYXJkUGF0aCgpKSx0aGlzLnBkZi50ZXh0KEQsVC54LFQueSx7YW5nbGU6dC5hbmdsZSxhbGlnbjplLHJlbmRlcmluZ01vZGU6dC5yZW5kZXJpbmdNb2RlfSkseiYmdGhpcy5wZGYucmVzdG9yZUdyYXBoaWNzU3RhdGUoKX19ZWxzZSBFLnk8QyYmKHRoaXMuY3R4LnByZXZQYWdlTGFzdEVsZW1PZmZzZXQrPUMtRS55KTt0LnNjYWxlPj0uMDEmJih0aGlzLnBkZi5zZXRGb250U2l6ZShuKSx0aGlzLmxpbmVXaWR0aD1pKX19ZWxzZSB0LnNjYWxlPj0uMDEmJihuPXRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCksdGhpcy5wZGYuc2V0Rm9udFNpemUobip0LnNjYWxlKSxpPXRoaXMubGluZVdpZHRoLHRoaXMubGluZVdpZHRoPWkqdC5zY2FsZSksdGhpcy5wZGYudGV4dCh0LnRleHQsaC54K3RoaXMucG9zWCxoLnkrdGhpcy5wb3NZLHthbmdsZTp0LmFuZ2xlLGFsaWduOmUscmVuZGVyaW5nTW9kZTp0LnJlbmRlcmluZ01vZGUsbWF4V2lkdGg6dC5tYXhXaWR0aH0pLHQuc2NhbGU+PS4wMSYmKHRoaXMucGRmLnNldEZvbnRTaXplKG4pLHRoaXMubGluZVdpZHRoPWkpfSxqPWZ1bmN0aW9uKHQsZSxyLGEpe3I9cnx8MCxhPWF8fDAsdGhpcy5wZGYuaW50ZXJuYWwub3V0KG4odCtyKStcIiBcIitpKGUrYSkrXCIgbFwiKX0sTz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRoaXMucGRmLmxpbmVzKHQsZSxyLG51bGwsbnVsbCl9LEI9ZnVuY3Rpb24odCxlLG4saSxvLHUsYyxsKXt0aGlzLnBkZi5pbnRlcm5hbC5vdXQoW3IoYShuK3QpKSxyKHMoaStlKSkscihhKG8rdCkpLHIocyh1K2UpKSxyKGEoYyt0KSkscihzKGwrZSkpLFwiY1wiXS5qb2luKFwiIFwiKSl9LE09ZnVuY3Rpb24odCxlLHIsbil7Zm9yKHZhciBpPTIqTWF0aC5QSSxhPU1hdGguUEkvMjtlPnI7KWUtPWk7dmFyIG89TWF0aC5hYnMoci1lKTtvPGkmJm4mJihvPWktbyk7Zm9yKHZhciBzPVtdLHU9bj8tMToxLGM9ZTtvPjFlLTU7KXt2YXIgbD1jK3UqTWF0aC5taW4obyxhKTtzLnB1c2gocS5jYWxsKHRoaXMsdCxjLGwpKSxvLT1NYXRoLmFicyhsLWMpLGM9bH1yZXR1cm4gc30scT1mdW5jdGlvbih0LGUscil7dmFyIG49KHItZSkvMixpPXQqTWF0aC5jb3MobiksYT10Kk1hdGguc2luKG4pLG89aSxzPS1hLHU9bypvK3MqcyxjPXUrbyppK3MqYSxsPTQvMyooTWF0aC5zcXJ0KDIqdSpjKS1jKS8obyphLXMqaSksaD1vLWwqcyxmPXMrbCpvLGQ9aCxwPS1mLGc9bitlLG09TWF0aC5jb3MoZyksdj1NYXRoLnNpbihnKTtyZXR1cm57eDE6dCpNYXRoLmNvcyhlKSx5MTp0Kk1hdGguc2luKGUpLHgyOmgqbS1mKnYseTI6aCp2K2YqbSx4MzpkKm0tcCp2LHkzOmQqditwKm0seDQ6dCpNYXRoLmNvcyhyKSx5NDp0Kk1hdGguc2luKHIpfX0sRT1mdW5jdGlvbih0KXtyZXR1cm4gMTgwKnQvTWF0aC5QSX0sUj1mdW5jdGlvbih0LGUscixuLGksYSl7dmFyIG89dCsuNSooci10KSxzPWUrLjUqKG4tZSksdT1pKy41KihyLWkpLGw9YSsuNSoobi1hKSxoPU1hdGgubWluKHQsaSxvLHUpLGY9TWF0aC5tYXgodCxpLG8sdSksZD1NYXRoLm1pbihlLGEscyxsKSxwPU1hdGgubWF4KGUsYSxzLGwpO3JldHVybiBuZXcgYyhoLGQsZi1oLHAtZCl9LEQ9ZnVuY3Rpb24odCxlLHIsbixpLGEsbyxzKXt2YXIgdSxsLGgsZixkLHAsZyxtLHYsYix5LHcsTixMLHg9ci10LEE9bi1lLFM9aS1yLF89YS1uLFA9by1pLGs9cy1hO2ZvcihsPTA7bDw0MTtsKyspdj0oZz0oaD10Kyh1PWwvNDApKngpK3UqKChkPXIrdSpTKS1oKSkrdSooZCt1KihpK3UqUC1kKS1nKSxiPShtPShmPWUrdSpBKSt1KigocD1uK3UqXyktZikpK3UqKHArdSooYSt1KmstcCktbSksMD09bD8oeT12LHc9YixOPXYsTD1iKTooeT1NYXRoLm1pbih5LHYpLHc9TWF0aC5taW4odyxiKSxOPU1hdGgubWF4KE4sdiksTD1NYXRoLm1heChMLGIpKTtyZXR1cm4gbmV3IGMoTWF0aC5yb3VuZCh5KSxNYXRoLnJvdW5kKHcpLE1hdGgucm91bmQoTi15KSxNYXRoLnJvdW5kKEwtdykpfSxUPWZ1bmN0aW9uKCl7aWYodGhpcy5wcmV2TGluZURhc2h8fHRoaXMuY3R4LmxpbmVEYXNoLmxlbmd0aHx8dGhpcy5jdHgubGluZURhc2hPZmZzZXQpe3ZhciB0LGUscj0odD10aGlzLmN0eC5saW5lRGFzaCxlPXRoaXMuY3R4LmxpbmVEYXNoT2Zmc2V0LEpTT04uc3RyaW5naWZ5KHtsaW5lRGFzaDp0LGxpbmVEYXNoT2Zmc2V0OmV9KSk7dGhpcy5wcmV2TGluZURhc2ghPT1yJiYodGhpcy5wZGYuc2V0TGluZURhc2godGhpcy5jdHgubGluZURhc2gsdGhpcy5jdHgubGluZURhc2hPZmZzZXQpLHRoaXMucHJldkxpbmVEYXNoPXIpfX19KEUuQVBJKSxcbi8qKlxuICogQGxpY2Vuc2VcbiAqIGpzUERGIGZpbHRlcnMgUGx1Z0luXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQXJhcyBBYmJhc2lcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuZnVuY3Rpb24odCl7dmFyIHI9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksYSxvLHMsdSxjLGw7Zm9yKC9bXlxceDAwLVxceEZGXS8udGVzdCh0KSxyPVtdLG49MCxpPSh0Kz1lPVwiXFwwXFwwXFwwXFwwXCIuc2xpY2UodC5sZW5ndGglNHx8NCkpLmxlbmd0aDtpPm47bis9NCkwIT09KGE9KHQuY2hhckNvZGVBdChuKTw8MjQpKyh0LmNoYXJDb2RlQXQobisxKTw8MTYpKyh0LmNoYXJDb2RlQXQobisyKTw8OCkrdC5jaGFyQ29kZUF0KG4rMykpPyhvPShhPSgoYT0oKGE9KChhPShhLShsPWElODUpKS84NSktKGM9YSU4NSkpLzg1KS0odT1hJTg1KSkvODUpLShzPWElODUpKS84NSklODUsci5wdXNoKG8rMzMscyszMyx1KzMzLGMrMzMsbCszMykpOnIucHVzaCgxMjIpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lO3I+MDtyLS0pdC5wb3AoKX0ocixlLmxlbmd0aCksU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscikrXCJ+PlwifSxuPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLGEsbz1TdHJpbmcscz1cImxlbmd0aFwiLHU9MjU1LGM9XCJjaGFyQ29kZUF0XCIsbD1cInNsaWNlXCIsaD1cInJlcGxhY2VcIjtmb3IodFtsXSgtMiksdD10W2xdKDAsLTIpW2hdKC9cXHMvZyxcIlwiKVtoXShcInpcIixcIiEhISEhXCIpLG49W10saT0wLGE9KHQrPWU9XCJ1dXV1dVwiW2xdKHRbc10lNXx8NSkpW3NdO2E+aTtpKz01KXI9NTIyMDA2MjUqKHRbY10oaSktMzMpKzYxNDEyNSoodFtjXShpKzEpLTMzKSs3MjI1Kih0W2NdKGkrMiktMzMpKzg1Kih0W2NdKGkrMyktMzMpKyh0W2NdKGkrNCktMzMpLG4ucHVzaCh1JnI+PjI0LHUmcj4+MTYsdSZyPj44LHUmcik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWU7cj4wO3ItLSl0LnBvcCgpfShuLGVbc10pLG8uZnJvbUNoYXJDb2RlLmFwcGx5KG8sbil9LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BsaXQoXCJcIikubWFwKGZ1bmN0aW9uKHQpe3JldHVybihcIjBcIit0LmNoYXJDb2RlQXQoKS50b1N0cmluZygxNikpLnNsaWNlKC0yKX0pLmpvaW4oXCJcIikrXCI+XCJ9LGE9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFJlZ0V4cCgvXihbMC05QS1GYS1mXXsyfSkrJC8pO2lmKC0xIT09KHQ9dC5yZXBsYWNlKC9cXHMvZyxcIlwiKSkuaW5kZXhPZihcIj5cIikmJih0PXQuc3Vic3RyKDAsdC5pbmRleE9mKFwiPlwiKSkpLHQubGVuZ3RoJTImJih0Kz1cIjBcIiksITE9PT1lLnRlc3QodCkpcmV0dXJuXCJcIjtmb3IodmFyIHI9XCJcIixuPTA7bjx0Lmxlbmd0aDtuKz0yKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoXCIweFwiKyh0W25dK3RbbisxXSkpO3JldHVybiByfSxvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCksbj10Lmxlbmd0aDtuLS07KXJbbl09dC5jaGFyQ29kZUF0KG4pO3JldHVybihyPWUocikpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K1N0cmluZy5mcm9tQ2hhckNvZGUoZSl9LFwiXCIpfTt0LnByb2Nlc3NEYXRhQnlGaWx0ZXJzPWZ1bmN0aW9uKHQsZSl7dmFyIHM9MCx1PXR8fFwiXCIsYz1bXTtmb3IoXCJzdHJpbmdcIj09dHlwZW9mKGU9ZXx8W10pJiYoZT1bZV0pLHM9MDtzPGUubGVuZ3RoO3MrPTEpc3dpdGNoKGVbc10pe2Nhc2VcIkFTQ0lJODVEZWNvZGVcIjpjYXNlXCIvQVNDSUk4NURlY29kZVwiOnU9bih1KSxjLnB1c2goXCIvQVNDSUk4NUVuY29kZVwiKTticmVhaztjYXNlXCJBU0NJSTg1RW5jb2RlXCI6Y2FzZVwiL0FTQ0lJODVFbmNvZGVcIjp1PXIodSksYy5wdXNoKFwiL0FTQ0lJODVEZWNvZGVcIik7YnJlYWs7Y2FzZVwiQVNDSUlIZXhEZWNvZGVcIjpjYXNlXCIvQVNDSUlIZXhEZWNvZGVcIjp1PWEodSksYy5wdXNoKFwiL0FTQ0lJSGV4RW5jb2RlXCIpO2JyZWFrO2Nhc2VcIkFTQ0lJSGV4RW5jb2RlXCI6Y2FzZVwiL0FTQ0lJSGV4RW5jb2RlXCI6dT1pKHUpLGMucHVzaChcIi9BU0NJSUhleERlY29kZVwiKTticmVhaztjYXNlXCJGbGF0ZUVuY29kZVwiOmNhc2VcIi9GbGF0ZUVuY29kZVwiOnU9byh1KSxjLnB1c2goXCIvRmxhdGVEZWNvZGVcIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ1RoZSBmaWx0ZXI6IFwiJytlW3NdKydcIiBpcyBub3QgaW1wbGVtZW50ZWQnKX1yZXR1cm57ZGF0YTp1LHJldmVyc2VDaGFpbjpjLnJldmVyc2UoKS5qb2luKFwiIFwiKX19fShFLkFQSSksXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBqc1BERiBmaWxlbG9hZGluZyBQbHVnSW5cbiAqIENvcHlyaWdodCAoYykgMjAxOCBBcmFzIEFiYmFzaSAoYXJhcy5hYmJhc2lAZ21haWwuY29tKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5mdW5jdGlvbih0KXt0LmxvYWRGaWxlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2U9ITEhPT1lLHI9XCJmdW5jdGlvblwiPT10eXBlb2Ygcj9yOmZ1bmN0aW9uKCl7fTt2YXIgbj12b2lkIDA7dHJ5e249ZnVuY3Rpb24odCxlLHIpe3ZhciBuPW5ldyBYTUxIdHRwUmVxdWVzdCxpPTAsYT1mdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxyPVtdLG49U3RyaW5nLmZyb21DaGFyQ29kZTtmb3IoaT0wO2k8ZTtpKz0xKXIucHVzaChuKDI1NSZ0LmNoYXJDb2RlQXQoaSkpKTtyZXR1cm4gci5qb2luKFwiXCIpfTtpZihuLm9wZW4oXCJHRVRcIix0LCFlKSxuLm92ZXJyaWRlTWltZVR5cGUoXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXgtdXNlci1kZWZpbmVkXCIpLCExPT09ZSYmKG4ub25sb2FkPWZ1bmN0aW9uKCl7MjAwPT09bi5zdGF0dXM/cihhKHRoaXMucmVzcG9uc2VUZXh0KSk6cih2b2lkIDApfSksbi5zZW5kKG51bGwpLGUmJjIwMD09PW4uc3RhdHVzKXJldHVybiBhKG4ucmVzcG9uc2VUZXh0KX0odCxlLHIpfWNhdGNoKGkpe31yZXR1cm4gbn0odCxlLHIpfSx0LmFsbG93RnNSZWFkPXZvaWQgMCx0LmxvYWRJbWFnZUZpbGU9dC5sb2FkRmlsZX0oRS5BUEkpLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4oaS5odG1sMmNhbnZhcz9Qcm9taXNlLnJlc29sdmUoaS5odG1sMmNhbnZhcyk6aW1wb3J0KFwiaHRtbDJjYW52YXNcIikpLmNhdGNoKGZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBodG1sMmNhbnZhczogXCIrdCkpfSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5kZWZhdWx0P3QuZGVmYXVsdDp0fSl9ZnVuY3Rpb24gbigpe3JldHVybihpLkRPTVB1cmlmeT9Qcm9taXNlLnJlc29sdmUoaS5ET01QdXJpZnkpOmltcG9ydChcImRvbXB1cmlmeVwiKSkuY2F0Y2goZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2FkIGRvbXB1cmlmeTogXCIrdCkpfSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5kZWZhdWx0P3QuZGVmYXVsdDp0fSl9dmFyIGE9ZnVuY3Rpb24oZSl7dmFyIHI9dChlKTtyZXR1cm5cInVuZGVmaW5lZFwiPT09cj9cInVuZGVmaW5lZFwiOlwic3RyaW5nXCI9PT1yfHxlIGluc3RhbmNlb2YgU3RyaW5nP1wic3RyaW5nXCI6XCJudW1iZXJcIj09PXJ8fGUgaW5zdGFuY2VvZiBOdW1iZXI/XCJudW1iZXJcIjpcImZ1bmN0aW9uXCI9PT1yfHxlIGluc3RhbmNlb2YgRnVuY3Rpb24/XCJmdW5jdGlvblwiOmUmJmUuY29uc3RydWN0b3I9PT1BcnJheT9cImFycmF5XCI6ZSYmMT09PWUubm9kZVR5cGU/XCJlbGVtZW50XCI6XCJvYmplY3RcIj09PXI/XCJvYmplY3RcIjpcInVua25vd25cIn0sbz1mdW5jdGlvbih0LGUpe3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCk7Zm9yKHZhciBuIGluIGUuY2xhc3NOYW1lJiYoci5jbGFzc05hbWU9ZS5jbGFzc05hbWUpLGUuaW5uZXJIVE1MJiZlLmRvbXB1cmlmeSYmKHIuaW5uZXJIVE1MPWUuZG9tcHVyaWZ5LnNhbml0aXplKGUuaW5uZXJIVE1MKSksZS5zdHlsZSlyLnN0eWxlW25dPWUuc3R5bGVbbl07cmV0dXJuIHJ9LHM9ZnVuY3Rpb24gdChlLHIpe2Zvcih2YXIgbj0zPT09ZS5ub2RlVHlwZT9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlLm5vZGVWYWx1ZSk6ZS5jbG9uZU5vZGUoITEpLGk9ZS5maXJzdENoaWxkO2k7aT1pLm5leHRTaWJsaW5nKSEwIT09ciYmMT09PWkubm9kZVR5cGUmJlwiU0NSSVBUXCI9PT1pLm5vZGVOYW1lfHxuLmFwcGVuZENoaWxkKHQoaSxyKSk7cmV0dXJuIDE9PT1lLm5vZGVUeXBlJiYoXCJDQU5WQVNcIj09PWUubm9kZU5hbWU/KG4ud2lkdGg9ZS53aWR0aCxuLmhlaWdodD1lLmhlaWdodCxuLmdldENvbnRleHQoXCIyZFwiKS5kcmF3SW1hZ2UoZSwwLDApKTpcIlRFWFRBUkVBXCIhPT1lLm5vZGVOYW1lJiZcIlNFTEVDVFwiIT09ZS5ub2RlTmFtZXx8KG4udmFsdWU9ZS52YWx1ZSksbi5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLGZ1bmN0aW9uKCl7bi5zY3JvbGxUb3A9ZS5zY3JvbGxUb3Asbi5zY3JvbGxMZWZ0PWUuc2Nyb2xsTGVmdH0sITApKSxufSx1PWZ1bmN0aW9uIHQoZSl7dmFyIHI9T2JqZWN0LmFzc2lnbih0LmNvbnZlcnQoUHJvbWlzZS5yZXNvbHZlKCkpLEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC50ZW1wbGF0ZSkpKSxuPXQuY29udmVydChQcm9taXNlLnJlc29sdmUoKSxyKTtyZXR1cm4obj1uLnNldFByb2dyZXNzKDEsdCwxLFt0XSkpLnNldChlKX07KHUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUHJvbWlzZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj11LHUuY29udmVydD1mdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lfHx1LnByb3RvdHlwZSx0fSx1LnRlbXBsYXRlPXtwcm9wOntzcmM6bnVsbCxjb250YWluZXI6bnVsbCxvdmVybGF5Om51bGwsY2FudmFzOm51bGwsaW1nOm51bGwscGRmOm51bGwscGFnZVNpemU6bnVsbCxjYWxsYmFjazpmdW5jdGlvbigpe319LHByb2dyZXNzOnt2YWw6MCxzdGF0ZTpudWxsLG46MCxzdGFjazpbXX0sb3B0OntmaWxlbmFtZTpcImZpbGUucGRmXCIsbWFyZ2luOlswLDAsMCwwXSxlbmFibGVMaW5rczohMCx4OjAseTowLGh0bWwyY2FudmFzOnt9LGpzUERGOnt9LGJhY2tncm91bmRDb2xvcjpcInRyYW5zcGFyZW50XCJ9fSx1LnByb3RvdHlwZS5mcm9tPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbigpe3N3aXRjaChlPWV8fGZ1bmN0aW9uKHQpe3N3aXRjaChhKHQpKXtjYXNlXCJzdHJpbmdcIjpyZXR1cm5cInN0cmluZ1wiO2Nhc2VcImVsZW1lbnRcIjpyZXR1cm5cImNhbnZhc1wiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP1wiY2FudmFzXCI6XCJlbGVtZW50XCI7ZGVmYXVsdDpyZXR1cm5cInVua25vd25cIn19KHQpLGUpe2Nhc2VcInN0cmluZ1wiOnJldHVybiB0aGlzLnRoZW4obikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zZXQoe3NyYzpvKFwiZGl2XCIse2lubmVySFRNTDp0LGRvbXB1cmlmeTplfSl9KX0pO2Nhc2VcImVsZW1lbnRcIjpyZXR1cm4gdGhpcy5zZXQoe3NyYzp0fSk7Y2FzZVwiY2FudmFzXCI6cmV0dXJuIHRoaXMuc2V0KHtjYW52YXM6dH0pO2Nhc2VcImltZ1wiOnJldHVybiB0aGlzLnNldCh7aW1nOnR9KTtkZWZhdWx0OnJldHVybiB0aGlzLmVycm9yKFwiVW5rbm93biBzb3VyY2UgdHlwZS5cIil9fSl9LHUucHJvdG90eXBlLnRvPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlXCJjb250YWluZXJcIjpyZXR1cm4gdGhpcy50b0NvbnRhaW5lcigpO2Nhc2VcImNhbnZhc1wiOnJldHVybiB0aGlzLnRvQ2FudmFzKCk7Y2FzZVwiaW1nXCI6cmV0dXJuIHRoaXMudG9JbWcoKTtjYXNlXCJwZGZcIjpyZXR1cm4gdGhpcy50b1BkZigpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuZXJyb3IoXCJJbnZhbGlkIHRhcmdldC5cIil9fSx1LnByb3RvdHlwZS50b0NvbnRhaW5lcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRoZW5MaXN0KFtmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3Auc3JjfHx0aGlzLmVycm9yKFwiQ2Fubm90IGR1cGxpY2F0ZSAtIG5vIHNvdXJjZSBIVE1MLlwiKX0sZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wLnBhZ2VTaXplfHx0aGlzLnNldFBhZ2VTaXplKCl9XSkudGhlbihmdW5jdGlvbigpe3ZhciB0PXtwb3NpdGlvbjpcInJlbGF0aXZlXCIsZGlzcGxheTpcImlubGluZS1ibG9ja1wiLHdpZHRoOihcIm51bWJlclwiIT10eXBlb2YgdGhpcy5vcHQud2lkdGh8fGlzTmFOKHRoaXMub3B0LndpZHRoKXx8XCJudW1iZXJcIiE9dHlwZW9mIHRoaXMub3B0LndpbmRvd1dpZHRofHxpc05hTih0aGlzLm9wdC53aW5kb3dXaWR0aCk/TWF0aC5tYXgodGhpcy5wcm9wLnNyYy5jbGllbnRXaWR0aCx0aGlzLnByb3Auc3JjLnNjcm9sbFdpZHRoLHRoaXMucHJvcC5zcmMub2Zmc2V0V2lkdGgpOnRoaXMub3B0LndpbmRvd1dpZHRoKStcInB4XCIsbGVmdDowLHJpZ2h0OjAsdG9wOjAsbWFyZ2luOlwiYXV0b1wiLGJhY2tncm91bmRDb2xvcjp0aGlzLm9wdC5iYWNrZ3JvdW5kQ29sb3J9LGU9cyh0aGlzLnByb3Auc3JjLHRoaXMub3B0Lmh0bWwyY2FudmFzLmphdmFzY3JpcHRFbmFibGVkKTtcIkJPRFlcIj09PWUudGFnTmFtZSYmKHQuaGVpZ2h0PU1hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0KStcInB4XCIpLHRoaXMucHJvcC5vdmVybGF5PW8oXCJkaXZcIix7Y2xhc3NOYW1lOlwiaHRtbDJwZGZfX292ZXJsYXlcIixzdHlsZTp7cG9zaXRpb246XCJmaXhlZFwiLG92ZXJmbG93OlwiaGlkZGVuXCIsekluZGV4OjFlMyxsZWZ0OlwiLTEwMDAwMHB4XCIscmlnaHQ6MCxib3R0b206MCx0b3A6MH19KSx0aGlzLnByb3AuY29udGFpbmVyPW8oXCJkaXZcIix7Y2xhc3NOYW1lOlwiaHRtbDJwZGZfX2NvbnRhaW5lclwiLHN0eWxlOnR9KSx0aGlzLnByb3AuY29udGFpbmVyLmFwcGVuZENoaWxkKGUpLHRoaXMucHJvcC5jb250YWluZXIuZmlyc3RDaGlsZC5hcHBlbmRDaGlsZChvKFwiZGl2XCIse3N0eWxlOntjbGVhcjpcImJvdGhcIixib3JkZXI6XCIwIG5vbmUgdHJhbnNwYXJlbnRcIixtYXJnaW46MCxwYWRkaW5nOjAsaGVpZ2h0OjB9fSkpLHRoaXMucHJvcC5jb250YWluZXIuc3R5bGUuZmxvYXQ9XCJub25lXCIsdGhpcy5wcm9wLm92ZXJsYXkuYXBwZW5kQ2hpbGQodGhpcy5wcm9wLmNvbnRhaW5lciksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnByb3Aub3ZlcmxheSksdGhpcy5wcm9wLmNvbnRhaW5lci5maXJzdENoaWxkLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLnByb3AuY29udGFpbmVyLmhlaWdodD1NYXRoLm1heCh0aGlzLnByb3AuY29udGFpbmVyLmZpcnN0Q2hpbGQuY2xpZW50SGVpZ2h0LHRoaXMucHJvcC5jb250YWluZXIuZmlyc3RDaGlsZC5zY3JvbGxIZWlnaHQsdGhpcy5wcm9wLmNvbnRhaW5lci5maXJzdENoaWxkLm9mZnNldEhlaWdodCkrXCJweFwifSl9LHUucHJvdG90eXBlLnRvQ2FudmFzPWZ1bmN0aW9uKCl7dmFyIHQ9W2Z1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5wcm9wLmNvbnRhaW5lcil8fHRoaXMudG9Db250YWluZXIoKX1dO3JldHVybiB0aGlzLnRoZW5MaXN0KHQpLnRoZW4ocikudGhlbihmdW5jdGlvbih0KXt2YXIgZT1PYmplY3QuYXNzaWduKHt9LHRoaXMub3B0Lmh0bWwyY2FudmFzKTtyZXR1cm4gZGVsZXRlIGUub25yZW5kZXJlZCx0KHRoaXMucHJvcC5jb250YWluZXIsZSl9KS50aGVuKGZ1bmN0aW9uKHQpeyh0aGlzLm9wdC5odG1sMmNhbnZhcy5vbnJlbmRlcmVkfHxmdW5jdGlvbigpe30pKHQpLHRoaXMucHJvcC5jYW52YXM9dCxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMucHJvcC5vdmVybGF5KX0pfSx1LnByb3RvdHlwZS50b0NvbnRleHQyZD1mdW5jdGlvbigpe3ZhciB0PVtmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMucHJvcC5jb250YWluZXIpfHx0aGlzLnRvQ29udGFpbmVyKCl9XTtyZXR1cm4gdGhpcy50aGVuTGlzdCh0KS50aGVuKHIpLnRoZW4oZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHQuanNQREYscj10aGlzLm9wdC5mb250RmFjZXMsbj1cIm51bWJlclwiIT10eXBlb2YgdGhpcy5vcHQud2lkdGh8fGlzTmFOKHRoaXMub3B0LndpZHRoKXx8XCJudW1iZXJcIiE9dHlwZW9mIHRoaXMub3B0LndpbmRvd1dpZHRofHxpc05hTih0aGlzLm9wdC53aW5kb3dXaWR0aCk/MTp0aGlzLm9wdC53aWR0aC90aGlzLm9wdC53aW5kb3dXaWR0aCxpPU9iamVjdC5hc3NpZ24oe2FzeW5jOiEwLGFsbG93VGFpbnQ6ITAsc2NhbGU6bixzY3JvbGxYOnRoaXMub3B0LnNjcm9sbFh8fDAsc2Nyb2xsWTp0aGlzLm9wdC5zY3JvbGxZfHwwLGJhY2tncm91bmRDb2xvcjpcIiNmZmZmZmZcIixpbWFnZVRpbWVvdXQ6MTVlMyxsb2dnaW5nOiEwLHByb3h5Om51bGwscmVtb3ZlQ29udGFpbmVyOiEwLGZvcmVpZ25PYmplY3RSZW5kZXJpbmc6ITEsdXNlQ09SUzohMX0sdGhpcy5vcHQuaHRtbDJjYW52YXMpO2lmKGRlbGV0ZSBpLm9ucmVuZGVyZWQsZS5jb250ZXh0MmQuYXV0b1BhZ2luZz12b2lkIDA9PT10aGlzLm9wdC5hdXRvUGFnaW5nfHx0aGlzLm9wdC5hdXRvUGFnaW5nLGUuY29udGV4dDJkLnBvc1g9dGhpcy5vcHQueCxlLmNvbnRleHQyZC5wb3NZPXRoaXMub3B0LnksZS5jb250ZXh0MmQubWFyZ2luPXRoaXMub3B0Lm1hcmdpbixlLmNvbnRleHQyZC5mb250RmFjZXM9cixyKWZvcih2YXIgYT0wO2E8ci5sZW5ndGg7KythKXt2YXIgbz1yW2FdLHM9by5zcmMuZmluZChmdW5jdGlvbih0KXtyZXR1cm5cInRydWV0eXBlXCI9PT10LmZvcm1hdH0pO3MmJmUuYWRkRm9udChzLnVybCxvLnJlZi5uYW1lLG8ucmVmLnN0eWxlKX1yZXR1cm4gaS53aW5kb3dIZWlnaHQ9aS53aW5kb3dIZWlnaHR8fDAsaS53aW5kb3dIZWlnaHQ9MD09aS53aW5kb3dIZWlnaHQ/TWF0aC5tYXgodGhpcy5wcm9wLmNvbnRhaW5lci5jbGllbnRIZWlnaHQsdGhpcy5wcm9wLmNvbnRhaW5lci5zY3JvbGxIZWlnaHQsdGhpcy5wcm9wLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQpOmkud2luZG93SGVpZ2h0LGUuY29udGV4dDJkLnNhdmUoITApLHQodGhpcy5wcm9wLmNvbnRhaW5lcixpKX0pLnRoZW4oZnVuY3Rpb24odCl7dGhpcy5vcHQuanNQREYuY29udGV4dDJkLnJlc3RvcmUoITApLCh0aGlzLm9wdC5odG1sMmNhbnZhcy5vbnJlbmRlcmVkfHxmdW5jdGlvbigpe30pKHQpLHRoaXMucHJvcC5jYW52YXM9dCxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMucHJvcC5vdmVybGF5KX0pfSx1LnByb3RvdHlwZS50b0ltZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRoZW5MaXN0KFtmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3AuY2FudmFzfHx0aGlzLnRvQ2FudmFzKCl9XSkudGhlbihmdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcC5jYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvXCIrdGhpcy5vcHQuaW1hZ2UudHlwZSx0aGlzLm9wdC5pbWFnZS5xdWFsaXR5KTt0aGlzLnByb3AuaW1nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiksdGhpcy5wcm9wLmltZy5zcmM9dH0pfSx1LnByb3RvdHlwZS50b1BkZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRoZW5MaXN0KFtmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvQ29udGV4dDJkKCl9XSkudGhlbihmdW5jdGlvbigpe3RoaXMucHJvcC5wZGY9dGhpcy5wcm9wLnBkZnx8dGhpcy5vcHQuanNQREZ9KX0sdS5wcm90b3R5cGUub3V0cHV0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm5cImltZ1wiPT09KHI9cnx8XCJwZGZcIikudG9Mb3dlckNhc2UoKXx8XCJpbWFnZVwiPT09ci50b0xvd2VyQ2FzZSgpP3RoaXMub3V0cHV0SW1nKHQsZSk6dGhpcy5vdXRwdXRQZGYodCxlKX0sdS5wcm90b3R5cGUub3V0cHV0UGRmPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudGhlbkxpc3QoW2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcC5wZGZ8fHRoaXMudG9QZGYoKX1dKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcC5wZGYub3V0cHV0KHQsZSl9KX0sdS5wcm90b3R5cGUub3V0cHV0SW1nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW5MaXN0KFtmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3AuaW1nfHx0aGlzLnRvSW1nKCl9XSkudGhlbihmdW5jdGlvbigpe3N3aXRjaCh0KXtjYXNlIHZvaWQgMDpjYXNlXCJpbWdcIjpyZXR1cm4gdGhpcy5wcm9wLmltZztjYXNlXCJkYXRhdXJpc3RyaW5nXCI6Y2FzZVwiZGF0YXVybHN0cmluZ1wiOnJldHVybiB0aGlzLnByb3AuaW1nLnNyYztjYXNlXCJkYXRhdXJpXCI6Y2FzZVwiZGF0YXVybFwiOnJldHVybiBkb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMucHJvcC5pbWcuc3JjO2RlZmF1bHQ6dGhyb3cnSW1hZ2Ugb3V0cHV0IHR5cGUgXCInK3QrJ1wiIGlzIG5vdCBzdXBwb3J0ZWQuJ319KX0sdS5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuTGlzdChbZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wLnBkZnx8dGhpcy50b1BkZigpfV0pLnNldCh0P3tmaWxlbmFtZTp0fTpudWxsKS50aGVuKGZ1bmN0aW9uKCl7dGhpcy5wcm9wLnBkZi5zYXZlKHRoaXMub3B0LmZpbGVuYW1lKX0pfSx1LnByb3RvdHlwZS5kb0NhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhlbkxpc3QoW2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcC5wZGZ8fHRoaXMudG9QZGYoKX1dKS50aGVuKGZ1bmN0aW9uKCl7dGhpcy5wcm9wLmNhbGxiYWNrKHRoaXMucHJvcC5wZGYpfSl9LHUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXtpZihcIm9iamVjdFwiIT09YSh0KSlyZXR1cm4gdGhpczt2YXIgZT1PYmplY3Qua2V5cyh0fHx7fSkubWFwKGZ1bmN0aW9uKGUpe2lmKGUgaW4gdS50ZW1wbGF0ZS5wcm9wKXJldHVybiBmdW5jdGlvbigpe3RoaXMucHJvcFtlXT10W2VdfTtzd2l0Y2goZSl7Y2FzZVwibWFyZ2luXCI6cmV0dXJuIHRoaXMuc2V0TWFyZ2luLmJpbmQodGhpcyx0Lm1hcmdpbik7Y2FzZVwianNQREZcIjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHQuanNQREY9dC5qc1BERix0aGlzLnNldFBhZ2VTaXplKCl9O2Nhc2VcInBhZ2VTaXplXCI6cmV0dXJuIHRoaXMuc2V0UGFnZVNpemUuYmluZCh0aGlzLHQucGFnZVNpemUpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5vcHRbZV09dFtlXX19fSx0aGlzKTtyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGhlbkxpc3QoZSl9KX0sdS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbigpe3ZhciByPXQgaW4gdS50ZW1wbGF0ZS5wcm9wP3RoaXMucHJvcFt0XTp0aGlzLm9wdFt0XTtyZXR1cm4gZT9lKHIpOnJ9KX0sdS5wcm90b3R5cGUuc2V0TWFyZ2luPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oKXtzd2l0Y2goYSh0KSl7Y2FzZVwibnVtYmVyXCI6dD1bdCx0LHQsdF07Y2FzZVwiYXJyYXlcIjppZigyPT09dC5sZW5ndGgmJih0PVt0WzBdLHRbMV0sdFswXSx0WzFdXSksND09PXQubGVuZ3RoKWJyZWFrO2RlZmF1bHQ6cmV0dXJuIHRoaXMuZXJyb3IoXCJJbnZhbGlkIG1hcmdpbiBhcnJheS5cIil9dGhpcy5vcHQubWFyZ2luPXR9KS50aGVuKHRoaXMuc2V0UGFnZVNpemUpfSx1LnByb3RvdHlwZS5zZXRQYWdlU2l6ZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIE1hdGguZmxvb3IodCplLzcyKjk2KX1yZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKCl7KHQ9dHx8RS5nZXRQYWdlU2l6ZSh0aGlzLm9wdC5qc1BERikpLmhhc093blByb3BlcnR5KFwiaW5uZXJcIil8fCh0LmlubmVyPXt3aWR0aDp0LndpZHRoLXRoaXMub3B0Lm1hcmdpblsxXS10aGlzLm9wdC5tYXJnaW5bM10saGVpZ2h0OnQuaGVpZ2h0LXRoaXMub3B0Lm1hcmdpblswXS10aGlzLm9wdC5tYXJnaW5bMl19LHQuaW5uZXIucHg9e3dpZHRoOmUodC5pbm5lci53aWR0aCx0LmspLGhlaWdodDplKHQuaW5uZXIuaGVpZ2h0LHQuayl9LHQuaW5uZXIucmF0aW89dC5pbm5lci5oZWlnaHQvdC5pbm5lci53aWR0aCksdGhpcy5wcm9wLnBhZ2VTaXplPXR9KX0sdS5wcm90b3R5cGUuc2V0UHJvZ3Jlc3M9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIG51bGwhPXQmJih0aGlzLnByb2dyZXNzLnZhbD10KSxudWxsIT1lJiYodGhpcy5wcm9ncmVzcy5zdGF0ZT1lKSxudWxsIT1yJiYodGhpcy5wcm9ncmVzcy5uPXIpLG51bGwhPW4mJih0aGlzLnByb2dyZXNzLnN0YWNrPW4pLHRoaXMucHJvZ3Jlc3MucmF0aW89dGhpcy5wcm9ncmVzcy52YWwvdGhpcy5wcm9ncmVzcy5zdGF0ZSx0aGlzfSx1LnByb3RvdHlwZS51cGRhdGVQcm9ncmVzcz1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdGhpcy5zZXRQcm9ncmVzcyh0P3RoaXMucHJvZ3Jlc3MudmFsK3Q6bnVsbCxlfHxudWxsLHI/dGhpcy5wcm9ncmVzcy5uK3I6bnVsbCxuP3RoaXMucHJvZ3Jlc3Muc3RhY2suY29uY2F0KG4pOm51bGwpfSx1LnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztyZXR1cm4gdGhpcy50aGVuQ29yZSh0LGUsZnVuY3Rpb24odCxlKXtyZXR1cm4gci51cGRhdGVQcm9ncmVzcyhudWxsLG51bGwsMSxbdF0pLFByb21pc2UucHJvdG90eXBlLnRoZW4uY2FsbCh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiByLnVwZGF0ZVByb2dyZXNzKG51bGwsdCksZX0pLnRoZW4odCxlKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiByLnVwZGF0ZVByb2dyZXNzKDEpLHR9KX0pfSx1LnByb3RvdHlwZS50aGVuQ29yZT1mdW5jdGlvbih0LGUscil7cj1yfHxQcm9taXNlLnByb3RvdHlwZS50aGVuO3ZhciBuPXRoaXM7dCYmKHQ9dC5iaW5kKG4pKSxlJiYoZT1lLmJpbmQobikpO3ZhciBpPS0xIT09UHJvbWlzZS50b1N0cmluZygpLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpJiZcIlByb21pc2VcIj09PVByb21pc2UubmFtZT9uOnUuY29udmVydChPYmplY3QuYXNzaWduKHt9LG4pLFByb21pc2UucHJvdG90eXBlKSxhPXIuY2FsbChpLHQsZSk7cmV0dXJuIHUuY29udmVydChhLG4uX19wcm90b19fKX0sdS5wcm90b3R5cGUudGhlbkV4dGVybmFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFByb21pc2UucHJvdG90eXBlLnRoZW4uY2FsbCh0aGlzLHQsZSl9LHUucHJvdG90eXBlLnRoZW5MaXN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtlPWUudGhlbkNvcmUodCl9KSxlfSx1LnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbih0KXt0JiYodD10LmJpbmQodGhpcykpO3ZhciBlPVByb21pc2UucHJvdG90eXBlLmNhdGNoLmNhbGwodGhpcyx0KTtyZXR1cm4gdS5jb252ZXJ0KGUsdGhpcyl9LHUucHJvdG90eXBlLmNhdGNoRXh0ZXJuYWw9ZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2UucHJvdG90eXBlLmNhdGNoLmNhbGwodGhpcyx0KX0sdS5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcih0KX0pfSx1LnByb3RvdHlwZS51c2luZz11LnByb3RvdHlwZS5zZXQsdS5wcm90b3R5cGUuc2F2ZUFzPXUucHJvdG90eXBlLnNhdmUsdS5wcm90b3R5cGUuZXhwb3J0PXUucHJvdG90eXBlLm91dHB1dCx1LnByb3RvdHlwZS5ydW49dS5wcm90b3R5cGUudGhlbixFLmdldFBhZ2VTaXplPWZ1bmN0aW9uKGUscixuKXtpZihcIm9iamVjdFwiPT09dChlKSl7dmFyIGk9ZTtlPWkub3JpZW50YXRpb24scj1pLnVuaXR8fHIsbj1pLmZvcm1hdHx8bn1yPXJ8fFwibW1cIixuPW58fFwiYTRcIixlPShcIlwiKyhlfHxcIlBcIikpLnRvTG93ZXJDYXNlKCk7dmFyIGEsbz0oXCJcIituKS50b0xvd2VyQ2FzZSgpLHM9e2EwOlsyMzgzLjk0LDMzNzAuMzldLGExOlsxNjgzLjc4LDIzODMuOTRdLGEyOlsxMTkwLjU1LDE2ODMuNzhdLGEzOls4NDEuODksMTE5MC41NV0sYTQ6WzU5NS4yOCw4NDEuODldLGE1Ols0MTkuNTMsNTk1LjI4XSxhNjpbMjk3LjY0LDQxOS41M10sYTc6WzIwOS43NiwyOTcuNjRdLGE4OlsxNDcuNCwyMDkuNzZdLGE5OlsxMDQuODgsMTQ3LjRdLGExMDpbNzMuNywxMDQuODhdLGIwOlsyODM0LjY1LDQwMDguMTldLGIxOlsyMDA0LjA5LDI4MzQuNjVdLGIyOlsxNDE3LjMyLDIwMDQuMDldLGIzOlsxMDAwLjYzLDE0MTcuMzJdLGI0Ols3MDguNjYsMTAwMC42M10sYjU6WzQ5OC45LDcwOC42Nl0sYjY6WzM1NC4zMyw0OTguOV0sYjc6WzI0OS40NSwzNTQuMzNdLGI4OlsxNzUuNzUsMjQ5LjQ1XSxiOTpbMTI0LjcyLDE3NS43NV0sYjEwOls4Ny44NywxMjQuNzJdLGMwOlsyNTk5LjM3LDM2NzYuNTRdLGMxOlsxODM2Ljg1LDI1OTkuMzddLGMyOlsxMjk4LjI3LDE4MzYuODVdLGMzOls5MTguNDMsMTI5OC4yN10sYzQ6WzY0OS4xMyw5MTguNDNdLGM1Ols0NTkuMjEsNjQ5LjEzXSxjNjpbMzIzLjE1LDQ1OS4yMV0sYzc6WzIyOS42MSwzMjMuMTVdLGM4OlsxNjEuNTcsMjI5LjYxXSxjOTpbMTEzLjM5LDE2MS41N10sYzEwOls3OS4zNywxMTMuMzldLGRsOlszMTEuODEsNjIzLjYyXSxsZXR0ZXI6WzYxMiw3OTJdLFwiZ292ZXJubWVudC1sZXR0ZXJcIjpbNTc2LDc1Nl0sbGVnYWw6WzYxMiwxMDA4XSxcImp1bmlvci1sZWdhbFwiOls1NzYsMzYwXSxsZWRnZXI6WzEyMjQsNzkyXSx0YWJsb2lkOls3OTIsMTIyNF0sXCJjcmVkaXQtY2FyZFwiOlsxNTMsMjQzXX07c3dpdGNoKHIpe2Nhc2VcInB0XCI6YT0xO2JyZWFrO2Nhc2VcIm1tXCI6YT03Mi8yNS40O2JyZWFrO2Nhc2VcImNtXCI6YT03Mi8yLjU0O2JyZWFrO2Nhc2VcImluXCI6YT03MjticmVhaztjYXNlXCJweFwiOmE9Ljc1O2JyZWFrO2Nhc2VcInBjXCI6Y2FzZVwiZW1cIjphPTEyO2JyZWFrO2Nhc2VcImV4XCI6YT02O2JyZWFrO2RlZmF1bHQ6dGhyb3dcIkludmFsaWQgdW5pdDogXCIrcn12YXIgdSxjPTAsbD0wO2lmKHMuaGFzT3duUHJvcGVydHkobykpYz1zW29dWzFdL2EsbD1zW29dWzBdL2E7ZWxzZSB0cnl7Yz1uWzFdLGw9blswXX1jYXRjaChoKXt0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGZvcm1hdDogXCIrbil9aWYoXCJwXCI9PT1lfHxcInBvcnRyYWl0XCI9PT1lKWU9XCJwXCIsbD5jJiYodT1sLGw9YyxjPXUpO2Vsc2V7aWYoXCJsXCIhPT1lJiZcImxhbmRzY2FwZVwiIT09ZSl0aHJvd1wiSW52YWxpZCBvcmllbnRhdGlvbjogXCIrZTtlPVwibFwiLGM+bCYmKHU9bCxsPWMsYz11KX1yZXR1cm57d2lkdGg6bCxoZWlnaHQ6Yyx1bml0OnIsazphLG9yaWVudGF0aW9uOmV9fSxlLmh0bWw9ZnVuY3Rpb24odCxlKXsoZT1lfHx7fSkuY2FsbGJhY2s9ZS5jYWxsYmFja3x8ZnVuY3Rpb24oKXt9LGUuaHRtbDJjYW52YXM9ZS5odG1sMmNhbnZhc3x8e30sZS5odG1sMmNhbnZhcy5jYW52YXM9ZS5odG1sMmNhbnZhcy5jYW52YXN8fHRoaXMuY2FudmFzLGUuanNQREY9ZS5qc1BERnx8dGhpcyxlLmZvbnRGYWNlcz1lLmZvbnRGYWNlcz9lLmZvbnRGYWNlcy5tYXAoT3QpOm51bGw7dmFyIHI9bmV3IHUoZSk7cmV0dXJuIGUud29ya2VyP3I6ci5mcm9tKHQpLmRvQ2FsbGJhY2soKX19KEUuQVBJKSxFLkFQSS5hZGRKUz1mdW5jdGlvbih0KXt2YXIgZSxyLG49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVwiXCIscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbj10W3JdO2lmKFwiKFwiPT09bnx8XCIpXCI9PT1uKXtmb3IodmFyIGk9MCxhPXItMTthPj0wJiZcIlxcXFxcIj09PXRbYV07YS0tKWkrKztlKz1pJTI9PTA/XCJcXFxcXCIrbjpufWVsc2UgZSs9bn1yZXR1cm4gZX0odCk7cmV0dXJuIHRoaXMuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZShcInBvc3RQdXRSZXNvdXJjZXNcIixmdW5jdGlvbigpe2U9dGhpcy5pbnRlcm5hbC5uZXdPYmplY3QoKSx0aGlzLmludGVybmFsLm91dChcIjw8XCIpLHRoaXMuaW50ZXJuYWwub3V0KFwiL05hbWVzIFsoRW1iZWRkZWRKUykgXCIrKGUrMSkrXCIgMCBSXVwiKSx0aGlzLmludGVybmFsLm91dChcIj4+XCIpLHRoaXMuaW50ZXJuYWwub3V0KFwiZW5kb2JqXCIpLHI9dGhpcy5pbnRlcm5hbC5uZXdPYmplY3QoKSx0aGlzLmludGVybmFsLm91dChcIjw8XCIpLHRoaXMuaW50ZXJuYWwub3V0KFwiL1MgL0phdmFTY3JpcHRcIiksdGhpcy5pbnRlcm5hbC5vdXQoXCIvSlMgKFwiK24rXCIpXCIpLHRoaXMuaW50ZXJuYWwub3V0KFwiPj5cIiksdGhpcy5pbnRlcm5hbC5vdXQoXCJlbmRvYmpcIil9KSx0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoXCJwdXRDYXRhbG9nXCIsZnVuY3Rpb24oKXt2b2lkIDAhPT1lJiZ2b2lkIDAhPT1yJiZ0aGlzLmludGVybmFsLm91dChcIi9OYW1lcyA8PC9KYXZhU2NyaXB0IFwiK2UrXCIgMCBSPj5cIil9KSx0aGlzfSxcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNCBTdGV2ZW4gU3B1bmdpbiAoVHdlbHZlVG9uZSBMTEMpICBzdGV2ZW5AdHdlbHZldG9uZS50dlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5mdW5jdGlvbih0KXt2YXIgZTt0LmV2ZW50cy5wdXNoKFtcInBvc3RQdXRSZXNvdXJjZXNcIixmdW5jdGlvbigpe3ZhciB0PXRoaXMscj0vXihcXGQrKSAwIG9iaiQvO2lmKHRoaXMub3V0bGluZS5yb290LmNoaWxkcmVuLmxlbmd0aD4wKWZvcih2YXIgbj10Lm91dGxpbmUucmVuZGVyKCkuc3BsaXQoL1xcclxcbi8pLGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIGE9bltpXSxvPXIuZXhlYyhhKTtpZihudWxsIT1vKXt2YXIgcz1vWzFdO3QuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihzLCExKX10LmludGVybmFsLndyaXRlKGEpfWlmKHRoaXMub3V0bGluZS5jcmVhdGVOYW1lZERlc3RpbmF0aW9ucyl7dmFyIHU9dGhpcy5pbnRlcm5hbC5wYWdlcy5sZW5ndGgsYz1bXTtmb3IoaT0wO2k8dTtpKyspe3ZhciBsPXQuaW50ZXJuYWwubmV3T2JqZWN0KCk7Yy5wdXNoKGwpO3ZhciBoPXQuaW50ZXJuYWwuZ2V0UGFnZUluZm8oaSsxKTt0LmludGVybmFsLndyaXRlKFwiPDwgL0RbXCIraC5vYmpJZCtcIiAwIFIgL1hZWiBudWxsIG51bGwgbnVsbF0+PiBlbmRvYmpcIil9dmFyIGY9dC5pbnRlcm5hbC5uZXdPYmplY3QoKTtmb3IodC5pbnRlcm5hbC53cml0ZShcIjw8IC9OYW1lcyBbIFwiKSxpPTA7aTxjLmxlbmd0aDtpKyspdC5pbnRlcm5hbC53cml0ZShcIihwYWdlX1wiKyhpKzEpK1wiKVwiK2NbaV0rXCIgMCBSXCIpO3QuaW50ZXJuYWwud3JpdGUoXCIgXSA+PlwiLFwiZW5kb2JqXCIpLGU9dC5pbnRlcm5hbC5uZXdPYmplY3QoKSx0LmludGVybmFsLndyaXRlKFwiPDwgL0Rlc3RzIFwiK2YrXCIgMCBSXCIpLHQuaW50ZXJuYWwud3JpdGUoXCI+PlwiLFwiZW5kb2JqXCIpfX1dKSx0LmV2ZW50cy5wdXNoKFtcInB1dENhdGFsb2dcIixmdW5jdGlvbigpe3ZhciB0PXRoaXM7dC5vdXRsaW5lLnJvb3QuY2hpbGRyZW4ubGVuZ3RoPjAmJih0LmludGVybmFsLndyaXRlKFwiL091dGxpbmVzXCIsdGhpcy5vdXRsaW5lLm1ha2VSZWYodGhpcy5vdXRsaW5lLnJvb3QpKSx0aGlzLm91dGxpbmUuY3JlYXRlTmFtZWREZXN0aW5hdGlvbnMmJnQuaW50ZXJuYWwud3JpdGUoXCIvTmFtZXMgXCIrZStcIiAwIFJcIikpfV0pLHQuZXZlbnRzLnB1c2goW1wiaW5pdGlhbGl6ZWRcIixmdW5jdGlvbigpe3ZhciB0PXRoaXM7dC5vdXRsaW5lPXtjcmVhdGVOYW1lZERlc3RpbmF0aW9uczohMSxyb290OntjaGlsZHJlbjpbXX19LHQub3V0bGluZS5hZGQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXt0aXRsZTplLG9wdGlvbnM6cixjaGlsZHJlbjpbXX07cmV0dXJuIG51bGw9PXQmJih0PXRoaXMucm9vdCksdC5jaGlsZHJlbi5wdXNoKG4pLG59LHQub3V0bGluZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHg9e30sdGhpcy5jdHgudmFsPVwiXCIsdGhpcy5jdHgucGRmPXQsdGhpcy5nZW5JZHNfcih0aGlzLnJvb3QpLHRoaXMucmVuZGVyUm9vdCh0aGlzLnJvb3QpLHRoaXMucmVuZGVySXRlbXModGhpcy5yb290KSx0aGlzLmN0eC52YWx9LHQub3V0bGluZS5nZW5JZHNfcj1mdW5jdGlvbihlKXtlLmlkPXQuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWQoKTtmb3IodmFyIHI9MDtyPGUuY2hpbGRyZW4ubGVuZ3RoO3IrKyl0aGlzLmdlbklkc19yKGUuY2hpbGRyZW5bcl0pfSx0Lm91dGxpbmUucmVuZGVyUm9vdD1mdW5jdGlvbih0KXt0aGlzLm9ialN0YXJ0KHQpLHRoaXMubGluZShcIi9UeXBlIC9PdXRsaW5lc1wiKSx0LmNoaWxkcmVuLmxlbmd0aD4wJiYodGhpcy5saW5lKFwiL0ZpcnN0IFwiK3RoaXMubWFrZVJlZih0LmNoaWxkcmVuWzBdKSksdGhpcy5saW5lKFwiL0xhc3QgXCIrdGhpcy5tYWtlUmVmKHQuY2hpbGRyZW5bdC5jaGlsZHJlbi5sZW5ndGgtMV0pKSksdGhpcy5saW5lKFwiL0NvdW50IFwiK3RoaXMuY291bnRfcih7Y291bnQ6MH0sdCkpLHRoaXMub2JqRW5kKCl9LHQub3V0bGluZS5yZW5kZXJJdGVtcz1mdW5jdGlvbihlKXtmb3IodmFyIHI9dGhpcy5jdHgucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyxuPTA7bjxlLmNoaWxkcmVuLmxlbmd0aDtuKyspe3ZhciBpPWUuY2hpbGRyZW5bbl07dGhpcy5vYmpTdGFydChpKSx0aGlzLmxpbmUoXCIvVGl0bGUgXCIrdGhpcy5tYWtlU3RyaW5nKGkudGl0bGUpKSx0aGlzLmxpbmUoXCIvUGFyZW50IFwiK3RoaXMubWFrZVJlZihlKSksbj4wJiZ0aGlzLmxpbmUoXCIvUHJldiBcIit0aGlzLm1ha2VSZWYoZS5jaGlsZHJlbltuLTFdKSksbjxlLmNoaWxkcmVuLmxlbmd0aC0xJiZ0aGlzLmxpbmUoXCIvTmV4dCBcIit0aGlzLm1ha2VSZWYoZS5jaGlsZHJlbltuKzFdKSksaS5jaGlsZHJlbi5sZW5ndGg+MCYmKHRoaXMubGluZShcIi9GaXJzdCBcIit0aGlzLm1ha2VSZWYoaS5jaGlsZHJlblswXSkpLHRoaXMubGluZShcIi9MYXN0IFwiK3RoaXMubWFrZVJlZihpLmNoaWxkcmVuW2kuY2hpbGRyZW4ubGVuZ3RoLTFdKSkpO3ZhciBhPXRoaXMuY291bnQ9dGhpcy5jb3VudF9yKHtjb3VudDowfSxpKTtpZihhPjAmJnRoaXMubGluZShcIi9Db3VudCBcIithKSxpLm9wdGlvbnMmJmkub3B0aW9ucy5wYWdlTnVtYmVyKXt2YXIgbz10LmludGVybmFsLmdldFBhZ2VJbmZvKGkub3B0aW9ucy5wYWdlTnVtYmVyKTt0aGlzLmxpbmUoXCIvRGVzdCBbXCIrby5vYmpJZCtcIiAwIFIgL1hZWiAwIFwiK3IoMCkrXCIgMF1cIil9dGhpcy5vYmpFbmQoKX1mb3IodmFyIHM9MDtzPGUuY2hpbGRyZW4ubGVuZ3RoO3MrKyl0aGlzLnJlbmRlckl0ZW1zKGUuY2hpbGRyZW5bc10pfSx0Lm91dGxpbmUubGluZT1mdW5jdGlvbih0KXt0aGlzLmN0eC52YWwrPXQrXCJcXHJcXG5cIn0sdC5vdXRsaW5lLm1ha2VSZWY9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaWQrXCIgMCBSXCJ9LHQub3V0bGluZS5tYWtlU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVyblwiKFwiK3QuaW50ZXJuYWwucGRmRXNjYXBlKGUpK1wiKVwifSx0Lm91dGxpbmUub2JqU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5jdHgudmFsKz1cIlxcclxcblwiK3QuaWQrXCIgMCBvYmpcXHJcXG48PFxcclxcblwifSx0Lm91dGxpbmUub2JqRW5kPWZ1bmN0aW9uKCl7dGhpcy5jdHgudmFsKz1cIj4+IFxcclxcbmVuZG9ialxcclxcblwifSx0Lm91dGxpbmUuY291bnRfcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wO3I8ZS5jaGlsZHJlbi5sZW5ndGg7cisrKXQuY291bnQrKyx0aGlzLmNvdW50X3IodCxlLmNoaWxkcmVuW3JdKTtyZXR1cm4gdC5jb3VudH19XSl9KEUuQVBJKSxcbi8qKlxuICogQGxpY2Vuc2VcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuZnVuY3Rpb24odCl7dmFyIGU9WzE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTldO3QucHJvY2Vzc0pQRUc9ZnVuY3Rpb24odCxyLG4saSxhLG8pe3ZhciBzLHU9dGhpcy5kZWNvZGUuRENUX0RFQ09ERSxjPW51bGw7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHR8fHRoaXMuX19hZGRpbWFnZV9fLmlzQXJyYXlCdWZmZXIodCl8fHRoaXMuX19hZGRpbWFnZV9fLmlzQXJyYXlCdWZmZXJWaWV3KHQpKXtzd2l0Y2godD1hfHx0LHQ9dGhpcy5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlcih0KT9uZXcgVWludDhBcnJheSh0KTp0LHM9ZnVuY3Rpb24odCl7Zm9yKHZhciByLG49MjU2KnQuY2hhckNvZGVBdCg0KSt0LmNoYXJDb2RlQXQoNSksaT10Lmxlbmd0aCxhPXt3aWR0aDowLGhlaWdodDowLG51bWNvbXBvbmVudHM6MX0sbz00O288aTtvKz0yKXtpZihvKz1uLC0xIT09ZS5pbmRleE9mKHQuY2hhckNvZGVBdChvKzEpKSl7cj0yNTYqdC5jaGFyQ29kZUF0KG8rNSkrdC5jaGFyQ29kZUF0KG8rNiksYT17d2lkdGg6MjU2KnQuY2hhckNvZGVBdChvKzcpK3QuY2hhckNvZGVBdChvKzgpLGhlaWdodDpyLG51bWNvbXBvbmVudHM6dC5jaGFyQ29kZUF0KG8rOSl9O2JyZWFrfW49MjU2KnQuY2hhckNvZGVBdChvKzIpK3QuY2hhckNvZGVBdChvKzMpfXJldHVybiBhfSh0PXRoaXMuX19hZGRpbWFnZV9fLmlzQXJyYXlCdWZmZXJWaWV3KHQpP3RoaXMuX19hZGRpbWFnZV9fLmFycmF5QnVmZmVyVG9CaW5hcnlTdHJpbmcodCk6dCkscy5udW1jb21wb25lbnRzKXtjYXNlIDE6bz10aGlzLmNvbG9yX3NwYWNlcy5ERVZJQ0VfR1JBWTticmVhaztjYXNlIDQ6bz10aGlzLmNvbG9yX3NwYWNlcy5ERVZJQ0VfQ01ZSzticmVhaztjYXNlIDM6bz10aGlzLmNvbG9yX3NwYWNlcy5ERVZJQ0VfUkdCfWM9e2RhdGE6dCx3aWR0aDpzLndpZHRoLGhlaWdodDpzLmhlaWdodCxjb2xvclNwYWNlOm8sYml0c1BlckNvbXBvbmVudDo4LGZpbHRlcjp1LGluZGV4OnIsYWxpYXM6bn19cmV0dXJuIGN9fShFLkFQSSksRS5BUEkucHJvY2Vzc1BORz1mdW5jdGlvbih0LGksYSxvKXtpZih0aGlzLl9fYWRkaW1hZ2VfXy5pc0FycmF5QnVmZmVyKHQpJiYodD1uZXcgVWludDhBcnJheSh0KSksdGhpcy5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlclZpZXcodCkpe3ZhciBzLHU9bih0LHtjaGVja0NyYzohMH0pLGM9dS53aWR0aCxsPXUuaGVpZ2h0LGg9dS5jaGFubmVscyxmPXUucGFsZXR0ZSxkPXUuZGVwdGg7cz1mJiYxPT09aD9mdW5jdGlvbih0KXtmb3IodmFyIGU9dC53aWR0aCxuPXQuaGVpZ2h0LGk9dC5kYXRhLGE9dC5wYWxldHRlLG89dC5kZXB0aCxzPSExLHU9W10sYz1bXSxsPXZvaWQgMCxoPSExLGY9MCxkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBwPXIoYVtkXSw0KSxnPXBbMF0sbT1wWzFdLHY9cFsyXSxiPXBbM107dS5wdXNoKGcsbSx2KSxudWxsIT1iJiYoMD09PWI/KGYrKyxjLmxlbmd0aDwxJiZjLnB1c2goZCkpOmI8MjU1JiYoaD0hMCkpfWlmKGh8fGY+MSl7cz0hMCxjPXZvaWQgMDt2YXIgeT1lKm47bD1uZXcgVWludDhBcnJheSh5KTtmb3IodmFyIHc9bmV3IERhdGFWaWV3KGkuYnVmZmVyKSxOPTA7Tjx5O04rKyl7dmFyIEw9ZWUodyxOLG8pLHg9cihhW0xdLDQpWzNdO2xbTl09eH19ZWxzZSAwPT09ZiYmKGM9dm9pZCAwKTtyZXR1cm57Y29sb3JTcGFjZTpcIkluZGV4ZWRcIixjb2xvcnNQZXJQaXhlbDoxLHNNYXNrQml0c1BlckNvbXBvbmVudDpzPzg6dm9pZCAwLGNvbG9yQnl0ZXM6aSxhbHBoYUJ5dGVzOmwsbmVlZFNNYXNrOnMscGFsZXR0ZTp1LG1hc2s6Y319KHUpOjI9PT1ofHw0PT09aD9mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5kYXRhLHI9dC53aWR0aCxuPXQuaGVpZ2h0LGk9dC5jaGFubmVscyxhPXQuZGVwdGgsbz0yPT09aT9cIkRldmljZUdyYXlcIjpcIkRldmljZVJHQlwiLHM9aS0xLHU9cipuLGM9cyxsPXUqYyxoPTEqdSxmPU1hdGguY2VpbChsKmEvOCksZD1NYXRoLmNlaWwoaCphLzgpLHA9bmV3IFVpbnQ4QXJyYXkoZiksZz1uZXcgVWludDhBcnJheShkKSxtPW5ldyBEYXRhVmlldyhlLmJ1ZmZlciksdj1uZXcgRGF0YVZpZXcocC5idWZmZXIpLGI9bmV3IERhdGFWaWV3KGcuYnVmZmVyKSx5PSExLHc9MDt3PHU7dysrKXtmb3IodmFyIE49dyppLEw9MDtMPGM7TCsrKXJlKHYsZWUobSxOK0wsYSksdypjK0wsYSk7dmFyIHg9ZWUobSxOK2MsYSk7eDwoMTw8YSktMSYmKHk9ITApLHJlKGIseCwxKncsYSl9cmV0dXJue2NvbG9yU3BhY2U6byxjb2xvcnNQZXJQaXhlbDpzLHNNYXNrQml0c1BlckNvbXBvbmVudDp5P2E6dm9pZCAwLGNvbG9yQnl0ZXM6cCxhbHBoYUJ5dGVzOmcsbmVlZFNNYXNrOnl9fSh1KTpmdW5jdGlvbih0KXt2YXIgZT10LmRhdGEscj0xPT09dC5jaGFubmVscz9cIkRldmljZUdyYXlcIjpcIkRldmljZVJHQlwiO3JldHVybntjb2xvclNwYWNlOnIsY29sb3JzUGVyUGl4ZWw6XCJEZXZpY2VHcmF5XCI9PT1yPzE6Myxjb2xvckJ5dGVzOmUgaW5zdGFuY2VvZiBVaW50MTZBcnJheT9mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgVWludDhBcnJheSgyKmUpLG49bmV3IERhdGFWaWV3KHIuYnVmZmVyLHIuYnl0ZU9mZnNldCxyLmJ5dGVMZW5ndGgpLGk9MDtpPGU7aSsrKW4uc2V0VWludDE2KDIqaSx0W2ldLCExKTtyZXR1cm4gcn0oZSk6ZSxuZWVkU01hc2s6ITF9fSh1KTt2YXIgcCxnLG0sdj1zLGI9di5jb2xvclNwYWNlLHk9di5jb2xvcnNQZXJQaXhlbCx3PXYuc01hc2tCaXRzUGVyQ29tcG9uZW50LE49di5jb2xvckJ5dGVzLEw9di5hbHBoYUJ5dGVzLHg9di5uZWVkU01hc2ssQT12LnBhbGV0dGUsUz12Lm1hc2ssXz1udWxsO3JldHVybiBvIT09RS5BUEkuaW1hZ2VfY29tcHJlc3Npb24uTk9ORSYmXCJmdW5jdGlvblwiPT10eXBlb2YgZT8oXz1mdW5jdGlvbih0KXt2YXIgZTtzd2l0Y2godCl7Y2FzZSBFLkFQSS5pbWFnZV9jb21wcmVzc2lvbi5GQVNUOmU9MTE7YnJlYWs7Y2FzZSBFLkFQSS5pbWFnZV9jb21wcmVzc2lvbi5NRURJVU06ZT0xMzticmVhaztjYXNlIEUuQVBJLmltYWdlX2NvbXByZXNzaW9uLlNMT1c6ZT0xNDticmVhaztkZWZhdWx0OmU9MTJ9cmV0dXJuIGV9KG8pLHA9dGhpcy5kZWNvZGUuRkxBVEVfREVDT0RFLGc9XCIvUHJlZGljdG9yIFwiLmNvbmNhdChfLFwiIC9Db2xvcnMgXCIpLmNvbmNhdCh5LFwiIC9CaXRzUGVyQ29tcG9uZW50IFwiKS5jb25jYXQoZCxcIiAvQ29sdW1ucyBcIikuY29uY2F0KGMpLHQ9WXQoTixNYXRoLmNlaWwoYyp5KmQvOCkseSxkLG8pLHgmJihtPVl0KEwsTWF0aC5jZWlsKGMqdy84KSwxLHcsbykpKToocD12b2lkIDAsZz12b2lkIDAsdD1OLHgmJihtPUwpKSwodGhpcy5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlcih0KXx8dGhpcy5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlclZpZXcodCkpJiYodD10aGlzLl9fYWRkaW1hZ2VfXy5hcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKHQpKSwobSYmdGhpcy5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlcihtKXx8dGhpcy5fX2FkZGltYWdlX18uaXNBcnJheUJ1ZmZlclZpZXcobSkpJiYobT10aGlzLl9fYWRkaW1hZ2VfXy5hcnJheUJ1ZmZlclRvQmluYXJ5U3RyaW5nKG0pKSx7YWxpYXM6YSxkYXRhOnQsaW5kZXg6aSxmaWx0ZXI6cCxkZWNvZGVQYXJhbWV0ZXJzOmcsdHJhbnNwYXJlbmN5OlMscGFsZXR0ZTpBLHNNYXNrOm0scHJlZGljdG9yOl8sd2lkdGg6YyxoZWlnaHQ6bCxiaXRzUGVyQ29tcG9uZW50OmQsc01hc2tCaXRzUGVyQ29tcG9uZW50OncsY29sb3JTcGFjZTpifX19LGZ1bmN0aW9uKHQpe3QucHJvY2Vzc0dJRjg5QT1mdW5jdGlvbihlLHIsbixpKXt2YXIgYT1uZXcgaWUoZSksbz1hLndpZHRoLHM9YS5oZWlnaHQsdT1bXTthLmRlY29kZUFuZEJsaXRGcmFtZVJHQkEoMCx1KTt2YXIgYz17ZGF0YTp1LHdpZHRoOm8saGVpZ2h0OnN9LGw9bmV3IG9lKDEwMCkuZW5jb2RlKGMsMTAwKTtyZXR1cm4gdC5wcm9jZXNzSlBFRy5jYWxsKHRoaXMsbCxyLG4saSl9LHQucHJvY2Vzc0dJRjg3QT10LnByb2Nlc3NHSUY4OUF9KEUuQVBJKSxzZS5wcm90b3R5cGUucGFyc2VIZWFkZXI9ZnVuY3Rpb24oKXtpZih0aGlzLmZpbGVTaXplPXRoaXMuZGF0YXYuZ2V0VWludDMyKHRoaXMucG9zLCEwKSx0aGlzLnBvcys9NCx0aGlzLnJlc2VydmVkPXRoaXMuZGF0YXYuZ2V0VWludDMyKHRoaXMucG9zLCEwKSx0aGlzLnBvcys9NCx0aGlzLm9mZnNldD10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy5oZWFkZXJTaXplPXRoaXMuZGF0YXYuZ2V0VWludDMyKHRoaXMucG9zLCEwKSx0aGlzLnBvcys9NCx0aGlzLndpZHRoPXRoaXMuZGF0YXYuZ2V0VWludDMyKHRoaXMucG9zLCEwKSx0aGlzLnBvcys9NCx0aGlzLmhlaWdodD10aGlzLmRhdGF2LmdldEludDMyKHRoaXMucG9zLCEwKSx0aGlzLnBvcys9NCx0aGlzLnBsYW5lcz10aGlzLmRhdGF2LmdldFVpbnQxNih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTIsdGhpcy5iaXRQUD10aGlzLmRhdGF2LmdldFVpbnQxNih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTIsdGhpcy5jb21wcmVzcz10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy5yYXdTaXplPXRoaXMuZGF0YXYuZ2V0VWludDMyKHRoaXMucG9zLCEwKSx0aGlzLnBvcys9NCx0aGlzLmhyPXRoaXMuZGF0YXYuZ2V0VWludDMyKHRoaXMucG9zLCEwKSx0aGlzLnBvcys9NCx0aGlzLnZyPXRoaXMuZGF0YXYuZ2V0VWludDMyKHRoaXMucG9zLCEwKSx0aGlzLnBvcys9NCx0aGlzLmNvbG9ycz10aGlzLmRhdGF2LmdldFVpbnQzMih0aGlzLnBvcywhMCksdGhpcy5wb3MrPTQsdGhpcy5pbXBvcnRhbnRDb2xvcnM9dGhpcy5kYXRhdi5nZXRVaW50MzIodGhpcy5wb3MsITApLHRoaXMucG9zKz00LDE2PT09dGhpcy5iaXRQUCYmdGhpcy5pc193aXRoX2FscGhhJiYodGhpcy5iaXRQUD0xNSksdGhpcy5iaXRQUDwxNSl7dmFyIHQ9MD09PXRoaXMuY29sb3JzPzE8PHRoaXMuYml0UFA6dGhpcy5jb2xvcnM7dGhpcy5wYWxldHRlPW5ldyBBcnJheSh0KTtmb3IodmFyIGU9MDtlPHQ7ZSsrKXt2YXIgcj10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLG49dGhpcy5kYXRhdi5nZXRVaW50OCh0aGlzLnBvcysrLCEwKSxpPXRoaXMuZGF0YXYuZ2V0VWludDgodGhpcy5wb3MrKywhMCksYT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApO3RoaXMucGFsZXR0ZVtlXT17cmVkOmksZ3JlZW46bixibHVlOnIscXVhZDphfX19dGhpcy5oZWlnaHQ8MCYmKHRoaXMuaGVpZ2h0Kj0tMSx0aGlzLmJvdHRvbV91cD0hMSl9LHNlLnByb3RvdHlwZS5wYXJzZUJHUj1mdW5jdGlvbigpe3RoaXMucG9zPXRoaXMub2Zmc2V0O3ZhciB0PVwiYml0XCIrdGhpcy5iaXRQUCxlPXRoaXMud2lkdGgqdGhpcy5oZWlnaHQqNDtpZihlPjUzNjg3MDkxMil0aHJvdyBuZXcgRXJyb3IoXCJJbWFnZSBkaW1lbnNpb25zIGV4Y2VlZCA1MTJNQiwgd2hpY2ggaXMgdG9vIGxhcmdlLlwiKTt0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkoZSk7dHJ5e3RoaXNbdF0oKX1jYXRjaChyKXtvLmxvZyhcImJpdCBkZWNvZGUgZXJyb3I6XCIrcil9fSxzZS5wcm90b3R5cGUuYml0MT1mdW5jdGlvbigpe3ZhciB0LGU9TWF0aC5jZWlsKHRoaXMud2lkdGgvOCkscj1lJTQ7Zm9yKHQ9dGhpcy5oZWlnaHQtMTt0Pj0wO3QtLSl7Zm9yKHZhciBuPXRoaXMuYm90dG9tX3VwP3Q6dGhpcy5oZWlnaHQtMS10LGk9MDtpPGU7aSsrKWZvcih2YXIgYT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLG89bip0aGlzLndpZHRoKjQrOCppKjQscz0wO3M8OCYmOCppK3M8dGhpcy53aWR0aDtzKyspe3ZhciB1PXRoaXMucGFsZXR0ZVthPj43LXMmMV07dGhpcy5kYXRhW28rNCpzXT11LmJsdWUsdGhpcy5kYXRhW28rNCpzKzFdPXUuZ3JlZW4sdGhpcy5kYXRhW28rNCpzKzJdPXUucmVkLHRoaXMuZGF0YVtvKzQqcyszXT0yNTV9MCE9PXImJih0aGlzLnBvcys9NC1yKX19LHNlLnByb3RvdHlwZS5iaXQ0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PU1hdGguY2VpbCh0aGlzLndpZHRoLzIpLGU9dCU0LHI9dGhpcy5oZWlnaHQtMTtyPj0wO3ItLSl7Zm9yKHZhciBuPXRoaXMuYm90dG9tX3VwP3I6dGhpcy5oZWlnaHQtMS1yLGk9MDtpPHQ7aSsrKXt2YXIgYT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLG89bip0aGlzLndpZHRoKjQrMippKjQscz1hPj40LHU9MTUmYSxjPXRoaXMucGFsZXR0ZVtzXTtpZih0aGlzLmRhdGFbb109Yy5ibHVlLHRoaXMuZGF0YVtvKzFdPWMuZ3JlZW4sdGhpcy5kYXRhW28rMl09Yy5yZWQsdGhpcy5kYXRhW28rM109MjU1LDIqaSsxPj10aGlzLndpZHRoKWJyZWFrO2M9dGhpcy5wYWxldHRlW3VdLHRoaXMuZGF0YVtvKzRdPWMuYmx1ZSx0aGlzLmRhdGFbbys0KzFdPWMuZ3JlZW4sdGhpcy5kYXRhW28rNCsyXT1jLnJlZCx0aGlzLmRhdGFbbys0KzNdPTI1NX0wIT09ZSYmKHRoaXMucG9zKz00LWUpfX0sc2UucHJvdG90eXBlLmJpdDg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy53aWR0aCU0LGU9dGhpcy5oZWlnaHQtMTtlPj0wO2UtLSl7Zm9yKHZhciByPXRoaXMuYm90dG9tX3VwP2U6dGhpcy5oZWlnaHQtMS1lLG49MDtuPHRoaXMud2lkdGg7bisrKXt2YXIgaT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLGE9cip0aGlzLndpZHRoKjQrNCpuO2lmKGk8dGhpcy5wYWxldHRlLmxlbmd0aCl7dmFyIG89dGhpcy5wYWxldHRlW2ldO3RoaXMuZGF0YVthXT1vLnJlZCx0aGlzLmRhdGFbYSsxXT1vLmdyZWVuLHRoaXMuZGF0YVthKzJdPW8uYmx1ZSx0aGlzLmRhdGFbYSszXT0yNTV9ZWxzZSB0aGlzLmRhdGFbYV09MjU1LHRoaXMuZGF0YVthKzFdPTI1NSx0aGlzLmRhdGFbYSsyXT0yNTUsdGhpcy5kYXRhW2ErM109MjU1fTAhPT10JiYodGhpcy5wb3MrPTQtdCl9fSxzZS5wcm90b3R5cGUuYml0MTU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy53aWR0aCUzLGU9cGFyc2VJbnQoXCIxMTExMVwiLDIpLHI9dGhpcy5oZWlnaHQtMTtyPj0wO3ItLSl7Zm9yKHZhciBuPXRoaXMuYm90dG9tX3VwP3I6dGhpcy5oZWlnaHQtMS1yLGk9MDtpPHRoaXMud2lkdGg7aSsrKXt2YXIgYT10aGlzLmRhdGF2LmdldFVpbnQxNih0aGlzLnBvcywhMCk7dGhpcy5wb3MrPTI7dmFyIG89KGEmZSkvZSoyNTV8MCxzPShhPj41JmUpL2UqMjU1fDAsdT0oYT4+MTAmZSkvZSoyNTV8MCxjPWE+PjE1PzI1NTowLGw9bip0aGlzLndpZHRoKjQrNCppO3RoaXMuZGF0YVtsXT11LHRoaXMuZGF0YVtsKzFdPXMsdGhpcy5kYXRhW2wrMl09byx0aGlzLmRhdGFbbCszXT1jfXRoaXMucG9zKz10fX0sc2UucHJvdG90eXBlLmJpdDE2PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMud2lkdGglMyxlPXBhcnNlSW50KFwiMTExMTFcIiwyKSxyPXBhcnNlSW50KFwiMTExMTExXCIsMiksbj10aGlzLmhlaWdodC0xO24+PTA7bi0tKXtmb3IodmFyIGk9dGhpcy5ib3R0b21fdXA/bjp0aGlzLmhlaWdodC0xLW4sYT0wO2E8dGhpcy53aWR0aDthKyspe3ZhciBvPXRoaXMuZGF0YXYuZ2V0VWludDE2KHRoaXMucG9zLCEwKTt0aGlzLnBvcys9Mjt2YXIgcz0obyZlKS9lKjI1NXwwLHU9KG8+PjUmcikvcioyNTV8MCxjPShvPj4xMSkvZSoyNTV8MCxsPWkqdGhpcy53aWR0aCo0KzQqYTt0aGlzLmRhdGFbbF09Yyx0aGlzLmRhdGFbbCsxXT11LHRoaXMuZGF0YVtsKzJdPXMsdGhpcy5kYXRhW2wrM109MjU1fXRoaXMucG9zKz10fX0sc2UucHJvdG90eXBlLmJpdDI0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuaGVpZ2h0LTE7dD49MDt0LS0pe2Zvcih2YXIgZT10aGlzLmJvdHRvbV91cD90OnRoaXMuaGVpZ2h0LTEtdCxyPTA7cjx0aGlzLndpZHRoO3IrKyl7dmFyIG49dGhpcy5kYXRhdi5nZXRVaW50OCh0aGlzLnBvcysrLCEwKSxpPXRoaXMuZGF0YXYuZ2V0VWludDgodGhpcy5wb3MrKywhMCksYT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLG89ZSp0aGlzLndpZHRoKjQrNCpyO3RoaXMuZGF0YVtvXT1hLHRoaXMuZGF0YVtvKzFdPWksdGhpcy5kYXRhW28rMl09bix0aGlzLmRhdGFbbyszXT0yNTV9dGhpcy5wb3MrPXRoaXMud2lkdGglNH19LHNlLnByb3RvdHlwZS5iaXQzMj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmhlaWdodC0xO3Q+PTA7dC0tKWZvcih2YXIgZT10aGlzLmJvdHRvbV91cD90OnRoaXMuaGVpZ2h0LTEtdCxyPTA7cjx0aGlzLndpZHRoO3IrKyl7dmFyIG49dGhpcy5kYXRhdi5nZXRVaW50OCh0aGlzLnBvcysrLCEwKSxpPXRoaXMuZGF0YXYuZ2V0VWludDgodGhpcy5wb3MrKywhMCksYT10aGlzLmRhdGF2LmdldFVpbnQ4KHRoaXMucG9zKyssITApLG89dGhpcy5kYXRhdi5nZXRVaW50OCh0aGlzLnBvcysrLCEwKSxzPWUqdGhpcy53aWR0aCo0KzQqcjt0aGlzLmRhdGFbc109YSx0aGlzLmRhdGFbcysxXT1pLHRoaXMuZGF0YVtzKzJdPW4sdGhpcy5kYXRhW3MrM109b319LHNlLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggQXJhcyBBYmJhc2lcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuZnVuY3Rpb24odCl7dC5wcm9jZXNzQk1QPWZ1bmN0aW9uKGUscixuLGkpe3ZhciBhPW5ldyBzZShlLCExKSxvPWEud2lkdGgscz1hLmhlaWdodCx1PXtkYXRhOmEuZ2V0RGF0YSgpLHdpZHRoOm8saGVpZ2h0OnN9LGM9bmV3IG9lKDEwMCkuZW5jb2RlKHUsMTAwKTtyZXR1cm4gdC5wcm9jZXNzSlBFRy5jYWxsKHRoaXMsYyxyLG4saSl9fShFLkFQSSksdWUucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfSxcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxOSBBcmFzIEFiYmFzaVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5mdW5jdGlvbih0KXt0LnByb2Nlc3NXRUJQPWZ1bmN0aW9uKGUscixuLGkpe3ZhciBhPW5ldyB1ZShlKSxvPWEud2lkdGgscz1hLmhlaWdodCx1PXtkYXRhOmEuZ2V0RGF0YSgpLHdpZHRoOm8saGVpZ2h0OnN9LGM9bmV3IG9lKDEwMCkuZW5jb2RlKHUsMTAwKTtyZXR1cm4gdC5wcm9jZXNzSlBFRy5jYWxsKHRoaXMsYyxyLG4saSl9fShFLkFQSSksRS5BUEkucHJvY2Vzc1JHQkE9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbj10LmRhdGEsaT1uLmxlbmd0aCxhPW5ldyBVaW50OEFycmF5KGkvNCozKSxvPW5ldyBVaW50OEFycmF5KGkvNCkscz0wLHU9MCxjPTA7YzxpO2MrPTQpe3ZhciBsPW5bY10saD1uW2MrMV0sZj1uW2MrMl0sZD1uW2MrM107YVtzKytdPWwsYVtzKytdPWgsYVtzKytdPWYsb1t1KytdPWR9dmFyIHA9dGhpcy5fX2FkZGltYWdlX18uYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhhKTtyZXR1cm57YWxwaGE6dGhpcy5fX2FkZGltYWdlX18uYXJyYXlCdWZmZXJUb0JpbmFyeVN0cmluZyhvKSxkYXRhOnAsaW5kZXg6ZSxhbGlhczpyLGNvbG9yU3BhY2U6XCJEZXZpY2VSR0JcIixiaXRzUGVyQ29tcG9uZW50Ojgsd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fSxFLkFQSS5zZXRMYW5ndWFnZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dGhpcy5pbnRlcm5hbC5sYW5ndWFnZVNldHRpbmdzJiYodGhpcy5pbnRlcm5hbC5sYW5ndWFnZVNldHRpbmdzPXt9LHRoaXMuaW50ZXJuYWwubGFuZ3VhZ2VTZXR0aW5ncy5pc1N1YnNjcmliZWQ9ITEpLHZvaWQgMCE9PXthZjpcIkFmcmlrYWFuc1wiLHNxOlwiQWxiYW5pYW5cIixhcjpcIkFyYWJpYyAoU3RhbmRhcmQpXCIsXCJhci1EWlwiOlwiQXJhYmljIChBbGdlcmlhKVwiLFwiYXItQkhcIjpcIkFyYWJpYyAoQmFocmFpbilcIixcImFyLUVHXCI6XCJBcmFiaWMgKEVneXB0KVwiLFwiYXItSVFcIjpcIkFyYWJpYyAoSXJhcSlcIixcImFyLUpPXCI6XCJBcmFiaWMgKEpvcmRhbilcIixcImFyLUtXXCI6XCJBcmFiaWMgKEt1d2FpdClcIixcImFyLUxCXCI6XCJBcmFiaWMgKExlYmFub24pXCIsXCJhci1MWVwiOlwiQXJhYmljIChMaWJ5YSlcIixcImFyLU1BXCI6XCJBcmFiaWMgKE1vcm9jY28pXCIsXCJhci1PTVwiOlwiQXJhYmljIChPbWFuKVwiLFwiYXItUUFcIjpcIkFyYWJpYyAoUWF0YXIpXCIsXCJhci1TQVwiOlwiQXJhYmljIChTYXVkaSBBcmFiaWEpXCIsXCJhci1TWVwiOlwiQXJhYmljIChTeXJpYSlcIixcImFyLVROXCI6XCJBcmFiaWMgKFR1bmlzaWEpXCIsXCJhci1BRVwiOlwiQXJhYmljIChVLkEuRS4pXCIsXCJhci1ZRVwiOlwiQXJhYmljIChZZW1lbilcIixhbjpcIkFyYWdvbmVzZVwiLGh5OlwiQXJtZW5pYW5cIixhczpcIkFzc2FtZXNlXCIsYXN0OlwiQXN0dXJpYW5cIixhejpcIkF6ZXJiYWlqYW5pXCIsZXU6XCJCYXNxdWVcIixiZTpcIkJlbGFydXNpYW5cIixibjpcIkJlbmdhbGlcIixiczpcIkJvc25pYW5cIixicjpcIkJyZXRvblwiLGJnOlwiQnVsZ2FyaWFuXCIsbXk6XCJCdXJtZXNlXCIsY2E6XCJDYXRhbGFuXCIsY2g6XCJDaGFtb3Jyb1wiLGNlOlwiQ2hlY2hlblwiLHpoOlwiQ2hpbmVzZVwiLFwiemgtSEtcIjpcIkNoaW5lc2UgKEhvbmcgS29uZylcIixcInpoLUNOXCI6XCJDaGluZXNlIChQUkMpXCIsXCJ6aC1TR1wiOlwiQ2hpbmVzZSAoU2luZ2Fwb3JlKVwiLFwiemgtVFdcIjpcIkNoaW5lc2UgKFRhaXdhbilcIixjdjpcIkNodXZhc2hcIixjbzpcIkNvcnNpY2FuXCIsY3I6XCJDcmVlXCIsaHI6XCJDcm9hdGlhblwiLGNzOlwiQ3plY2hcIixkYTpcIkRhbmlzaFwiLG5sOlwiRHV0Y2ggKFN0YW5kYXJkKVwiLFwibmwtQkVcIjpcIkR1dGNoIChCZWxnaWFuKVwiLGVuOlwiRW5nbGlzaFwiLFwiZW4tQVVcIjpcIkVuZ2xpc2ggKEF1c3RyYWxpYSlcIixcImVuLUJaXCI6XCJFbmdsaXNoIChCZWxpemUpXCIsXCJlbi1DQVwiOlwiRW5nbGlzaCAoQ2FuYWRhKVwiLFwiZW4tSUVcIjpcIkVuZ2xpc2ggKElyZWxhbmQpXCIsXCJlbi1KTVwiOlwiRW5nbGlzaCAoSmFtYWljYSlcIixcImVuLU5aXCI6XCJFbmdsaXNoIChOZXcgWmVhbGFuZClcIixcImVuLVBIXCI6XCJFbmdsaXNoIChQaGlsaXBwaW5lcylcIixcImVuLVpBXCI6XCJFbmdsaXNoIChTb3V0aCBBZnJpY2EpXCIsXCJlbi1UVFwiOlwiRW5nbGlzaCAoVHJpbmlkYWQgJiBUb2JhZ28pXCIsXCJlbi1HQlwiOlwiRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pXCIsXCJlbi1VU1wiOlwiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcylcIixcImVuLVpXXCI6XCJFbmdsaXNoIChaaW1iYWJ3ZSlcIixlbzpcIkVzcGVyYW50b1wiLGV0OlwiRXN0b25pYW5cIixmbzpcIkZhZXJvZXNlXCIsZmo6XCJGaWppYW5cIixmaTpcIkZpbm5pc2hcIixmcjpcIkZyZW5jaCAoU3RhbmRhcmQpXCIsXCJmci1CRVwiOlwiRnJlbmNoIChCZWxnaXVtKVwiLFwiZnItQ0FcIjpcIkZyZW5jaCAoQ2FuYWRhKVwiLFwiZnItRlJcIjpcIkZyZW5jaCAoRnJhbmNlKVwiLFwiZnItTFVcIjpcIkZyZW5jaCAoTHV4ZW1ib3VyZylcIixcImZyLU1DXCI6XCJGcmVuY2ggKE1vbmFjbylcIixcImZyLUNIXCI6XCJGcmVuY2ggKFN3aXR6ZXJsYW5kKVwiLGZ5OlwiRnJpc2lhblwiLGZ1cjpcIkZyaXVsaWFuXCIsZ2Q6XCJHYWVsaWMgKFNjb3RzKVwiLFwiZ2QtSUVcIjpcIkdhZWxpYyAoSXJpc2gpXCIsZ2w6XCJHYWxhY2lhblwiLGthOlwiR2VvcmdpYW5cIixkZTpcIkdlcm1hbiAoU3RhbmRhcmQpXCIsXCJkZS1BVFwiOlwiR2VybWFuIChBdXN0cmlhKVwiLFwiZGUtREVcIjpcIkdlcm1hbiAoR2VybWFueSlcIixcImRlLUxJXCI6XCJHZXJtYW4gKExpZWNodGVuc3RlaW4pXCIsXCJkZS1MVVwiOlwiR2VybWFuIChMdXhlbWJvdXJnKVwiLFwiZGUtQ0hcIjpcIkdlcm1hbiAoU3dpdHplcmxhbmQpXCIsZWw6XCJHcmVla1wiLGd1OlwiR3VqdXJhdGlcIixodDpcIkhhaXRpYW5cIixoZTpcIkhlYnJld1wiLGhpOlwiSGluZGlcIixodTpcIkh1bmdhcmlhblwiLGlzOlwiSWNlbGFuZGljXCIsaWQ6XCJJbmRvbmVzaWFuXCIsaXU6XCJJbnVrdGl0dXRcIixnYTpcIklyaXNoXCIsaXQ6XCJJdGFsaWFuIChTdGFuZGFyZClcIixcIml0LUNIXCI6XCJJdGFsaWFuIChTd2l0emVybGFuZClcIixqYTpcIkphcGFuZXNlXCIsa246XCJLYW5uYWRhXCIsa3M6XCJLYXNobWlyaVwiLGtrOlwiS2F6YWtoXCIsa206XCJLaG1lclwiLGt5OlwiS2lyZ2hpelwiLHRsaDpcIktsaW5nb25cIixrbzpcIktvcmVhblwiLFwia28tS1BcIjpcIktvcmVhbiAoTm9ydGggS29yZWEpXCIsXCJrby1LUlwiOlwiS29yZWFuIChTb3V0aCBLb3JlYSlcIixsYTpcIkxhdGluXCIsbHY6XCJMYXR2aWFuXCIsbHQ6XCJMaXRodWFuaWFuXCIsbGI6XCJMdXhlbWJvdXJnaXNoXCIsbWs6XCJOb3J0aCBNYWNlZG9uaWFcIixtczpcIk1hbGF5XCIsbWw6XCJNYWxheWFsYW1cIixtdDpcIk1hbHRlc2VcIixtaTpcIk1hb3JpXCIsbXI6XCJNYXJhdGhpXCIsbW86XCJNb2xkYXZpYW5cIixudjpcIk5hdmFqb1wiLG5nOlwiTmRvbmdhXCIsbmU6XCJOZXBhbGlcIixubzpcIk5vcndlZ2lhblwiLG5iOlwiTm9yd2VnaWFuIChCb2ttYWwpXCIsbm46XCJOb3J3ZWdpYW4gKE55bm9yc2spXCIsb2M6XCJPY2NpdGFuXCIsb3I6XCJPcml5YVwiLG9tOlwiT3JvbW9cIixmYTpcIlBlcnNpYW5cIixcImZhLUlSXCI6XCJQZXJzaWFuL0lyYW5cIixwbDpcIlBvbGlzaFwiLHB0OlwiUG9ydHVndWVzZVwiLFwicHQtQlJcIjpcIlBvcnR1Z3Vlc2UgKEJyYXppbClcIixwYTpcIlB1bmphYmlcIixcInBhLUlOXCI6XCJQdW5qYWJpIChJbmRpYSlcIixcInBhLVBLXCI6XCJQdW5qYWJpIChQYWtpc3RhbilcIixxdTpcIlF1ZWNodWFcIixybTpcIlJoYWV0by1Sb21hbmljXCIscm86XCJSb21hbmlhblwiLFwicm8tTU9cIjpcIlJvbWFuaWFuIChNb2xkYXZpYSlcIixydTpcIlJ1c3NpYW5cIixcInJ1LU1PXCI6XCJSdXNzaWFuIChNb2xkYXZpYSlcIixzejpcIlNhbWkgKExhcHBpc2gpXCIsc2c6XCJTYW5nb1wiLHNhOlwiU2Fuc2tyaXRcIixzYzpcIlNhcmRpbmlhblwiLHNkOlwiU2luZGhpXCIsc2k6XCJTaW5naGFsZXNlXCIsc3I6XCJTZXJiaWFuXCIsc2s6XCJTbG92YWtcIixzbDpcIlNsb3ZlbmlhblwiLHNvOlwiU29tYW5pXCIsc2I6XCJTb3JiaWFuXCIsZXM6XCJTcGFuaXNoXCIsXCJlcy1BUlwiOlwiU3BhbmlzaCAoQXJnZW50aW5hKVwiLFwiZXMtQk9cIjpcIlNwYW5pc2ggKEJvbGl2aWEpXCIsXCJlcy1DTFwiOlwiU3BhbmlzaCAoQ2hpbGUpXCIsXCJlcy1DT1wiOlwiU3BhbmlzaCAoQ29sb21iaWEpXCIsXCJlcy1DUlwiOlwiU3BhbmlzaCAoQ29zdGEgUmljYSlcIixcImVzLURPXCI6XCJTcGFuaXNoIChEb21pbmljYW4gUmVwdWJsaWMpXCIsXCJlcy1FQ1wiOlwiU3BhbmlzaCAoRWN1YWRvcilcIixcImVzLVNWXCI6XCJTcGFuaXNoIChFbCBTYWx2YWRvcilcIixcImVzLUdUXCI6XCJTcGFuaXNoIChHdWF0ZW1hbGEpXCIsXCJlcy1ITlwiOlwiU3BhbmlzaCAoSG9uZHVyYXMpXCIsXCJlcy1NWFwiOlwiU3BhbmlzaCAoTWV4aWNvKVwiLFwiZXMtTklcIjpcIlNwYW5pc2ggKE5pY2FyYWd1YSlcIixcImVzLVBBXCI6XCJTcGFuaXNoIChQYW5hbWEpXCIsXCJlcy1QWVwiOlwiU3BhbmlzaCAoUGFyYWd1YXkpXCIsXCJlcy1QRVwiOlwiU3BhbmlzaCAoUGVydSlcIixcImVzLVBSXCI6XCJTcGFuaXNoIChQdWVydG8gUmljbylcIixcImVzLUVTXCI6XCJTcGFuaXNoIChTcGFpbilcIixcImVzLVVZXCI6XCJTcGFuaXNoIChVcnVndWF5KVwiLFwiZXMtVkVcIjpcIlNwYW5pc2ggKFZlbmV6dWVsYSlcIixzeDpcIlN1dHVcIixzdzpcIlN3YWhpbGlcIixzdjpcIlN3ZWRpc2hcIixcInN2LUZJXCI6XCJTd2VkaXNoIChGaW5sYW5kKVwiLFwic3YtU1ZcIjpcIlN3ZWRpc2ggKFN3ZWRlbilcIix0YTpcIlRhbWlsXCIsdHQ6XCJUYXRhclwiLHRlOlwiVGVsdWdhXCIsdGg6XCJUaGFpXCIsdGlnOlwiVGlncmVcIix0czpcIlRzb25nYVwiLHRuOlwiVHN3YW5hXCIsdHI6XCJUdXJraXNoXCIsdGs6XCJUdXJrbWVuXCIsdWs6XCJVa3JhaW5pYW5cIixoc2I6XCJVcHBlciBTb3JiaWFuXCIsdXI6XCJVcmR1XCIsdmU6XCJWZW5kYVwiLHZpOlwiVmlldG5hbWVzZVwiLHZvOlwiVm9sYXB1a1wiLHdhOlwiV2FsbG9vblwiLGN5OlwiV2Vsc2hcIix4aDpcIlhob3NhXCIsamk6XCJZaWRkaXNoXCIsenU6XCJadWx1XCJ9W3RdJiYodGhpcy5pbnRlcm5hbC5sYW5ndWFnZVNldHRpbmdzLmxhbmd1YWdlQ29kZT10LCExPT09dGhpcy5pbnRlcm5hbC5sYW5ndWFnZVNldHRpbmdzLmlzU3Vic2NyaWJlZCYmKHRoaXMuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZShcInB1dENhdGFsb2dcIixmdW5jdGlvbigpe3RoaXMuaW50ZXJuYWwud3JpdGUoXCIvTGFuZyAoXCIrdGhpcy5pbnRlcm5hbC5sYW5ndWFnZVNldHRpbmdzLmxhbmd1YWdlQ29kZStcIilcIil9KSx0aGlzLmludGVybmFsLmxhbmd1YWdlU2V0dGluZ3MuaXNTdWJzY3JpYmVkPSEwKSksdGhpc30senQ9RS5BUEksVXQ9enQuZ2V0Q2hhcldpZHRoc0FycmF5PWZ1bmN0aW9uKGUscil7dmFyIG4saSxhPShyPXJ8fHt9KS5mb250fHx0aGlzLmludGVybmFsLmdldEZvbnQoKSxvPXIuZm9udFNpemV8fHRoaXMuaW50ZXJuYWwuZ2V0Rm9udFNpemUoKSxzPXIuY2hhclNwYWNlfHx0aGlzLmludGVybmFsLmdldENoYXJTcGFjZSgpLHU9ci53aWR0aHM/ci53aWR0aHM6YS5tZXRhZGF0YS5Vbmljb2RlLndpZHRocyxjPXUuZm9mP3UuZm9mOjEsbD1yLmtlcm5pbmc/ci5rZXJuaW5nOmEubWV0YWRhdGEuVW5pY29kZS5rZXJuaW5nLGg9bC5mb2Y/bC5mb2Y6MSxmPSExIT09ci5kb0tlcm5pbmcsZD0wLHA9ZS5sZW5ndGgsZz0wLG09dVswXXx8Yyx2PVtdO2ZvcihuPTA7bjxwO24rKylpPWUuY2hhckNvZGVBdChuKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLm1ldGFkYXRhLndpZHRoT2ZTdHJpbmc/di5wdXNoKChhLm1ldGFkYXRhLndpZHRoT2ZHbHlwaChhLm1ldGFkYXRhLmNoYXJhY3RlclRvR2x5cGgoaSkpK3MqKDFlMy9vKXx8MCkvMWUzKTooZD1mJiZcIm9iamVjdFwiPT09dChsW2ldKSYmIWlzTmFOKHBhcnNlSW50KGxbaV1bZ10sMTApKT9sW2ldW2ddL2g6MCx2LnB1c2goKHVbaV18fG0pL2MrZCkpLGc9aTtyZXR1cm4gdn0sSHQ9enQuZ2V0U3RyaW5nVW5pdFdpZHRoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9KGU9ZXx8e30pLmZvbnRTaXplfHx0aGlzLmludGVybmFsLmdldEZvbnRTaXplKCksbj1lLmZvbnR8fHRoaXMuaW50ZXJuYWwuZ2V0Rm9udCgpLGk9ZS5jaGFyU3BhY2V8fHRoaXMuaW50ZXJuYWwuZ2V0Q2hhclNwYWNlKCk7cmV0dXJuIHp0LnByb2Nlc3NBcmFiaWMmJih0PXp0LnByb2Nlc3NBcmFiaWModCkpLFwiZnVuY3Rpb25cIj09dHlwZW9mIG4ubWV0YWRhdGEud2lkdGhPZlN0cmluZz9uLm1ldGFkYXRhLndpZHRoT2ZTdHJpbmcodCxyLGkpL3I6VXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9LDApfSxXdD1mdW5jdGlvbih0LGUscixuKXtmb3IodmFyIGk9W10sYT0wLG89dC5sZW5ndGgscz0wO2EhPT1vJiZzK2VbYV08cjspcys9ZVthXSxhKys7aS5wdXNoKHQuc2xpY2UoMCxhKSk7dmFyIHU9YTtmb3Iocz0wO2EhPT1vOylzK2VbYV0+biYmKGkucHVzaCh0LnNsaWNlKHUsYSkpLHM9MCx1PWEpLHMrPWVbYV0sYSsrO3JldHVybiB1IT09YSYmaS5wdXNoKHQuc2xpY2UodSxhKSksaX0sVnQ9ZnVuY3Rpb24odCxlLHIpe3J8fChyPXt9KTt2YXIgbixpLGEsbyxzLHUsYyxsPVtdLGg9W2xdLGY9ci50ZXh0SW5kZW50fHwwLGQ9MCxwPTAsZz10LnNwbGl0KFwiIFwiKSxtPVV0LmFwcGx5KHRoaXMsW1wiIFwiLHJdKVswXTtpZih1PS0xPT09ci5saW5lSW5kZW50P2dbMF0ubGVuZ3RoKzI6ci5saW5lSW5kZW50fHwwKXt2YXIgdj1BcnJheSh1KS5qb2luKFwiIFwiKSxiPVtdO2cubWFwKGZ1bmN0aW9uKHQpeyh0PXQuc3BsaXQoL1xccypcXG4vKSkubGVuZ3RoPjE/Yj1iLmNvbmNhdCh0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybihlJiZ0Lmxlbmd0aD9cIlxcblwiOlwiXCIpK3R9KSk6Yi5wdXNoKHRbMF0pfSksZz1iLHU9SHQuYXBwbHkodGhpcyxbdixyXSl9Zm9yKGE9MCxvPWcubGVuZ3RoO2E8bzthKyspe3ZhciB5PTA7aWYobj1nW2FdLHUmJlwiXFxuXCI9PW5bMF0mJihuPW4uc3Vic3RyKDEpLHk9MSksZitkKyhwPShpPVV0LmFwcGx5KHRoaXMsW24scl0pKS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSwwKSk+ZXx8eSl7aWYocD5lKXtmb3Iocz1XdC5hcHBseSh0aGlzLFtuLGksZS0oZitkKSxlXSksbC5wdXNoKHMuc2hpZnQoKSksbD1bcy5wb3AoKV07cy5sZW5ndGg7KWgucHVzaChbcy5zaGlmdCgpXSk7cD1pLnNsaWNlKG4ubGVuZ3RoLShsWzBdP2xbMF0ubGVuZ3RoOjApKS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSwwKX1lbHNlIGw9W25dO2gucHVzaChsKSxmPXArdSxkPW19ZWxzZSBsLnB1c2gobiksZis9ZCtwLGQ9bX1yZXR1cm4gYz11P2Z1bmN0aW9uKHQsZSl7cmV0dXJuKGU/djpcIlwiKSt0LmpvaW4oXCIgXCIpfTpmdW5jdGlvbih0KXtyZXR1cm4gdC5qb2luKFwiIFwiKX0saC5tYXAoYyl9LHp0LnNwbGl0VGV4dFRvU2l6ZT1mdW5jdGlvbih0LGUscil7dmFyIG4saT0ocj1yfHx7fSkuZm9udFNpemV8fHRoaXMuaW50ZXJuYWwuZ2V0Rm9udFNpemUoKSxhPWZ1bmN0aW9uKHQpe2lmKHQud2lkdGhzJiZ0Lmtlcm5pbmcpcmV0dXJue3dpZHRoczp0LndpZHRocyxrZXJuaW5nOnQua2VybmluZ307dmFyIGU9dGhpcy5pbnRlcm5hbC5nZXRGb250KHQuZm9udE5hbWUsdC5mb250U3R5bGUpLHI9XCJVbmljb2RlXCI7cmV0dXJuIGUubWV0YWRhdGFbcl0/e3dpZHRoczplLm1ldGFkYXRhW3JdLndpZHRoc3x8ezA6MX0sa2VybmluZzplLm1ldGFkYXRhW3JdLmtlcm5pbmd8fHt9fTp7Zm9udDplLm1ldGFkYXRhLGZvbnRTaXplOnRoaXMuaW50ZXJuYWwuZ2V0Rm9udFNpemUoKSxjaGFyU3BhY2U6dGhpcy5pbnRlcm5hbC5nZXRDaGFyU3BhY2UoKX19LmNhbGwodGhpcyxyKTtuPUFycmF5LmlzQXJyYXkodCk/dDpTdHJpbmcodCkuc3BsaXQoL1xccj9cXG4vKTt2YXIgbz0xKnRoaXMuaW50ZXJuYWwuc2NhbGVGYWN0b3IqZS9pO2EudGV4dEluZGVudD1yLnRleHRJbmRlbnQ/MSpyLnRleHRJbmRlbnQqdGhpcy5pbnRlcm5hbC5zY2FsZUZhY3Rvci9pOjAsYS5saW5lSW5kZW50PXIubGluZUluZGVudDt2YXIgcyx1LGM9W107Zm9yKHM9MCx1PW4ubGVuZ3RoO3M8dTtzKyspYz1jLmNvbmNhdChWdC5hcHBseSh0aGlzLFtuW3NdLG8sYV0pKTtyZXR1cm4gY30sZnVuY3Rpb24oZSl7ZS5fX2ZvbnRtZXRyaWNzX189ZS5fX2ZvbnRtZXRyaWNzX198fHt9O2Zvcih2YXIgcj1cIjAxMjM0NTY3ODlhYmNkZWZcIixuPVwia2xtbm9wcXJzdHV2d3h5elwiLGk9e30sYT17fSxvPTA7bzwxNjtvKyspaVtuW29dXT1yW29dLGFbcltvXV09bltvXTt2YXIgcz1mdW5jdGlvbih0KXtyZXR1cm5cIjB4XCIrcGFyc2VJbnQodCwxMCkudG9TdHJpbmcoMTYpfSx1PWUuX19mb250bWV0cmljc19fLmNvbXByZXNzPWZ1bmN0aW9uKGUpe3ZhciByLG4saSxvLGM9W1wie1wiXTtmb3IodmFyIGwgaW4gZSl7aWYocj1lW2xdLGlzTmFOKHBhcnNlSW50KGwsMTApKT9uPVwiJ1wiK2wrXCInXCI6KGw9cGFyc2VJbnQobCwxMCksbj0obj1zKGwpLnNsaWNlKDIpKS5zbGljZSgwLC0xKSthW24uc2xpY2UoLTEpXSksXCJudW1iZXJcIj09dHlwZW9mIHIpcjwwPyhpPXMocikuc2xpY2UoMyksbz1cIi1cIik6KGk9cyhyKS5zbGljZSgyKSxvPVwiXCIpLGk9bytpLnNsaWNlKDAsLTEpK2FbaS5zbGljZSgtMSldO2Vsc2V7aWYoXCJvYmplY3RcIiE9PXQocikpdGhyb3cgbmV3IEVycm9yKFwiRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdmFsdWUgdHlwZSBcIit0KHIpK1wiLlwiKTtpPXUocil9Yy5wdXNoKG4raSl9cmV0dXJuIGMucHVzaChcIn1cIiksYy5qb2luKFwiXCIpfSxjPWUuX19mb250bWV0cmljc19fLnVuY29tcHJlc3M9ZnVuY3Rpb24odCl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8gdW5jb21wcmVzcy5cIik7Zm9yKHZhciBlLHIsbixhLG89e30scz0xLHU9byxjPVtdLGw9XCJcIixoPVwiXCIsZj10Lmxlbmd0aC0xLGQ9MTtkPGY7ZCs9MSlcIidcIj09KGE9dFtkXSk/ZT8obj1lLmpvaW4oXCJcIiksZT12b2lkIDApOmU9W106ZT9lLnB1c2goYSk6XCJ7XCI9PWE/KGMucHVzaChbdSxuXSksdT17fSxuPXZvaWQgMCk6XCJ9XCI9PWE/KChyPWMucG9wKCkpWzBdW3JbMV1dPXUsbj12b2lkIDAsdT1yWzBdKTpcIi1cIj09YT9zPS0xOnZvaWQgMD09PW4/aS5oYXNPd25Qcm9wZXJ0eShhKT8obCs9aVthXSxuPXBhcnNlSW50KGwsMTYpKnMscz0xLGw9XCJcIik6bCs9YTppLmhhc093blByb3BlcnR5KGEpPyhoKz1pW2FdLHVbbl09cGFyc2VJbnQoaCwxNikqcyxzPTEsbj12b2lkIDAsaD1cIlwiKTpoKz1hO3JldHVybiBvfSxsPXtjb2RlUGFnZXM6W1wiV2luQW5zaUVuY29kaW5nXCJdLFdpbkFuc2lFbmNvZGluZzpjKFwiezE5bThuMjAxbjlxMjAxbzlyMjAxczlsMjAxdDltMjAxdThtMjAxdzluMjAxeDlvMjAxeThvMjAyazhxMjAybDhyMjAybTlwMjAycThwMjBhdzhrMjAzazh0MjAzdDh2MjAzdTl2MmNxOHMyMTJtOXQxNW04dzE1bjl3MmR3OXMxNms4dTE2bDl1MTdzOXoxN3g4eTE3eTl5fVwiKX0saD17VW5pY29kZTp7Q291cmllcjpsLFwiQ291cmllci1Cb2xkXCI6bCxcIkNvdXJpZXItQm9sZE9ibGlxdWVcIjpsLFwiQ291cmllci1PYmxpcXVlXCI6bCxIZWx2ZXRpY2E6bCxcIkhlbHZldGljYS1Cb2xkXCI6bCxcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiOmwsXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiOmwsXCJUaW1lcy1Sb21hblwiOmwsXCJUaW1lcy1Cb2xkXCI6bCxcIlRpbWVzLUJvbGRJdGFsaWNcIjpsLFwiVGltZXMtSXRhbGljXCI6bH19LGY9e1VuaWNvZGU6e1wiQ291cmllci1PYmxpcXVlXCI6YyhcInsnd2lkdGhzJ3trM3cnZm9mJzZvfSdrZXJuaW5nJ3snZm9mJy02b319XCIpLFwiVGltZXMtQm9sZEl0YWxpY1wiOmMoXCJ7J3dpZHRocyd7azNvMnE0eWN4MnIyMDFuM20yMDFvNm8yMDFzMmwyMDF0MmwyMDF1MmwyMDF3M20yMDF4M20yMDF5M20yazF0MmwycjIwMm0ybjJuM20ybzNtMnA1bjIwMnE2bzJyMXcyczJsMnQybDJ1M20ydjN0MncxdDJ4MmwyeTF0MnoxdzNrM20zbDNtM20zbTNuM20zbzNtM3AzbTNxM20zcjNtM3MzbTIwM3QybDIwM3UybDN2MmwzdzN0M3gzdDN5M3QzejNtNGs1bjRsNG00bTRtNG40bTRvNHM0cDRtNHE0bTRyNHM0czR5NHQycjR1M200djRtNHczeDR4NXQ0eTRzNHo0czVrM3g1bDRzNW00bTVuM3I1bzN4NXA0czVxNG01cjV0NXM0bTV0M3g1dTN4NXYybDV3MXc1eDJsNXkzdDV6M202azJsNmwzbTZtM202bjJ3Nm8zbTZwMnc2cTJsNnIzbTZzM3I2dDF3NnUxdzZ2M202dzF3Nng0eTZ5M3I2ejNtN2szbTdsM203bTJyN24ycjdvMXc3cDNyN3EydzdyNG03czNtN3Qydzd1MnI3djJuN3cxcTd4Mm43eTN0MjAybDNtY2w0bWFsMnJhbTNtYW4zbWFvM21hcDNtYXIzbWFzMmxhdDR1YXUxdWF2M21hdzN3YXk0dWF6MmxiazJzYmwzdCdmb2YnNm9ibzJsYnAzdGJxM21icjF0YnMybGJ1MXlidjNtYnozbWNrNG0yMDJrM21jbTRtY240bWNvNG1jcDRtY3E1eWNyNG1jczRtY3Q0bWN1NG1jdjRtY3cycjJtM3JjeTJyY3oycmRsNHNkbTRzZG40c2RvNHNkcDRzZHE0c2RzNHNkdDRzZHU0c2R2NHNkdzRzZHozbWVrM21lbDNtZW0zbWVuM21lbzNtZXAzbWVxNHNlcjJ3ZXMyd2V0MndldTJ3ZXYyd2V3MXdleDF3ZXkxd2V6MXdmbDNyZm0zbWZuM21mbzNtZnAzbWZxM21mcjN0ZnMzbWZ0M3JmdTNyZnYzcmZ3M3JmejJ3MjAzazZvMjEybTZvMmR3MmwyY3EybDN0M20zdTJsMTdzM3gxOW0zbX0na2VybmluZyd7Y2x7NHF1NWt0NXF0NXJzMTdzczV0c30yMDFzezIwMXNzfTIwMXR7Y2tzNGxzY21zY25zY29zY3BzY2xzMnd1Mnl1MjAxdHN9MjAxeHsyd3UyeXV9Mmt7MjAxdHN9Mnd7NHF4NWt4NW91NXF4NXJzMTdzdTV0dX0yeHsxN3N1NXR1NW91fTJ5ezRxeDVreDVvdTVxeDVyczE3c3M1dHN9J2ZvZictNm9mbnsxN3N3NXR3NW91NXF3NXJzfTd0e2Nrc2Nsc2Ntc2Nuc2Nvc2NwczRsc30zdXsxN3N1NXR1NW9zNXFzfTN2ezE3c3U1dHU1b3M1cXN9N3B7MTdzdTV0dX1ja3s0cXU1a3Q1cXQ1cnMxN3NzNXRzfTRsezRxdTVrdDVxdDVyczE3c3M1dHN9Y217NHF1NWt0NXF0NXJzMTdzczV0c31jbns0cXU1a3Q1cXQ1cnMxN3NzNXRzfWNvezRxdTVrdDVxdDVyczE3c3M1dHN9Y3B7NHF1NWt0NXF0NXJzMTdzczV0c302bHs0cXU1b3U1cXc1cnQxN3N1NXR1fTVxe2NrdWNsdWNtdWNudWNvdWNwdTRsdX01cntja3VjbHVjbXVjbnVjb3VjcHU0bHV9N3F7Y2tzY2xzY21zY25zY29zY3BzNGxzfTZwezRxdTVvdTVxdzVydDE3c3c1dHd9ZWt7NHF1NW91NXF3NXJ0MTdzdTV0dX1lbHs0cXU1b3U1cXc1cnQxN3N1NXR1fWVtezRxdTVvdTVxdzVydDE3c3U1dHV9ZW57NHF1NW91NXF3NXJ0MTdzdTV0dX1lb3s0cXU1b3U1cXc1cnQxN3N1NXR1fWVwezRxdTVvdTVxdzVydDE3c3U1dHV9ZXN7MTdzczV0czVxczRxdX1ldHs0cXU1b3U1cXc1cnQxN3N3NXR3fWV1ezRxdTVvdTVxdzVydDE3c3M1dHN9ZXZ7MTdzczV0czVxczRxdX02ensxN3N3NXR3NW91NXF3NXJzfWZtezE3c3c1dHc1b3U1cXc1cnN9N257MjAxdHN9Zm97MTdzdzV0dzVvdTVxdzVyc31mcHsxN3N3NXR3NW91NXF3NXJzfWZxezE3c3c1dHc1b3U1cXc1cnN9N3J7Y2tzY2xzY21zY25zY29zY3BzNGxzfWZzezE3c3c1dHc1b3U1cXc1cnN9ZnR7MTdzdTV0dX1mdXsxN3N1NXR1fWZ2ezE3c3U1dHV9Znd7MTdzdTV0dX1mentja3NjbHNjbXNjbnNjb3NjcHM0bHN9fX1cIiksXCJIZWx2ZXRpY2EtQm9sZFwiOmMoXCJ7J3dpZHRocyd7azNzMnE0c2N4MXcyMDFuM3IyMDFvNm8yMDFzMXcyMDF0MXcyMDF1MXcyMDF3M20yMDF4M20yMDF5M20yazF3MmwybDIwMm0ybjJuM3IybzNyMnA1dDIwMnE2bzJyMXMyczJsMnQybDJ1MnIydjN1MncxdzJ4MmwyeTF3MnoxdzNrM3IzbDNyM20zcjNuM3IzbzNyM3AzcjNxM3IzcjNyM3MzcjIwM3QybDIwM3UybDN2MmwzdzN1M3gzdTN5M3UzejN4NGs2bDRsNHM0bTRzNG40czRvNHM0cDRtNHEzeDRyNHk0czRzNHQxdzR1M3I0djRzNHczeDR4NW40eTRzNHo0eTVrNG01bDR5NW00czVuNG01bzN4NXA0czVxNG01cjV5NXM0bTV0NG01dTN4NXYybDV3MXc1eDJsNXkzdTV6M3I2azJsNmwzcjZtM3g2bjNyNm8zeDZwM3I2cTJsNnIzeDZzM3g2dDF3NnUxdzZ2M3I2dzF3Nng1dDZ5M3g2ejN4N2szeDdsM3g3bTJyN24zcjdvMmw3cDN4N3EzcjdyNHk3czNyN3Qzcjd1M203djJyN3cxdzd4MnI3eTN1MjAybDNyY2w0c2FsMmxhbTNyYW4zcmFvM3JhcDNyYXIzcmFzMmxhdDR0YXUycGF2M3JhdzN1YXk0dGF6MmxiazJzYmwzdSdmb2YnNm9ibzJsYnAzeGJxM3JicjF3YnMybGJ1Mm9idjNyYnozeGNrNHMyMDJrM3JjbTRzY240c2NvNHNjcDRzY3E2b2NyNHNjczRtY3Q0bWN1NG1jdjRtY3cxdzJtMnpjeTF3Y3oxd2RsNHNkbTR5ZG40eWRvNHlkcDR5ZHE0eWRzNHlkdDRzZHU0c2R2NHNkdzRzZHozeGVrM3JlbDNyZW0zcmVuM3JlbzNyZXAzcmVxNXRlcjNyZXMzcmV0M3JldTNyZXYzcmV3MXdleDF3ZXkxd2V6MXdmbDN4Zm0zeGZuM3hmbzN4ZnAzeGZxM3hmcjN1ZnMzeGZ0M3hmdTN4ZnYzeGZ3M3hmejNyMjAzazZvMjEybTZvMmR3MmwyY3EybDN0M3IzdTJsMTdzNG0xOW0zcn0na2VybmluZyd7Y2x7NHFzNWt1NW90NXFzMTdzdjV0dn0yMDF0ezJ3dzR3eTJ5d30yMDF3ezJrc30yMDF4ezJ3dzR3eTJ5d30ya3syMDF0czIwMXhzfTJ3ezdxczRxdTVrdzVvczVxdzVyczE3c3U1dHU3dHNmenN9Mnh7NW93NXFzfTJ5ezdxczRxdTVrdzVvczVxdzVyczE3c3U1dHU3dHNmenN9J2ZvZictNm83cHsxN3N1NXR1NW90fWNrezRxczVrdTVvdDVxczE3c3Y1dHZ9NGx7NHFzNWt1NW90NXFzMTdzdjV0dn1jbXs0cXM1a3U1b3Q1cXMxN3N2NXR2fWNuezRxczVrdTVvdDVxczE3c3Y1dHZ9Y297NHFzNWt1NW90NXFzMTdzdjV0dn1jcHs0cXM1a3U1b3Q1cXMxN3N2NXR2fTZsezE3c3Q1dHQ1b3N9MTdzezJrd2NsdmNtdmNudmNvdmNwdjRsdjR3d2Nrdn01b3sya3VjbHRjbXRjbnRjb3RjcHQ0bHQ0d3Rja3R9NXF7MmtzY2xzY21zY25zY29zY3BzNGxzNHd2Y2tzfTVyezJrczR3c301dHsya3djbHZjbXZjbnZjb3ZjcHY0bHY0d3dja3Z9ZW97MTdzdDV0dDVvc31mdXsxN3N1NXR1NW90fTZwezE3c3M1dHN9ZWt7MTdzdDV0dDVvc31lbHsxN3N0NXR0NW9zfWVtezE3c3Q1dHQ1b3N9ZW57MTdzdDV0dDVvc302b3syMDF0c31lcHsxN3N0NXR0NW9zfWVzezE3c3M1dHN9ZXR7MTdzczV0c31ldXsxN3NzNXRzfWV2ezE3c3M1dHN9Nnp7MTdzdTV0dTVvczVxdH1mbXsxN3N1NXR1NW9zNXF0fWZuezE3c3U1dHU1b3M1cXR9Zm97MTdzdTV0dTVvczVxdH1mcHsxN3N1NXR1NW9zNXF0fWZxezE3c3U1dHU1b3M1cXR9ZnN7MTdzdTV0dTVvczVxdH1mdHsxN3N1NXR1NW90fTdtezVvc31mdnsxN3N1NXR1NW90fWZ3ezE3c3U1dHU1b3R9fX1cIiksQ291cmllcjpjKFwieyd3aWR0aHMne2szdydmb2YnNm99J2tlcm5pbmcneydmb2YnLTZvfX1cIiksXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCI6YyhcInsnd2lkdGhzJ3trM3cnZm9mJzZvfSdrZXJuaW5nJ3snZm9mJy02b319XCIpLFwiVGltZXMtQm9sZFwiOmMoXCJ7J3dpZHRocyd7azNxMnE1bmN4MnIyMDFuM20yMDFvNm8yMDFzMmwyMDF0MmwyMDF1MmwyMDF3M20yMDF4M20yMDF5M20yazF0MmwybDIwMm0ybjJuM20ybzNtMnA2bzIwMnE2bzJyMXcyczJsMnQybDJ1M20ydjN0MncxdDJ4MmwyeTF0MnoxdzNrM20zbDNtM20zbTNuM20zbzNtM3AzbTNxM20zcjNtM3MzbTIwM3QybDIwM3UybDN2MmwzdzN0M3gzdDN5M3QzejNtNGs1eDRsNHM0bTRtNG40czRvNHM0cDRtNHEzeDRyNHk0czR5NHQycjR1M200djR5NHc0bTR4NXk0eTRzNHo0eTVrM3g1bDR5NW00czVuM3I1bzRtNXA0czVxNHM1cjZvNXM0czV0NHM1dTRtNXYybDV3MXc1eDJsNXkzdTV6M202azJsNmwzbTZtM3I2bjJ3Nm8zcjZwMnc2cTJsNnIzbTZzM3I2dDF3NnUybDZ2M3I2dzF3Nng1bjZ5M3I2ejNtN2szcjdsM3I3bTJ3N24ycjdvMmw3cDNyN3EzbTdyNHM3czNtN3QzbTd1Mnc3djJyN3cxcTd4MnI3eTNvMjAybDNtY2w0c2FsMmxhbTNtYW4zbWFvM21hcDNtYXIzbWFzMmxhdDR1YXUxeWF2M21hdzN0YXk0dWF6MmxiazJzYmwzdCdmb2YnNm9ibzJsYnAzcmJyMXRiczJsYnUybGJ2M21iejNtY2s0czIwMmszbWNtNHNjbjRzY280c2NwNHNjcTZvY3I0c2NzNG1jdDRtY3U0bWN2NG1jdzJyMm0zcmN5MnJjejJyZGw0c2RtNHlkbjR5ZG80eWRwNHlkcTR5ZHM0eWR0NHNkdTRzZHY0c2R3NHNkejNyZWszbWVsM21lbTNtZW4zbWVvM21lcDNtZXE0c2VyMndlczJ3ZXQyd2V1MndldjJ3ZXcxd2V4MXdleTF3ZXoxd2ZsM3JmbTNtZm4zbWZvM21mcDNtZnEzbWZyM3RmczNtZnQzcmZ1M3JmdjNyZnczcmZ6M20yMDNrNm8yMTJtNm8yZHcybDJjcTJsM3QzbTN1MmwxN3M0czE5bTNtfSdrZXJuaW5nJ3tjbHs0cXQ1a3M1b3Q1cXk1cncxN3N2NXR2fTIwMXR7Y2tzNGxzY21zY25zY29zY3BzY2xzNHd2fTJrezIwMXRzfTJ3ezRxdTVrdTdtdTVvczVxeDVydTE3c3U1dHV9Mnh7MTdzdTV0dTVvdTVxc30yeXs0cXY1a3Y3bXU1b3Q1cXo1cnUxN3N1NXR1fSdmb2YnLTZvN3R7Y2tzY2xzY21zY25zY29zY3BzNGxzfTN1ezE3c3U1dHU1b3M1cXV9M3Z7MTdzdTV0dTVvczVxdX1mdXsxN3N1NXR1NW91NXF1fTdwezE3c3U1dHU1b3U1cXV9Y2t7NHF0NWtzNW90NXF5NXJ3MTdzdjV0dn00bHs0cXQ1a3M1b3Q1cXk1cncxN3N2NXR2fWNtezRxdDVrczVvdDVxeTVydzE3c3Y1dHZ9Y257NHF0NWtzNW90NXF5NXJ3MTdzdjV0dn1jb3s0cXQ1a3M1b3Q1cXk1cncxN3N2NXR2fWNwezRxdDVrczVvdDVxeTVydzE3c3Y1dHZ9Nmx7MTdzdDV0dDVvdTVxdX0xN3N7Y2t1Y2x1Y211Y251Y291Y3B1NGx1NHd1fTVve2NrdWNsdWNtdWNudWNvdWNwdTRsdTR3dX01cXtja3pjbHpjbXpjbnpjb3pjcHo0bHo0d3V9NXJ7Y2t4Y2x4Y214Y254Y294Y3B4NGx4NHd1fTV0e2NrdWNsdWNtdWNudWNvdWNwdTRsdTR3dX03cXtja3VjbHVjbXVjbnVjb3VjcHU0bHV9NnB7MTdzdzV0dzVvdTVxdX1la3sxN3N0NXR0NXF1fWVsezE3c3Q1dHQ1b3U1cXV9ZW17MTdzdDV0dDVxdX1lbnsxN3N0NXR0NXF1fWVvezE3c3Q1dHQ1cXV9ZXB7MTdzdDV0dDVvdTVxdX1lc3sxN3NzNXRzNXF1fWV0ezE3c3c1dHc1b3U1cXV9ZXV7MTdzdzV0dzVvdTVxdX1ldnsxN3NzNXRzNXF1fTZ6ezE3c3c1dHc1b3U1cXU1cnN9Zm17MTdzdzV0dzVvdTVxdTVyc31mbnsxN3N3NXR3NW91NXF1NXJzfWZvezE3c3c1dHc1b3U1cXU1cnN9ZnB7MTdzdzV0dzVvdTVxdTVyc31mcXsxN3N3NXR3NW91NXF1NXJzfTdye2NrdGNsdGNtdGNudGNvdGNwdDRsdDVvc31mc3sxN3N3NXR3NW91NXF1NXJzfWZ0ezE3c3U1dHU1b3U1cXV9N217NW9zfWZ2ezE3c3U1dHU1b3U1cXV9Znd7MTdzdTV0dTVvdTVxdX1mentja3NjbHNjbXNjbnNjb3NjcHM0bHN9fX1cIiksU3ltYm9sOmMoXCJ7J3dpZHRocyd7azN1YXc0cjE5bTNtMmsxdDJsMmwyMDJtMnkybjNtMnA1bjIwMnE2bzNrM20yczJsMnQybDJ2M3IydzF0M20zbTJ5MXQyejF3Ymsyc2JsM3InZm9mJzZvM24zbTNvM20zcDNtM3EzbTNyM20zczNtM3QzbTN1MXczdjF3M3czcjN4M3IzeTNyM3oyd2JwM3QzbDNtNXYybDV4Mmw1ejNtMnE0eWZyM3I3djNrN3cxbzd4M2t9J2tlcm5pbmcneydmb2YnLTZvfX1cIiksSGVsdmV0aWNhOmMoXCJ7J3dpZHRocyd7azNwMnE0bWN4MXcyMDFuM3IyMDFvNm8yMDFzMXEyMDF0MXEyMDF1MXEyMDF3MmwyMDF4MmwyMDF5MmwyazF3MmwxdzIwMm0ybjJuM3IybzNyMnA1dDIwMnE2bzJyMW4yczJsMnQybDJ1MnIydjN1MncxdzJ4MmwyeTF3MnoxdzNrM3IzbDNyM20zcjNuM3IzbzNyM3AzcjNxM3IzcjNyM3MzcjIwM3QybDIwM3UybDN2MXczdzN1M3gzdTN5M3UzejNyNGs2cDRsNG00bTRtNG40czRvNHM0cDRtNHEzeDRyNHk0czRzNHQxdzR1M200djRtNHczcjR4NW40eTRzNHo0eTVrNG01bDR5NW00czVuNG01bzN4NXA0czVxNG01cjV5NXM0bTV0NG01dTN4NXYxdzV3MXc1eDF3NXkyejV6M3I2azJsNmwzcjZtM3I2bjNtNm8zcjZwM3I2cTF3NnIzcjZzM3I2dDFxNnUxcTZ2M202dzFxNng1bjZ5M3I2ejNyN2szcjdsM3I3bTJsN24zbTdvMXc3cDNyN3EzbTdyNHM3czNtN3QzbTd1M203djJsN3cxdTd4Mmw3eTN1MjAybDNyY2w0bWFsMmxhbTNyYW4zcmFvM3JhcDNyYXIzcmFzMmxhdDR0YXUycGF2M3JhdzN1YXk0dGF6MmxiazJzYmwzdSdmb2YnNm9ibzJsYnAzcmJyMXdiczJsYnUyb2J2M3JiejN4Y2s0bTIwMmszcmNtNG1jbjRtY280bWNwNG1jcTZvY3I0c2NzNG1jdDRtY3U0bWN2NG1jdzF3Mm0ybmN5MXdjejF3ZGw0c2RtNHlkbjR5ZG80eWRwNHlkcTR5ZHM0eWR0NHNkdTRzZHY0c2R3NHNkejN4ZWszcmVsM3JlbTNyZW4zcmVvM3JlcDNyZXE1dGVyM21lczNyZXQzcmV1M3JldjNyZXcxd2V4MXdleTF3ZXoxd2ZsM3JmbTNyZm4zcmZvM3JmcDNyZnEzcmZyM3VmczN4ZnQzcmZ1M3JmdjNyZnczcmZ6M20yMDNrNm8yMTJtNm8yZHcybDJjcTJsM3QzcjN1MXcxN3M0bTE5bTNyfSdrZXJuaW5nJ3s1cXs0d3Z9Y2x7NHFzNWt3NW93NXFzMTdzdjV0dn0yMDF0ezJ3dTR3MWsyeXV9MjAxeHsyd3U0d3kyeXV9MTdzezJrdGNsdWNtdWNudTRvdGNwdTRsdTR3eWNvdWNrdX0yd3s3cXM0cXo1azFtMTdzeTVvdzVxeDVyc2ZzdTV0eTd0dWZ6dX0yeHsxN3N5NXR5NW95NXFzfTJ5ezdxczRxejVrMW0xN3N5NW93NXF4NXJzZnN1NXR5N3R1Znp1fSdmb2YnLTZvN3B7MTdzdjV0djVvd31ja3s0cXM1a3c1b3c1cXMxN3N2NXR2fTRsezRxczVrdzVvdzVxczE3c3Y1dHZ9Y217NHFzNWt3NW93NXFzMTdzdjV0dn1jbns0cXM1a3c1b3c1cXMxN3N2NXR2fWNvezRxczVrdzVvdzVxczE3c3Y1dHZ9Y3B7NHFzNWt3NW93NXFzMTdzdjV0dn02bHsxN3N5NXR5NW93fWRvezE3c3Q1dHR9NHp7MTdzdDV0dH03c3tmc3R9ZG17MTdzdDV0dH1kbnsxN3N0NXR0fTVve2Nrd2Nsd2Ntd2Nud2Nvd2NwdzRsdzR3dn1kcHsxN3N0NXR0fWRxezE3c3Q1dHR9N3R7NW93fWRzezE3c3Q1dHR9NXR7Mmt0Y2x1Y211Y251NG90Y3B1NGx1NHd5Y291Y2t1fWZ1ezE3c3Y1dHY1b3d9NnB7MTdzeTV0eTVvdzVxc31la3sxN3N5NXR5NW93fWVsezE3c3k1dHk1b3d9ZW17MTdzeTV0eTVvd31lbns1dHl9ZW97MTdzeTV0eTVvd31lcHsxN3N5NXR5NW93fWVzezE3c3k1dHk1cXN9ZXR7MTdzeTV0eTVvdzVxc31ldXsxN3N5NXR5NW93NXFzfWV2ezE3c3k1dHk1b3c1cXN9Nnp7MTdzeTV0eTVvdzVxc31mbXsxN3N5NXR5NW93NXFzfWZuezE3c3k1dHk1b3c1cXN9Zm97MTdzeTV0eTVvdzVxc31mcHsxN3N5NXR5NXFzfWZxezE3c3k1dHk1b3c1cXN9N3J7NW93fWZzezE3c3k1dHk1b3c1cXN9ZnR7MTdzdjV0djVvd303bXs1b3d9ZnZ7MTdzdjV0djVvd31md3sxN3N2NXR2NW93fX19XCIpLFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI6YyhcInsnd2lkdGhzJ3trM3MycTRzY3gxdzIwMW4zcjIwMW82bzIwMXMxdzIwMXQxdzIwMXUxdzIwMXczbTIwMXgzbTIwMXkzbTJrMXcybDJsMjAybTJuMm4zcjJvM3IycDV0MjAycTZvMnIxczJzMmwydDJsMnUycjJ2M3UydzF3MngybDJ5MXcyejF3M2szcjNsM3IzbTNyM24zcjNvM3IzcDNyM3EzcjNyM3IzczNyMjAzdDJsMjAzdTJsM3YybDN3M3UzeDN1M3kzdTN6M3g0azZsNGw0czRtNHM0bjRzNG80czRwNG00cTN4NHI0eTRzNHM0dDF3NHUzcjR2NHM0dzN4NHg1bjR5NHM0ejR5NWs0bTVsNHk1bTRzNW40bTVvM3g1cDRzNXE0bTVyNXk1czRtNXQ0bTV1M3g1djJsNXcxdzV4Mmw1eTN1NXozcjZrMmw2bDNyNm0zeDZuM3I2bzN4NnAzcjZxMmw2cjN4NnMzeDZ0MXc2dTF3NnYzcjZ3MXc2eDV0NnkzeDZ6M3g3azN4N2wzeDdtMnI3bjNyN28ybDdwM3g3cTNyN3I0eTdzM3I3dDNyN3UzbTd2MnI3dzF3N3gycjd5M3UyMDJsM3JjbDRzYWwybGFtM3JhbjNyYW8zcmFwM3JhcjNyYXMybGF0NHRhdTJwYXYzcmF3M3VheTR0YXoybGJrMnNibDN1J2ZvZic2b2JvMmxicDN4YnEzcmJyMXdiczJsYnUyb2J2M3JiejN4Y2s0czIwMmszcmNtNHNjbjRzY280c2NwNHNjcTZvY3I0c2NzNG1jdDRtY3U0bWN2NG1jdzF3Mm0yemN5MXdjejF3ZGw0c2RtNHlkbjR5ZG80eWRwNHlkcTR5ZHM0eWR0NHNkdTRzZHY0c2R3NHNkejN4ZWszcmVsM3JlbTNyZW4zcmVvM3JlcDNyZXE1dGVyM3JlczNyZXQzcmV1M3JldjNyZXcxd2V4MXdleTF3ZXoxd2ZsM3hmbTN4Zm4zeGZvM3hmcDN4ZnEzeGZyM3VmczN4ZnQzeGZ1M3hmdjN4ZnczeGZ6M3IyMDNrNm8yMTJtNm8yZHcybDJjcTJsM3QzcjN1MmwxN3M0bTE5bTNyfSdrZXJuaW5nJ3tjbHs0cXM1a3U1b3Q1cXMxN3N2NXR2fTIwMXR7Mnd3NHd5Mnl3fTIwMXd7MmtzfTIwMXh7Mnd3NHd5Mnl3fTJrezIwMXRzMjAxeHN9Mnd7N3FzNHF1NWt3NW9zNXF3NXJzMTdzdTV0dTd0c2Z6c30yeHs1b3c1cXN9Mnl7N3FzNHF1NWt3NW9zNXF3NXJzMTdzdTV0dTd0c2Z6c30nZm9mJy02bzdwezE3c3U1dHU1b3R9Y2t7NHFzNWt1NW90NXFzMTdzdjV0dn00bHs0cXM1a3U1b3Q1cXMxN3N2NXR2fWNtezRxczVrdTVvdDVxczE3c3Y1dHZ9Y257NHFzNWt1NW90NXFzMTdzdjV0dn1jb3s0cXM1a3U1b3Q1cXMxN3N2NXR2fWNwezRxczVrdTVvdDVxczE3c3Y1dHZ9Nmx7MTdzdDV0dDVvc30xN3N7Mmt3Y2x2Y212Y252Y292Y3B2NGx2NHd3Y2t2fTVvezJrdWNsdGNtdGNudGNvdGNwdDRsdDR3dGNrdH01cXsya3NjbHNjbXNjbnNjb3NjcHM0bHM0d3Zja3N9NXJ7MmtzNHdzfTV0ezJrd2NsdmNtdmNudmNvdmNwdjRsdjR3d2Nrdn1lb3sxN3N0NXR0NW9zfWZ1ezE3c3U1dHU1b3R9NnB7MTdzczV0c31la3sxN3N0NXR0NW9zfWVsezE3c3Q1dHQ1b3N9ZW17MTdzdDV0dDVvc31lbnsxN3N0NXR0NW9zfTZvezIwMXRzfWVwezE3c3Q1dHQ1b3N9ZXN7MTdzczV0c31ldHsxN3NzNXRzfWV1ezE3c3M1dHN9ZXZ7MTdzczV0c302ensxN3N1NXR1NW9zNXF0fWZtezE3c3U1dHU1b3M1cXR9Zm57MTdzdTV0dTVvczVxdH1mb3sxN3N1NXR1NW9zNXF0fWZwezE3c3U1dHU1b3M1cXR9ZnF7MTdzdTV0dTVvczVxdH1mc3sxN3N1NXR1NW9zNXF0fWZ0ezE3c3U1dHU1b3R9N217NW9zfWZ2ezE3c3U1dHU1b3R9Znd7MTdzdTV0dTVvdH19fVwiKSxaYXBmRGluZ2JhdHM6YyhcInsnd2lkdGhzJ3trNHUyazF3J2ZvZic2b30na2VybmluZyd7J2ZvZictNm99fVwiKSxcIkNvdXJpZXItQm9sZFwiOmMoXCJ7J3dpZHRocyd7azN3J2ZvZic2b30na2VybmluZyd7J2ZvZictNm99fVwiKSxcIlRpbWVzLUl0YWxpY1wiOmMoXCJ7J3dpZHRocyd7azNuMnE0eWN4MmwyMDFuM20yMDFvNXQyMDFzMmwyMDF0MmwyMDF1MmwyMDF3M3IyMDF4M3IyMDF5M3IyazF0MmwybDIwMm0ybjJuM20ybzNtMnA1bjIwMnE1dDJyMXAyczJsMnQybDJ1M20ydjRuMncxdDJ4MmwyeTF0MnoxdzNrM20zbDNtM20zbTNuM20zbzNtM3AzbTNxM20zcjNtM3MzbTIwM3QybDIwM3UybDN2MmwzdzRuM3g0bjN5NG4zejNtNGs1dzRsM3g0bTN4NG40bTRvNHM0cDN4NHEzeDRyNHM0czRzNHQybDR1Mnc0djRtNHczcjR4NW40eTRtNHo0czVrM3g1bDRzNW0zeDVuM201bzNyNXA0czVxM3g1cjVuNXMzeDV0M3I1dTNyNXYycjV3MXc1eDJyNXkydTV6M202azJsNmwzbTZtM202bjJ3Nm8zbTZwMnc2cTF3NnIzbTZzM202dDF3NnUxdzZ2Mnc2dzF3Nng0czZ5M202ejNtN2szbTdsM203bTJyN24ycjdvMXc3cDNtN3EydzdyNG03czJ3N3Qydzd1MnI3djJzN3cxdjd4MnM3eTNxMjAybDNtY2wzeGFsMnJhbTNtYW4zbWFvM21hcDNtYXIzbWFzMmxhdDR3YXUxdmF2M21hdzRuYXk0d2F6MmxiazJzYmw0bidmb2YnNm9ibzJsYnAzbWJxM29icjF0YnMybGJ1MXpidjNtYnozbWNrM3gyMDJrM21jbTN4Y24zeGNvM3hjcDN4Y3E1dGNyNG1jczN4Y3QzeGN1M3hjdjN4Y3cybDJtMnVjeTJsY3oybGRsNG1kbTRzZG40c2RvNHNkcDRzZHE0c2RzNHNkdDRzZHU0c2R2NHNkdzRzZHozbWVrM21lbDNtZW0zbWVuM21lbzNtZXAzbWVxNG1lcjJ3ZXMyd2V0MndldTJ3ZXYyd2V3MXdleDF3ZXkxd2V6MXdmbDNtZm0zbWZuM21mbzNtZnAzbWZxM21mcjRuZnMzbWZ0M21mdTNtZnYzbWZ3M21mejJ3MjAzazZvMjEybTZtMmR3MmwyY3EybDN0M20zdTJsMTdzM3IxOW0zbX0na2VybmluZyd7Y2x7NWt0NHF3fTIwMXN7MjAxc3d9MjAxdHsyMDF0dzJ3eTJ5eTZxLXR9MjAxeHsyd3kyeXl9Mmt7MjAxdHd9Mnd7N3FzNHF5N3JzNWt5N213NW9zNXF4NXJ1MTdzdTV0dX0yeHsxN3NzNXRzNW9zfTJ5ezdxczRxeTdyczVreTdtdzVvczVxeDVydTE3c3U1dHV9J2ZvZictNm82dHsxN3NzNXRzNXFzfTd0ezVvc30zdns1cXN9N3B7MTdzdTV0dTVxc31ja3s1a3Q0cXd9NGx7NWt0NHF3fWNtezVrdDRxd31jbns1a3Q0cXd9Y297NWt0NHF3fWNwezVrdDRxd302bHs0cXM1a3M1b3U1cXc1cnUxN3N1NXR1fTE3c3sya3N9NXF7Y2t2Y2x2Y212Y252Y292Y3B2NGx2fTVye2NrdWNsdWNtdWNudWNvdWNwdTRsdX01dHsya3N9NnB7NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1la3s0cXM1a3M1b3U1cXc1cnUxN3N1NXR1fWVsezRxczVrczVvdTVxdzVydTE3c3U1dHV9ZW17NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1lbns0cXM1a3M1b3U1cXc1cnUxN3N1NXR1fWVvezRxczVrczVvdTVxdzVydTE3c3U1dHV9ZXB7NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1lc3s1a3M1cXM0cXN9ZXR7NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1ldXs0cXM1a3M1cXc1cnUxN3N1NXR1fWV2ezVrczVxczRxc31leHsxN3NzNXRzNXFzfTZ6ezRxdjVrczVvdTVxdzVydTE3c3U1dHV9Zm17NHF2NWtzNW91NXF3NXJ1MTdzdTV0dX1mbns0cXY1a3M1b3U1cXc1cnUxN3N1NXR1fWZvezRxdjVrczVvdTVxdzVydTE3c3U1dHV9ZnB7NHF2NWtzNW91NXF3NXJ1MTdzdTV0dX1mcXs0cXY1a3M1b3U1cXc1cnUxN3N1NXR1fTdyezVvc31mc3s0cXY1a3M1b3U1cXc1cnUxN3N1NXR1fWZ0ezE3c3U1dHU1cXN9ZnV7MTdzdTV0dTVxc31mdnsxN3N1NXR1NXFzfWZ3ezE3c3U1dHU1cXN9fX1cIiksXCJUaW1lcy1Sb21hblwiOmMoXCJ7J3dpZHRocyd7azNuMnE0eWN4MmwyMDFuM20yMDFvNm8yMDFzMmwyMDF0MmwyMDF1MmwyMDF3MncyMDF4MncyMDF5MncyazF0MmwybDIwMm0ybjJuM20ybzNtMnA1bjIwMnE2bzJyMW0yczJsMnQybDJ1M20ydjNzMncxdDJ4MmwyeTF0MnoxdzNrM20zbDNtM20zbTNuM20zbzNtM3AzbTNxM20zcjNtM3MzbTIwM3QybDIwM3UybDN2MXczdzNzM3gzczN5M3MzejJ3NGs1dzRsNHM0bTRtNG40bTRvNHM0cDN4NHEzcjRyNHM0czRzNHQybDR1MnI0djRzNHczeDR4NXQ0eTRzNHo0czVrM3I1bDRzNW00bTVuM3I1bzN4NXA0czVxNHM1cjV5NXM0czV0NHM1dTN4NXYybDV3MXc1eDJsNXkyejV6M202azJsNmwydzZtM202bjJ3Nm8zbTZwMnc2cTJsNnIzbTZzM202dDF3NnUxdzZ2M202dzF3Nng0eTZ5M202ejNtN2szbTdsM203bTJsN24ycjdvMXc3cDNtN3EzbTdyNHM3czNtN3QzbTd1Mnc3djNrN3cxbzd4M2s3eTNxMjAybDNtY2w0c2FsMmxhbTNtYW4zbWFvM21hcDNtYXIzbWFzMmxhdDR3YXUxdmF2M21hdzNzYXk0d2F6MmxiazJzYmwzcydmb2YnNm9ibzJsYnAzbWJxMnhicjF0YnMybGJ1MXpidjNtYnoyd2NrNHMyMDJrM21jbTRzY240c2NvNHNjcDRzY3E1dGNyNG1jczN4Y3QzeGN1M3hjdjN4Y3cybDJtMnRjeTJsY3oybGRsNHNkbTRzZG40c2RvNHNkcDRzZHE0c2RzNHNkdDRzZHU0c2R2NHNkdzRzZHozbWVrMndlbDJ3ZW0yd2VuMndlbzJ3ZXAyd2VxNG1lcjJ3ZXMyd2V0MndldTJ3ZXYyd2V3MXdleDF3ZXkxd2V6MXdmbDNtZm0zbWZuM21mbzNtZnAzbWZxM21mcjNzZnMzbWZ0M21mdTNtZnYzbWZ3M21mejNtMjAzazZvMjEybTZtMmR3MmwyY3EybDN0M20zdTF3MTdzNHMxOW0zbX0na2VybmluZyd7Y2x7NHFzNWt1MTdzdzVvdTVxeTVydzIwMXNzNXR3MjAxd3N9MjAxc3syMDFzc30yMDF0e2NrdzRsd2Ntd2Nud2Nvd2Nwd2NsdzR3dTIwMXRzfTJrezIwMXRzfTJ3ezRxczVrdzVvczVxeDVydTE3c3g1dHh9Mnh7MTdzdzV0dzVvdTVxdX0yeXs0cXM1a3c1b3M1cXg1cnUxN3N4NXR4fSdmb2YnLTZvN3R7Y2t1Y2x1Y211Y251Y291Y3B1NGx1NW9zNXJzfTN1ezE3c3U1dHU1cXN9M3Z7MTdzdTV0dTVxc303cHsxN3N3NXR3NXFzfWNrezRxczVrdTE3c3c1b3U1cXk1cncyMDFzczV0dzIwMXdzfTRsezRxczVrdTE3c3c1b3U1cXk1cncyMDFzczV0dzIwMXdzfWNtezRxczVrdTE3c3c1b3U1cXk1cncyMDFzczV0dzIwMXdzfWNuezRxczVrdTE3c3c1b3U1cXk1cncyMDFzczV0dzIwMXdzfWNvezRxczVrdTE3c3c1b3U1cXk1cncyMDFzczV0dzIwMXdzfWNwezRxczVrdTE3c3c1b3U1cXk1cncyMDFzczV0dzIwMXdzfTZsezE3c3U1dHU1b3M1cXc1cnN9MTdzezJrdGNsdmNtdmNudmNvdmNwdjRsdjR3dWNrdn01b3tja3djbHdjbXdjbndjb3djcHc0bHc0d3V9NXF7Y2t5Y2x5Y215Y255Y295Y3B5NGx5NHd1NW1zfTVye2NrdGNsdGNtdGNudGNvdGNwdDRsdDR3c301dHsya3RjbHZjbXZjbnZjb3ZjcHY0bHY0d3Vja3Z9N3F7Y2tzY2xzY21zY25zY29zY3BzNGxzfTZwezE3c3U1dHU1cXc1cnN9ZWt7NXFzNXJzfWVsezE3c3U1dHU1b3M1cXc1cnN9ZW17MTdzdTV0dTVvczVxczVyc31lbnsxN3N1NXFzNXJzfWVvezVxczVyc31lcHsxN3N1NXR1NW9zNXF3NXJzfWVzezVxc31ldHsxN3N1NXR1NXF3NXJzfWV1ezE3c3U1dHU1cXM1cnN9ZXZ7NXFzfTZ6ezE3c3Y1dHY1b3M1cXg1cnN9Zm17NW9zNXF0NXJzfWZuezE3c3Y1dHY1b3M1cXg1cnN9Zm97MTdzdjV0djVvczVxeDVyc31mcHs1b3M1cXQ1cnN9ZnF7NW9zNXF0NXJzfTdye2NrdWNsdWNtdWNudWNvdWNwdTRsdTVvc31mc3sxN3N2NXR2NW9zNXF4NXJzfWZ0ezE3c3M1dHM1cXN9ZnV7MTdzdzV0dzVxc31mdnsxN3N3NXR3NXFzfWZ3ezE3c3M1dHM1cXN9Znp7Y2t1Y2x1Y211Y251Y291Y3B1NGx1NW9zNXJzfX19XCIpLFwiSGVsdmV0aWNhLU9ibGlxdWVcIjpjKFwieyd3aWR0aHMne2szcDJxNG1jeDF3MjAxbjNyMjAxbzZvMjAxczFxMjAxdDFxMjAxdTFxMjAxdzJsMjAxeDJsMjAxeTJsMmsxdzJsMXcyMDJtMm4ybjNyMm8zcjJwNXQyMDJxNm8ycjFuMnMybDJ0MmwydTJyMnYzdTJ3MXcyeDJsMnkxdzJ6MXczazNyM2wzcjNtM3IzbjNyM28zcjNwM3IzcTNyM3IzcjNzM3IyMDN0MmwyMDN1MmwzdjF3M3czdTN4M3UzeTN1M3ozcjRrNnA0bDRtNG00bTRuNHM0bzRzNHA0bTRxM3g0cjR5NHM0czR0MXc0dTNtNHY0bTR3M3I0eDVuNHk0czR6NHk1azRtNWw0eTVtNHM1bjRtNW8zeDVwNHM1cTRtNXI1eTVzNG01dDRtNXUzeDV2MXc1dzF3NXgxdzV5Mno1ejNyNmsybDZsM3I2bTNyNm4zbTZvM3I2cDNyNnExdzZyM3I2czNyNnQxcTZ1MXE2djNtNncxcTZ4NW42eTNyNnozcjdrM3I3bDNyN20ybDduM203bzF3N3AzcjdxM203cjRzN3MzbTd0M203dTNtN3YybDd3MXU3eDJsN3kzdTIwMmwzcmNsNG1hbDJsYW0zcmFuM3JhbzNyYXAzcmFyM3JhczJsYXQ0dGF1MnBhdjNyYXczdWF5NHRhejJsYmsyc2JsM3UnZm9mJzZvYm8ybGJwM3JicjF3YnMybGJ1Mm9idjNyYnozeGNrNG0yMDJrM3JjbTRtY240bWNvNG1jcDRtY3E2b2NyNHNjczRtY3Q0bWN1NG1jdjRtY3cxdzJtMm5jeTF3Y3oxd2RsNHNkbTR5ZG40eWRvNHlkcDR5ZHE0eWRzNHlkdDRzZHU0c2R2NHNkdzRzZHozeGVrM3JlbDNyZW0zcmVuM3JlbzNyZXAzcmVxNXRlcjNtZXMzcmV0M3JldTNyZXYzcmV3MXdleDF3ZXkxd2V6MXdmbDNyZm0zcmZuM3JmbzNyZnAzcmZxM3JmcjN1ZnMzeGZ0M3JmdTNyZnYzcmZ3M3JmejNtMjAzazZvMjEybTZvMmR3MmwyY3EybDN0M3IzdTF3MTdzNG0xOW0zcn0na2VybmluZyd7NXF7NHd2fWNsezRxczVrdzVvdzVxczE3c3Y1dHZ9MjAxdHsyd3U0dzFrMnl1fTIwMXh7Mnd1NHd5Mnl1fTE3c3sya3RjbHVjbXVjbnU0b3RjcHU0bHU0d3ljb3Vja3V9Mnd7N3FzNHF6NWsxbTE3c3k1b3c1cXg1cnNmc3U1dHk3dHVmenV9Mnh7MTdzeTV0eTVveTVxc30yeXs3cXM0cXo1azFtMTdzeTVvdzVxeDVyc2ZzdTV0eTd0dWZ6dX0nZm9mJy02bzdwezE3c3Y1dHY1b3d9Y2t7NHFzNWt3NW93NXFzMTdzdjV0dn00bHs0cXM1a3c1b3c1cXMxN3N2NXR2fWNtezRxczVrdzVvdzVxczE3c3Y1dHZ9Y257NHFzNWt3NW93NXFzMTdzdjV0dn1jb3s0cXM1a3c1b3c1cXMxN3N2NXR2fWNwezRxczVrdzVvdzVxczE3c3Y1dHZ9Nmx7MTdzeTV0eTVvd31kb3sxN3N0NXR0fTR6ezE3c3Q1dHR9N3N7ZnN0fWRtezE3c3Q1dHR9ZG57MTdzdDV0dH01b3tja3djbHdjbXdjbndjb3djcHc0bHc0d3Z9ZHB7MTdzdDV0dH1kcXsxN3N0NXR0fTd0ezVvd31kc3sxN3N0NXR0fTV0ezJrdGNsdWNtdWNudTRvdGNwdTRsdTR3eWNvdWNrdX1mdXsxN3N2NXR2NW93fTZwezE3c3k1dHk1b3c1cXN9ZWt7MTdzeTV0eTVvd31lbHsxN3N5NXR5NW93fWVtezE3c3k1dHk1b3d9ZW57NXR5fWVvezE3c3k1dHk1b3d9ZXB7MTdzeTV0eTVvd31lc3sxN3N5NXR5NXFzfWV0ezE3c3k1dHk1b3c1cXN9ZXV7MTdzeTV0eTVvdzVxc31ldnsxN3N5NXR5NW93NXFzfTZ6ezE3c3k1dHk1b3c1cXN9Zm17MTdzeTV0eTVvdzVxc31mbnsxN3N5NXR5NW93NXFzfWZvezE3c3k1dHk1b3c1cXN9ZnB7MTdzeTV0eTVxc31mcXsxN3N5NXR5NW93NXFzfTdyezVvd31mc3sxN3N5NXR5NW93NXFzfWZ0ezE3c3Y1dHY1b3d9N217NW93fWZ2ezE3c3Y1dHY1b3d9Znd7MTdzdjV0djVvd319fVwiKX19O2UuZXZlbnRzLnB1c2goW1wiYWRkRm9udFwiLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZm9udCxyPWYuVW5pY29kZVtlLnBvc3RTY3JpcHROYW1lXTtyJiYoZS5tZXRhZGF0YS5Vbmljb2RlPXt9LGUubWV0YWRhdGEuVW5pY29kZS53aWR0aHM9ci53aWR0aHMsZS5tZXRhZGF0YS5Vbmljb2RlLmtlcm5pbmc9ci5rZXJuaW5nKTt2YXIgbj1oLlVuaWNvZGVbZS5wb3N0U2NyaXB0TmFtZV07biYmKGUubWV0YWRhdGEuVW5pY29kZS5lbmNvZGluZz1uLGUuZW5jb2Rpbmc9bi5jb2RlUGFnZXNbMF0pfV0pfShFLkFQSSksXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IFVpbnQ4QXJyYXkoZSksbj0wO248ZTtuKyspcltuXT10LmNoYXJDb2RlQXQobik7cmV0dXJuIHJ9O3QuQVBJLmV2ZW50cy5wdXNoKFtcImFkZEZvbnRcIixmdW5jdGlvbihyKXt2YXIgbj12b2lkIDAsaT1yLmZvbnQsYT1yLmluc3RhbmNlO2lmKCFpLmlzU3RhbmRhcmRGb250KXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBFcnJvcihcIkZvbnQgZG9lcyBub3QgZXhpc3QgaW4gdkZTLCBpbXBvcnQgZm9udHMgb3IgcmVtb3ZlIGRlY2xhcmF0aW9uIGRvYy5hZGRGb250KCdcIitpLnBvc3RTY3JpcHROYW1lK1wiJykuXCIpO2lmKFwic3RyaW5nXCIhPXR5cGVvZihuPSExPT09YS5leGlzdHNGaWxlSW5WRlMoaS5wb3N0U2NyaXB0TmFtZSk/YS5sb2FkRmlsZShpLnBvc3RTY3JpcHROYW1lKTphLmdldEZpbGVGcm9tVkZTKGkucG9zdFNjcmlwdE5hbWUpKSl0aHJvdyBuZXcgRXJyb3IoXCJGb250IGlzIG5vdCBzdG9yZWQgYXMgc3RyaW5nLWRhdGEgaW4gdkZTLCBpbXBvcnQgZm9udHMgb3IgcmVtb3ZlIGRlY2xhcmF0aW9uIGRvYy5hZGRGb250KCdcIitpLnBvc3RTY3JpcHROYW1lK1wiJykuXCIpOyFmdW5jdGlvbihyLG4pe249L15cXHgwMFxceDAxXFx4MDBcXHgwMC8udGVzdChuKT9lKG4pOmUoZihuKSksci5tZXRhZGF0YT10LkFQSS5UVEZGb250Lm9wZW4obiksci5tZXRhZGF0YS5Vbmljb2RlPXIubWV0YWRhdGEuVW5pY29kZXx8e2VuY29kaW5nOnt9LGtlcm5pbmc6e30sd2lkdGhzOltdfSxyLm1ldGFkYXRhLmdseUlkc1VzZWQ9WzBdfShpLG4pfX1dKX0oRSksRS5BUEkuYWRkU3ZnQXNJbWFnZT1mdW5jdGlvbih0LGUscixuLGEscyx1LGMpe2lmKGlzTmFOKGUpfHxpc05hTihyKSl0aHJvdyBvLmVycm9yKFwianNQREYuYWRkU3ZnQXNJbWFnZTogSW52YWxpZCBjb29yZGluYXRlc1wiLGFyZ3VtZW50cyksbmV3IEVycm9yKFwiSW52YWxpZCBjb29yZGluYXRlcyBwYXNzZWQgdG8ganNQREYuYWRkU3ZnQXNJbWFnZVwiKTtpZihpc05hTihuKXx8aXNOYU4oYSkpdGhyb3cgby5lcnJvcihcImpzUERGLmFkZFN2Z0FzSW1hZ2U6IEludmFsaWQgbWVhc3VyZW1lbnRzXCIsYXJndW1lbnRzKSxuZXcgRXJyb3IoXCJJbnZhbGlkIG1lYXN1cmVtZW50cyAod2lkdGggYW5kL29yIGhlaWdodCkgcGFzc2VkIHRvIGpzUERGLmFkZFN2Z0FzSW1hZ2VcIik7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtsLndpZHRoPW4sbC5oZWlnaHQ9YTt2YXIgaD1sLmdldENvbnRleHQoXCIyZFwiKTtoLmZpbGxTdHlsZT1cIiNmZmZcIixoLmZpbGxSZWN0KDAsMCxsLndpZHRoLGwuaGVpZ2h0KTt2YXIgZj17aWdub3JlTW91c2U6ITAsaWdub3JlQW5pbWF0aW9uOiEwLGlnbm9yZURpbWVuc2lvbnM6ITB9LGQ9dGhpcztyZXR1cm4oaS5jYW52Zz9Qcm9taXNlLnJlc29sdmUoaS5jYW52Zyk6aW1wb3J0KFwiY2FudmdcIikpLmNhdGNoKGZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBjYW52ZzogXCIrdCkpfSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5kZWZhdWx0P3QuZGVmYXVsdDp0fSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5mcm9tU3RyaW5nKGgsdCxmKX0sZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQ291bGQgbm90IGxvYWQgY2FudmcuXCIpKX0pLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIHQucmVuZGVyKGYpfSkudGhlbihmdW5jdGlvbigpe2QuYWRkSW1hZ2UobC50b0RhdGFVUkwoXCJpbWFnZS9qcGVnXCIsMSksZSxyLG4sYSx1LGMpfSl9LEUuQVBJLnB1dFRvdGFsUGFnZXM9ZnVuY3Rpb24odCl7dmFyIGUscj0wO3BhcnNlSW50KHRoaXMuaW50ZXJuYWwuZ2V0Rm9udCgpLmlkLnN1YnN0cigxKSwxMCk8MTU/KGU9bmV3IFJlZ0V4cCh0LFwiZ1wiKSxyPXRoaXMuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKTooZT1uZXcgUmVnRXhwKHRoaXMucGRmRXNjYXBlMTYodCx0aGlzLmludGVybmFsLmdldEZvbnQoKSksXCJnXCIpLHI9dGhpcy5wZGZFc2NhcGUxNih0aGlzLmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKStcIlwiLHRoaXMuaW50ZXJuYWwuZ2V0Rm9udCgpKSk7Zm9yKHZhciBuPTE7bjw9dGhpcy5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCk7bisrKWZvcih2YXIgaT0wO2k8dGhpcy5pbnRlcm5hbC5wYWdlc1tuXS5sZW5ndGg7aSsrKXRoaXMuaW50ZXJuYWwucGFnZXNbbl1baV09dGhpcy5pbnRlcm5hbC5wYWdlc1tuXVtpXS5yZXBsYWNlKGUscik7cmV0dXJuIHRoaXN9LEUuQVBJLnZpZXdlclByZWZlcmVuY2VzPWZ1bmN0aW9uKGUscil7dmFyIG47ZT1lfHx7fSxyPXJ8fCExO3ZhciBpLGEsbyxzPXtIaWRlVG9vbGJhcjp7ZGVmYXVsdFZhbHVlOiExLHZhbHVlOiExLHR5cGU6XCJib29sZWFuXCIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyEwLCExXSxwZGZWZXJzaW9uOjEuM30sSGlkZU1lbnViYXI6e2RlZmF1bHRWYWx1ZTohMSx2YWx1ZTohMSx0eXBlOlwiYm9vbGVhblwiLGV4cGxpY2l0U2V0OiExLHZhbHVlU2V0OlshMCwhMV0scGRmVmVyc2lvbjoxLjN9LEhpZGVXaW5kb3dVSTp7ZGVmYXVsdFZhbHVlOiExLHZhbHVlOiExLHR5cGU6XCJib29sZWFuXCIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyEwLCExXSxwZGZWZXJzaW9uOjEuM30sRml0V2luZG93OntkZWZhdWx0VmFsdWU6ITEsdmFsdWU6ITEsdHlwZTpcImJvb2xlYW5cIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpbITAsITFdLHBkZlZlcnNpb246MS4zfSxDZW50ZXJXaW5kb3c6e2RlZmF1bHRWYWx1ZTohMSx2YWx1ZTohMSx0eXBlOlwiYm9vbGVhblwiLGV4cGxpY2l0U2V0OiExLHZhbHVlU2V0OlshMCwhMV0scGRmVmVyc2lvbjoxLjN9LERpc3BsYXlEb2NUaXRsZTp7ZGVmYXVsdFZhbHVlOiExLHZhbHVlOiExLHR5cGU6XCJib29sZWFuXCIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6WyEwLCExXSxwZGZWZXJzaW9uOjEuNH0sTm9uRnVsbFNjcmVlblBhZ2VNb2RlOntkZWZhdWx0VmFsdWU6XCJVc2VOb25lXCIsdmFsdWU6XCJVc2VOb25lXCIsdHlwZTpcIm5hbWVcIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpbXCJVc2VOb25lXCIsXCJVc2VPdXRsaW5lc1wiLFwiVXNlVGh1bWJzXCIsXCJVc2VPQ1wiXSxwZGZWZXJzaW9uOjEuM30sRGlyZWN0aW9uOntkZWZhdWx0VmFsdWU6XCJMMlJcIix2YWx1ZTpcIkwyUlwiLHR5cGU6XCJuYW1lXCIsZXhwbGljaXRTZXQ6ITEsdmFsdWVTZXQ6W1wiTDJSXCIsXCJSMkxcIl0scGRmVmVyc2lvbjoxLjN9LFZpZXdBcmVhOntkZWZhdWx0VmFsdWU6XCJDcm9wQm94XCIsdmFsdWU6XCJDcm9wQm94XCIsdHlwZTpcIm5hbWVcIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpbXCJNZWRpYUJveFwiLFwiQ3JvcEJveFwiLFwiVHJpbUJveFwiLFwiQmxlZWRCb3hcIixcIkFydEJveFwiXSxwZGZWZXJzaW9uOjEuNH0sVmlld0NsaXA6e2RlZmF1bHRWYWx1ZTpcIkNyb3BCb3hcIix2YWx1ZTpcIkNyb3BCb3hcIix0eXBlOlwibmFtZVwiLGV4cGxpY2l0U2V0OiExLHZhbHVlU2V0OltcIk1lZGlhQm94XCIsXCJDcm9wQm94XCIsXCJUcmltQm94XCIsXCJCbGVlZEJveFwiLFwiQXJ0Qm94XCJdLHBkZlZlcnNpb246MS40fSxQcmludEFyZWE6e2RlZmF1bHRWYWx1ZTpcIkNyb3BCb3hcIix2YWx1ZTpcIkNyb3BCb3hcIix0eXBlOlwibmFtZVwiLGV4cGxpY2l0U2V0OiExLHZhbHVlU2V0OltcIk1lZGlhQm94XCIsXCJDcm9wQm94XCIsXCJUcmltQm94XCIsXCJCbGVlZEJveFwiLFwiQXJ0Qm94XCJdLHBkZlZlcnNpb246MS40fSxQcmludENsaXA6e2RlZmF1bHRWYWx1ZTpcIkNyb3BCb3hcIix2YWx1ZTpcIkNyb3BCb3hcIix0eXBlOlwibmFtZVwiLGV4cGxpY2l0U2V0OiExLHZhbHVlU2V0OltcIk1lZGlhQm94XCIsXCJDcm9wQm94XCIsXCJUcmltQm94XCIsXCJCbGVlZEJveFwiLFwiQXJ0Qm94XCJdLHBkZlZlcnNpb246MS40fSxQcmludFNjYWxpbmc6e2RlZmF1bHRWYWx1ZTpcIkFwcERlZmF1bHRcIix2YWx1ZTpcIkFwcERlZmF1bHRcIix0eXBlOlwibmFtZVwiLGV4cGxpY2l0U2V0OiExLHZhbHVlU2V0OltcIkFwcERlZmF1bHRcIixcIk5vbmVcIl0scGRmVmVyc2lvbjoxLjZ9LER1cGxleDp7ZGVmYXVsdFZhbHVlOlwiXCIsdmFsdWU6XCJub25lXCIsdHlwZTpcIm5hbWVcIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpbXCJTaW1wbGV4XCIsXCJEdXBsZXhGbGlwU2hvcnRFZGdlXCIsXCJEdXBsZXhGbGlwTG9uZ0VkZ2VcIixcIm5vbmVcIl0scGRmVmVyc2lvbjoxLjd9LFBpY2tUcmF5QnlQREZTaXplOntkZWZhdWx0VmFsdWU6ITEsdmFsdWU6ITEsdHlwZTpcImJvb2xlYW5cIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpbITAsITFdLHBkZlZlcnNpb246MS43fSxQcmludFBhZ2VSYW5nZTp7ZGVmYXVsdFZhbHVlOlwiXCIsdmFsdWU6XCJcIix0eXBlOlwiYXJyYXlcIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpudWxsLHBkZlZlcnNpb246MS43fSxOdW1Db3BpZXM6e2RlZmF1bHRWYWx1ZToxLHZhbHVlOjEsdHlwZTpcImludGVnZXJcIixleHBsaWNpdFNldDohMSx2YWx1ZVNldDpudWxsLHBkZlZlcnNpb246MS43fX0sdT1PYmplY3Qua2V5cyhzKSxjPVtdLGw9MCxoPTAsZj0wO2Z1bmN0aW9uIGQodCxlKXt2YXIgcixuPSExO2ZvcihyPTA7cjx0Lmxlbmd0aDtyKz0xKXRbcl09PT1lJiYobj0hMCk7cmV0dXJuIG59aWYodm9pZCAwPT09dGhpcy5pbnRlcm5hbC52aWV3ZXJwcmVmZXJlbmNlcyYmKHRoaXMuaW50ZXJuYWwudmlld2VycHJlZmVyZW5jZXM9e30sdGhpcy5pbnRlcm5hbC52aWV3ZXJwcmVmZXJlbmNlcy5jb25maWd1cmF0aW9uPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocykpLHRoaXMuaW50ZXJuYWwudmlld2VycHJlZmVyZW5jZXMuaXNTdWJzY3JpYmVkPSExKSxuPXRoaXMuaW50ZXJuYWwudmlld2VycHJlZmVyZW5jZXMuY29uZmlndXJhdGlvbixcInJlc2V0XCI9PT1lfHwhMD09PXIpe3ZhciBwPXUubGVuZ3RoO2ZvcihmPTA7ZjxwO2YrPTEpblt1W2ZdXS52YWx1ZT1uW3VbZl1dLmRlZmF1bHRWYWx1ZSxuW3VbZl1dLmV4cGxpY2l0U2V0PSExfWlmKFwib2JqZWN0XCI9PT10KGUpKWZvcihhIGluIGUpaWYobz1lW2FdLGQodSxhKSYmdm9pZCAwIT09byl7aWYoXCJib29sZWFuXCI9PT1uW2FdLnR5cGUmJlwiYm9vbGVhblwiPT10eXBlb2YgbyluW2FdLnZhbHVlPW87ZWxzZSBpZihcIm5hbWVcIj09PW5bYV0udHlwZSYmZChuW2FdLnZhbHVlU2V0LG8pKW5bYV0udmFsdWU9bztlbHNlIGlmKFwiaW50ZWdlclwiPT09blthXS50eXBlJiZOdW1iZXIuaXNJbnRlZ2VyKG8pKW5bYV0udmFsdWU9bztlbHNlIGlmKFwiYXJyYXlcIj09PW5bYV0udHlwZSl7Zm9yKGw9MDtsPG8ubGVuZ3RoO2wrPTEpaWYoaT0hMCwxPT09b1tsXS5sZW5ndGgmJlwibnVtYmVyXCI9PXR5cGVvZiBvW2xdWzBdKWMucHVzaChTdHJpbmcob1tsXS0xKSk7ZWxzZSBpZihvW2xdLmxlbmd0aD4xKXtmb3IoaD0wO2g8b1tsXS5sZW5ndGg7aCs9MSlcIm51bWJlclwiIT10eXBlb2Ygb1tsXVtoXSYmKGk9ITEpOyEwPT09aSYmYy5wdXNoKFtvW2xdWzBdLTEsb1tsXVsxXS0xXS5qb2luKFwiIFwiKSl9blthXS52YWx1ZT1cIltcIitjLmpvaW4oXCIgXCIpK1wiXVwifWVsc2UgblthXS52YWx1ZT1uW2FdLmRlZmF1bHRWYWx1ZTtuW2FdLmV4cGxpY2l0U2V0PSEwfXJldHVybiExPT09dGhpcy5pbnRlcm5hbC52aWV3ZXJwcmVmZXJlbmNlcy5pc1N1YnNjcmliZWQmJih0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoXCJwdXRDYXRhbG9nXCIsZnVuY3Rpb24oKXt2YXIgdCxlPVtdO2Zvcih0IGluIG4pITA9PT1uW3RdLmV4cGxpY2l0U2V0JiYoXCJuYW1lXCI9PT1uW3RdLnR5cGU/ZS5wdXNoKFwiL1wiK3QrXCIgL1wiK25bdF0udmFsdWUpOmUucHVzaChcIi9cIit0K1wiIFwiK25bdF0udmFsdWUpKTswIT09ZS5sZW5ndGgmJnRoaXMuaW50ZXJuYWwud3JpdGUoXCIvVmlld2VyUHJlZmVyZW5jZXNcXG48PFxcblwiK2Uuam9pbihcIlxcblwiKStcIlxcbj4+XCIpfSksdGhpcy5pbnRlcm5hbC52aWV3ZXJwcmVmZXJlbmNlcy5pc1N1YnNjcmliZWQ9ITApLHRoaXMuaW50ZXJuYWwudmlld2VycHJlZmVyZW5jZXMuY29uZmlndXJhdGlvbj1uLHRoaXN9LEUuQVBJLmFkZE1ldGFkYXRhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PXRoaXMuaW50ZXJuYWwuX19tZXRhZGF0YV9fJiYodGhpcy5pbnRlcm5hbC5fX21ldGFkYXRhX189e21ldGFkYXRhOnQsbmFtZXNwYWNlVXJpOm51bGwhPWU/ZTpcImh0dHA6Ly9qc3BkZi5kZWZhdWx0Lm5hbWVzcGFjZXVyaS9cIixyYXdYbWw6XCJib29sZWFuXCI9PXR5cGVvZiBlJiZlfSx0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoXCJwdXRDYXRhbG9nXCIsbGUpLHRoaXMuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZShcInBvc3RQdXRSZXNvdXJjZXNcIixjZSkpLHRoaXN9LGZ1bmN0aW9uKHQpe3ZhciBlPXQuQVBJLHI9ZS5wZGZFc2NhcGUxNj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcixuPWUubWV0YWRhdGEuVW5pY29kZS53aWR0aHMsaT1bXCJcIixcIjBcIixcIjAwXCIsXCIwMDBcIixcIjAwMDBcIl0sYT1bXCJcIl0sbz0wLHM9dC5sZW5ndGg7bzxzOysrbyl7aWYocj1lLm1ldGFkYXRhLmNoYXJhY3RlclRvR2x5cGgodC5jaGFyQ29kZUF0KG8pKSxlLm1ldGFkYXRhLmdseUlkc1VzZWQucHVzaChyKSxlLm1ldGFkYXRhLnRvVW5pY29kZVtyXT10LmNoYXJDb2RlQXQobyksLTE9PW4uaW5kZXhPZihyKSYmKG4ucHVzaChyKSxuLnB1c2goW3BhcnNlSW50KGUubWV0YWRhdGEud2lkdGhPZkdseXBoKHIpLDEwKV0pKSxcIjBcIj09cilyZXR1cm4gYS5qb2luKFwiXCIpO3I9ci50b1N0cmluZygxNiksYS5wdXNoKGlbNC1yLmxlbmd0aF0scil9cmV0dXJuIGEuam9pbihcIlwiKX0sbj1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG8scztmb3IoYT1cIi9DSURJbml0IC9Qcm9jU2V0IGZpbmRyZXNvdXJjZSBiZWdpblxcbjEyIGRpY3QgYmVnaW5cXG5iZWdpbmNtYXBcXG4vQ0lEU3lzdGVtSW5mbyA8PFxcbiAgL1JlZ2lzdHJ5IChBZG9iZSlcXG4gIC9PcmRlcmluZyAoVUNTKVxcbiAgL1N1cHBsZW1lbnQgMFxcbj4+IGRlZlxcbi9DTWFwTmFtZSAvQWRvYmUtSWRlbnRpdHktVUNTIGRlZlxcbi9DTWFwVHlwZSAyIGRlZlxcbjEgYmVnaW5jb2Rlc3BhY2VyYW5nZVxcbjwwMDAwPjxmZmZmPlxcbmVuZGNvZGVzcGFjZXJhbmdlXCIsbj1bXSxvPTAscz0ocj1PYmplY3Qua2V5cyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pKS5sZW5ndGg7bzxzO28rKyllPXJbb10sbi5sZW5ndGg+PTEwMCYmKGErPVwiXFxuXCIrbi5sZW5ndGgrXCIgYmVnaW5iZmNoYXJcXG5cIituLmpvaW4oXCJcXG5cIikrXCJcXG5lbmRiZmNoYXJcIixuPVtdKSx2b2lkIDAhPT10W2VdJiZudWxsIT09dFtlXSYmXCJmdW5jdGlvblwiPT10eXBlb2YgdFtlXS50b1N0cmluZyYmKGk9KFwiMDAwMFwiK3RbZV0udG9TdHJpbmcoMTYpKS5zbGljZSgtNCksZT0oXCIwMDAwXCIrKCtlKS50b1N0cmluZygxNikpLnNsaWNlKC00KSxuLnB1c2goXCI8XCIrZStcIj48XCIraStcIj5cIikpO3JldHVybiBuLmxlbmd0aCYmKGErPVwiXFxuXCIrbi5sZW5ndGgrXCIgYmVnaW5iZmNoYXJcXG5cIituLmpvaW4oXCJcXG5cIikrXCJcXG5lbmRiZmNoYXJcXG5cIiksYStcImVuZGNtYXBcXG5DTWFwTmFtZSBjdXJyZW50ZGljdCAvQ01hcCBkZWZpbmVyZXNvdXJjZSBwb3BcXG5lbmRcXG5lbmRcIn07ZS5ldmVudHMucHVzaChbXCJwdXRGb250XCIsZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe3ZhciByPWUuZm9udCxpPWUub3V0LGE9ZS5uZXdPYmplY3Qsbz1lLnB1dFN0cmVhbTtpZihyLm1ldGFkYXRhIGluc3RhbmNlb2YgdC5BUEkuVFRGRm9udCYmXCJJZGVudGl0eS1IXCI9PT1yLmVuY29kaW5nKXtmb3IodmFyIHM9ci5tZXRhZGF0YS5Vbmljb2RlLndpZHRocyx1PXIubWV0YWRhdGEuc3Vic2V0LmVuY29kZShyLm1ldGFkYXRhLmdseUlkc1VzZWQsMSksYz1cIlwiLGw9MDtsPHUubGVuZ3RoO2wrKyljKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHVbbF0pO3ZhciBoPWEoKTtvKHtkYXRhOmMsYWRkTGVuZ3RoMTohMCxvYmplY3RJZDpofSksaShcImVuZG9ialwiKTt2YXIgZj1hKCk7byh7ZGF0YTpuKHIubWV0YWRhdGEudG9Vbmljb2RlKSxhZGRMZW5ndGgxOiEwLG9iamVjdElkOmZ9KSxpKFwiZW5kb2JqXCIpO3ZhciBkPWEoKTtpKFwiPDxcIiksaShcIi9UeXBlIC9Gb250RGVzY3JpcHRvclwiKSxpKFwiL0ZvbnROYW1lIC9cIitDKHIuZm9udE5hbWUpKSxpKFwiL0ZvbnRGaWxlMiBcIitoK1wiIDAgUlwiKSxpKFwiL0ZvbnRCQm94IFwiK3QuQVBJLlBERk9iamVjdC5jb252ZXJ0KHIubWV0YWRhdGEuYmJveCkpLGkoXCIvRmxhZ3MgXCIrci5tZXRhZGF0YS5mbGFncyksaShcIi9TdGVtViBcIityLm1ldGFkYXRhLnN0ZW1WKSxpKFwiL0l0YWxpY0FuZ2xlIFwiK3IubWV0YWRhdGEuaXRhbGljQW5nbGUpLGkoXCIvQXNjZW50IFwiK3IubWV0YWRhdGEuYXNjZW5kZXIpLGkoXCIvRGVzY2VudCBcIityLm1ldGFkYXRhLmRlY2VuZGVyKSxpKFwiL0NhcEhlaWdodCBcIityLm1ldGFkYXRhLmNhcEhlaWdodCksaShcIj4+XCIpLGkoXCJlbmRvYmpcIik7dmFyIHA9YSgpO2koXCI8PFwiKSxpKFwiL1R5cGUgL0ZvbnRcIiksaShcIi9CYXNlRm9udCAvXCIrQyhyLmZvbnROYW1lKSksaShcIi9Gb250RGVzY3JpcHRvciBcIitkK1wiIDAgUlwiKSxpKFwiL1cgXCIrdC5BUEkuUERGT2JqZWN0LmNvbnZlcnQocykpLGkoXCIvQ0lEVG9HSURNYXAgL0lkZW50aXR5XCIpLGkoXCIvRFcgMTAwMFwiKSxpKFwiL1N1YnR5cGUgL0NJREZvbnRUeXBlMlwiKSxpKFwiL0NJRFN5c3RlbUluZm9cIiksaShcIjw8XCIpLGkoXCIvU3VwcGxlbWVudCAwXCIpLGkoXCIvUmVnaXN0cnkgKEFkb2JlKVwiKSxpKFwiL09yZGVyaW5nIChcIityLmVuY29kaW5nK1wiKVwiKSxpKFwiPj5cIiksaShcIj4+XCIpLGkoXCJlbmRvYmpcIiksci5vYmplY3ROdW1iZXI9YSgpLGkoXCI8PFwiKSxpKFwiL1R5cGUgL0ZvbnRcIiksaShcIi9TdWJ0eXBlIC9UeXBlMFwiKSxpKFwiL1RvVW5pY29kZSBcIitmK1wiIDAgUlwiKSxpKFwiL0Jhc2VGb250IC9cIitDKHIuZm9udE5hbWUpKSxpKFwiL0VuY29kaW5nIC9cIityLmVuY29kaW5nKSxpKFwiL0Rlc2NlbmRhbnRGb250cyBbXCIrcCtcIiAwIFJdXCIpLGkoXCI+PlwiKSxpKFwiZW5kb2JqXCIpLHIuaXNBbHJlYWR5UHV0dGVkPSEwfX0oZSl9XSksZS5ldmVudHMucHVzaChbXCJwdXRGb250XCIsZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe3ZhciByPWUuZm9udCxpPWUub3V0LGE9ZS5uZXdPYmplY3Qsbz1lLnB1dFN0cmVhbTtpZihyLm1ldGFkYXRhIGluc3RhbmNlb2YgdC5BUEkuVFRGRm9udCYmXCJXaW5BbnNpRW5jb2RpbmdcIj09PXIuZW5jb2Rpbmcpe2Zvcih2YXIgcz1yLm1ldGFkYXRhLnJhd0RhdGEsdT1cIlwiLGM9MDtjPHMubGVuZ3RoO2MrKyl1Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHNbY10pO3ZhciBsPWEoKTtvKHtkYXRhOnUsYWRkTGVuZ3RoMTohMCxvYmplY3RJZDpsfSksaShcImVuZG9ialwiKTt2YXIgaD1hKCk7byh7ZGF0YTpuKHIubWV0YWRhdGEudG9Vbmljb2RlKSxhZGRMZW5ndGgxOiEwLG9iamVjdElkOmh9KSxpKFwiZW5kb2JqXCIpO3ZhciBmPWEoKTtpKFwiPDxcIiksaShcIi9EZXNjZW50IFwiK3IubWV0YWRhdGEuZGVjZW5kZXIpLGkoXCIvQ2FwSGVpZ2h0IFwiK3IubWV0YWRhdGEuY2FwSGVpZ2h0KSxpKFwiL1N0ZW1WIFwiK3IubWV0YWRhdGEuc3RlbVYpLGkoXCIvVHlwZSAvRm9udERlc2NyaXB0b3JcIiksaShcIi9Gb250RmlsZTIgXCIrbCtcIiAwIFJcIiksaShcIi9GbGFncyA5NlwiKSxpKFwiL0ZvbnRCQm94IFwiK3QuQVBJLlBERk9iamVjdC5jb252ZXJ0KHIubWV0YWRhdGEuYmJveCkpLGkoXCIvRm9udE5hbWUgL1wiK0Moci5mb250TmFtZSkpLGkoXCIvSXRhbGljQW5nbGUgXCIrci5tZXRhZGF0YS5pdGFsaWNBbmdsZSksaShcIi9Bc2NlbnQgXCIrci5tZXRhZGF0YS5hc2NlbmRlciksaShcIj4+XCIpLGkoXCJlbmRvYmpcIiksci5vYmplY3ROdW1iZXI9YSgpO2Zvcih2YXIgZD0wO2Q8ci5tZXRhZGF0YS5obXR4LndpZHRocy5sZW5ndGg7ZCsrKXIubWV0YWRhdGEuaG10eC53aWR0aHNbZF09cGFyc2VJbnQoci5tZXRhZGF0YS5obXR4LndpZHRoc1tkXSooMWUzL3IubWV0YWRhdGEuaGVhZC51bml0c1BlckVtKSk7aShcIjw8L1N1YnR5cGUvVHJ1ZVR5cGUvVHlwZS9Gb250L1RvVW5pY29kZSBcIitoK1wiIDAgUi9CYXNlRm9udC9cIitDKHIuZm9udE5hbWUpK1wiL0ZvbnREZXNjcmlwdG9yIFwiK2YrXCIgMCBSL0VuY29kaW5nL1wiK3IuZW5jb2RpbmcrXCIgL0ZpcnN0Q2hhciAyOSAvTGFzdENoYXIgMjU1IC9XaWR0aHMgXCIrdC5BUEkuUERGT2JqZWN0LmNvbnZlcnQoci5tZXRhZGF0YS5obXR4LndpZHRocykrXCI+PlwiKSxpKFwiZW5kb2JqXCIpLHIuaXNBbHJlYWR5UHV0dGVkPSEwfX0oZSl9XSk7dmFyIGk9ZnVuY3Rpb24odCl7dmFyIGUsbj10LnRleHR8fFwiXCIsaT10LngsYT10Lnksbz10Lm9wdGlvbnN8fHt9LHM9dC5tdXRleHx8e30sdT1zLnBkZkVzY2FwZSxjPXMuYWN0aXZlRm9udEtleSxsPXMuZm9udHMsaD1jLGY9XCJcIixkPTAscD1cIlwiLGc9bFtoXS5lbmNvZGluZztpZihcIklkZW50aXR5LUhcIiE9PWxbaF0uZW5jb2RpbmcpcmV0dXJue3RleHQ6bix4OmkseTphLG9wdGlvbnM6byxtdXRleDpzfTtmb3IocD1uLGg9YyxBcnJheS5pc0FycmF5KG4pJiYocD1uWzBdKSxkPTA7ZDxwLmxlbmd0aDtkKz0xKWxbaF0ubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoXCJjbWFwXCIpJiYoZT1sW2hdLm1ldGFkYXRhLmNtYXAudW5pY29kZS5jb2RlTWFwW3BbZF0uY2hhckNvZGVBdCgwKV0pLGV8fHBbZF0uY2hhckNvZGVBdCgwKTwyNTYmJmxbaF0ubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoXCJVbmljb2RlXCIpP2YrPXBbZF06Zis9XCJcIjt2YXIgbT1cIlwiO3JldHVybiBwYXJzZUludChoLnNsaWNlKDEpKTwxNHx8XCJXaW5BbnNpRW5jb2RpbmdcIj09PWc/bT11KGYsaCkuc3BsaXQoXCJcIikubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpfSkuam9pbihcIlwiKTpcIklkZW50aXR5LUhcIj09PWcmJihtPXIoZixsW2hdKSkscy5pc0hleD0hMCx7dGV4dDptLHg6aSx5OmEsb3B0aW9uczpvLG11dGV4OnN9fTtlLmV2ZW50cy5wdXNoKFtcInBvc3RQcm9jZXNzVGV4dFwiLGZ1bmN0aW9uKHQpe3ZhciBlPXQudGV4dHx8XCJcIixyPVtdLG49e3RleHQ6ZSx4OnQueCx5OnQueSxvcHRpb25zOnQub3B0aW9ucyxtdXRleDp0Lm11dGV4fTtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgYT0wO2ZvcihhPTA7YTxlLmxlbmd0aDthKz0xKUFycmF5LmlzQXJyYXkoZVthXSkmJjM9PT1lW2FdLmxlbmd0aD9yLnB1c2goW2koT2JqZWN0LmFzc2lnbih7fSxuLHt0ZXh0OmVbYV1bMF19KSkudGV4dCxlW2FdWzFdLGVbYV1bMl1dKTpyLnB1c2goaShPYmplY3QuYXNzaWduKHt9LG4se3RleHQ6ZVthXX0pKS50ZXh0KTt0LnRleHQ9cn1lbHNlIHQudGV4dD1pKE9iamVjdC5hc3NpZ24oe30sbix7dGV4dDplfSkpLnRleHR9XSl9KEUpLFxuLyoqXG4gKiBAbGljZW5zZVxuICoganNQREYgdmlydHVhbCBGaWxlU3lzdGVtIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5pbnRlcm5hbC52RlMmJih0aGlzLmludGVybmFsLnZGUz17fSksITB9O3QuZXhpc3RzRmlsZUluVkZTPWZ1bmN0aW9uKHQpe3JldHVybiBlLmNhbGwodGhpcyksdm9pZCAwIT09dGhpcy5pbnRlcm5hbC52RlNbdF19LHQuYWRkRmlsZVRvVkZTPWZ1bmN0aW9uKHQscil7cmV0dXJuIGUuY2FsbCh0aGlzKSx0aGlzLmludGVybmFsLnZGU1t0XT1yLHRoaXN9LHQuZ2V0RmlsZUZyb21WRlM9ZnVuY3Rpb24odCl7cmV0dXJuIGUuY2FsbCh0aGlzKSx2b2lkIDAhPT10aGlzLmludGVybmFsLnZGU1t0XT90aGlzLmludGVybmFsLnZGU1t0XTpudWxsfX0oRS5BUEkpLFxuLyoqXG4gKiBAbGljZW5zZVxuICogVW5pY29kZSBCaWRpIEVuZ2luZSBiYXNlZCBvbiB0aGUgd29yayBvZiBBbGV4IFNoZW5zaXMgKEBhc3RoZW5zaXMpXG4gKiBNSVQgTGljZW5zZVxuICovXG5mdW5jdGlvbih0KXt0Ll9fYmlkaUVuZ2luZV9fPXQucHJvdG90eXBlLl9fYmlkaUVuZ2luZV9fPWZ1bmN0aW9uKHQpe3ZhciByLG4saSxhLG8scyx1LGM9ZSxsPVtbMCwzLDAsMSwwLDAsMF0sWzAsMywwLDEsMiwyLDBdLFswLDMsMCwxNywyLDAsMV0sWzAsMyw1LDUsNCwxLDBdLFswLDMsMjEsMjEsNCwwLDFdLFswLDMsNSw1LDQsMiwwXV0saD1bWzIsMCwxLDEsMCwxLDBdLFsyLDAsMSwxLDAsMiwwXSxbMiwwLDIsMSwzLDIsMF0sWzIsMCwyLDMzLDMsMSwxXV0sZj17TDowLFI6MSxFTjoyLEFOOjMsTjo0LEI6NSxTOjZ9LGQ9ezA6MCw1OjEsNjoyLDc6MywzMjo0LDI1MTo1LDI1NDo2LDI1NTo3fSxwPVtcIihcIixcIilcIixcIihcIixcIjxcIixcIj5cIixcIjxcIixcIltcIixcIl1cIixcIltcIixcIntcIixcIn1cIixcIntcIixcIsKrXCIsXCLCu1wiLFwiwqtcIixcIuKAuVwiLFwi4oC6XCIsXCLigLlcIixcIuKBhVwiLFwi4oGGXCIsXCLigYVcIixcIuKBvVwiLFwi4oG+XCIsXCLigb1cIixcIuKCjVwiLFwi4oKOXCIsXCLigo1cIixcIuKJpFwiLFwi4omlXCIsXCLiiaRcIixcIuKMqVwiLFwi4oyqXCIsXCLijKlcIixcIu+5mVwiLFwi77maXCIsXCLvuZlcIixcIu+5m1wiLFwi77mcXCIsXCLvuZtcIixcIu+5nVwiLFwi77meXCIsXCLvuZ1cIixcIu+5pFwiLFwi77mlXCIsXCLvuaRcIl0sZz1uZXcgUmVnRXhwKC9eKFsxLTR8OV18MVswLTldfDJbMC05XXwzWzAxNjhdfDRbMDQ1ODldfDVbMDEyXXw3Wzc4XXwxNTl8MTZbMC05XXwxN1swLTJdfDIxWzU2OV18MjJbMDM0ODldfDI1MCkkLyksbT0hMSx2PTA7dGhpcy5fX2JpZGlFbmdpbmVfXz17fTt2YXIgYj1mdW5jdGlvbih0KXt2YXIgZT10LmNoYXJDb2RlQXQoKSxyPWU+Pjgsbj1kW3JdO3JldHVybiB2b2lkIDAhPT1uP2NbMjU2Km4rKDI1NSZlKV06MjUyPT09cnx8MjUzPT09cj9cIkFMXCI6Zy50ZXN0KHIpP1wiTFwiOjg9PT1yP1wiUlwiOlwiTlwifSx5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPTA7cjx0Lmxlbmd0aDtyKyspe2lmKFwiTFwiPT09KGU9Yih0LmNoYXJBdChyKSkpKXJldHVybiExO2lmKFwiUlwiPT09ZSlyZXR1cm4hMH1yZXR1cm4hMX0sdz1mdW5jdGlvbih0LGUsbyxzKXt2YXIgdSxjLGwsaCxmPWVbc107c3dpdGNoKGYpe2Nhc2VcIkxcIjpjYXNlXCJSXCI6Y2FzZVwiTFJFXCI6Y2FzZVwiUkxFXCI6Y2FzZVwiTFJPXCI6Y2FzZVwiUkxPXCI6Y2FzZVwiUERGXCI6bT0hMTticmVhaztjYXNlXCJOXCI6Y2FzZVwiQU5cIjpicmVhaztjYXNlXCJFTlwiOm0mJihmPVwiQU5cIik7YnJlYWs7Y2FzZVwiQUxcIjptPSEwLGY9XCJSXCI7YnJlYWs7Y2FzZVwiV1NcIjpjYXNlXCJCTlwiOmY9XCJOXCI7YnJlYWs7Y2FzZVwiQ1NcIjpzPDF8fHMrMT49ZS5sZW5ndGh8fFwiRU5cIiE9PSh1PW9bcy0xXSkmJlwiQU5cIiE9PXV8fFwiRU5cIiE9PShjPWVbcysxXSkmJlwiQU5cIiE9PWM/Zj1cIk5cIjptJiYoYz1cIkFOXCIpLGY9Yz09PXU/YzpcIk5cIjticmVhaztjYXNlXCJFU1wiOmY9XCJFTlwiPT09KHU9cz4wP29bcy0xXTpcIkJcIikmJnMrMTxlLmxlbmd0aCYmXCJFTlwiPT09ZVtzKzFdP1wiRU5cIjpcIk5cIjticmVhaztjYXNlXCJFVFwiOmlmKHM+MCYmXCJFTlwiPT09b1tzLTFdKXtmPVwiRU5cIjticmVha31pZihtKXtmPVwiTlwiO2JyZWFrfWZvcihsPXMrMSxoPWUubGVuZ3RoO2w8aCYmXCJFVFwiPT09ZVtsXTspbCsrO2Y9bDxoJiZcIkVOXCI9PT1lW2xdP1wiRU5cIjpcIk5cIjticmVhaztjYXNlXCJOU01cIjppZihpJiYhYSl7Zm9yKGg9ZS5sZW5ndGgsbD1zKzE7bDxoJiZcIk5TTVwiPT09ZVtsXTspbCsrO2lmKGw8aCl7dmFyIGQ9dFtzXSxwPWQ+PTE0MjUmJmQ8PTIzMDN8fDY0Mjg2PT09ZDtpZih1PWVbbF0scCYmKFwiUlwiPT09dXx8XCJBTFwiPT09dSkpe2Y9XCJSXCI7YnJlYWt9fX1mPXM8MXx8XCJCXCI9PT0odT1lW3MtMV0pP1wiTlwiOm9bcy0xXTticmVhaztjYXNlXCJCXCI6bT0hMSxyPSEwLGY9djticmVhaztjYXNlXCJTXCI6bj0hMCxmPVwiTlwifXJldHVybiBmfSxOPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10LnNwbGl0KFwiXCIpO3JldHVybiByJiZMKG4scix7aGlMZXZlbDp2fSksbi5yZXZlcnNlKCksZSYmZS5yZXZlcnNlKCksbi5qb2luKFwiXCIpfSxMPWZ1bmN0aW9uKHQsZSxpKXt2YXIgYSxvLHMsdSxjLGQ9LTEscD10Lmxlbmd0aCxnPTAseT1bXSxOPXY/aDpsLEw9W107Zm9yKG09ITEscj0hMSxuPSExLG89MDtvPHA7bysrKUxbb109Yih0W29dKTtmb3Iocz0wO3M8cDtzKyspe2lmKGM9Zyx5W3NdPXcodCxMLHkscyksYT0yNDAmKGc9TltjXVtmW3lbc11dXSksZyY9MTUsZVtzXT11PU5bZ11bNV0sYT4wKWlmKDE2PT09YSl7Zm9yKG89ZDtvPHM7bysrKWVbb109MTtkPS0xfWVsc2UgZD0tMTtpZihOW2ddWzZdKS0xPT09ZCYmKGQ9cyk7ZWxzZSBpZihkPi0xKXtmb3Iobz1kO288cztvKyspZVtvXT11O2Q9LTF9XCJCXCI9PT1MW3NdJiYoZVtzXT0wKSxpLmhpTGV2ZWx8PXV9biYmZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbj0wO248cjtuKyspaWYoXCJTXCI9PT10W25dKXtlW25dPXY7Zm9yKHZhciBpPW4tMTtpPj0wJiZcIldTXCI9PT10W2ldO2ktLSllW2ldPXZ9fShMLGUscCl9LHg9ZnVuY3Rpb24odCxlLG4saSxhKXtpZighKGEuaGlMZXZlbDx0KSl7aWYoMT09PXQmJjE9PT12JiYhcilyZXR1cm4gZS5yZXZlcnNlKCksdm9pZChuJiZuLnJldmVyc2UoKSk7Zm9yKHZhciBvLHMsdSxjLGw9ZS5sZW5ndGgsaD0wO2g8bDspe2lmKGlbaF0+PXQpe2Zvcih1PWgrMTt1PGwmJmlbdV0+PXQ7KXUrKztmb3IoYz1oLHM9dS0xO2M8cztjKysscy0tKW89ZVtjXSxlW2NdPWVbc10sZVtzXT1vLG4mJihvPW5bY10sbltjXT1uW3NdLG5bc109byk7aD11fWgrK319fSxBPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10LnNwbGl0KFwiXCIpLGk9e2hpTGV2ZWw6dn07cmV0dXJuIHJ8fChyPVtdKSxMKG4scixpKSxmdW5jdGlvbih0LGUscil7aWYoMCE9PXIuaGlMZXZlbCYmdSlmb3IodmFyIG4saT0wO2k8dC5sZW5ndGg7aSsrKTE9PT1lW2ldJiYobj1wLmluZGV4T2YodFtpXSkpPj0wJiYodFtpXT1wW24rMV0pfShuLHIsaSkseCgyLG4sZSxyLGkpLHgoMSxuLGUscixpKSxuLmpvaW4oXCJcIil9O3JldHVybiB0aGlzLl9fYmlkaUVuZ2luZV9fLmRvQmlkaVJlb3JkZXI9ZnVuY3Rpb24odCxlLHIpe2lmKGZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyllW3JdPXI7dm9pZCAwPT09YSYmKGE9eSh0KSksdm9pZCAwPT09cyYmKHM9eSh0KSl9KHQsZSksaXx8IW98fHMpaWYoaSYmbyYmYV5zKXY9YT8xOjAsdD1OKHQsZSxyKTtlbHNlIGlmKCFpJiZvJiZzKXY9YT8xOjAsdD1BKHQsZSxyKSx0PU4odCxlKTtlbHNlIGlmKCFpfHxhfHxvfHxzKXtpZihpJiYhbyYmYV5zKXQ9Tih0LGUpLGE/KHY9MCx0PUEodCxlLHIpKToodj0xLHQ9QSh0LGUsciksdD1OKHQsZSkpO2Vsc2UgaWYoaSYmYSYmIW8mJnMpdj0xLHQ9QSh0LGUsciksdD1OKHQsZSk7ZWxzZSBpZighaSYmIW8mJmFecyl7dmFyIG49dTthPyh2PTEsdD1BKHQsZSxyKSx2PTAsdT0hMSx0PUEodCxlLHIpLHU9bik6KHY9MCx0PUEodCxlLHIpLHQ9Tih0LGUpLHY9MSx1PSExLHQ9QSh0LGUsciksdT1uLHQ9Tih0LGUpKX19ZWxzZSB2PTAsdD1BKHQsZSxyKTtlbHNlIHY9YT8xOjAsdD1BKHQsZSxyKTtyZXR1cm4gdH0sdGhpcy5fX2JpZGlFbmdpbmVfXy5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJihpPXQuaXNJbnB1dFZpc3VhbCxvPXQuaXNPdXRwdXRWaXN1YWwsYT10LmlzSW5wdXRSdGwscz10LmlzT3V0cHV0UnRsLHU9dC5pc1N5bW1ldHJpY1N3YXBwaW5nKX0sdGhpcy5fX2JpZGlFbmdpbmVfXy5zZXRPcHRpb25zKHQpLHRoaXMuX19iaWRpRW5naW5lX199O3ZhciBlPVtcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIlNcIixcIkJcIixcIlNcIixcIldTXCIsXCJCXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJcIixcIkJcIixcIkJcIixcIlNcIixcIldTXCIsXCJOXCIsXCJOXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJFU1wiLFwiQ1NcIixcIkVTXCIsXCJDU1wiLFwiQ1NcIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJDU1wiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJDU1wiLFwiTlwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIkxcIixcIk5cIixcIk5cIixcIkJOXCIsXCJOXCIsXCJOXCIsXCJFVFwiLFwiRVRcIixcIkVOXCIsXCJFTlwiLFwiTlwiLFwiTFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiRU5cIixcIkxcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIkxcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIkVUXCIsXCJOXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJSXCIsXCJOU01cIixcIlJcIixcIk5TTVwiLFwiTlNNXCIsXCJSXCIsXCJOU01cIixcIk5TTVwiLFwiUlwiLFwiTlNNXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJBTlwiLFwiQU5cIixcIkFOXCIsXCJBTlwiLFwiQU5cIixcIkFOXCIsXCJOXCIsXCJOXCIsXCJBTFwiLFwiRVRcIixcIkVUXCIsXCJBTFwiLFwiQ1NcIixcIkFMXCIsXCJOXCIsXCJOXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiQUxcIixcIkFMXCIsXCJOXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJBTlwiLFwiQU5cIixcIkFOXCIsXCJBTlwiLFwiQU5cIixcIkFOXCIsXCJBTlwiLFwiQU5cIixcIkFOXCIsXCJBTlwiLFwiRVRcIixcIkFOXCIsXCJBTlwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiTlNNXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiQU5cIixcIk5cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIkFMXCIsXCJBTFwiLFwiTlNNXCIsXCJOU01cIixcIk5cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiQUxcIixcIkFMXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJOXCIsXCJBTFwiLFwiQUxcIixcIk5TTVwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlwiLFwiTlwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiQUxcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIlJcIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIlJcIixcIlJcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIlJcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIldTXCIsXCJXU1wiLFwiV1NcIixcIldTXCIsXCJXU1wiLFwiV1NcIixcIldTXCIsXCJXU1wiLFwiV1NcIixcIldTXCIsXCJXU1wiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiTFwiLFwiUlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiV1NcIixcIkJcIixcIkxSRVwiLFwiUkxFXCIsXCJQREZcIixcIkxST1wiLFwiUkxPXCIsXCJDU1wiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJDU1wiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiV1NcIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiTlwiLFwiTFJJXCIsXCJSTElcIixcIkZTSVwiLFwiUERJXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJCTlwiLFwiQk5cIixcIkJOXCIsXCJFTlwiLFwiTFwiLFwiTlwiLFwiTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRVNcIixcIkVTXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJMXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRVNcIixcIkVTXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJMXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiUlwiLFwiTlNNXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJSXCIsXCJFU1wiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiTlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiTlwiLFwiUlwiLFwiTlwiLFwiUlwiLFwiUlwiLFwiTlwiLFwiUlwiLFwiUlwiLFwiTlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiUlwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5TTVwiLFwiTlNNXCIsXCJOU01cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIkNTXCIsXCJOXCIsXCJDU1wiLFwiTlwiLFwiTlwiLFwiQ1NcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIkVUXCIsXCJOXCIsXCJOXCIsXCJFU1wiLFwiRVNcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIkVUXCIsXCJFVFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJOXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJBTFwiLFwiQUxcIixcIkFMXCIsXCJOXCIsXCJOXCIsXCJCTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiRVRcIixcIkVUXCIsXCJFVFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiRVNcIixcIkNTXCIsXCJFU1wiLFwiQ1NcIixcIkNTXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiRU5cIixcIkVOXCIsXCJFTlwiLFwiQ1NcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIk5cIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIk5cIixcIkxcIixcIkxcIixcIkxcIixcIk5cIixcIk5cIixcIk5cIixcIkVUXCIsXCJFVFwiLFwiTlwiLFwiTlwiLFwiTlwiLFwiRVRcIixcIkVUXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCIsXCJOXCJdLHI9bmV3IHQuX19iaWRpRW5naW5lX18oe2lzSW5wdXRWaXN1YWw6ITB9KTt0LkFQSS5ldmVudHMucHVzaChbXCJwb3N0UHJvY2Vzc1RleHRcIixmdW5jdGlvbih0KXt2YXIgZT10LnRleHQ7dC54LHQueTt2YXIgbj10Lm9wdGlvbnN8fHt9O3QubXV0ZXgsbi5sYW5nO3ZhciBpPVtdO2lmKG4uaXNJbnB1dFZpc3VhbD1cImJvb2xlYW5cIiE9dHlwZW9mIG4uaXNJbnB1dFZpc3VhbHx8bi5pc0lucHV0VmlzdWFsLHIuc2V0T3B0aW9ucyhuKSxcIltvYmplY3QgQXJyYXldXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpe3ZhciBhPTA7Zm9yKGk9W10sYT0wO2E8ZS5sZW5ndGg7YSs9MSlcIltvYmplY3QgQXJyYXldXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZVthXSk/aS5wdXNoKFtyLmRvQmlkaVJlb3JkZXIoZVthXVswXSksZVthXVsxXSxlW2FdWzJdXSk6aS5wdXNoKFtyLmRvQmlkaVJlb3JkZXIoZVthXSldKTt0LnRleHQ9aX1lbHNlIHQudGV4dD1yLmRvQmlkaVJlb3JkZXIoZSk7ci5zZXRPcHRpb25zKHtpc0lucHV0VmlzdWFsOiEwfSl9XSl9KEUpLEUuQVBJLlRURkZvbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlO2lmKHRoaXMucmF3RGF0YT10LGU9dGhpcy5jb250ZW50cz1uZXcgZmUodCksdGhpcy5jb250ZW50cy5wb3M9NCxcInR0Y2ZcIj09PWUucmVhZFN0cmluZyg0KSl0aHJvdyBuZXcgRXJyb3IoXCJUVENGIG5vdCBzdXBwb3J0ZWQuXCIpO2UucG9zPTAsdGhpcy5wYXJzZSgpLHRoaXMuc3Vic2V0PW5ldyBDZSh0aGlzKSx0aGlzLnJlZ2lzdGVyVFRGKCl9cmV0dXJuIHQub3Blbj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSl9LHQucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlyZWN0b3J5PW5ldyBkZSh0aGlzLmNvbnRlbnRzKSx0aGlzLmhlYWQ9bmV3IG1lKHRoaXMpLHRoaXMubmFtZT1uZXcgeGUodGhpcyksdGhpcy5jbWFwPW5ldyBiZSh0aGlzKSx0aGlzLnRvVW5pY29kZT17fSx0aGlzLmhoZWE9bmV3IHllKHRoaXMpLHRoaXMubWF4cD1uZXcgQWUodGhpcyksdGhpcy5obXR4PW5ldyBTZSh0aGlzKSx0aGlzLnBvc3Q9bmV3IE5lKHRoaXMpLHRoaXMub3MyPW5ldyB3ZSh0aGlzKSx0aGlzLmxvY2E9bmV3IEllKHRoaXMpLHRoaXMuZ2x5Zj1uZXcgUGUodGhpcyksdGhpcy5hc2NlbmRlcj10aGlzLm9zMi5leGlzdHMmJnRoaXMub3MyLmFzY2VuZGVyfHx0aGlzLmhoZWEuYXNjZW5kZXIsdGhpcy5kZWNlbmRlcj10aGlzLm9zMi5leGlzdHMmJnRoaXMub3MyLmRlY2VuZGVyfHx0aGlzLmhoZWEuZGVjZW5kZXIsdGhpcy5saW5lR2FwPXRoaXMub3MyLmV4aXN0cyYmdGhpcy5vczIubGluZUdhcHx8dGhpcy5oaGVhLmxpbmVHYXAsdGhpcy5iYm94PVt0aGlzLmhlYWQueE1pbix0aGlzLmhlYWQueU1pbix0aGlzLmhlYWQueE1heCx0aGlzLmhlYWQueU1heF19LHQucHJvdG90eXBlLnJlZ2lzdGVyVFRGPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG4saTtpZih0aGlzLnNjYWxlRmFjdG9yPTFlMy90aGlzLmhlYWQudW5pdHNQZXJFbSx0aGlzLmJib3g9ZnVuY3Rpb24oKXt2YXIgZSxyLG4saTtmb3IoaT1bXSxlPTAscj0obj10aGlzLmJib3gpLmxlbmd0aDtlPHI7ZSsrKXQ9bltlXSxpLnB1c2goTWF0aC5yb3VuZCh0KnRoaXMuc2NhbGVGYWN0b3IpKTtyZXR1cm4gaX0uY2FsbCh0aGlzKSx0aGlzLnN0ZW1WPTAsdGhpcy5wb3N0LmV4aXN0cz8ocj0yNTUmKG49dGhpcy5wb3N0Lml0YWxpY19hbmdsZSksMzI3NjgmKGU9bj4+MTYpJiYoZT0tKDErKDY1NTM1XmUpKSksdGhpcy5pdGFsaWNBbmdsZT0rKGUrXCIuXCIrcikpOnRoaXMuaXRhbGljQW5nbGU9MCx0aGlzLmFzY2VuZGVyPU1hdGgucm91bmQodGhpcy5hc2NlbmRlcip0aGlzLnNjYWxlRmFjdG9yKSx0aGlzLmRlY2VuZGVyPU1hdGgucm91bmQodGhpcy5kZWNlbmRlcip0aGlzLnNjYWxlRmFjdG9yKSx0aGlzLmxpbmVHYXA9TWF0aC5yb3VuZCh0aGlzLmxpbmVHYXAqdGhpcy5zY2FsZUZhY3RvciksdGhpcy5jYXBIZWlnaHQ9dGhpcy5vczIuZXhpc3RzJiZ0aGlzLm9zMi5jYXBIZWlnaHR8fHRoaXMuYXNjZW5kZXIsdGhpcy54SGVpZ2h0PXRoaXMub3MyLmV4aXN0cyYmdGhpcy5vczIueEhlaWdodHx8MCx0aGlzLmZhbWlseUNsYXNzPSh0aGlzLm9zMi5leGlzdHMmJnRoaXMub3MyLmZhbWlseUNsYXNzfHwwKT4+OCx0aGlzLmlzU2VyaWY9MT09PShpPXRoaXMuZmFtaWx5Q2xhc3MpfHwyPT09aXx8Mz09PWl8fDQ9PT1pfHw1PT09aXx8Nz09PWksdGhpcy5pc1NjcmlwdD0xMD09PXRoaXMuZmFtaWx5Q2xhc3MsdGhpcy5mbGFncz0wLHRoaXMucG9zdC5pc0ZpeGVkUGl0Y2gmJih0aGlzLmZsYWdzfD0xKSx0aGlzLmlzU2VyaWYmJih0aGlzLmZsYWdzfD0yKSx0aGlzLmlzU2NyaXB0JiYodGhpcy5mbGFnc3w9OCksMCE9PXRoaXMuaXRhbGljQW5nbGUmJih0aGlzLmZsYWdzfD02NCksdGhpcy5mbGFnc3w9MzIsIXRoaXMuY21hcC51bmljb2RlKXRocm93IG5ldyBFcnJvcihcIk5vIHVuaWNvZGUgY21hcCBmb3IgZm9udFwiKX0sdC5wcm90b3R5cGUuY2hhcmFjdGVyVG9HbHlwaD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4obnVsbCE9KGU9dGhpcy5jbWFwLnVuaWNvZGUpP2UuY29kZU1hcFt0XTp2b2lkIDApfHwwfSx0LnByb3RvdHlwZS53aWR0aE9mR2x5cGg9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9MWUzL3RoaXMuaGVhZC51bml0c1BlckVtLHRoaXMuaG10eC5mb3JHbHlwaCh0KS5hZHZhbmNlKmV9LHQucHJvdG90eXBlLndpZHRoT2ZTdHJpbmc9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksYSxvO2ZvcihhPTAsaT0wLG89KHQ9XCJcIit0KS5sZW5ndGg7MDw9bz9pPG86aT5vO2k9MDw9bz8rK2k6LS1pKW49dC5jaGFyQ29kZUF0KGkpLGErPXRoaXMud2lkdGhPZkdseXBoKHRoaXMuY2hhcmFjdGVyVG9HbHlwaChuKSkrciooMWUzL2UpfHwwO3JldHVybiBhKihlLzFlMyl9LHQucHJvdG90eXBlLmxpbmVIZWlnaHQ9ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gbnVsbD09ZSYmKGU9ITEpLHI9ZT90aGlzLmxpbmVHYXA6MCwodGhpcy5hc2NlbmRlcityLXRoaXMuZGVjZW5kZXIpLzFlMyp0fSx0fSgpO3ZhciBoZSxmZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5kYXRhPW51bGwhPXQ/dDpbXSx0aGlzLnBvcz0wLHRoaXMubGVuZ3RoPXRoaXMuZGF0YS5sZW5ndGh9cmV0dXJuIHQucHJvdG90eXBlLnJlYWRCeXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVt0aGlzLnBvcysrXX0sdC5wcm90b3R5cGUud3JpdGVCeXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdGhpcy5wb3MrK109dH0sdC5wcm90b3R5cGUucmVhZFVJbnQzMj1mdW5jdGlvbigpe3JldHVybiAxNjc3NzIxNip0aGlzLnJlYWRCeXRlKCkrKHRoaXMucmVhZEJ5dGUoKTw8MTYpKyh0aGlzLnJlYWRCeXRlKCk8PDgpK3RoaXMucmVhZEJ5dGUoKX0sdC5wcm90b3R5cGUud3JpdGVVSW50MzI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud3JpdGVCeXRlKHQ+Pj4yNCYyNTUpLHRoaXMud3JpdGVCeXRlKHQ+PjE2JjI1NSksdGhpcy53cml0ZUJ5dGUodD4+OCYyNTUpLHRoaXMud3JpdGVCeXRlKDI1NSZ0KX0sdC5wcm90b3R5cGUucmVhZEludDMyPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuKHQ9dGhpcy5yZWFkVUludDMyKCkpPj0yMTQ3NDgzNjQ4P3QtNDI5NDk2NzI5Njp0fSx0LnByb3RvdHlwZS53cml0ZUludDMyPWZ1bmN0aW9uKHQpe3JldHVybiB0PDAmJih0Kz00Mjk0OTY3Mjk2KSx0aGlzLndyaXRlVUludDMyKHQpfSx0LnByb3RvdHlwZS5yZWFkVUludDE2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZEJ5dGUoKTw8OHx0aGlzLnJlYWRCeXRlKCl9LHQucHJvdG90eXBlLndyaXRlVUludDE2PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLndyaXRlQnl0ZSh0Pj44JjI1NSksdGhpcy53cml0ZUJ5dGUoMjU1JnQpfSx0LnByb3RvdHlwZS5yZWFkSW50MTY9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4odD10aGlzLnJlYWRVSW50MTYoKSk+PTMyNzY4P3QtNjU1MzY6dH0sdC5wcm90b3R5cGUud3JpdGVJbnQxNj1mdW5jdGlvbih0KXtyZXR1cm4gdDwwJiYodCs9NjU1MzYpLHRoaXMud3JpdGVVSW50MTYodCl9LHQucHJvdG90eXBlLnJlYWRTdHJpbmc9ZnVuY3Rpb24odCl7dmFyIGUscjtmb3Iocj1bXSxlPTA7MDw9dD9lPHQ6ZT50O2U9MDw9dD8rK2U6LS1lKXJbZV09U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRCeXRlKCkpO3JldHVybiByLmpvaW4oXCJcIil9LHQucHJvdG90eXBlLndyaXRlU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbjtmb3Iobj1bXSxlPTAscj10Lmxlbmd0aDswPD1yP2U8cjplPnI7ZT0wPD1yPysrZTotLWUpbi5wdXNoKHRoaXMud3JpdGVCeXRlKHQuY2hhckNvZGVBdChlKSkpO3JldHVybiBufSx0LnByb3RvdHlwZS5yZWFkU2hvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkSW50MTYoKX0sdC5wcm90b3R5cGUud3JpdGVTaG9ydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53cml0ZUludDE2KHQpfSx0LnByb3RvdHlwZS5yZWFkTG9uZ0xvbmc9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbixpLGEsbyxzO3JldHVybiB0PXRoaXMucmVhZEJ5dGUoKSxlPXRoaXMucmVhZEJ5dGUoKSxyPXRoaXMucmVhZEJ5dGUoKSxuPXRoaXMucmVhZEJ5dGUoKSxpPXRoaXMucmVhZEJ5dGUoKSxhPXRoaXMucmVhZEJ5dGUoKSxvPXRoaXMucmVhZEJ5dGUoKSxzPXRoaXMucmVhZEJ5dGUoKSwxMjgmdD8tMSooNzIwNTc1OTQwMzc5Mjc5NDAqKDI1NV50KSsyODE0NzQ5NzY3MTA2NTYqKDI1NV5lKSsxMDk5NTExNjI3Nzc2KigyNTVecikrNDI5NDk2NzI5NiooMjU1Xm4pKzE2Nzc3MjE2KigyNTVeaSkrNjU1MzYqKDI1NV5hKSsyNTYqKDI1NV5vKSsoMjU1XnMpKzEpOjcyMDU3NTk0MDM3OTI3OTQwKnQrMjgxNDc0OTc2NzEwNjU2KmUrMTA5OTUxMTYyNzc3NipyKzQyOTQ5NjcyOTYqbisxNjc3NzIxNippKzY1NTM2KmErMjU2Km8rc30sdC5wcm90b3R5cGUud3JpdGVMb25nTG9uZz1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiBlPU1hdGguZmxvb3IodC80Mjk0OTY3Mjk2KSxyPTQyOTQ5NjcyOTUmdCx0aGlzLndyaXRlQnl0ZShlPj4yNCYyNTUpLHRoaXMud3JpdGVCeXRlKGU+PjE2JjI1NSksdGhpcy53cml0ZUJ5dGUoZT4+OCYyNTUpLHRoaXMud3JpdGVCeXRlKDI1NSZlKSx0aGlzLndyaXRlQnl0ZShyPj4yNCYyNTUpLHRoaXMud3JpdGVCeXRlKHI+PjE2JjI1NSksdGhpcy53cml0ZUJ5dGUocj4+OCYyNTUpLHRoaXMud3JpdGVCeXRlKDI1NSZyKX0sdC5wcm90b3R5cGUucmVhZEludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRJbnQzMigpfSx0LnByb3RvdHlwZS53cml0ZUludD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53cml0ZUludDMyKHQpfSx0LnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlLHI7Zm9yKGU9W10scj0wOzA8PXQ/cjx0OnI+dDtyPTA8PXQ/KytyOi0tcillLnB1c2godGhpcy5yZWFkQnl0ZSgpKTtyZXR1cm4gZX0sdC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGUscixuLGk7Zm9yKGk9W10scj0wLG49dC5sZW5ndGg7cjxuO3IrKyllPXRbcl0saS5wdXNoKHRoaXMud3JpdGVCeXRlKGUpKTtyZXR1cm4gaX0sdH0oKSxkZT1mdW5jdGlvbigpe3ZhciB0O2Z1bmN0aW9uIGUodCl7dmFyIGUscixuO2Zvcih0aGlzLnNjYWxhclR5cGU9dC5yZWFkSW50KCksdGhpcy50YWJsZUNvdW50PXQucmVhZFNob3J0KCksdGhpcy5zZWFyY2hSYW5nZT10LnJlYWRTaG9ydCgpLHRoaXMuZW50cnlTZWxlY3Rvcj10LnJlYWRTaG9ydCgpLHRoaXMucmFuZ2VTaGlmdD10LnJlYWRTaG9ydCgpLHRoaXMudGFibGVzPXt9LHI9MCxuPXRoaXMudGFibGVDb3VudDswPD1uP3I8bjpyPm47cj0wPD1uPysrcjotLXIpZT17dGFnOnQucmVhZFN0cmluZyg0KSxjaGVja3N1bTp0LnJlYWRJbnQoKSxvZmZzZXQ6dC5yZWFkSW50KCksbGVuZ3RoOnQucmVhZEludCgpfSx0aGlzLnRhYmxlc1tlLnRhZ109ZX1yZXR1cm4gZS5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKGUpe3ZhciByLG4saSxhLG8scyx1LGMsbCxoLGYsZCxwO2ZvcihwIGluIGY9T2JqZWN0LmtleXMoZSkubGVuZ3RoLHM9TWF0aC5sb2coMiksbD0xNipNYXRoLmZsb29yKE1hdGgubG9nKGYpL3MpLGE9TWF0aC5mbG9vcihsL3MpLGM9MTYqZi1sLChuPW5ldyBmZSkud3JpdGVJbnQodGhpcy5zY2FsYXJUeXBlKSxuLndyaXRlU2hvcnQoZiksbi53cml0ZVNob3J0KGwpLG4ud3JpdGVTaG9ydChhKSxuLndyaXRlU2hvcnQoYyksaT0xNipmLHU9bi5wb3MraSxvPW51bGwsZD1bXSxlKWZvcihoPWVbcF0sbi53cml0ZVN0cmluZyhwKSxuLndyaXRlSW50KHQoaCkpLG4ud3JpdGVJbnQodSksbi53cml0ZUludChoLmxlbmd0aCksZD1kLmNvbmNhdChoKSxcImhlYWRcIj09PXAmJihvPXUpLHUrPWgubGVuZ3RoO3UlNDspZC5wdXNoKDApLHUrKztyZXR1cm4gbi53cml0ZShkKSxyPTI5ODExNDY1NTQtdChuLmRhdGEpLG4ucG9zPW8rOCxuLndyaXRlVUludDMyKHIpLG4uZGF0YX0sdD1mdW5jdGlvbih0KXt2YXIgZSxyLG4saTtmb3IodD1fZS5jYWxsKHQpO3QubGVuZ3RoJTQ7KXQucHVzaCgwKTtmb3Iobj1uZXcgZmUodCkscj0wLGU9MCxpPXQubGVuZ3RoO2U8aTtlPWUrPTQpcis9bi5yZWFkVUludDMyKCk7cmV0dXJuIDQyOTQ5NjcyOTUmcn0sZX0oKSxwZT17fS5oYXNPd25Qcm9wZXJ0eSxnZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgciBpbiBlKXBlLmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1yZXR1cm4gbi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IG4sdC5fX3N1cGVyX189ZS5wcm90b3R5cGUsdH07aGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlO3RoaXMuZmlsZT10LGU9dGhpcy5maWxlLmRpcmVjdG9yeS50YWJsZXNbdGhpcy50YWddLHRoaXMuZXhpc3RzPSEhZSxlJiYodGhpcy5vZmZzZXQ9ZS5vZmZzZXQsdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5wYXJzZSh0aGlzLmZpbGUuY29udGVudHMpKX1yZXR1cm4gdC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUucmF3PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhpc3RzPyh0aGlzLmZpbGUuY29udGVudHMucG9zPXRoaXMub2Zmc2V0LHRoaXMuZmlsZS5jb250ZW50cy5yZWFkKHRoaXMubGVuZ3RoKSk6bnVsbH0sdH0oKTt2YXIgbWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZ2UodCxoZSksdC5wcm90b3R5cGUudGFnPVwiaGVhZFwiLHQucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnBvcz10aGlzLm9mZnNldCx0aGlzLnZlcnNpb249dC5yZWFkSW50KCksdGhpcy5yZXZpc2lvbj10LnJlYWRJbnQoKSx0aGlzLmNoZWNrU3VtQWRqdXN0bWVudD10LnJlYWRJbnQoKSx0aGlzLm1hZ2ljTnVtYmVyPXQucmVhZEludCgpLHRoaXMuZmxhZ3M9dC5yZWFkU2hvcnQoKSx0aGlzLnVuaXRzUGVyRW09dC5yZWFkU2hvcnQoKSx0aGlzLmNyZWF0ZWQ9dC5yZWFkTG9uZ0xvbmcoKSx0aGlzLm1vZGlmaWVkPXQucmVhZExvbmdMb25nKCksdGhpcy54TWluPXQucmVhZFNob3J0KCksdGhpcy55TWluPXQucmVhZFNob3J0KCksdGhpcy54TWF4PXQucmVhZFNob3J0KCksdGhpcy55TWF4PXQucmVhZFNob3J0KCksdGhpcy5tYWNTdHlsZT10LnJlYWRTaG9ydCgpLHRoaXMubG93ZXN0UmVjUFBFTT10LnJlYWRTaG9ydCgpLHRoaXMuZm9udERpcmVjdGlvbkhpbnQ9dC5yZWFkU2hvcnQoKSx0aGlzLmluZGV4VG9Mb2NGb3JtYXQ9dC5yZWFkU2hvcnQoKSx0aGlzLmdseXBoRGF0YUZvcm1hdD10LnJlYWRTaG9ydCgpfSx0LnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuKGU9bmV3IGZlKS53cml0ZUludCh0aGlzLnZlcnNpb24pLGUud3JpdGVJbnQodGhpcy5yZXZpc2lvbiksZS53cml0ZUludCh0aGlzLmNoZWNrU3VtQWRqdXN0bWVudCksZS53cml0ZUludCh0aGlzLm1hZ2ljTnVtYmVyKSxlLndyaXRlU2hvcnQodGhpcy5mbGFncyksZS53cml0ZVNob3J0KHRoaXMudW5pdHNQZXJFbSksZS53cml0ZUxvbmdMb25nKHRoaXMuY3JlYXRlZCksZS53cml0ZUxvbmdMb25nKHRoaXMubW9kaWZpZWQpLGUud3JpdGVTaG9ydCh0aGlzLnhNaW4pLGUud3JpdGVTaG9ydCh0aGlzLnlNaW4pLGUud3JpdGVTaG9ydCh0aGlzLnhNYXgpLGUud3JpdGVTaG9ydCh0aGlzLnlNYXgpLGUud3JpdGVTaG9ydCh0aGlzLm1hY1N0eWxlKSxlLndyaXRlU2hvcnQodGhpcy5sb3dlc3RSZWNQUEVNKSxlLndyaXRlU2hvcnQodGhpcy5mb250RGlyZWN0aW9uSGludCksZS53cml0ZVNob3J0KHQpLGUud3JpdGVTaG9ydCh0aGlzLmdseXBoRGF0YUZvcm1hdCksZS5kYXRhfSx0fSgpLHZlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciByLG4saSxhLG8scyx1LGMsbCxoLGYsZCxwLGcsbSx2LGI7c3dpdGNoKHRoaXMucGxhdGZvcm1JRD10LnJlYWRVSW50MTYoKSx0aGlzLmVuY29kaW5nSUQ9dC5yZWFkU2hvcnQoKSx0aGlzLm9mZnNldD1lK3QucmVhZEludCgpLGw9dC5wb3MsdC5wb3M9dGhpcy5vZmZzZXQsdGhpcy5mb3JtYXQ9dC5yZWFkVUludDE2KCksdGhpcy5sZW5ndGg9dC5yZWFkVUludDE2KCksdGhpcy5sYW5ndWFnZT10LnJlYWRVSW50MTYoKSx0aGlzLmlzVW5pY29kZT0zPT09dGhpcy5wbGF0Zm9ybUlEJiYxPT09dGhpcy5lbmNvZGluZ0lEJiY0PT09dGhpcy5mb3JtYXR8fDA9PT10aGlzLnBsYXRmb3JtSUQmJjQ9PT10aGlzLmZvcm1hdCx0aGlzLmNvZGVNYXA9e30sdGhpcy5mb3JtYXQpe2Nhc2UgMDpmb3Iocz0wO3M8MjU2Oysrcyl0aGlzLmNvZGVNYXBbc109dC5yZWFkQnl0ZSgpO2JyZWFrO2Nhc2UgNDpmb3IoZj10LnJlYWRVSW50MTYoKSxoPWYvMix0LnBvcys9NixpPWZ1bmN0aW9uKCl7dmFyIGUscjtmb3Iocj1bXSxzPWU9MDswPD1oP2U8aDplPmg7cz0wPD1oPysrZTotLWUpci5wdXNoKHQucmVhZFVJbnQxNigpKTtyZXR1cm4gcn0oKSx0LnBvcys9MixwPWZ1bmN0aW9uKCl7dmFyIGUscjtmb3Iocj1bXSxzPWU9MDswPD1oP2U8aDplPmg7cz0wPD1oPysrZTotLWUpci5wdXNoKHQucmVhZFVJbnQxNigpKTtyZXR1cm4gcn0oKSx1PWZ1bmN0aW9uKCl7dmFyIGUscjtmb3Iocj1bXSxzPWU9MDswPD1oP2U8aDplPmg7cz0wPD1oPysrZTotLWUpci5wdXNoKHQucmVhZFVJbnQxNigpKTtyZXR1cm4gcn0oKSxjPWZ1bmN0aW9uKCl7dmFyIGUscjtmb3Iocj1bXSxzPWU9MDswPD1oP2U8aDplPmg7cz0wPD1oPysrZTotLWUpci5wdXNoKHQucmVhZFVJbnQxNigpKTtyZXR1cm4gcn0oKSxuPSh0aGlzLmxlbmd0aC10LnBvcyt0aGlzLm9mZnNldCkvMixvPWZ1bmN0aW9uKCl7dmFyIGUscjtmb3Iocj1bXSxzPWU9MDswPD1uP2U8bjplPm47cz0wPD1uPysrZTotLWUpci5wdXNoKHQucmVhZFVJbnQxNigpKTtyZXR1cm4gcn0oKSxzPW09MCxiPWkubGVuZ3RoO208YjtzPSsrbSlmb3IoZz1pW3NdLHI9dj1kPXBbc107ZDw9Zz92PD1nOnY+PWc7cj1kPD1nPysrdjotLXYpMD09PWNbc10/YT1yK3Vbc106MCE9PShhPW9bY1tzXS8yKyhyLWQpLShoLXMpXXx8MCkmJihhKz11W3NdKSx0aGlzLmNvZGVNYXBbcl09NjU1MzUmYX10LnBvcz1sfXJldHVybiB0LmVuY29kZT1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxhLG8scyx1LGMsbCxoLGYsZCxwLGcsbSx2LGIseSx3LE4sTCx4LEEsUyxfLFAsayxGLEksQyxqLE8sQixNLHEsRSxSLEQsVCx6LFUsSCxXLFYsRyxZO3N3aXRjaChGPW5ldyBmZSxhPU9iamVjdC5rZXlzKHQpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSksZSl7Y2FzZVwibWFjcm9tYW5cIjpmb3IocD0wLGc9ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IoZD0wO2Q8MjU2OysrZCl0LnB1c2goMCk7cmV0dXJuIHR9KCksdj17MDowfSxpPXt9LEk9MCxCPWEubGVuZ3RoO0k8QjtJKyspbnVsbD09dltXPXRbbj1hW0ldXV0mJih2W1ddPSsrcCksaVtuXT17b2xkOnRbbl0sbmV3OnZbdFtuXV19LGdbbl09dlt0W25dXTtyZXR1cm4gRi53cml0ZVVJbnQxNigxKSxGLndyaXRlVUludDE2KDApLEYud3JpdGVVSW50MzIoMTIpLEYud3JpdGVVSW50MTYoMCksRi53cml0ZVVJbnQxNigyNjIpLEYud3JpdGVVSW50MTYoMCksRi53cml0ZShnKSx7Y2hhck1hcDppLHN1YnRhYmxlOkYuZGF0YSxtYXhHbHlwaElEOnArMX07Y2FzZVwidW5pY29kZVwiOmZvcihQPVtdLGw9W10sYj0wLHY9e30scj17fSxtPXU9bnVsbCxDPTAsTT1hLmxlbmd0aDtDPE07QysrKW51bGw9PXZbdz10W249YVtDXV1dJiYodlt3XT0rK2IpLHJbbl09e29sZDp3LG5ldzp2W3ddfSxvPXZbd10tbixudWxsIT1tJiZvPT09dXx8KG0mJmwucHVzaChtKSxQLnB1c2gobiksdT1vKSxtPW47Zm9yKG0mJmwucHVzaChtKSxsLnB1c2goNjU1MzUpLFAucHVzaCg2NTUzNSksUz0yKihBPVAubGVuZ3RoKSx4PTIqTWF0aC5wb3coTWF0aC5sb2coQSkvTWF0aC5MTjIsMiksaD1NYXRoLmxvZyh4LzIpL01hdGguTE4yLEw9MipBLXgscz1bXSxOPVtdLGY9W10sZD1qPTAscT1QLmxlbmd0aDtqPHE7ZD0rK2ope2lmKF89UFtkXSxjPWxbZF0sNjU1MzU9PT1fKXtzLnB1c2goMCksTi5wdXNoKDApO2JyZWFrfWlmKF8tKGs9cltfXS5uZXcpPj0zMjc2OClmb3Iocy5wdXNoKDApLE4ucHVzaCgyKihmLmxlbmd0aCtBLWQpKSxuPU89XztfPD1jP088PWM6Tz49YztuPV88PWM/KytPOi0tTylmLnB1c2gocltuXS5uZXcpO2Vsc2Ugcy5wdXNoKGstXyksTi5wdXNoKDApfWZvcihGLndyaXRlVUludDE2KDMpLEYud3JpdGVVSW50MTYoMSksRi53cml0ZVVJbnQzMigxMiksRi53cml0ZVVJbnQxNig0KSxGLndyaXRlVUludDE2KDE2KzgqQSsyKmYubGVuZ3RoKSxGLndyaXRlVUludDE2KDApLEYud3JpdGVVSW50MTYoUyksRi53cml0ZVVJbnQxNih4KSxGLndyaXRlVUludDE2KGgpLEYud3JpdGVVSW50MTYoTCksVT0wLEU9bC5sZW5ndGg7VTxFO1UrKyluPWxbVV0sRi53cml0ZVVJbnQxNihuKTtmb3IoRi53cml0ZVVJbnQxNigwKSxIPTAsUj1QLmxlbmd0aDtIPFI7SCsrKW49UFtIXSxGLndyaXRlVUludDE2KG4pO2ZvcihWPTAsRD1zLmxlbmd0aDtWPEQ7VisrKW89c1tWXSxGLndyaXRlVUludDE2KG8pO2ZvcihHPTAsVD1OLmxlbmd0aDtHPFQ7RysrKXk9TltHXSxGLndyaXRlVUludDE2KHkpO2ZvcihZPTAsej1mLmxlbmd0aDtZPHo7WSsrKXA9ZltZXSxGLndyaXRlVUludDE2KHApO3JldHVybntjaGFyTWFwOnIsc3VidGFibGU6Ri5kYXRhLG1heEdseXBoSUQ6YisxfX19LHR9KCksYmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZ2UodCxoZSksdC5wcm90b3R5cGUudGFnPVwiY21hcFwiLHQucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbjtmb3IodC5wb3M9dGhpcy5vZmZzZXQsdGhpcy52ZXJzaW9uPXQucmVhZFVJbnQxNigpLG49dC5yZWFkVUludDE2KCksdGhpcy50YWJsZXM9W10sdGhpcy51bmljb2RlPW51bGwscj0wOzA8PW4/cjxuOnI+bjtyPTA8PW4/KytyOi0tcillPW5ldyB2ZSh0LHRoaXMub2Zmc2V0KSx0aGlzLnRhYmxlcy5wdXNoKGUpLGUuaXNVbmljb2RlJiZudWxsPT10aGlzLnVuaWNvZGUmJih0aGlzLnVuaWNvZGU9ZSk7cmV0dXJuITB9LHQuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbjtyZXR1cm4gbnVsbD09ZSYmKGU9XCJtYWNyb21hblwiKSxyPXZlLmVuY29kZSh0LGUpLChuPW5ldyBmZSkud3JpdGVVSW50MTYoMCksbi53cml0ZVVJbnQxNigxKSxyLnRhYmxlPW4uZGF0YS5jb25jYXQoci5zdWJ0YWJsZSkscn0sdH0oKSx5ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gdC5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBnZSh0LGhlKSx0LnByb3RvdHlwZS50YWc9XCJoaGVhXCIsdC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQucG9zPXRoaXMub2Zmc2V0LHRoaXMudmVyc2lvbj10LnJlYWRJbnQoKSx0aGlzLmFzY2VuZGVyPXQucmVhZFNob3J0KCksdGhpcy5kZWNlbmRlcj10LnJlYWRTaG9ydCgpLHRoaXMubGluZUdhcD10LnJlYWRTaG9ydCgpLHRoaXMuYWR2YW5jZVdpZHRoTWF4PXQucmVhZFNob3J0KCksdGhpcy5taW5MZWZ0U2lkZUJlYXJpbmc9dC5yZWFkU2hvcnQoKSx0aGlzLm1pblJpZ2h0U2lkZUJlYXJpbmc9dC5yZWFkU2hvcnQoKSx0aGlzLnhNYXhFeHRlbnQ9dC5yZWFkU2hvcnQoKSx0aGlzLmNhcmV0U2xvcGVSaXNlPXQucmVhZFNob3J0KCksdGhpcy5jYXJldFNsb3BlUnVuPXQucmVhZFNob3J0KCksdGhpcy5jYXJldE9mZnNldD10LnJlYWRTaG9ydCgpLHQucG9zKz04LHRoaXMubWV0cmljRGF0YUZvcm1hdD10LnJlYWRTaG9ydCgpLHRoaXMubnVtYmVyT2ZNZXRyaWNzPXQucmVhZFVJbnQxNigpfSx0fSgpLHdlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3JldHVybiB0Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGdlKHQsaGUpLHQucHJvdG90eXBlLnRhZz1cIk9TLzJcIix0LnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0KXtpZih0LnBvcz10aGlzLm9mZnNldCx0aGlzLnZlcnNpb249dC5yZWFkVUludDE2KCksdGhpcy5hdmVyYWdlQ2hhcldpZHRoPXQucmVhZFNob3J0KCksdGhpcy53ZWlnaHRDbGFzcz10LnJlYWRVSW50MTYoKSx0aGlzLndpZHRoQ2xhc3M9dC5yZWFkVUludDE2KCksdGhpcy50eXBlPXQucmVhZFNob3J0KCksdGhpcy55U3Vic2NyaXB0WFNpemU9dC5yZWFkU2hvcnQoKSx0aGlzLnlTdWJzY3JpcHRZU2l6ZT10LnJlYWRTaG9ydCgpLHRoaXMueVN1YnNjcmlwdFhPZmZzZXQ9dC5yZWFkU2hvcnQoKSx0aGlzLnlTdWJzY3JpcHRZT2Zmc2V0PXQucmVhZFNob3J0KCksdGhpcy55U3VwZXJzY3JpcHRYU2l6ZT10LnJlYWRTaG9ydCgpLHRoaXMueVN1cGVyc2NyaXB0WVNpemU9dC5yZWFkU2hvcnQoKSx0aGlzLnlTdXBlcnNjcmlwdFhPZmZzZXQ9dC5yZWFkU2hvcnQoKSx0aGlzLnlTdXBlcnNjcmlwdFlPZmZzZXQ9dC5yZWFkU2hvcnQoKSx0aGlzLnlTdHJpa2VvdXRTaXplPXQucmVhZFNob3J0KCksdGhpcy55U3RyaWtlb3V0UG9zaXRpb249dC5yZWFkU2hvcnQoKSx0aGlzLmZhbWlseUNsYXNzPXQucmVhZFNob3J0KCksdGhpcy5wYW5vc2U9ZnVuY3Rpb24oKXt2YXIgZSxyO2ZvcihyPVtdLGU9MDtlPDEwOysrZSlyLnB1c2godC5yZWFkQnl0ZSgpKTtyZXR1cm4gcn0oKSx0aGlzLmNoYXJSYW5nZT1mdW5jdGlvbigpe3ZhciBlLHI7Zm9yKHI9W10sZT0wO2U8NDsrK2Upci5wdXNoKHQucmVhZEludCgpKTtyZXR1cm4gcn0oKSx0aGlzLnZlbmRvcklEPXQucmVhZFN0cmluZyg0KSx0aGlzLnNlbGVjdGlvbj10LnJlYWRTaG9ydCgpLHRoaXMuZmlyc3RDaGFySW5kZXg9dC5yZWFkU2hvcnQoKSx0aGlzLmxhc3RDaGFySW5kZXg9dC5yZWFkU2hvcnQoKSx0aGlzLnZlcnNpb24+MCYmKHRoaXMuYXNjZW50PXQucmVhZFNob3J0KCksdGhpcy5kZXNjZW50PXQucmVhZFNob3J0KCksdGhpcy5saW5lR2FwPXQucmVhZFNob3J0KCksdGhpcy53aW5Bc2NlbnQ9dC5yZWFkU2hvcnQoKSx0aGlzLndpbkRlc2NlbnQ9dC5yZWFkU2hvcnQoKSx0aGlzLmNvZGVQYWdlUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZSxyO2ZvcihyPVtdLGU9MDtlPDI7ZT0rK2Upci5wdXNoKHQucmVhZEludCgpKTtyZXR1cm4gcn0oKSx0aGlzLnZlcnNpb24+MSkpcmV0dXJuIHRoaXMueEhlaWdodD10LnJlYWRTaG9ydCgpLHRoaXMuY2FwSGVpZ2h0PXQucmVhZFNob3J0KCksdGhpcy5kZWZhdWx0Q2hhcj10LnJlYWRTaG9ydCgpLHRoaXMuYnJlYWtDaGFyPXQucmVhZFNob3J0KCksdGhpcy5tYXhDb250ZXh0PXQucmVhZFNob3J0KCl9LHR9KCksTmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZ2UodCxoZSksdC5wcm90b3R5cGUudGFnPVwicG9zdFwiLHQucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbjtzd2l0Y2godC5wb3M9dGhpcy5vZmZzZXQsdGhpcy5mb3JtYXQ9dC5yZWFkSW50KCksdGhpcy5pdGFsaWNBbmdsZT10LnJlYWRJbnQoKSx0aGlzLnVuZGVybGluZVBvc2l0aW9uPXQucmVhZFNob3J0KCksdGhpcy51bmRlcmxpbmVUaGlja25lc3M9dC5yZWFkU2hvcnQoKSx0aGlzLmlzRml4ZWRQaXRjaD10LnJlYWRJbnQoKSx0aGlzLm1pbk1lbVR5cGU0Mj10LnJlYWRJbnQoKSx0aGlzLm1heE1lbVR5cGU0Mj10LnJlYWRJbnQoKSx0aGlzLm1pbk1lbVR5cGUxPXQucmVhZEludCgpLHRoaXMubWF4TWVtVHlwZTE9dC5yZWFkSW50KCksdGhpcy5mb3JtYXQpe2Nhc2UgNjU1MzY6Y2FzZSAxOTY2MDg6YnJlYWs7Y2FzZSAxMzEwNzI6dmFyIGk7Zm9yKHI9dC5yZWFkVUludDE2KCksdGhpcy5nbHlwaE5hbWVJbmRleD1bXSxpPTA7MDw9cj9pPHI6aT5yO2k9MDw9cj8rK2k6LS1pKXRoaXMuZ2x5cGhOYW1lSW5kZXgucHVzaCh0LnJlYWRVSW50MTYoKSk7Zm9yKHRoaXMubmFtZXM9W10sbj1bXTt0LnBvczx0aGlzLm9mZnNldCt0aGlzLmxlbmd0aDspZT10LnJlYWRCeXRlKCksbi5wdXNoKHRoaXMubmFtZXMucHVzaCh0LnJlYWRTdHJpbmcoZSkpKTtyZXR1cm4gbjtjYXNlIDE1MTU1MjpyZXR1cm4gcj10LnJlYWRVSW50MTYoKSx0aGlzLm9mZnNldHM9dC5yZWFkKHIpO2Nhc2UgMjYyMTQ0OnJldHVybiB0aGlzLm1hcD1mdW5jdGlvbigpe3ZhciBlLHIsbjtmb3Iobj1bXSxpPWU9MCxyPXRoaXMuZmlsZS5tYXhwLm51bUdseXBoczswPD1yP2U8cjplPnI7aT0wPD1yPysrZTotLWUpbi5wdXNoKHQucmVhZFVJbnQzMigpKTtyZXR1cm4gbn0uY2FsbCh0aGlzKX19LHR9KCksTGU9ZnVuY3Rpb24odCxlKXt0aGlzLnJhdz10LHRoaXMubGVuZ3RoPXQubGVuZ3RoLHRoaXMucGxhdGZvcm1JRD1lLnBsYXRmb3JtSUQsdGhpcy5lbmNvZGluZ0lEPWUuZW5jb2RpbmdJRCx0aGlzLmxhbmd1YWdlSUQ9ZS5sYW5ndWFnZUlEfSx4ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gdC5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBnZSh0LGhlKSx0LnByb3RvdHlwZS50YWc9XCJuYW1lXCIsdC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksYSxvLHMsdSxjLGwsaDtmb3IodC5wb3M9dGhpcy5vZmZzZXQsdC5yZWFkU2hvcnQoKSxlPXQucmVhZFNob3J0KCksbz10LnJlYWRTaG9ydCgpLHI9W10saT0wOzA8PWU/aTxlOmk+ZTtpPTA8PWU/KytpOi0taSlyLnB1c2goe3BsYXRmb3JtSUQ6dC5yZWFkU2hvcnQoKSxlbmNvZGluZ0lEOnQucmVhZFNob3J0KCksbGFuZ3VhZ2VJRDp0LnJlYWRTaG9ydCgpLG5hbWVJRDp0LnJlYWRTaG9ydCgpLGxlbmd0aDp0LnJlYWRTaG9ydCgpLG9mZnNldDp0aGlzLm9mZnNldCtvK3QucmVhZFNob3J0KCl9KTtmb3Iocz17fSxpPWM9MCxsPXIubGVuZ3RoO2M8bDtpPSsrYyluPXJbaV0sdC5wb3M9bi5vZmZzZXQsdT10LnJlYWRTdHJpbmcobi5sZW5ndGgpLGE9bmV3IExlKHUsbiksbnVsbD09c1toPW4ubmFtZUlEXSYmKHNbaF09W10pLHNbbi5uYW1lSURdLnB1c2goYSk7dGhpcy5zdHJpbmdzPXMsdGhpcy5jb3B5cmlnaHQ9c1swXSx0aGlzLmZvbnRGYW1pbHk9c1sxXSx0aGlzLmZvbnRTdWJmYW1pbHk9c1syXSx0aGlzLnVuaXF1ZVN1YmZhbWlseT1zWzNdLHRoaXMuZm9udE5hbWU9c1s0XSx0aGlzLnZlcnNpb249c1s1XTt0cnl7dGhpcy5wb3N0c2NyaXB0TmFtZT1zWzZdWzBdLnJhdy5yZXBsYWNlKC9bXFx4MDAtXFx4MTlcXHg4MC1cXHhmZl0vZyxcIlwiKX1jYXRjaChmKXt0aGlzLnBvc3RzY3JpcHROYW1lPXNbNF1bMF0ucmF3LnJlcGxhY2UoL1tcXHgwMC1cXHgxOVxceDgwLVxceGZmXS9nLFwiXCIpfXJldHVybiB0aGlzLnRyYWRlbWFyaz1zWzddLHRoaXMubWFudWZhY3R1cmVyPXNbOF0sdGhpcy5kZXNpZ25lcj1zWzldLHRoaXMuZGVzY3JpcHRpb249c1sxMF0sdGhpcy52ZW5kb3JVcmw9c1sxMV0sdGhpcy5kZXNpZ25lclVybD1zWzEyXSx0aGlzLmxpY2Vuc2U9c1sxM10sdGhpcy5saWNlbnNlVXJsPXNbMTRdLHRoaXMucHJlZmVycmVkRmFtaWx5PXNbMTVdLHRoaXMucHJlZmVycmVkU3ViZmFtaWx5PXNbMTddLHRoaXMuY29tcGF0aWJsZUZ1bGw9c1sxOF0sdGhpcy5zYW1wbGVUZXh0PXNbMTldfSx0fSgpLEFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3JldHVybiB0Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGdlKHQsaGUpLHQucHJvdG90eXBlLnRhZz1cIm1heHBcIix0LnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5wb3M9dGhpcy5vZmZzZXQsdGhpcy52ZXJzaW9uPXQucmVhZEludCgpLHRoaXMubnVtR2x5cGhzPXQucmVhZFVJbnQxNigpLHRoaXMubWF4UG9pbnRzPXQucmVhZFVJbnQxNigpLHRoaXMubWF4Q29udG91cnM9dC5yZWFkVUludDE2KCksdGhpcy5tYXhDb21wb3NpdGVQb2ludHM9dC5yZWFkVUludDE2KCksdGhpcy5tYXhDb21wb25lbnRDb250b3Vycz10LnJlYWRVSW50MTYoKSx0aGlzLm1heFpvbmVzPXQucmVhZFVJbnQxNigpLHRoaXMubWF4VHdpbGlnaHRQb2ludHM9dC5yZWFkVUludDE2KCksdGhpcy5tYXhTdG9yYWdlPXQucmVhZFVJbnQxNigpLHRoaXMubWF4RnVuY3Rpb25EZWZzPXQucmVhZFVJbnQxNigpLHRoaXMubWF4SW5zdHJ1Y3Rpb25EZWZzPXQucmVhZFVJbnQxNigpLHRoaXMubWF4U3RhY2tFbGVtZW50cz10LnJlYWRVSW50MTYoKSx0aGlzLm1heFNpemVPZkluc3RydWN0aW9ucz10LnJlYWRVSW50MTYoKSx0aGlzLm1heENvbXBvbmVudEVsZW1lbnRzPXQucmVhZFVJbnQxNigpLHRoaXMubWF4Q29tcG9uZW50RGVwdGg9dC5yZWFkVUludDE2KCl9LHR9KCksU2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZ2UodCxoZSksdC5wcm90b3R5cGUudGFnPVwiaG10eFwiLHQucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLGEsbyxzO2Zvcih0LnBvcz10aGlzLm9mZnNldCx0aGlzLm1ldHJpY3M9W10sZT0wLG89dGhpcy5maWxlLmhoZWEubnVtYmVyT2ZNZXRyaWNzOzA8PW8/ZTxvOmU+bztlPTA8PW8/KytlOi0tZSl0aGlzLm1ldHJpY3MucHVzaCh7YWR2YW5jZTp0LnJlYWRVSW50MTYoKSxsc2I6dC5yZWFkSW50MTYoKX0pO2ZvcihuPXRoaXMuZmlsZS5tYXhwLm51bUdseXBocy10aGlzLmZpbGUuaGhlYS5udW1iZXJPZk1ldHJpY3MsdGhpcy5sZWZ0U2lkZUJlYXJpbmdzPWZ1bmN0aW9uKCl7dmFyIHIsaTtmb3IoaT1bXSxlPXI9MDswPD1uP3I8bjpyPm47ZT0wPD1uPysrcjotLXIpaS5wdXNoKHQucmVhZEludDE2KCkpO3JldHVybiBpfSgpLHRoaXMud2lkdGhzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG47Zm9yKG49W10sdD0wLGU9KHI9dGhpcy5tZXRyaWNzKS5sZW5ndGg7dDxlO3QrKylpPXJbdF0sbi5wdXNoKGkuYWR2YW5jZSk7cmV0dXJuIG59LmNhbGwodGhpcykscj10aGlzLndpZHRoc1t0aGlzLndpZHRocy5sZW5ndGgtMV0scz1bXSxlPWE9MDswPD1uP2E8bjphPm47ZT0wPD1uPysrYTotLWEpcy5wdXNoKHRoaXMud2lkdGhzLnB1c2gocikpO3JldHVybiBzfSx0LnByb3RvdHlwZS5mb3JHbHlwaD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbiB0aGlzLm1ldHJpY3M/dGhpcy5tZXRyaWNzW3RdOnthZHZhbmNlOnRoaXMubWV0cmljc1t0aGlzLm1ldHJpY3MubGVuZ3RoLTFdLmFkdmFuY2UsbHNiOnRoaXMubGVmdFNpZGVCZWFyaW5nc1t0LXRoaXMubWV0cmljcy5sZW5ndGhdfX0sdH0oKSxfZT1bXS5zbGljZSxQZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gdC5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBnZSh0LGhlKSx0LnByb3RvdHlwZS50YWc9XCJnbHlmXCIsdC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYWNoZT17fX0sdC5wcm90b3R5cGUuZ2x5cGhGb3I9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksYSxvLHMsdSxjLGw7cmV0dXJuIHQgaW4gdGhpcy5jYWNoZT90aGlzLmNhY2hlW3RdOihpPXRoaXMuZmlsZS5sb2NhLGU9dGhpcy5maWxlLmNvbnRlbnRzLHI9aS5pbmRleE9mKHQpLDA9PT0obj1pLmxlbmd0aE9mKHQpKT90aGlzLmNhY2hlW3RdPW51bGw6KGUucG9zPXRoaXMub2Zmc2V0K3IsYT0obz1uZXcgZmUoZS5yZWFkKG4pKSkucmVhZFNob3J0KCksdT1vLnJlYWRTaG9ydCgpLGw9by5yZWFkU2hvcnQoKSxzPW8ucmVhZFNob3J0KCksYz1vLnJlYWRTaG9ydCgpLHRoaXMuY2FjaGVbdF09LTE9PT1hP25ldyBGZShvLHUsbCxzLGMpOm5ldyBrZShvLGEsdSxsLHMsYyksdGhpcy5jYWNoZVt0XSkpfSx0LnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksYSxvLHM7Zm9yKGE9W10saT1bXSxvPTAscz1lLmxlbmd0aDtvPHM7bysrKW49dFtlW29dXSxpLnB1c2goYS5sZW5ndGgpLG4mJihhPWEuY29uY2F0KG4uZW5jb2RlKHIpKSk7cmV0dXJuIGkucHVzaChhLmxlbmd0aCkse3RhYmxlOmEsb2Zmc2V0czppfX0sdH0oKSxrZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLHIsbixpLGEpe3RoaXMucmF3PXQsdGhpcy5udW1iZXJPZkNvbnRvdXJzPWUsdGhpcy54TWluPXIsdGhpcy55TWluPW4sdGhpcy54TWF4PWksdGhpcy55TWF4PWEsdGhpcy5jb21wb3VuZD0hMX1yZXR1cm4gdC5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF3LmRhdGF9LHR9KCksRmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxyLG4saSl7dmFyIGEsbztmb3IodGhpcy5yYXc9dCx0aGlzLnhNaW49ZSx0aGlzLnlNaW49cix0aGlzLnhNYXg9bix0aGlzLnlNYXg9aSx0aGlzLmNvbXBvdW5kPSEwLHRoaXMuZ2x5cGhJRHM9W10sdGhpcy5nbHlwaE9mZnNldHM9W10sYT10aGlzLnJhdztvPWEucmVhZFNob3J0KCksdGhpcy5nbHlwaE9mZnNldHMucHVzaChhLnBvcyksdGhpcy5nbHlwaElEcy5wdXNoKGEucmVhZFVJbnQxNigpKSwzMiZvOylhLnBvcys9MSZvPzQ6MiwxMjgmbz9hLnBvcys9ODo2NCZvP2EucG9zKz00OjgmbyYmKGEucG9zKz0yKX1yZXR1cm4gdC5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKCl7dmFyIHQsZSxyO2ZvcihlPW5ldyBmZShfZS5jYWxsKHRoaXMucmF3LmRhdGEpKSx0PTAscj10aGlzLmdseXBoSURzLmxlbmd0aDt0PHI7Kyt0KWUucG9zPXRoaXMuZ2x5cGhPZmZzZXRzW3RdO3JldHVybiBlLmRhdGF9LHR9KCksSWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZ2UodCxoZSksdC5wcm90b3R5cGUudGFnPVwibG9jYVwiLHQucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlLHI7cmV0dXJuIHQucG9zPXRoaXMub2Zmc2V0LGU9dGhpcy5maWxlLmhlYWQuaW5kZXhUb0xvY0Zvcm1hdCx0aGlzLm9mZnNldHM9MD09PWU/ZnVuY3Rpb24oKXt2YXIgZSxuO2ZvcihuPVtdLHI9MCxlPXRoaXMubGVuZ3RoO3I8ZTtyKz0yKW4ucHVzaCgyKnQucmVhZFVJbnQxNigpKTtyZXR1cm4gbn0uY2FsbCh0aGlzKTpmdW5jdGlvbigpe3ZhciBlLG47Zm9yKG49W10scj0wLGU9dGhpcy5sZW5ndGg7cjxlO3IrPTQpbi5wdXNoKHQucmVhZFVJbnQzMigpKTtyZXR1cm4gbn0uY2FsbCh0aGlzKX0sdC5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vZmZzZXRzW3RdfSx0LnByb3RvdHlwZS5sZW5ndGhPZj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vZmZzZXRzW3QrMV0tdGhpcy5vZmZzZXRzW3RdfSx0LnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9bmV3IFVpbnQzMkFycmF5KHRoaXMub2Zmc2V0cy5sZW5ndGgpLG49MCxpPTAsYT0wO2E8ci5sZW5ndGg7KythKWlmKHJbYV09bixpPGUubGVuZ3RoJiZlW2ldPT1hKXsrK2ksclthXT1uO3ZhciBvPXRoaXMub2Zmc2V0c1thXSxzPXRoaXMub2Zmc2V0c1thKzFdLW87cz4wJiYobis9cyl9Zm9yKHZhciB1PW5ldyBBcnJheSg0KnIubGVuZ3RoKSxjPTA7YzxyLmxlbmd0aDsrK2MpdVs0KmMrM109MjU1JnJbY10sdVs0KmMrMl09KDY1MjgwJnJbY10pPj44LHVbNCpjKzFdPSgxNjcxMTY4MCZyW2NdKT4+MTYsdVs0KmNdPSg0Mjc4MTkwMDgwJnJbY10pPj4yNDtyZXR1cm4gdX0sdH0oKSxDZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5mb250PXQsdGhpcy5zdWJzZXQ9e30sdGhpcy51bmljb2Rlcz17fSx0aGlzLm5leHQ9MzN9cmV0dXJuIHQucHJvdG90eXBlLmdlbmVyYXRlQ21hcD1mdW5jdGlvbigpe3ZhciB0LGUscixuLGk7Zm9yKGUgaW4gbj10aGlzLmZvbnQuY21hcC50YWJsZXNbMF0uY29kZU1hcCx0PXt9LGk9dGhpcy5zdWJzZXQpcj1pW2VdLHRbZV09bltyXTtyZXR1cm4gdH0sdC5wcm90b3R5cGUuZ2x5cGhzRm9yPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLGEsbyxzO2ZvcihuPXt9LGE9MCxvPXQubGVuZ3RoO2E8bzthKyspbltpPXRbYV1dPXRoaXMuZm9udC5nbHlmLmdseXBoRm9yKGkpO2ZvcihpIGluIGU9W10sbikobnVsbCE9KHI9bltpXSk/ci5jb21wb3VuZDp2b2lkIDApJiZlLnB1c2guYXBwbHkoZSxyLmdseXBoSURzKTtpZihlLmxlbmd0aD4wKWZvcihpIGluIHM9dGhpcy5nbHlwaHNGb3IoZSkpcj1zW2ldLG5baV09cjtyZXR1cm4gbn0sdC5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpLGEsbyxzLHUsYyxsLGgsZixkLHAsZyxtO2ZvcihuIGluIHI9YmUuZW5jb2RlKHRoaXMuZ2VuZXJhdGVDbWFwKCksXCJ1bmljb2RlXCIpLGE9dGhpcy5nbHlwaHNGb3IodCksZj17MDowfSxtPXIuY2hhck1hcClmWyhzPW1bbl0pLm9sZF09cy5uZXc7Zm9yKGQgaW4gaD1yLm1heEdseXBoSUQsYSlkIGluIGZ8fChmW2RdPWgrKyk7cmV0dXJuIGM9ZnVuY3Rpb24odCl7dmFyIGUscjtmb3IoZSBpbiByPXt9LHQpclt0W2VdXT1lO3JldHVybiByfShmKSxsPU9iamVjdC5rZXlzKGMpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSkscD1mdW5jdGlvbigpe3ZhciB0LGUscjtmb3Iocj1bXSx0PTAsZT1sLmxlbmd0aDt0PGU7dCsrKW89bFt0XSxyLnB1c2goY1tvXSk7cmV0dXJuIHJ9KCksaT10aGlzLmZvbnQuZ2x5Zi5lbmNvZGUoYSxwLGYpLHU9dGhpcy5mb250LmxvY2EuZW5jb2RlKGkub2Zmc2V0cyxwKSxnPXtjbWFwOnRoaXMuZm9udC5jbWFwLnJhdygpLGdseWY6aS50YWJsZSxsb2NhOnUsaG10eDp0aGlzLmZvbnQuaG10eC5yYXcoKSxoaGVhOnRoaXMuZm9udC5oaGVhLnJhdygpLG1heHA6dGhpcy5mb250Lm1heHAucmF3KCkscG9zdDp0aGlzLmZvbnQucG9zdC5yYXcoKSxuYW1lOnRoaXMuZm9udC5uYW1lLnJhdygpLGhlYWQ6dGhpcy5mb250LmhlYWQuZW5jb2RlKGUpfSx0aGlzLmZvbnQub3MyLmV4aXN0cyYmKGdbXCJPUy8yXCJdPXRoaXMuZm9udC5vczIucmF3KCkpLHRoaXMuZm9udC5kaXJlY3RvcnkuZW5jb2RlKGcpfSx0fSgpO0UuQVBJLlBERk9iamVjdD1mdW5jdGlvbigpe3ZhciB0O2Z1bmN0aW9uIGUoKXt9cmV0dXJuIHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4oQXJyYXkoZSsxKS5qb2luKFwiMFwiKSt0KS5zbGljZSgtZSl9LGUuY29udmVydD1mdW5jdGlvbihyKXt2YXIgbixpLGEsbztpZihBcnJheS5pc0FycmF5KHIpKXJldHVyblwiW1wiK2Z1bmN0aW9uKCl7dmFyIHQsaSxhO2ZvcihhPVtdLHQ9MCxpPXIubGVuZ3RoO3Q8aTt0Kyspbj1yW3RdLGEucHVzaChlLmNvbnZlcnQobikpO3JldHVybiBhfSgpLmpvaW4oXCIgXCIpK1wiXVwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiByKXJldHVyblwiL1wiK3I7aWYobnVsbCE9cj9yLmlzU3RyaW5nOnZvaWQgMClyZXR1cm5cIihcIityK1wiKVwiO2lmKHIgaW5zdGFuY2VvZiBEYXRlKXJldHVyblwiKEQ6XCIrdChyLmdldFVUQ0Z1bGxZZWFyKCksNCkrdChyLmdldFVUQ01vbnRoKCksMikrdChyLmdldFVUQ0RhdGUoKSwyKSt0KHIuZ2V0VVRDSG91cnMoKSwyKSt0KHIuZ2V0VVRDTWludXRlcygpLDIpK3Qoci5nZXRVVENTZWNvbmRzKCksMikrXCJaKVwiO2lmKFwiW29iamVjdCBPYmplY3RdXCI9PT17fS50b1N0cmluZy5jYWxsKHIpKXtmb3IoaSBpbiBhPVtcIjw8XCJdLHIpbz1yW2ldLGEucHVzaChcIi9cIitpK1wiIFwiK2UuY29udmVydChvKSk7cmV0dXJuIGEucHVzaChcIj4+XCIpLGEuam9pbihcIlxcblwiKX1yZXR1cm5cIlwiK3J9LGV9KCk7ZXhwb3J0e190IGFzIEFjcm9Gb3JtLEF0IGFzIEFjcm9Gb3JtQXBwZWFyYW5jZSx2dCBhcyBBY3JvRm9ybUJ1dHRvbixOdCBhcyBBY3JvRm9ybUNoZWNrQm94LGR0IGFzIEFjcm9Gb3JtQ2hvaWNlRmllbGQsZ3QgYXMgQWNyb0Zvcm1Db21ib0JveCxtdCBhcyBBY3JvRm9ybUVkaXRCb3gscHQgYXMgQWNyb0Zvcm1MaXN0Qm94LHh0IGFzIEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCxidCBhcyBBY3JvRm9ybVB1c2hCdXR0b24seXQgYXMgQWNyb0Zvcm1SYWRpb0J1dHRvbixMdCBhcyBBY3JvRm9ybVRleHRGaWVsZCxPIGFzIEdTdGF0ZSxNIGFzIFNoYWRpbmdQYXR0ZXJuLHEgYXMgVGlsaW5nUGF0dGVybixFIGFzIGRlZmF1bHQsRSBhcyBqc1BERn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1qc3BkZi5lcy5taW4uanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jspdf/dist/jspdf.es.min.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/Icon.js":
/*!****************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/Icon.js ***!
\****************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Icon; }\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _defaultAttributes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaultAttributes.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/defaultAttributes.js\");\n/* harmony import */ var _shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shared/src/utils.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/shared/src/utils.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \n\n\nconst Icon = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(_c = (param, ref)=>{\n let { color = \"currentColor\", size = 24, strokeWidth = 2, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest } = param;\n return /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(\"svg\", {\n ref,\n ..._defaultAttributes_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: (0,_shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeClasses)(\"lucide\", className),\n ...rest\n }, [\n ...iconNode.map((param)=>{\n let [tag, attrs] = param;\n return /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(tag, attrs);\n }),\n ...Array.isArray(children) ? children : [\n children\n ]\n ]);\n});\n_c1 = Icon;\n //# sourceMappingURL=Icon.js.map\nvar _c, _c1;\n$RefreshReg$(_c, \"Icon$forwardRef\");\n$RefreshReg$(_c1, \"Icon\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vSWNvbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLE1BQU1BLHFCQUFPQyxpREFBVUEsTUFDckIsUUFXRUM7UUFWQSxFQUNFQyxRQUFRLGdCQUNSQyxPQUFPLElBQ1BDLGNBQWMsR0FDZEMsbUJBQUEsRUFDQUMsWUFBWSxJQUNaQyxRQUFBLEVBQ0FDLFFBQUEsRUFDQSxHQUFHQyxNQUFBO0lBSUUscUJBQUFDLG9EQUFhQSxDQUNsQixPQUNBO1FBQ0VUO1FBQ0EsR0FBR1UsNkRBQUE7UUFDSEMsT0FBT1Q7UUFDUFUsUUFBUVY7UUFDUlcsUUFBUVo7UUFDUkUsYUFBYUMsc0JBQXVCVSxPQUFPWCxlQUFlLEtBQU1XLE9BQU9aLFFBQVFDO1FBQy9FRSxXQUFXVSxrRUFBWUEsQ0FBQyxVQUFVVjtRQUNsQyxHQUFHRyxJQUFBO0lBQ0wsR0FDQTtXQUNLRCxTQUFTUyxHQUFBLENBQUk7Z0JBQUMsQ0FBQ0MsS0FBS0MsTUFBVztpQ0FBQVQsb0RBQWFBLENBQUNRLEtBQUtDOztXQUNqREMsTUFBTUMsT0FBQSxDQUFRZCxZQUFZQSxXQUFXO1lBQUNBO1NBQVE7S0FDcEQ7QUFFSiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vc3JjL0ljb24udHM/YWRhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBmb3J3YXJkUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGRlZmF1bHRBdHRyaWJ1dGVzIGZyb20gJy4vZGVmYXVsdEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgSWNvbk5vZGUsIEx1Y2lkZVByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBtZXJnZUNsYXNzZXMgfSBmcm9tICdAbHVjaWRlL3NoYXJlZCc7XG5cbmludGVyZmFjZSBJY29uQ29tcG9uZW50UHJvcHMgZXh0ZW5kcyBMdWNpZGVQcm9wcyB7XG4gIGljb25Ob2RlOiBJY29uTm9kZTtcbn1cblxuLyoqXG4gKiBMdWNpZGUgaWNvbiBjb21wb25lbnRcbiAqXG4gKiBAY29tcG9uZW50IEljb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtzdHJpbmd9IHByb3BzLmNvbG9yIC0gVGhlIGNvbG9yIG9mIHRoZSBpY29uXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvcHMuc2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBpY29uXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvcHMuc3Ryb2tlV2lkdGggLSBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBpY29uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHByb3BzLmFic29sdXRlU3Ryb2tlV2lkdGggLSBXaGV0aGVyIHRvIHVzZSBhYnNvbHV0ZSBzdHJva2Ugd2lkdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wcy5jbGFzc05hbWUgLSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgaWNvblxuICogQHBhcmFtIHtJY29uTm9kZX0gcHJvcHMuY2hpbGRyZW4gLSBUaGUgY2hpbGRyZW4gb2YgdGhlIGljb25cbiAqIEBwYXJhbSB7SWNvbk5vZGV9IHByb3BzLmljb25Ob2RlIC0gVGhlIGljb24gbm9kZSBvZiB0aGUgaWNvblxuICpcbiAqIEByZXR1cm5zIHtGb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50fSBMdWNpZGVJY29uXG4gKi9cbmNvbnN0IEljb24gPSBmb3J3YXJkUmVmPFNWR1NWR0VsZW1lbnQsIEljb25Db21wb25lbnRQcm9wcz4oXG4gIChcbiAgICB7XG4gICAgICBjb2xvciA9ICdjdXJyZW50Q29sb3InLFxuICAgICAgc2l6ZSA9IDI0LFxuICAgICAgc3Ryb2tlV2lkdGggPSAyLFxuICAgICAgYWJzb2x1dGVTdHJva2VXaWR0aCxcbiAgICAgIGNsYXNzTmFtZSA9ICcnLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBpY29uTm9kZSxcbiAgICAgIC4uLnJlc3RcbiAgICB9LFxuICAgIHJlZixcbiAgKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXG4gICAgICAnc3ZnJyxcbiAgICAgIHtcbiAgICAgICAgcmVmLFxuICAgICAgICAuLi5kZWZhdWx0QXR0cmlidXRlcyxcbiAgICAgICAgd2lkdGg6IHNpemUsXG4gICAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgICAgc3Ryb2tlOiBjb2xvcixcbiAgICAgICAgc3Ryb2tlV2lkdGg6IGFic29sdXRlU3Ryb2tlV2lkdGggPyAoTnVtYmVyKHN0cm9rZVdpZHRoKSAqIDI0KSAvIE51bWJlcihzaXplKSA6IHN0cm9rZVdpZHRoLFxuICAgICAgICBjbGFzc05hbWU6IG1lcmdlQ2xhc3NlcygnbHVjaWRlJywgY2xhc3NOYW1lKSxcbiAgICAgICAgLi4ucmVzdCxcbiAgICAgIH0sXG4gICAgICBbXG4gICAgICAgIC4uLmljb25Ob2RlLm1hcCgoW3RhZywgYXR0cnNdKSA9PiBjcmVhdGVFbGVtZW50KHRhZywgYXR0cnMpKSxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4gOiBbY2hpbGRyZW5dKSxcbiAgICAgIF0sXG4gICAgKTtcbiAgfSxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IEljb247XG4iXSwibmFtZXMiOlsiSWNvbiIsImZvcndhcmRSZWYiLCJyZWYiLCJjb2xvciIsInNpemUiLCJzdHJva2VXaWR0aCIsImFic29sdXRlU3Ryb2tlV2lkdGgiLCJjbGFzc05hbWUiLCJjaGlsZHJlbiIsImljb25Ob2RlIiwicmVzdCIsImNyZWF0ZUVsZW1lbnQiLCJkZWZhdWx0QXR0cmlidXRlcyIsIndpZHRoIiwiaGVpZ2h0Iiwic3Ryb2tlIiwiTnVtYmVyIiwibWVyZ2VDbGFzc2VzIiwibWFwIiwidGFnIiwiYXR0cnMiLCJBcnJheSIsImlzQXJyYXkiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/Icon.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js":
/*!****************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/createLucideIcon.js ***!
\****************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ createLucideIcon; }\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shared/src/utils.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/shared/src/utils.js\");\n/* harmony import */ var _Icon_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Icon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/Icon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \n\n\nconst createLucideIcon = (iconName, iconNode)=>{\n const Component = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)((param, ref)=>{\n let { className, ...props } = param;\n return /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_Icon_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n ref,\n iconNode,\n className: (0,_shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeClasses)(\"lucide-\".concat((0,_shared_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.toKebabCase)(iconName)), className),\n ...props\n });\n });\n Component.displayName = \"\".concat(iconName);\n return Component;\n};\n //# sourceMappingURL=createLucideIcon.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vY3JlYXRlTHVjaWRlSWNvbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBV00sTUFBQUEsbUJBQW1CLENBQUNDLFVBQWtCQztJQUMxQyxNQUFNQywwQkFBWUMsaURBQVVBLENBQTZCLFFBQTBCQztZQUF6QixFQUFFQyxTQUFXLEtBQUdDLE9BQVM7NkJBQ2pGQyxvREFBYUEsQ0FBQ0MsZ0RBQUlBLEVBQUU7WUFDbEJKO1lBQ0FIO1lBQ0FJLFdBQVdJLGtFQUFZQSxDQUFDLFVBQStCLE9BQXJCQyxpRUFBV0EsQ0FBQ1YsWUFBYUs7WUFDM0QsR0FBR0MsS0FBQTtRQUFBOztJQUlHSixVQUFBUyxXQUFBLEdBQWMsR0FBVyxPQUFSWDtJQUVwQixPQUFBRTtBQUNUIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uLi8uLi9zcmMvY3JlYXRlTHVjaWRlSWNvbi50cz8wNDg4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBtZXJnZUNsYXNzZXMsIHRvS2ViYWJDYXNlIH0gZnJvbSAnQGx1Y2lkZS9zaGFyZWQnO1xuaW1wb3J0IHsgSWNvbk5vZGUsIEx1Y2lkZVByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24nO1xuXG4vKipcbiAqIENyZWF0ZSBhIEx1Y2lkZSBpY29uIGNvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IGljb25OYW1lXG4gKiBAcGFyYW0ge2FycmF5fSBpY29uTm9kZVxuICogQHJldHVybnMge0ZvcndhcmRSZWZFeG90aWNDb21wb25lbnR9IEx1Y2lkZUljb25cbiAqL1xuY29uc3QgY3JlYXRlTHVjaWRlSWNvbiA9IChpY29uTmFtZTogc3RyaW5nLCBpY29uTm9kZTogSWNvbk5vZGUpID0+IHtcbiAgY29uc3QgQ29tcG9uZW50ID0gZm9yd2FyZFJlZjxTVkdTVkdFbGVtZW50LCBMdWNpZGVQcm9wcz4oKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9LCByZWYpID0+XG4gICAgY3JlYXRlRWxlbWVudChJY29uLCB7XG4gICAgICByZWYsXG4gICAgICBpY29uTm9kZSxcbiAgICAgIGNsYXNzTmFtZTogbWVyZ2VDbGFzc2VzKGBsdWNpZGUtJHt0b0tlYmFiQ2FzZShpY29uTmFtZSl9YCwgY2xhc3NOYW1lKSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pLFxuICApO1xuXG4gIENvbXBvbmVudC5kaXNwbGF5TmFtZSA9IGAke2ljb25OYW1lfWA7XG5cbiAgcmV0dXJuIENvbXBvbmVudDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUx1Y2lkZUljb247XG4iXSwibmFtZXMiOlsiY3JlYXRlTHVjaWRlSWNvbiIsImljb25OYW1lIiwiaWNvbk5vZGUiLCJDb21wb25lbnQiLCJmb3J3YXJkUmVmIiwicmVmIiwiY2xhc3NOYW1lIiwicHJvcHMiLCJjcmVhdGVFbGVtZW50IiwiSWNvbiIsIm1lcmdlQ2xhc3NlcyIsInRvS2ViYWJDYXNlIiwiZGlzcGxheU5hbWUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/defaultAttributes.js":
/*!*****************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/defaultAttributes.js ***!
\*****************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ defaultAttributes; }\n/* harmony export */ });\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ var defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n //# sourceMappingURL=defaultAttributes.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vZGVmYXVsdEF0dHJpYnV0ZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0lBQUEsSUFBZUEsb0JBQUE7SUFDYkMsT0FBTztJQUNQQyxPQUFPO0lBQ1BDLFFBQVE7SUFDUkMsU0FBUztJQUNUQyxNQUFNO0lBQ05DLFFBQVE7SUFDUkMsYUFBYTtJQUNiQyxlQUFlO0lBQ2ZDLGdCQUFnQjtBQUNsQiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vc3JjL2RlZmF1bHRBdHRyaWJ1dGVzLnRzPzM3MGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1xuICB4bWxuczogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyxcbiAgd2lkdGg6IDI0LFxuICBoZWlnaHQ6IDI0LFxuICB2aWV3Qm94OiAnMCAwIDI0IDI0JyxcbiAgZmlsbDogJ25vbmUnLFxuICBzdHJva2U6ICdjdXJyZW50Q29sb3InLFxuICBzdHJva2VXaWR0aDogMixcbiAgc3Ryb2tlTGluZWNhcDogJ3JvdW5kJyxcbiAgc3Ryb2tlTGluZWpvaW46ICdyb3VuZCcsXG59O1xuIl0sIm5hbWVzIjpbImRlZmF1bHRBdHRyaWJ1dGVzIiwieG1sbnMiLCJ3aWR0aCIsImhlaWdodCIsInZpZXdCb3giLCJmaWxsIiwic3Ryb2tlIiwic3Ryb2tlV2lkdGgiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/defaultAttributes.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/calendar.js":
/*!**************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/calendar.js ***!
\**************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Calendar; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Calendar = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Calendar\", [\n [\n \"path\",\n {\n d: \"M8 2v4\",\n key: \"1cmpym\"\n }\n ],\n [\n \"path\",\n {\n d: \"M16 2v4\",\n key: \"4m81vk\"\n }\n ],\n [\n \"rect\",\n {\n width: \"18\",\n height: \"18\",\n x: \"3\",\n y: \"4\",\n rx: \"2\",\n key: \"1hopcy\"\n }\n ],\n [\n \"path\",\n {\n d: \"M3 10h18\",\n key: \"8toen8\"\n }\n ]\n]);\n //# sourceMappingURL=calendar.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhTSxNQUFBQSxXQUFXQyxnRUFBZ0JBLENBQUMsWUFBWTtJQUM1QztRQUFDO1FBQVE7WUFBRUMsR0FBRztZQUFVQyxLQUFLO1FBQUE7S0FBVTtJQUN2QztRQUFDO1FBQVE7WUFBRUQsR0FBRztZQUFXQyxLQUFLO1FBQUE7S0FBVTtJQUN4QztRQUFDO1FBQVE7WUFBRUMsT0FBTztZQUFNQyxRQUFRO1lBQU1DLEdBQUc7WUFBS0MsR0FBRztZQUFLQyxJQUFJO1lBQUtMLEtBQUs7UUFBQTtLQUFVO0lBQzlFO1FBQUM7UUFBUTtZQUFFRCxHQUFHO1lBQVlDLEtBQUs7UUFBQTtLQUFVO0NBQzFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9zcmMvaWNvbnMvY2FsZW5kYXIudHM/ZjM3ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uJztcblxuLyoqXG4gKiBAY29tcG9uZW50IEBuYW1lIENhbGVuZGFyXG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThjR0YwYUNCa1BTSk5PQ0F5ZGpRaUlDOCtDaUFnUEhCaGRHZ2daRDBpVFRFMklESjJOQ0lnTHo0S0lDQThjbVZqZENCM2FXUjBhRDBpTVRnaUlHaGxhV2RvZEQwaU1UZ2lJSGc5SWpNaUlIazlJalFpSUhKNFBTSXlJaUF2UGdvZ0lEeHdZWFJvSUdROUlrMHpJREV3YURFNElpQXZQZ284TDNOMlp6NEspIC0gaHR0cHM6Ly9sdWNpZGUuZGV2L2ljb25zL2NhbGVuZGFyXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgQ2FsZW5kYXIgPSBjcmVhdGVMdWNpZGVJY29uKCdDYWxlbmRhcicsIFtcbiAgWydwYXRoJywgeyBkOiAnTTggMnY0Jywga2V5OiAnMWNtcHltJyB9XSxcbiAgWydwYXRoJywgeyBkOiAnTTE2IDJ2NCcsIGtleTogJzRtODF2aycgfV0sXG4gIFsncmVjdCcsIHsgd2lkdGg6ICcxOCcsIGhlaWdodDogJzE4JywgeDogJzMnLCB5OiAnNCcsIHJ4OiAnMicsIGtleTogJzFob3BjeScgfV0sXG4gIFsncGF0aCcsIHsgZDogJ00zIDEwaDE4Jywga2V5OiAnOHRvZW44JyB9XSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBDYWxlbmRhcjtcbiJdLCJuYW1lcyI6WyJDYWxlbmRhciIsImNyZWF0ZUx1Y2lkZUljb24iLCJkIiwia2V5Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsInJ4Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/calendar.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/circle-check.js":
/*!******************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/circle-check.js ***!
\******************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CircleCheck; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst CircleCheck = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"CircleCheck\", [\n [\n \"circle\",\n {\n cx: \"12\",\n cy: \"12\",\n r: \"10\",\n key: \"1mglay\"\n }\n ],\n [\n \"path\",\n {\n d: \"m9 12 2 2 4-4\",\n key: \"dzmm74\"\n }\n ]\n]);\n //# sourceMappingURL=circle-check.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWNoZWNrLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBYU0sTUFBQUEsY0FBY0MsZ0VBQWdCQSxDQUFDLGVBQWU7SUFDbEQ7UUFBQztRQUFVO1lBQUVDLElBQUk7WUFBTUMsSUFBSTtZQUFNQyxHQUFHO1lBQU1DLEtBQUs7UUFBQTtLQUFVO0lBQ3pEO1FBQUM7UUFBUTtZQUFFQyxHQUFHO1lBQWlCRCxLQUFLO1FBQUE7S0FBVTtDQUMvQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vLi4vc3JjL2ljb25zL2NpcmNsZS1jaGVjay50cz80YWQ2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgQ2lyY2xlQ2hlY2tcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOFkybHlZMnhsSUdONFBTSXhNaUlnWTNrOUlqRXlJaUJ5UFNJeE1DSWdMejRLSUNBOGNHRjBhQ0JrUFNKdE9TQXhNaUF5SURJZ05DMDBJaUF2UGdvOEwzTjJaejRLKSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy9jaXJjbGUtY2hlY2tcbiAqIEBzZWUgaHR0cHM6Ly9sdWNpZGUuZGV2L2d1aWRlL3BhY2thZ2VzL2x1Y2lkZS1yZWFjdCAtIERvY3VtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBMdWNpZGUgaWNvbnMgcHJvcHMgYW5kIGFueSB2YWxpZCBTVkcgYXR0cmlidXRlXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9IEpTWCBFbGVtZW50XG4gKlxuICovXG5jb25zdCBDaXJjbGVDaGVjayA9IGNyZWF0ZUx1Y2lkZUljb24oJ0NpcmNsZUNoZWNrJywgW1xuICBbJ2NpcmNsZScsIHsgY3g6ICcxMicsIGN5OiAnMTInLCByOiAnMTAnLCBrZXk6ICcxbWdsYXknIH1dLFxuICBbJ3BhdGgnLCB7IGQ6ICdtOSAxMiAyIDIgNC00Jywga2V5OiAnZHptbTc0JyB9XSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBDaXJjbGVDaGVjaztcbiJdLCJuYW1lcyI6WyJDaXJjbGVDaGVjayIsImNyZWF0ZUx1Y2lkZUljb24iLCJjeCIsImN5IiwiciIsImtleSIsImQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/circle-check.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/clock.js":
/*!***********************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/clock.js ***!
\***********************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Clock; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Clock = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Clock\", [\n [\n \"circle\",\n {\n cx: \"12\",\n cy: \"12\",\n r: \"10\",\n key: \"1mglay\"\n }\n ],\n [\n \"polyline\",\n {\n points: \"12 6 12 12 16 14\",\n key: \"68esgv\"\n }\n ]\n]);\n //# sourceMappingURL=clock.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvY2xvY2suanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhTSxNQUFBQSxRQUFRQyxnRUFBZ0JBLENBQUMsU0FBUztJQUN0QztRQUFDO1FBQVU7WUFBRUMsSUFBSTtZQUFNQyxJQUFJO1lBQU1DLEdBQUc7WUFBTUMsS0FBSztRQUFBO0tBQVU7SUFDekQ7UUFBQztRQUFZO1lBQUVDLFFBQVE7WUFBb0JELEtBQUs7UUFBQTtLQUFVO0NBQzNEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9zcmMvaWNvbnMvY2xvY2sudHM/ZjViYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uJztcblxuLyoqXG4gKiBAY29tcG9uZW50IEBuYW1lIENsb2NrXG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThZMmx5WTJ4bElHTjRQU0l4TWlJZ1kzazlJakV5SWlCeVBTSXhNQ0lnTHo0S0lDQThjRzlzZVd4cGJtVWdjRzlwYm5SelBTSXhNaUEySURFeUlERXlJREUySURFMElpQXZQZ284TDNOMlp6NEspIC0gaHR0cHM6Ly9sdWNpZGUuZGV2L2ljb25zL2Nsb2NrXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgQ2xvY2sgPSBjcmVhdGVMdWNpZGVJY29uKCdDbG9jaycsIFtcbiAgWydjaXJjbGUnLCB7IGN4OiAnMTInLCBjeTogJzEyJywgcjogJzEwJywga2V5OiAnMW1nbGF5JyB9XSxcbiAgWydwb2x5bGluZScsIHsgcG9pbnRzOiAnMTIgNiAxMiAxMiAxNiAxNCcsIGtleTogJzY4ZXNndicgfV0sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgQ2xvY2s7XG4iXSwibmFtZXMiOlsiQ2xvY2siLCJjcmVhdGVMdWNpZGVJY29uIiwiY3giLCJjeSIsInIiLCJrZXkiLCJwb2ludHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/clock.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/download.js":
/*!**************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/download.js ***!
\**************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Download; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Download = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Download\", [\n [\n \"path\",\n {\n d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\",\n key: \"ih7n3h\"\n }\n ],\n [\n \"polyline\",\n {\n points: \"7 10 12 15 17 10\",\n key: \"2ggqvy\"\n }\n ],\n [\n \"line\",\n {\n x1: \"12\",\n x2: \"12\",\n y1: \"15\",\n y2: \"3\",\n key: \"1vk2je\"\n }\n ]\n]);\n //# sourceMappingURL=download.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvZG93bmxvYWQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhTSxNQUFBQSxXQUFXQyxnRUFBZ0JBLENBQUMsWUFBWTtJQUM1QztRQUFDO1FBQVE7WUFBRUMsR0FBRztZQUE2Q0MsS0FBSztRQUFBO0tBQVU7SUFDMUU7UUFBQztRQUFZO1lBQUVDLFFBQVE7WUFBb0JELEtBQUs7UUFBQTtLQUFVO0lBQzFEO1FBQUM7UUFBUTtZQUFFRSxJQUFJO1lBQU1DLElBQUk7WUFBTUMsSUFBSTtZQUFNQyxJQUFJO1lBQUtMLEtBQUs7UUFBQTtLQUFVO0NBQ2xFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9zcmMvaWNvbnMvZG93bmxvYWQudHM/N2EzZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uJztcblxuLyoqXG4gKiBAY29tcG9uZW50IEBuYW1lIERvd25sb2FkXG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThjR0YwYUNCa1BTSk5NakVnTVRWMk5HRXlJRElnTUNBd0lERXRNaUF5U0RWaE1pQXlJREFnTUNBeExUSXRNbll0TkNJZ0x6NEtJQ0E4Y0c5c2VXeHBibVVnY0c5cGJuUnpQU0kzSURFd0lERXlJREUxSURFM0lERXdJaUF2UGdvZ0lEeHNhVzVsSUhneFBTSXhNaUlnZURJOUlqRXlJaUI1TVQwaU1UVWlJSGt5UFNJeklpQXZQZ284TDNOMlp6NEspIC0gaHR0cHM6Ly9sdWNpZGUuZGV2L2ljb25zL2Rvd25sb2FkXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgRG93bmxvYWQgPSBjcmVhdGVMdWNpZGVJY29uKCdEb3dubG9hZCcsIFtcbiAgWydwYXRoJywgeyBkOiAnTTIxIDE1djRhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ2LTQnLCBrZXk6ICdpaDduM2gnIH1dLFxuICBbJ3BvbHlsaW5lJywgeyBwb2ludHM6ICc3IDEwIDEyIDE1IDE3IDEwJywga2V5OiAnMmdncXZ5JyB9XSxcbiAgWydsaW5lJywgeyB4MTogJzEyJywgeDI6ICcxMicsIHkxOiAnMTUnLCB5MjogJzMnLCBrZXk6ICcxdmsyamUnIH1dLFxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IERvd25sb2FkO1xuIl0sIm5hbWVzIjpbIkRvd25sb2FkIiwiY3JlYXRlTHVjaWRlSWNvbiIsImQiLCJrZXkiLCJwb2ludHMiLCJ4MSIsIngyIiwieTEiLCJ5MiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/download.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.js":
/*!***********************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.js ***!
\***********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ EllipsisVertical; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst EllipsisVertical = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"EllipsisVertical\", [\n [\n \"circle\",\n {\n cx: \"12\",\n cy: \"12\",\n r: \"1\",\n key: \"41hilf\"\n }\n ],\n [\n \"circle\",\n {\n cx: \"12\",\n cy: \"5\",\n r: \"1\",\n key: \"gxeob9\"\n }\n ],\n [\n \"circle\",\n {\n cx: \"12\",\n cy: \"19\",\n r: \"1\",\n key: \"lyex9k\"\n }\n ]\n]);\n //# sourceMappingURL=ellipsis-vertical.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvZWxsaXBzaXMtdmVydGljYWwuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhTSxNQUFBQSxtQkFBbUJDLGdFQUFnQkEsQ0FBQyxvQkFBb0I7SUFDNUQ7UUFBQztRQUFVO1lBQUVDLElBQUk7WUFBTUMsSUFBSTtZQUFNQyxHQUFHO1lBQUtDLEtBQUs7UUFBQTtLQUFVO0lBQ3hEO1FBQUM7UUFBVTtZQUFFSCxJQUFJO1lBQU1DLElBQUk7WUFBS0MsR0FBRztZQUFLQyxLQUFLO1FBQUE7S0FBVTtJQUN2RDtRQUFDO1FBQVU7WUFBRUgsSUFBSTtZQUFNQyxJQUFJO1lBQU1DLEdBQUc7WUFBS0MsS0FBSztRQUFBO0tBQVU7Q0FDekQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL3NyYy9pY29ucy9lbGxpcHNpcy12ZXJ0aWNhbC50cz9hMTI3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgRWxsaXBzaXNWZXJ0aWNhbFxuICogQGRlc2NyaXB0aW9uIEx1Y2lkZSBTVkcgaWNvbiBjb21wb25lbnQsIHJlbmRlcnMgU1ZHIEVsZW1lbnQgd2l0aCBjaGlsZHJlbi5cbiAqXG4gKiBAcHJldmlldyAhW2ltZ10oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlBZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWdvZ0lIZHBaSFJvUFNJeU5DSUtJQ0JvWldsbmFIUTlJakkwSWdvZ0lIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSUtJQ0JtYVd4c1BTSnViMjVsSWdvZ0lITjBjbTlyWlQwaUl6QXdNQ0lnYzNSNWJHVTlJbUpoWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN0lHSnZjbVJsY2kxeVlXUnBkWE02SURKd2VDSUtJQ0J6ZEhKdmEyVXRkMmxrZEdnOUlqSWlDaUFnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lnb2dJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaUNqNEtJQ0E4WTJseVkyeGxJR040UFNJeE1pSWdZM2s5SWpFeUlpQnlQU0l4SWlBdlBnb2dJRHhqYVhKamJHVWdZM2c5SWpFeUlpQmplVDBpTlNJZ2NqMGlNU0lnTHo0S0lDQThZMmx5WTJ4bElHTjRQU0l4TWlJZ1kzazlJakU1SWlCeVBTSXhJaUF2UGdvOEwzTjJaejRLKSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy9lbGxpcHNpcy12ZXJ0aWNhbFxuICogQHNlZSBodHRwczovL2x1Y2lkZS5kZXYvZ3VpZGUvcGFja2FnZXMvbHVjaWRlLXJlYWN0IC0gRG9jdW1lbnRhdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyAtIEx1Y2lkZSBpY29ucyBwcm9wcyBhbmQgYW55IHZhbGlkIFNWRyBhdHRyaWJ1dGVcbiAqIEByZXR1cm5zIHtKU1guRWxlbWVudH0gSlNYIEVsZW1lbnRcbiAqXG4gKi9cbmNvbnN0IEVsbGlwc2lzVmVydGljYWwgPSBjcmVhdGVMdWNpZGVJY29uKCdFbGxpcHNpc1ZlcnRpY2FsJywgW1xuICBbJ2NpcmNsZScsIHsgY3g6ICcxMicsIGN5OiAnMTInLCByOiAnMScsIGtleTogJzQxaGlsZicgfV0sXG4gIFsnY2lyY2xlJywgeyBjeDogJzEyJywgY3k6ICc1JywgcjogJzEnLCBrZXk6ICdneGVvYjknIH1dLFxuICBbJ2NpcmNsZScsIHsgY3g6ICcxMicsIGN5OiAnMTknLCByOiAnMScsIGtleTogJ2x5ZXg5aycgfV0sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgRWxsaXBzaXNWZXJ0aWNhbDtcbiJdLCJuYW1lcyI6WyJFbGxpcHNpc1ZlcnRpY2FsIiwiY3JlYXRlTHVjaWRlSWNvbiIsImN4IiwiY3kiLCJyIiwia2V5Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/external-link.js":
/*!*******************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/external-link.js ***!
\*******************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ ExternalLink; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst ExternalLink = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"ExternalLink\", [\n [\n \"path\",\n {\n d: \"M15 3h6v6\",\n key: \"1q9fwt\"\n }\n ],\n [\n \"path\",\n {\n d: \"M10 14 21 3\",\n key: \"gplh6r\"\n }\n ],\n [\n \"path\",\n {\n d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\",\n key: \"a6xqqp\"\n }\n ]\n]);\n //# sourceMappingURL=external-link.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvZXh0ZXJuYWwtbGluay5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWFNLE1BQUFBLGVBQWVDLGdFQUFnQkEsQ0FBQyxnQkFBZ0I7SUFDcEQ7UUFBQztRQUFRO1lBQUVDLEdBQUc7WUFBYUMsS0FBSztRQUFBO0tBQVU7SUFDMUM7UUFBQztRQUFRO1lBQUVELEdBQUc7WUFBZUMsS0FBSztRQUFBO0tBQVU7SUFDNUM7UUFBQztRQUFRO1lBQUVELEdBQUc7WUFBNERDLEtBQUs7UUFBQTtLQUFVO0NBQzFGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9zcmMvaWNvbnMvZXh0ZXJuYWwtbGluay50cz85ZGFjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgRXh0ZXJuYWxMaW5rXG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThjR0YwYUNCa1BTSk5NVFVnTTJnMmRqWWlJQzgrQ2lBZ1BIQmhkR2dnWkQwaVRURXdJREUwSURJeElETWlJQzgrQ2lBZ1BIQmhkR2dnWkQwaVRURTRJREV6ZGpaaE1pQXlJREFnTUNBeExUSWdNa2cxWVRJZ01pQXdJREFnTVMweUxUSldPR0V5SURJZ01DQXdJREVnTWkweWFEWWlJQzgrQ2p3dmMzWm5QZ289KSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy9leHRlcm5hbC1saW5rXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgRXh0ZXJuYWxMaW5rID0gY3JlYXRlTHVjaWRlSWNvbignRXh0ZXJuYWxMaW5rJywgW1xuICBbJ3BhdGgnLCB7IGQ6ICdNMTUgM2g2djYnLCBrZXk6ICcxcTlmd3QnIH1dLFxuICBbJ3BhdGgnLCB7IGQ6ICdNMTAgMTQgMjEgMycsIGtleTogJ2dwbGg2cicgfV0sXG4gIFsncGF0aCcsIHsgZDogJ00xOCAxM3Y2YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmg2Jywga2V5OiAnYTZ4cXFwJyB9XSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBFeHRlcm5hbExpbms7XG4iXSwibmFtZXMiOlsiRXh0ZXJuYWxMaW5rIiwiY3JlYXRlTHVjaWRlSWNvbiIsImQiLCJrZXkiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/external-link.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/eye.js":
/*!*********************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/eye.js ***!
\*********************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Eye; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Eye = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Eye\", [\n [\n \"path\",\n {\n d: \"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\",\n key: \"rwhkz3\"\n }\n ],\n [\n \"circle\",\n {\n cx: \"12\",\n cy: \"12\",\n r: \"3\",\n key: \"1v7zrd\"\n }\n ]\n]);\n //# sourceMappingURL=eye.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvZXllLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBYU0sTUFBQUEsTUFBTUMsZ0VBQWdCQSxDQUFDLE9BQU87SUFDbEM7UUFBQztRQUFRO1lBQUVDLEdBQUc7WUFBZ0RDLEtBQUs7UUFBQTtLQUFVO0lBQzdFO1FBQUM7UUFBVTtZQUFFQyxJQUFJO1lBQU1DLElBQUk7WUFBTUMsR0FBRztZQUFLSCxLQUFLO1FBQUE7S0FBVTtDQUN6RCIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vLi4vc3JjL2ljb25zL2V5ZS50cz84Y2I4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgRXllXG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThjR0YwYUNCa1BTSk5NaUF4TW5NekxUY2dNVEF0TnlBeE1DQTNJREV3SURjdE15QTNMVEV3SURjdE1UQXROeTB4TUMwM1dpSWdMejRLSUNBOFkybHlZMnhsSUdONFBTSXhNaUlnWTNrOUlqRXlJaUJ5UFNJeklpQXZQZ284TDNOMlp6NEspIC0gaHR0cHM6Ly9sdWNpZGUuZGV2L2ljb25zL2V5ZVxuICogQHNlZSBodHRwczovL2x1Y2lkZS5kZXYvZ3VpZGUvcGFja2FnZXMvbHVjaWRlLXJlYWN0IC0gRG9jdW1lbnRhdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyAtIEx1Y2lkZSBpY29ucyBwcm9wcyBhbmQgYW55IHZhbGlkIFNWRyBhdHRyaWJ1dGVcbiAqIEByZXR1cm5zIHtKU1guRWxlbWVudH0gSlNYIEVsZW1lbnRcbiAqXG4gKi9cbmNvbnN0IEV5ZSA9IGNyZWF0ZUx1Y2lkZUljb24oJ0V5ZScsIFtcbiAgWydwYXRoJywgeyBkOiAnTTIgMTJzMy03IDEwLTcgMTAgNyAxMCA3LTMgNy0xMCA3LTEwLTctMTAtN1onLCBrZXk6ICdyd2hrejMnIH1dLFxuICBbJ2NpcmNsZScsIHsgY3g6ICcxMicsIGN5OiAnMTInLCByOiAnMycsIGtleTogJzF2N3pyZCcgfV0sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgRXllO1xuIl0sIm5hbWVzIjpbIkV5ZSIsImNyZWF0ZUx1Y2lkZUljb24iLCJkIiwia2V5IiwiY3giLCJjeSIsInIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/eye.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/file-text.js":
/*!***************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/file-text.js ***!
\***************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ FileText; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst FileText = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"FileText\", [\n [\n \"path\",\n {\n d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\",\n key: \"1rqfz7\"\n }\n ],\n [\n \"path\",\n {\n d: \"M14 2v4a2 2 0 0 0 2 2h4\",\n key: \"tnqrlb\"\n }\n ],\n [\n \"path\",\n {\n d: \"M10 9H8\",\n key: \"b1mrlr\"\n }\n ],\n [\n \"path\",\n {\n d: \"M16 13H8\",\n key: \"t4e002\"\n }\n ],\n [\n \"path\",\n {\n d: \"M16 17H8\",\n key: \"z1uh3a\"\n }\n ]\n]);\n //# sourceMappingURL=file-text.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvZmlsZS10ZXh0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBYU0sTUFBQUEsV0FBV0MsZ0VBQWdCQSxDQUFDLFlBQVk7SUFDNUM7UUFBQztRQUFRO1lBQUVDLEdBQUc7WUFBOERDLEtBQUs7UUFBQTtLQUFVO0lBQzNGO1FBQUM7UUFBUTtZQUFFRCxHQUFHO1lBQTJCQyxLQUFLO1FBQUE7S0FBVTtJQUN4RDtRQUFDO1FBQVE7WUFBRUQsR0FBRztZQUFXQyxLQUFLO1FBQUE7S0FBVTtJQUN4QztRQUFDO1FBQVE7WUFBRUQsR0FBRztZQUFZQyxLQUFLO1FBQUE7S0FBVTtJQUN6QztRQUFDO1FBQVE7WUFBRUQsR0FBRztZQUFZQyxLQUFLO1FBQUE7S0FBVTtDQUMxQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vLi4vc3JjL2ljb25zL2ZpbGUtdGV4dC50cz9mZjNlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgRmlsZVRleHRcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOGNHRjBhQ0JrUFNKTk1UVWdNa2cyWVRJZ01pQXdJREFnTUMweUlESjJNVFpoTWlBeUlEQWdNQ0F3SURJZ01tZ3hNbUV5SURJZ01DQXdJREFnTWkweVZqZGFJaUF2UGdvZ0lEeHdZWFJvSUdROUlrMHhOQ0F5ZGpSaE1pQXlJREFnTUNBd0lESWdNbWcwSWlBdlBnb2dJRHh3WVhSb0lHUTlJazB4TUNBNVNEZ2lJQzgrQ2lBZ1BIQmhkR2dnWkQwaVRURTJJREV6U0RnaUlDOCtDaUFnUEhCaGRHZ2daRDBpVFRFMklERTNTRGdpSUM4K0Nqd3ZjM1puUGdvPSkgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMvZmlsZS10ZXh0XG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgRmlsZVRleHQgPSBjcmVhdGVMdWNpZGVJY29uKCdGaWxlVGV4dCcsIFtcbiAgWydwYXRoJywgeyBkOiAnTTE1IDJINmEyIDIgMCAwIDAtMiAydjE2YTIgMiAwIDAgMCAyIDJoMTJhMiAyIDAgMCAwIDItMlY3WicsIGtleTogJzFycWZ6NycgfV0sXG4gIFsncGF0aCcsIHsgZDogJ00xNCAydjRhMiAyIDAgMCAwIDIgMmg0Jywga2V5OiAndG5xcmxiJyB9XSxcbiAgWydwYXRoJywgeyBkOiAnTTEwIDlIOCcsIGtleTogJ2IxbXJscicgfV0sXG4gIFsncGF0aCcsIHsgZDogJ00xNiAxM0g4Jywga2V5OiAndDRlMDAyJyB9XSxcbiAgWydwYXRoJywgeyBkOiAnTTE2IDE3SDgnLCBrZXk6ICd6MXVoM2EnIH1dLFxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVUZXh0O1xuIl0sIm5hbWVzIjpbIkZpbGVUZXh0IiwiY3JlYXRlTHVjaWRlSWNvbiIsImQiLCJrZXkiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/file-text.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/package.js":
/*!*************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/package.js ***!
\*************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Package; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Package = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Package\", [\n [\n \"path\",\n {\n d: \"m7.5 4.27 9 5.15\",\n key: \"1c824w\"\n }\n ],\n [\n \"path\",\n {\n d: \"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\",\n key: \"hh9hay\"\n }\n ],\n [\n \"path\",\n {\n d: \"m3.3 7 8.7 5 8.7-5\",\n key: \"g66t2b\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 22V12\",\n key: \"d0xqtd\"\n }\n ]\n]);\n //# sourceMappingURL=package.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvcGFja2FnZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWFNLE1BQUFBLFVBQVVDLGdFQUFnQkEsQ0FBQyxXQUFXO0lBQzFDO1FBQUM7UUFBUTtZQUFFQyxHQUFHO1lBQW9CQyxLQUFLO1FBQUE7S0FBVTtJQUNqRDtRQUNFO1FBQ0E7WUFDRUQsR0FBRztZQUNIQyxLQUFLO1FBQ1A7S0FDRjtJQUNBO1FBQUM7UUFBUTtZQUFFRCxHQUFHO1lBQXNCQyxLQUFLO1FBQUE7S0FBVTtJQUNuRDtRQUFDO1FBQVE7WUFBRUQsR0FBRztZQUFhQyxLQUFLO1FBQUE7S0FBVTtDQUMzQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vLi4vc3JjL2ljb25zL3BhY2thZ2UudHM/NDM3NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uJztcblxuLyoqXG4gKiBAY29tcG9uZW50IEBuYW1lIFBhY2thZ2VcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOGNHRjBhQ0JrUFNKdE55NDFJRFF1TWpjZ09TQTFMakUxSWlBdlBnb2dJRHh3WVhSb0lHUTlJazB5TVNBNFlUSWdNaUF3SURBZ01DMHhMVEV1TnpOc0xUY3ROR0V5SURJZ01DQXdJREF0TWlBd2JDMDNJRFJCTWlBeUlEQWdNQ0F3SURNZ09IWTRZVElnTWlBd0lEQWdNQ0F4SURFdU56TnNOeUEwWVRJZ01pQXdJREFnTUNBeUlEQnNOeTAwUVRJZ01pQXdJREFnTUNBeU1TQXhObG9pSUM4K0NpQWdQSEJoZEdnZ1pEMGliVE11TXlBM0lEZ3VOeUExSURndU55MDFJaUF2UGdvZ0lEeHdZWFJvSUdROUlrMHhNaUF5TWxZeE1pSWdMejRLUEM5emRtYytDZz09KSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy9wYWNrYWdlXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgUGFja2FnZSA9IGNyZWF0ZUx1Y2lkZUljb24oJ1BhY2thZ2UnLCBbXG4gIFsncGF0aCcsIHsgZDogJ203LjUgNC4yNyA5IDUuMTUnLCBrZXk6ICcxYzgyNHcnIH1dLFxuICBbXG4gICAgJ3BhdGgnLFxuICAgIHtcbiAgICAgIGQ6ICdNMjEgOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDctNEEyIDIgMCAwIDAgMjEgMTZaJyxcbiAgICAgIGtleTogJ2hoOWhheScsXG4gICAgfSxcbiAgXSxcbiAgWydwYXRoJywgeyBkOiAnbTMuMyA3IDguNyA1IDguNy01Jywga2V5OiAnZzY2dDJiJyB9XSxcbiAgWydwYXRoJywgeyBkOiAnTTEyIDIyVjEyJywga2V5OiAnZDB4cXRkJyB9XSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBQYWNrYWdlO1xuIl0sIm5hbWVzIjpbIlBhY2thZ2UiLCJjcmVhdGVMdWNpZGVJY29uIiwiZCIsImtleSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/package.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/pencil.js":
/*!************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/pencil.js ***!
\************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Pencil; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Pencil = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Pencil\", [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\n \"path\",\n {\n d: \"m15 5 4 4\",\n key: \"1mk7zo\"\n }\n ]\n]);\n //# sourceMappingURL=pencil.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvcGVuY2lsLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBYU0sTUFBQUEsU0FBU0MsZ0VBQWdCQSxDQUFDLFVBQVU7SUFDeEM7UUFDRTtRQUNBO1lBQ0VDLEdBQUc7WUFDSEMsS0FBSztRQUNQO0tBQ0Y7SUFDQTtRQUFDO1FBQVE7WUFBRUQsR0FBRztZQUFhQyxLQUFLO1FBQUE7S0FBVTtDQUMzQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vLi4vc3JjL2ljb25zL3BlbmNpbC50cz8zYzkxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgUGVuY2lsXG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThjR0YwYUNCa1BTSk5NakV1TVRjMElEWXVPREV5WVRFZ01TQXdJREFnTUMwekxqazROaTB6TGprNE4wd3pMamcwTWlBeE5pNHhOelJoTWlBeUlEQWdNQ0F3TFM0MUxqZ3piQzB4TGpNeU1TQTBMak0xTW1FdU5TNDFJREFnTUNBd0lDNDJNak11TmpJeWJEUXVNelV6TFRFdU16SmhNaUF5SURBZ01DQXdJQzQ0TXkwdU5EazNlaUlnTHo0S0lDQThjR0YwYUNCa1BTSnRNVFVnTlNBMElEUWlJQzgrQ2p3dmMzWm5QZ289KSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy9wZW5jaWxcbiAqIEBzZWUgaHR0cHM6Ly9sdWNpZGUuZGV2L2d1aWRlL3BhY2thZ2VzL2x1Y2lkZS1yZWFjdCAtIERvY3VtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBMdWNpZGUgaWNvbnMgcHJvcHMgYW5kIGFueSB2YWxpZCBTVkcgYXR0cmlidXRlXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9IEpTWCBFbGVtZW50XG4gKlxuICovXG5jb25zdCBQZW5jaWwgPSBjcmVhdGVMdWNpZGVJY29uKCdQZW5jaWwnLCBbXG4gIFtcbiAgICAncGF0aCcsXG4gICAge1xuICAgICAgZDogJ00yMS4xNzQgNi44MTJhMSAxIDAgMCAwLTMuOTg2LTMuOTg3TDMuODQyIDE2LjE3NGEyIDIgMCAwIDAtLjUuODNsLTEuMzIxIDQuMzUyYS41LjUgMCAwIDAgLjYyMy42MjJsNC4zNTMtMS4zMmEyIDIgMCAwIDAgLjgzLS40OTd6JyxcbiAgICAgIGtleTogJzFhOHVzdScsXG4gICAgfSxcbiAgXSxcbiAgWydwYXRoJywgeyBkOiAnbTE1IDUgNCA0Jywga2V5OiAnMW1rN3pvJyB9XSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBQZW5jaWw7XG4iXSwibmFtZXMiOlsiUGVuY2lsIiwiY3JlYXRlTHVjaWRlSWNvbiIsImQiLCJrZXkiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/pencil.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/plus.js":
/*!**********************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/plus.js ***!
\**********************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Plus; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Plus = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Plus\", [\n [\n \"path\",\n {\n d: \"M5 12h14\",\n key: \"1ays0h\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 5v14\",\n key: \"s699le\"\n }\n ]\n]);\n //# sourceMappingURL=plus.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvcGx1cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWFNLE1BQUFBLE9BQU9DLGdFQUFnQkEsQ0FBQyxRQUFRO0lBQ3BDO1FBQUM7UUFBUTtZQUFFQyxHQUFHO1lBQVlDLEtBQUs7UUFBQTtLQUFVO0lBQ3pDO1FBQUM7UUFBUTtZQUFFRCxHQUFHO1lBQVlDLEtBQUs7UUFBQTtLQUFVO0NBQzFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9zcmMvaWNvbnMvcGx1cy50cz81MTk2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgUGx1c1xuICogQGRlc2NyaXB0aW9uIEx1Y2lkZSBTVkcgaWNvbiBjb21wb25lbnQsIHJlbmRlcnMgU1ZHIEVsZW1lbnQgd2l0aCBjaGlsZHJlbi5cbiAqXG4gKiBAcHJldmlldyAhW2ltZ10oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlBZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWdvZ0lIZHBaSFJvUFNJeU5DSUtJQ0JvWldsbmFIUTlJakkwSWdvZ0lIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSUtJQ0JtYVd4c1BTSnViMjVsSWdvZ0lITjBjbTlyWlQwaUl6QXdNQ0lnYzNSNWJHVTlJbUpoWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN0lHSnZjbVJsY2kxeVlXUnBkWE02SURKd2VDSUtJQ0J6ZEhKdmEyVXRkMmxrZEdnOUlqSWlDaUFnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lnb2dJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaUNqNEtJQ0E4Y0dGMGFDQmtQU0pOTlNBeE1tZ3hOQ0lnTHo0S0lDQThjR0YwYUNCa1BTSk5NVElnTlhZeE5DSWdMejRLUEM5emRtYytDZz09KSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy9wbHVzXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgUGx1cyA9IGNyZWF0ZUx1Y2lkZUljb24oJ1BsdXMnLCBbXG4gIFsncGF0aCcsIHsgZDogJ001IDEyaDE0Jywga2V5OiAnMWF5czBoJyB9XSxcbiAgWydwYXRoJywgeyBkOiAnTTEyIDV2MTQnLCBrZXk6ICdzNjk5bGUnIH1dLFxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IFBsdXM7XG4iXSwibmFtZXMiOlsiUGx1cyIsImNyZWF0ZUx1Y2lkZUljb24iLCJkIiwia2V5Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/plus.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/search.js":
/*!************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/search.js ***!
\************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Search; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Search = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Search\", [\n [\n \"circle\",\n {\n cx: \"11\",\n cy: \"11\",\n r: \"8\",\n key: \"4ej97u\"\n }\n ],\n [\n \"path\",\n {\n d: \"m21 21-4.3-4.3\",\n key: \"1qie3q\"\n }\n ]\n]);\n //# sourceMappingURL=search.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvc2VhcmNoLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBYU0sTUFBQUEsU0FBU0MsZ0VBQWdCQSxDQUFDLFVBQVU7SUFDeEM7UUFBQztRQUFVO1lBQUVDLElBQUk7WUFBTUMsSUFBSTtZQUFNQyxHQUFHO1lBQUtDLEtBQUs7UUFBQTtLQUFVO0lBQ3hEO1FBQUM7UUFBUTtZQUFFQyxHQUFHO1lBQWtCRCxLQUFLO1FBQUE7S0FBVTtDQUNoRCIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vLi4vc3JjL2ljb25zL3NlYXJjaC50cz9kMzI5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgU2VhcmNoXG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThZMmx5WTJ4bElHTjRQU0l4TVNJZ1kzazlJakV4SWlCeVBTSTRJaUF2UGdvZ0lEeHdZWFJvSUdROUltMHlNU0F5TVMwMExqTXROQzR6SWlBdlBnbzhMM04yWno0SykgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMvc2VhcmNoXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgU2VhcmNoID0gY3JlYXRlTHVjaWRlSWNvbignU2VhcmNoJywgW1xuICBbJ2NpcmNsZScsIHsgY3g6ICcxMScsIGN5OiAnMTEnLCByOiAnOCcsIGtleTogJzRlajk3dScgfV0sXG4gIFsncGF0aCcsIHsgZDogJ20yMSAyMS00LjMtNC4zJywga2V5OiAnMXFpZTNxJyB9XSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBTZWFyY2g7XG4iXSwibmFtZXMiOlsiU2VhcmNoIiwiY3JlYXRlTHVjaWRlSWNvbiIsImN4IiwiY3kiLCJyIiwia2V5IiwiZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/search.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trash-2.js":
/*!*************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/trash-2.js ***!
\*************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Trash2; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Trash2 = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Trash2\", [\n [\n \"path\",\n {\n d: \"M3 6h18\",\n key: \"d0wm0j\"\n }\n ],\n [\n \"path\",\n {\n d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\",\n key: \"4alrt4\"\n }\n ],\n [\n \"path\",\n {\n d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\",\n key: \"v07s0e\"\n }\n ],\n [\n \"line\",\n {\n x1: \"10\",\n x2: \"10\",\n y1: \"11\",\n y2: \"17\",\n key: \"1uufr5\"\n }\n ],\n [\n \"line\",\n {\n x1: \"14\",\n x2: \"14\",\n y1: \"11\",\n y2: \"17\",\n key: \"xtxkd\"\n }\n ]\n]);\n //# sourceMappingURL=trash-2.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvdHJhc2gtMi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWFNLE1BQUFBLFNBQVNDLGdFQUFnQkEsQ0FBQyxVQUFVO0lBQ3hDO1FBQUM7UUFBUTtZQUFFQyxHQUFHO1lBQVdDLEtBQUs7UUFBQTtLQUFVO0lBQ3hDO1FBQUM7UUFBUTtZQUFFRCxHQUFHO1lBQXlDQyxLQUFLO1FBQUE7S0FBVTtJQUN0RTtRQUFDO1FBQVE7WUFBRUQsR0FBRztZQUFzQ0MsS0FBSztRQUFBO0tBQVU7SUFDbkU7UUFBQztRQUFRO1lBQUVDLElBQUk7WUFBTUMsSUFBSTtZQUFNQyxJQUFJO1lBQU1DLElBQUk7WUFBTUosS0FBSztRQUFBO0tBQVU7SUFDbEU7UUFBQztRQUFRO1lBQUVDLElBQUk7WUFBTUMsSUFBSTtZQUFNQyxJQUFJO1lBQU1DLElBQUk7WUFBTUosS0FBSztRQUFBO0tBQVM7Q0FDbEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL3NyYy9pY29ucy90cmFzaC0yLnRzPzg1OTUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbic7XG5cbi8qKlxuICogQGNvbXBvbmVudCBAbmFtZSBUcmFzaDJcbiAqIEBkZXNjcmlwdGlvbiBMdWNpZGUgU1ZHIGljb24gY29tcG9uZW50LCByZW5kZXJzIFNWRyBFbGVtZW50IHdpdGggY2hpbGRyZW4uXG4gKlxuICogQHByZXZpZXcgIVtpbWddKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklnb2dJSGRwWkhSb1BTSXlOQ0lLSUNCb1pXbG5hSFE5SWpJMElnb2dJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lLSUNCbWFXeHNQU0p1YjI1bElnb2dJSE4wY205clpUMGlJekF3TUNJZ2MzUjViR1U5SW1KaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdJR0p2Y21SbGNpMXlZV1JwZFhNNklESndlQ0lLSUNCemRISnZhMlV0ZDJsa2RHZzlJaklpQ2lBZ2MzUnliMnRsTFd4cGJtVmpZWEE5SW5KdmRXNWtJZ29nSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpY205MWJtUWlDajRLSUNBOGNHRjBhQ0JrUFNKTk15QTJhREU0SWlBdlBnb2dJRHh3WVhSb0lHUTlJazB4T1NBMmRqRTBZekFnTVMweElESXRNaUF5U0RkakxURWdNQzB5TFRFdE1pMHlWallpSUM4K0NpQWdQSEJoZEdnZ1pEMGlUVGdnTmxZMFl6QXRNU0F4TFRJZ01pMHlhRFJqTVNBd0lESWdNU0F5SURKMk1pSWdMejRLSUNBOGJHbHVaU0I0TVQwaU1UQWlJSGd5UFNJeE1DSWdlVEU5SWpFeElpQjVNajBpTVRjaUlDOCtDaUFnUEd4cGJtVWdlREU5SWpFMElpQjRNajBpTVRRaUlIa3hQU0l4TVNJZ2VUSTlJakUzSWlBdlBnbzhMM04yWno0SykgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMvdHJhc2gtMlxuICogQHNlZSBodHRwczovL2x1Y2lkZS5kZXYvZ3VpZGUvcGFja2FnZXMvbHVjaWRlLXJlYWN0IC0gRG9jdW1lbnRhdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyAtIEx1Y2lkZSBpY29ucyBwcm9wcyBhbmQgYW55IHZhbGlkIFNWRyBhdHRyaWJ1dGVcbiAqIEByZXR1cm5zIHtKU1guRWxlbWVudH0gSlNYIEVsZW1lbnRcbiAqXG4gKi9cbmNvbnN0IFRyYXNoMiA9IGNyZWF0ZUx1Y2lkZUljb24oJ1RyYXNoMicsIFtcbiAgWydwYXRoJywgeyBkOiAnTTMgNmgxOCcsIGtleTogJ2Qwd20waicgfV0sXG4gIFsncGF0aCcsIHsgZDogJ00xOSA2djE0YzAgMS0xIDItMiAySDdjLTEgMC0yLTEtMi0yVjYnLCBrZXk6ICc0YWxydDQnIH1dLFxuICBbJ3BhdGgnLCB7IGQ6ICdNOCA2VjRjMC0xIDEtMiAyLTJoNGMxIDAgMiAxIDIgMnYyJywga2V5OiAndjA3czBlJyB9XSxcbiAgWydsaW5lJywgeyB4MTogJzEwJywgeDI6ICcxMCcsIHkxOiAnMTEnLCB5MjogJzE3Jywga2V5OiAnMXV1ZnI1JyB9XSxcbiAgWydsaW5lJywgeyB4MTogJzE0JywgeDI6ICcxNCcsIHkxOiAnMTEnLCB5MjogJzE3Jywga2V5OiAneHR4a2QnIH1dLFxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IFRyYXNoMjtcbiJdLCJuYW1lcyI6WyJUcmFzaDIiLCJjcmVhdGVMdWNpZGVJY29uIiwiZCIsImtleSIsIngxIiwieDIiLCJ5MSIsInkyIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trash-2.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/triangle-alert.js":
/*!********************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/triangle-alert.js ***!
\********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ TriangleAlert; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst TriangleAlert = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"TriangleAlert\", [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 9v4\",\n key: \"juzpu7\"\n }\n ],\n [\n \"path\",\n {\n d: \"M12 17h.01\",\n key: \"p32p05\"\n }\n ]\n]);\n //# sourceMappingURL=triangle-alert.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvdHJpYW5nbGUtYWxlcnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhTSxNQUFBQSxnQkFBZ0JDLGdFQUFnQkEsQ0FBQyxpQkFBaUI7SUFDdEQ7UUFDRTtRQUNBO1lBQ0VDLEdBQUc7WUFDSEMsS0FBSztRQUNQO0tBQ0Y7SUFDQTtRQUFDO1FBQVE7WUFBRUQsR0FBRztZQUFXQyxLQUFLO1FBQUE7S0FBVTtJQUN4QztRQUFDO1FBQVE7WUFBRUQsR0FBRztZQUFjQyxLQUFLO1FBQUE7S0FBVTtDQUM1QyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vLi4vc3JjL2ljb25zL3RyaWFuZ2xlLWFsZXJ0LnRzPzBkYjAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyZWF0ZUx1Y2lkZUljb24gZnJvbSAnLi4vY3JlYXRlTHVjaWRlSWNvbic7XG5cbi8qKlxuICogQGNvbXBvbmVudCBAbmFtZSBUcmlhbmdsZUFsZXJ0XG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThjR0YwYUNCa1BTSnRNakV1TnpNZ01UZ3RPQzB4TkdFeUlESWdNQ0F3SURBdE15NDBPQ0F3YkMwNElERTBRVElnTWlBd0lEQWdNQ0EwSURJeGFERTJZVElnTWlBd0lEQWdNQ0F4TGpjekxUTWlJQzgrQ2lBZ1BIQmhkR2dnWkQwaVRURXlJRGwyTkNJZ0x6NEtJQ0E4Y0dGMGFDQmtQU0pOTVRJZ01UZG9MakF4SWlBdlBnbzhMM04yWno0SykgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMvdHJpYW5nbGUtYWxlcnRcbiAqIEBzZWUgaHR0cHM6Ly9sdWNpZGUuZGV2L2d1aWRlL3BhY2thZ2VzL2x1Y2lkZS1yZWFjdCAtIERvY3VtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBMdWNpZGUgaWNvbnMgcHJvcHMgYW5kIGFueSB2YWxpZCBTVkcgYXR0cmlidXRlXG4gKiBAcmV0dXJucyB7SlNYLkVsZW1lbnR9IEpTWCBFbGVtZW50XG4gKlxuICovXG5jb25zdCBUcmlhbmdsZUFsZXJ0ID0gY3JlYXRlTHVjaWRlSWNvbignVHJpYW5nbGVBbGVydCcsIFtcbiAgW1xuICAgICdwYXRoJyxcbiAgICB7XG4gICAgICBkOiAnbTIxLjczIDE4LTgtMTRhMiAyIDAgMCAwLTMuNDggMGwtOCAxNEEyIDIgMCAwIDAgNCAyMWgxNmEyIDIgMCAwIDAgMS43My0zJyxcbiAgICAgIGtleTogJ3dtb2VucScsXG4gICAgfSxcbiAgXSxcbiAgWydwYXRoJywgeyBkOiAnTTEyIDl2NCcsIGtleTogJ2p1enB1NycgfV0sXG4gIFsncGF0aCcsIHsgZDogJ00xMiAxN2guMDEnLCBrZXk6ICdwMzJwMDUnIH1dLFxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IFRyaWFuZ2xlQWxlcnQ7XG4iXSwibmFtZXMiOlsiVHJpYW5nbGVBbGVydCIsImNyZWF0ZUx1Y2lkZUljb24iLCJkIiwia2V5Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/triangle-alert.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/upload.js":
/*!************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/upload.js ***!
\************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Upload; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst Upload = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"Upload\", [\n [\n \"path\",\n {\n d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\",\n key: \"ih7n3h\"\n }\n ],\n [\n \"polyline\",\n {\n points: \"17 8 12 3 7 8\",\n key: \"t8dd8p\"\n }\n ],\n [\n \"line\",\n {\n x1: \"12\",\n x2: \"12\",\n y1: \"3\",\n y2: \"15\",\n key: \"widbto\"\n }\n ]\n]);\n //# sourceMappingURL=upload.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMvdXBsb2FkLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBYU0sTUFBQUEsU0FBU0MsZ0VBQWdCQSxDQUFDLFVBQVU7SUFDeEM7UUFBQztRQUFRO1lBQUVDLEdBQUc7WUFBNkNDLEtBQUs7UUFBQTtLQUFVO0lBQzFFO1FBQUM7UUFBWTtZQUFFQyxRQUFRO1lBQWlCRCxLQUFLO1FBQUE7S0FBVTtJQUN2RDtRQUFDO1FBQVE7WUFBRUUsSUFBSTtZQUFNQyxJQUFJO1lBQU1DLElBQUk7WUFBS0MsSUFBSTtZQUFNTCxLQUFLO1FBQUE7S0FBVTtDQUNsRSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vLi4vc3JjL2ljb25zL3VwbG9hZC50cz81MzUwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgVXBsb2FkXG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThjR0YwYUNCa1BTSk5NakVnTVRWMk5HRXlJRElnTUNBd0lERXRNaUF5U0RWaE1pQXlJREFnTUNBeExUSXRNbll0TkNJZ0x6NEtJQ0E4Y0c5c2VXeHBibVVnY0c5cGJuUnpQU0l4TnlBNElERXlJRE1nTnlBNElpQXZQZ29nSUR4c2FXNWxJSGd4UFNJeE1pSWdlREk5SWpFeUlpQjVNVDBpTXlJZ2VUSTlJakUxSWlBdlBnbzhMM04yWno0SykgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMvdXBsb2FkXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgVXBsb2FkID0gY3JlYXRlTHVjaWRlSWNvbignVXBsb2FkJywgW1xuICBbJ3BhdGgnLCB7IGQ6ICdNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNCcsIGtleTogJ2loN24zaCcgfV0sXG4gIFsncG9seWxpbmUnLCB7IHBvaW50czogJzE3IDggMTIgMyA3IDgnLCBrZXk6ICd0OGRkOHAnIH1dLFxuICBbJ2xpbmUnLCB7IHgxOiAnMTInLCB4MjogJzEyJywgeTE6ICczJywgeTI6ICcxNScsIGtleTogJ3dpZGJ0bycgfV0sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgVXBsb2FkO1xuIl0sIm5hbWVzIjpbIlVwbG9hZCIsImNyZWF0ZUx1Y2lkZUljb24iLCJkIiwia2V5IiwicG9pbnRzIiwieDEiLCJ4MiIsInkxIiwieTIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/upload.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/x.js":
/*!*******************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/x.js ***!
\*******************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ X; }\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst X = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"X\", [\n [\n \"path\",\n {\n d: \"M18 6 6 18\",\n key: \"1bl5f8\"\n }\n ],\n [\n \"path\",\n {\n d: \"m6 6 12 12\",\n key: \"d8bk6v\"\n }\n ]\n]);\n //# sourceMappingURL=x.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vaWNvbnMveC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWFNLE1BQUFBLElBQUlDLGdFQUFnQkEsQ0FBQyxLQUFLO0lBQzlCO1FBQUM7UUFBUTtZQUFFQyxHQUFHO1lBQWNDLEtBQUs7UUFBQTtLQUFVO0lBQzNDO1FBQUM7UUFBUTtZQUFFRCxHQUFHO1lBQWNDLEtBQUs7UUFBQTtLQUFVO0NBQzVDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9zcmMvaWNvbnMveC50cz9iYzM4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVMdWNpZGVJY29uIGZyb20gJy4uL2NyZWF0ZUx1Y2lkZUljb24nO1xuXG4vKipcbiAqIEBjb21wb25lbnQgQG5hbWUgWFxuICogQGRlc2NyaXB0aW9uIEx1Y2lkZSBTVkcgaWNvbiBjb21wb25lbnQsIHJlbmRlcnMgU1ZHIEVsZW1lbnQgd2l0aCBjaGlsZHJlbi5cbiAqXG4gKiBAcHJldmlldyAhW2ltZ10oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlBZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWdvZ0lIZHBaSFJvUFNJeU5DSUtJQ0JvWldsbmFIUTlJakkwSWdvZ0lIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSUtJQ0JtYVd4c1BTSnViMjVsSWdvZ0lITjBjbTlyWlQwaUl6QXdNQ0lnYzNSNWJHVTlJbUpoWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN0lHSnZjbVJsY2kxeVlXUnBkWE02SURKd2VDSUtJQ0J6ZEhKdmEyVXRkMmxrZEdnOUlqSWlDaUFnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lnb2dJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaUNqNEtJQ0E4Y0dGMGFDQmtQU0pOTVRnZ05pQTJJREU0SWlBdlBnb2dJRHh3WVhSb0lHUTlJbTAySURZZ01USWdNVElpSUM4K0Nqd3ZjM1puUGdvPSkgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMveFxuICogQHNlZSBodHRwczovL2x1Y2lkZS5kZXYvZ3VpZGUvcGFja2FnZXMvbHVjaWRlLXJlYWN0IC0gRG9jdW1lbnRhdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyAtIEx1Y2lkZSBpY29ucyBwcm9wcyBhbmQgYW55IHZhbGlkIFNWRyBhdHRyaWJ1dGVcbiAqIEByZXR1cm5zIHtKU1guRWxlbWVudH0gSlNYIEVsZW1lbnRcbiAqXG4gKi9cbmNvbnN0IFggPSBjcmVhdGVMdWNpZGVJY29uKCdYJywgW1xuICBbJ3BhdGgnLCB7IGQ6ICdNMTggNiA2IDE4Jywga2V5OiAnMWJsNWY4JyB9XSxcbiAgWydwYXRoJywgeyBkOiAnbTYgNiAxMiAxMicsIGtleTogJ2Q4Yms2dicgfV0sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgWDtcbiJdLCJuYW1lcyI6WyJYIiwiY3JlYXRlTHVjaWRlSWNvbiIsImQiLCJrZXkiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/x.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/lucide-react/dist/esm/shared/src/utils.js":
/*!****************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/shared/src/utils.js ***!
\****************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ mergeClasses: function() { return /* binding */ mergeClasses; },\n/* harmony export */ toKebabCase: function() { return /* binding */ toKebabCase; }\n/* harmony export */ });\n/**\n * @license lucide-react v0.408.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ const toKebabCase = (string)=>string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = function() {\n for(var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++){\n classes[_key] = arguments[_key];\n }\n return classes.filter((className, index, array)=>{\n return Boolean(className) && array.indexOf(className) === index;\n }).join(\" \");\n};\n //# sourceMappingURL=utils.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9sdWNpZGUtcmVhY3QvZGlzdC9lc20vc2hhcmVkL3NyYy91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0lBUWEsTUFBQUEsY0FBYyxDQUFDQyxTQUMxQkEsT0FBT0MsT0FBQSxDQUFRLHNCQUFzQixTQUFTQyxXQUFZO0FBc0IvQyxNQUFBQyxlQUFlO3FDQUEyQ0M7UUFBQUE7O1dBQ3JFQSxRQUNHQyxNQUFBLENBQU8sQ0FBQ0MsV0FBV0MsT0FBT0M7UUFDekIsT0FBT0MsUUFBUUgsY0FBY0UsTUFBTUUsT0FBQSxDQUFRSixlQUFlQztJQUM1RCxHQUNDSSxJQUFBLENBQUsiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL3NoYXJlZC9zcmMvdXRpbHMudHM/NjY5YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYW1lbFRvUGFzY2FsIH0gZnJvbSAnLi91dGlsaXR5LXR5cGVzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8ga2ViYWIgY2FzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEga2ViYWJpemVkIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgdG9LZWJhYkNhc2UgPSAoc3RyaW5nOiBzdHJpbmcpID0+XG4gIHN0cmluZy5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpO1xuXG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyB0byBwYXNjYWwgY2FzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcGFzY2FsaXplZCBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHRvUGFzY2FsQ2FzZSA9IDxUIGV4dGVuZHMgc3RyaW5nPihzdHJpbmc6IFQpOiBDYW1lbFRvUGFzY2FsPFQ+ID0+IHtcbiAgY29uc3QgY2FtZWxDYXNlID0gc3RyaW5nLnJlcGxhY2UoL14oW0EtWl0pfFtcXHMtX10rKFxcdykvZywgKG1hdGNoLCBwMSwgcDIpID0+XG4gICAgcDIgPyBwMi50b1VwcGVyQ2FzZSgpIDogcDEudG9Mb3dlckNhc2UoKSxcbiAgKTtcblxuICByZXR1cm4gKGNhbWVsQ2FzZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGNhbWVsQ2FzZS5zbGljZSgxKSkgYXMgQ2FtZWxUb1Bhc2NhbDxUPjtcbn07XG5cbi8qKlxuICogTWVyZ2VzIGNsYXNzZXMgaW50byBhIHNpbmdsZSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBjbGFzc2VzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHN0cmluZyBvZiBjbGFzc2VzXG4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZUNsYXNzZXMgPSA8Q2xhc3NUeXBlID0gc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbD4oLi4uY2xhc3NlczogQ2xhc3NUeXBlW10pID0+XG4gIGNsYXNzZXNcbiAgICAuZmlsdGVyKChjbGFzc05hbWUsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oY2xhc3NOYW1lKSAmJiBhcnJheS5pbmRleE9mKGNsYXNzTmFtZSkgPT09IGluZGV4O1xuICAgIH0pXG4gICAgLmpvaW4oJyAnKTtcbiJdLCJuYW1lcyI6WyJ0b0tlYmFiQ2FzZSIsInN0cmluZyIsInJlcGxhY2UiLCJ0b0xvd2VyQ2FzZSIsIm1lcmdlQ2xhc3NlcyIsImNsYXNzZXMiLCJmaWx0ZXIiLCJjbGFzc05hbWUiLCJpbmRleCIsImFycmF5IiwiQm9vbGVhbiIsImluZGV4T2YiLCJqb2luIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/lucide-react/dist/esm/shared/src/utils.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./app/dashboard/compliance/page.tsx":
/*!*******************************************!*\
!*** ./app/dashboard/compliance/page.tsx ***!
\*******************************************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Compliance; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/package.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/circle-check.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/clock.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/triangle-alert.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/calendar.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/search.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/x.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/upload.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/download.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/plus.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/eye.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/pencil.js\");\n/* harmony import */ var _barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! __barrel_optimize__?names=AlertTriangle,Calendar,CheckCircle2,Clock,Download,Eye,MoreVertical,Package,Pencil,Plus,Search,Trash2,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/trash-2.js\");\n/* harmony import */ var _lib_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/api */ \"(app-pages-browser)/./lib/api.ts\");\n/* harmony import */ var _components_ComplianceDetailModal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/components/ComplianceDetailModal */ \"(app-pages-browser)/./components/ComplianceDetailModal.tsx\");\n/* harmony import */ var jspdf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jspdf */ \"(app-pages-browser)/./node_modules/jspdf/dist/jspdf.es.min.js\");\n/* harmony import */ var jspdf_autotable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jspdf-autotable */ \"(app-pages-browser)/./node_modules/jspdf-autotable/dist/jspdf.plugin.autotable.mjs\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\n\nfunction imgSrc(url) {\n if (!url) return \"\";\n if (url.startsWith(\"data:\") || url.startsWith(\"http\")) return url;\n return \"\".concat(_lib_api__WEBPACK_IMPORTED_MODULE_2__.apiBase).concat(url);\n}\nconst TYPES = [\n \"FSSAI License\",\n \"Drug License\",\n \"GMP Certificate\",\n \"ISO Certificate\",\n \"EPR Registration\",\n \"Factory License\",\n \"Import Export Code\",\n \"Trademark Registration\"\n];\nconst STATUS = {\n complete: \"bg-emerald-50 text-emerald-700\",\n pending: \"bg-amber-50 text-amber-700\",\n expiring: \"bg-amber-50 text-amber-700\",\n expired: \"bg-rose-50 text-rose-700\"\n};\nfunction Compliance() {\n var _s_alerts;\n _s();\n const [rows, setRows] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [s, setS] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [products, setProducts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [filters, setFilters] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({\n search: \"\",\n status_filter: \"\",\n compliance_type: \"\",\n country: \"\"\n });\n const [detailId, setDetailId] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [menuFor, setMenuFor] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [form, setForm] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null); // add/edit form state (null = closed)\n const [page, setPage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1);\n const pageSize = 25;\n const [showAlerts, setShowAlerts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [deleteRow, setDeleteRow] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [deleting, setDeleting] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [selectedRows, setSelectedRows] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [bulkDeleteOpen, setBulkDeleteOpen] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n function load() {\n const qs = new URLSearchParams(Object.entries(filters).filter((param)=>{\n let [, v] = param;\n return v;\n })).toString();\n (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__.api)(\"/compliance\".concat(qs ? \"?\" + qs : \"\")).then(setRows).catch(()=>setRows([]));\n (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__.api)(\"/compliance/summary\").then((data)=>{\n setS(data);\n setShowAlerts(true);\n }).catch(()=>{});\n }\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n load();\n }, [\n filters\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__.api)(\"/products\").then((d)=>{\n var _d_items;\n return setProducts((_d_items = d.items) !== null && _d_items !== void 0 ? _d_items : []);\n }).catch(()=>{});\n }, []);\n const paged = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>rows.slice((page - 1) * pageSize, page * pageSize), [\n rows,\n page\n ]);\n const totalPages = Math.max(1, Math.ceil(rows.length / pageSize));\n const set = (k, v)=>{\n setPage(1);\n setFilters((f)=>({\n ...f,\n [k]: v\n }));\n };\n function handleExport() {\n const exportRows = selectedRows.length > 0 ? rows.filter((r)=>selectedRows.includes(r.id)) : rows;\n const headers = [\n \"Product\",\n \"SKU\",\n \"Compliance Type\",\n \"License Number\",\n \"License Name\",\n \"Issuing Authority\",\n \"Issue Date\",\n \"Expiry Date\",\n \"Days Left\",\n \"Status\",\n \"Country\",\n \"State\",\n \"Category\",\n \"Applicable To\",\n \"Manufacturing Plant\",\n \"Remarks\",\n \"Created By\",\n \"Created On\",\n \"Last Updated\",\n \"Document URL\"\n ];\n const csv = [\n headers.join(\",\"),\n ...exportRows.map((r)=>{\n var _r_product_name, _r_sku, _r_compliance_type, _r_license_number, _r_license_name, _r_issuing_authority, _r_issue_date, _r_expiry_date, _r_status, _r_country, _r_state, _r_category, _r_applicable_to, _r_plant, _r_remarks, _r_created_by, _r_document_url;\n return [\n '\"'.concat((_r_product_name = r.product_name) !== null && _r_product_name !== void 0 ? _r_product_name : \"\", '\"'),\n '\"'.concat((_r_sku = r.sku) !== null && _r_sku !== void 0 ? _r_sku : \"\", '\"'),\n '\"'.concat((_r_compliance_type = r.compliance_type) !== null && _r_compliance_type !== void 0 ? _r_compliance_type : \"\", '\"'),\n '\"'.concat((_r_license_number = r.license_number) !== null && _r_license_number !== void 0 ? _r_license_number : \"\", '\"'),\n '\"'.concat((_r_license_name = r.license_name) !== null && _r_license_name !== void 0 ? _r_license_name : \"\", '\"'),\n '\"'.concat((_r_issuing_authority = r.issuing_authority) !== null && _r_issuing_authority !== void 0 ? _r_issuing_authority : \"\", '\"'),\n '\"'.concat((_r_issue_date = r.issue_date) !== null && _r_issue_date !== void 0 ? _r_issue_date : \"\", '\"'),\n '\"'.concat((_r_expiry_date = r.expiry_date) !== null && _r_expiry_date !== void 0 ? _r_expiry_date : \"\", '\"'),\n '\"'.concat(r.days_left == null ? \"-\" : r.days_left < 0 ? \"Expired\" : r.days_left === 0 ? \"Today\" : \"\".concat(r.days_left, \" Days\"), '\"'),\n '\"'.concat((_r_status = r.status) !== null && _r_status !== void 0 ? _r_status : \"\", '\"'),\n '\"'.concat((_r_country = r.country) !== null && _r_country !== void 0 ? _r_country : \"\", '\"'),\n '\"'.concat((_r_state = r.state) !== null && _r_state !== void 0 ? _r_state : \"\", '\"'),\n '\"'.concat((_r_category = r.category) !== null && _r_category !== void 0 ? _r_category : \"\", '\"'),\n '\"'.concat((_r_applicable_to = r.applicable_to) !== null && _r_applicable_to !== void 0 ? _r_applicable_to : \"\", '\"'),\n '\"'.concat((_r_plant = r.plant) !== null && _r_plant !== void 0 ? _r_plant : \"\", '\"'),\n '\"'.concat((_r_remarks = r.remarks) !== null && _r_remarks !== void 0 ? _r_remarks : \"\", '\"'),\n '\"'.concat((_r_created_by = r.created_by) !== null && _r_created_by !== void 0 ? _r_created_by : \"\", '\"'),\n '\"'.concat(r.created_at ? new Date(r.created_at).toLocaleString(\"en-IN\") : \"\", '\"'),\n '\"'.concat(r.updated_at ? new Date(r.updated_at).toLocaleString(\"en-IN\") : \"\", '\"'),\n '\"'.concat((_r_document_url = r.document_url) !== null && _r_document_url !== void 0 ? _r_document_url : \"\", '\"')\n ].join(\",\");\n })\n ].join(\"\\n\");\n const blob = new Blob([\n csv\n ], {\n type: \"text/csv;charset=utf-8;\"\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = selectedRows.length > 0 ? \"selected_compliance_\".concat(selectedRows.length, \".csv\") : \"compliance_\".concat(new Date().toISOString().slice(0, 10), \".csv\");\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n async function handleImport(e) {\n var _e_target_files;\n const file = (_e_target_files = e.target.files) === null || _e_target_files === void 0 ? void 0 : _e_target_files[0];\n if (!file) return;\n const formData = new FormData();\n formData.append(\"file\", file);\n try {\n await fetch(\"\".concat(_lib_api__WEBPACK_IMPORTED_MODULE_2__.apiBase, \"/compliance/import\"), {\n method: \"POST\",\n body: formData,\n headers: {\n Authorization: \"Bearer \".concat(localStorage.getItem(\"vp_token\"))\n }\n });\n load();\n alert(\"Import successful\");\n } catch (e) {\n alert(\"Import failed\");\n }\n e.target.value = \"\";\n }\n async function handlePdfExport() {\n const exportRows = selectedRows.length > 0 ? rows.filter((r)=>selectedRows.includes(r.id)) : rows;\n const doc = new jspdf__WEBPACK_IMPORTED_MODULE_4__[\"default\"]({\n orientation: \"landscape\",\n unit: \"mm\",\n format: \"a4\"\n });\n // ===========================\n // Logo\n // ===========================\n try {\n const img = new Image();\n img.src = \"/logo.png\";\n await new Promise((resolve)=>{\n img.onload = resolve;\n img.onerror = resolve;\n });\n doc.addImage(img, \"PNG\", 14, 10, 18, 18);\n } catch (e) {}\n // ===========================\n // Company Header\n // ===========================\n doc.setFont(\"helvetica\", \"bold\");\n doc.setFontSize(18);\n doc.text(\"VerifyPack\", 38, 18);\n doc.setFont(\"helvetica\", \"normal\");\n doc.setFontSize(10);\n doc.setTextColor(100);\n doc.text(\"Digital Trust for Every Product\", 38, 24);\n // ===========================\n // Report Title\n // ===========================\n doc.setDrawColor(220);\n doc.line(14, 32, 283, 32);\n doc.setTextColor(0);\n doc.setFont(\"helvetica\", \"bold\");\n doc.setFontSize(15);\n doc.text(\"Compliance Report\", 14, 40);\n doc.setFont(\"helvetica\", \"normal\");\n doc.setFontSize(10);\n doc.text(\"Generated On : \".concat(new Date().toLocaleString(\"en-IN\")), 14, 47);\n doc.text(\"Total Records : \".concat(exportRows.length), 250, 47, {\n align: \"right\"\n });\n // ===========================\n // Table\n // ===========================\n (0,jspdf_autotable__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(doc, {\n startY: 55,\n head: [\n [\n \"Product\",\n \"SKU\",\n \"Compliance Type\",\n \"License No\",\n \"Issue Date\",\n \"Expiry Date\",\n \"Days Left\",\n \"Status\",\n \"Country\",\n \"Authority\"\n ]\n ],\n body: exportRows.map((r)=>[\n r.product_name || \"\",\n r.sku || \"\",\n r.compliance_type || \"\",\n r.license_number || \"\",\n r.issue_date ? new Date(r.issue_date).toLocaleDateString(\"en-IN\") : \"-\",\n r.expiry_date ? new Date(r.expiry_date).toLocaleDateString(\"en-IN\") : \"-\",\n r.days_left == null ? \"-\" : r.days_left < 0 ? \"Expired\" : r.days_left === 0 ? \"Today\" : \"\".concat(r.days_left, \" Days\"),\n r.days_left == null ? \"Pending\" : r.days_left < 0 ? \"Expired\" : r.days_left <= 30 ? \"Expiring\" : \"Complete\",\n r.country || \"-\",\n r.issuing_authority || \"-\"\n ]),\n styles: {\n fontSize: 8,\n cellPadding: 2\n },\n headStyles: {\n fillColor: [\n 37,\n 99,\n 235\n ],\n textColor: 255,\n fontStyle: \"bold\"\n },\n alternateRowStyles: {\n fillColor: [\n 245,\n 245,\n 245\n ]\n },\n margin: {\n left: 14,\n right: 14\n },\n didDrawPage: (data)=>{\n doc.setFontSize(9);\n doc.setTextColor(120);\n doc.text(\"Page \".concat(data.pageNumber), doc.internal.pageSize.getWidth() - 20, doc.internal.pageSize.getHeight() - 8, {\n align: \"right\"\n });\n doc.text(\"Generated by VerifyPack\", 14, doc.internal.pageSize.getHeight() - 8);\n }\n });\n // ===========================\n // Save PDF\n // ===========================\n doc.save(selectedRows.length ? \"selected_compliance_report.pdf\" : \"compliance_report.pdf\");\n }\n async function confirmDelete() {\n if (!deleteRow) return;\n try {\n setDeleting(true);\n await (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__.api)(\"/compliance/\".concat(deleteRow.id), {\n method: \"DELETE\"\n });\n setDeleteRow(null);\n load();\n } catch (err) {\n alert(\"Failed to delete compliance record.\");\n } finally{\n setDeleting(false);\n }\n }\n function toggleRow(id) {\n setSelectedRows((prev)=>prev.includes(id) ? prev.filter((x)=>x !== id) : [\n ...prev,\n id\n ]);\n }\n const allSelected = paged.length > 0 && paged.every((r)=>selectedRows.includes(r.id));\n function toggleAll() {\n if (allSelected) {\n setSelectedRows((prev)=>prev.filter((id)=>!paged.some((r)=>r.id === id)));\n } else {\n setSelectedRows((prev)=>[\n ...new Set([\n ...prev,\n ...paged.map((r)=>r.id)\n ])\n ]);\n }\n }\n async function deleteSelected() {\n try {\n setDeleting(true);\n await Promise.all(selectedRows.map((id)=>(0,_lib_api__WEBPACK_IMPORTED_MODULE_2__.api)(\"/compliance/\".concat(id), {\n method: \"DELETE\"\n })));\n setSelectedRows([]);\n setBulkDeleteOpen(false);\n load();\n } finally{\n setDeleting(false);\n }\n }\n function openAdd() {\n setForm({\n product_id: \"\",\n compliance_type: TYPES[0],\n license_number: \"\",\n license_name: \"\",\n issuing_authority: \"\",\n issue_date: \"\",\n expiry_date: \"\",\n country: \"India\",\n state: \"\",\n category: \"\",\n applicable_to: \"Manufacturing Plant\",\n plant: \"\",\n remarks: \"\",\n _id: \"\"\n });\n }\n function openEdit(r) {\n setDetailId(null);\n var _r_product_id;\n setForm({\n ...r,\n _id: r.id,\n product_id: (_r_product_id = r.product_id) !== null && _r_product_id !== void 0 ? _r_product_id : \"\",\n issue_date: r.issue_date ? r.issue_date.slice(0, 10) : \"\",\n expiry_date: r.expiry_date ? r.expiry_date.slice(0, 10) : \"\"\n });\n }\n async function saveForm() {\n const { _id, ...payload } = form;\n if (_id) await (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__.api)(\"/compliance/\".concat(_id), {\n method: \"PUT\",\n body: JSON.stringify(payload)\n });\n else await (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__.api)(\"/compliance\", {\n method: \"POST\",\n body: JSON.stringify(payload)\n });\n setForm(null);\n load();\n }\n var _s_total_products, _s_complete, _s_complete_pct, _s_pending, _s_pending_pct, _s_expired, _s_expired_pct, _s_expiring;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-5\",\n onClick: ()=>setMenuFor(null),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xl font-bold\",\n children: \"Compliance Center\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 437,\n columnNumber: 3\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 436,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid grid-cols-2 lg:grid-cols-5 gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Kpi, {\n label: \"Total Products\",\n value: (_s_total_products = s === null || s === void 0 ? void 0 : s.total_products) !== null && _s_total_products !== void 0 ? _s_total_products : 0,\n sub: \"All products\",\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 443,\n columnNumber: 93\n }, void 0),\n tint: \"bg-blue-50 text-blue-600\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 443,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Kpi, {\n label: \"Complete\",\n value: (_s_complete = s === null || s === void 0 ? void 0 : s.complete) !== null && _s_complete !== void 0 ? _s_complete : 0,\n sub: \"\".concat((_s_complete_pct = s === null || s === void 0 ? void 0 : s.complete_pct) !== null && _s_complete_pct !== void 0 ? _s_complete_pct : 0, \"% of total\"),\n subColor: \"text-emerald-600\",\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 444,\n columnNumber: 132\n }, void 0),\n tint: \"bg-emerald-50 text-emerald-600\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 444,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Kpi, {\n label: \"Pending\",\n value: (_s_pending = s === null || s === void 0 ? void 0 : s.pending) !== null && _s_pending !== void 0 ? _s_pending : 0,\n sub: \"\".concat((_s_pending_pct = s === null || s === void 0 ? void 0 : s.pending_pct) !== null && _s_pending_pct !== void 0 ? _s_pending_pct : 0, \"% of total\"),\n subColor: \"text-amber-600\",\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 445,\n columnNumber: 127\n }, void 0),\n tint: \"bg-amber-50 text-amber-600\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 445,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Kpi, {\n label: \"Expired\",\n value: (_s_expired = s === null || s === void 0 ? void 0 : s.expired) !== null && _s_expired !== void 0 ? _s_expired : 0,\n sub: \"\".concat((_s_expired_pct = s === null || s === void 0 ? void 0 : s.expired_pct) !== null && _s_expired_pct !== void 0 ? _s_expired_pct : 0, \"% of total\"),\n subColor: \"text-rose-600\",\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 446,\n columnNumber: 126\n }, void 0),\n tint: \"bg-rose-50 text-rose-500\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 446,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Kpi, {\n label: \"Upcoming Expiry\",\n value: (_s_expiring = s === null || s === void 0 ? void 0 : s.expiring) !== null && _s_expiring !== void 0 ? _s_expiring : 0,\n sub: \"Next 30 days\",\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 447,\n columnNumber: 88\n }, void 0),\n tint: \"bg-violet-50 text-violet-600\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 447,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 442,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"card p-4 flex flex-wrap items-end gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"absolute left-3 top-2.5 h-4 w-4 text-slate-400\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 453,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n value: filters.search,\n onChange: (e)=>set(\"search\", e.target.value),\n placeholder: \"Search compliance…\",\n className: \"pl-9 pr-3 py-2 w-52 rounded-lg border border-slate-200 text-sm\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 454,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 452,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Filter, {\n label: \"Status\",\n value: filters.status_filter,\n onChange: (v)=>set(\"status_filter\", v),\n opts: [\n \"complete\",\n \"pending\",\n \"expiring\",\n \"expired\"\n ].map((x)=>({\n value: x,\n label: x\n })),\n all: \"All Status\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 457,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Filter, {\n label: \"Type\",\n value: filters.compliance_type,\n onChange: (v)=>set(\"compliance_type\", v),\n opts: TYPES.map((t)=>({\n value: t,\n label: t\n })),\n all: \"All Types\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 458,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Filter, {\n label: \"Country\",\n value: filters.country,\n onChange: (v)=>set(\"country\", v),\n opts: [\n {\n value: \"India\",\n label: \"India\"\n }\n ],\n all: \"All Countries\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 459,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 451,\n columnNumber: 7\n }, this),\n showAlerts && (s === null || s === void 0 ? void 0 : (_s_alerts = s.alerts) === null || _s_alerts === void 0 ? void 0 : _s_alerts.length) > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"card p-4 bg-amber-50 border border-amber-200 rounded-xl relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setShowAlerts(false),\n className: \"absolute top-3 right-3 rounded-md p-1 text-amber-700 hover:bg-amber-100\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 470,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 466,\n columnNumber: 5\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"font-semibold text-amber-800 text-sm flex items-center gap-2 mb-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 474,\n columnNumber: 7\n }, this),\n \"Attention needed\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 473,\n columnNumber: 5\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-1\",\n children: s.alerts.map((a, i)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-amber-700\",\n children: [\n a.type,\n a.number ? \" (\".concat(a.number, \")\") : \"\",\n \" — \",\n a.status,\n a.expiry ? \" \\xb7 expires \".concat(new Date(a.expiry).toLocaleDateString()) : \"\"\n ]\n }, i, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 480,\n columnNumber: 9\n }, this))\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 478,\n columnNumber: 5\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 465,\n columnNumber: 3\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-slate-500\",\n children: [\n \"Total: \",\n rows.length\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 497,\n columnNumber: 5\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"flex items-center gap-2 px-4 py-2 rounded-lg border border-slate-200 bg-white hover:bg-slate-50 cursor-pointer text-sm font-medium\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 503,\n columnNumber: 7\n }, this),\n \"Import\",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"file\",\n accept: \".csv,.xlsx,.xls,.json\",\n className: \"hidden\",\n onChange: handleImport\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 505,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 502,\n columnNumber: 5\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: handleExport,\n className: \"flex items-center gap-2 px-4 py-2 rounded-lg border border-slate-200 bg-white hover:bg-slate-50 text-sm font-medium\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 518,\n columnNumber: 7\n }, this),\n selectedRows.length > 0 ? \"Export Selected (\".concat(selectedRows.length, \")\") : \"Export\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 514,\n columnNumber: 5\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: handlePdfExport,\n className: \"flex items-center gap-2 rounded-lg border border-slate-200 bg-white px-4 py-2 text-sm font-medium hover:bg-slate-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 527,\n columnNumber: 3\n }, this),\n selectedRows.length ? \"PDF (\".concat(selectedRows.length, \")\") : \"PDF Report\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 523,\n columnNumber: 1\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: openAdd,\n className: \"flex items-center gap-2 bg-brand-600 text-white px-4 py-2 rounded-lg text-sm font-semibold\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 538,\n columnNumber: 7\n }, this),\n \"Add Compliance\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 534,\n columnNumber: 5\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 496,\n columnNumber: 3\n }, this),\n selectedRows.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm font-medium text-brand-600\",\n children: [\n selectedRows.length,\n \" Selected\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 546,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setBulkDeleteOpen(true),\n className: \"rounded-lg bg-red-600 px-4 py-2 text-sm text-white\",\n children: \"Delete Selected\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 550,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 545,\n columnNumber: 5\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 494,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"card overflow-x-auto\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"table\", {\n className: \"w-full text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"thead\", {\n className: \"bg-slate-50 text-slate-500 text-left\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"checkbox\",\n checked: allSelected,\n onChange: toggleAll\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 566,\n columnNumber: 3\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 565,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3 font-medium\",\n children: \"Product\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 572,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3 font-medium\",\n children: \"Type\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 573,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3 font-medium\",\n children: \"License / Reg.\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 574,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3 font-medium\",\n children: \"Issue Date\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 575,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3 font-medium\",\n children: \"Expiry Date\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 576,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3 font-medium\",\n children: \"Status\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 577,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3 font-medium\",\n children: \"Country\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 578,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3 font-medium\",\n children: \"Last Updated\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 579,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-4 py-3 font-medium\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 580,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 564,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 563,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n className: \"divide-y divide-slate-100\",\n children: [\n paged.map((c)=>/*#__PURE__*/ {\n var _c_product_name, _c_sku, _c_license_number, _STATUS_c_status, _c_country;\n return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"hover:bg-slate-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"checkbox\",\n checked: selectedRows.includes(c.id),\n onChange: ()=>toggleRow(c.id)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 587,\n columnNumber: 3\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 586,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-3\",\n children: [\n c.product_image ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n src: imgSrc(c.product_image),\n className: \"h-10 w-10 rounded object-contain border border-slate-100\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 596,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"h-10 w-10 rounded bg-slate-100\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 597,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"font-medium text-slate-800\",\n children: (_c_product_name = c.product_name) !== null && _c_product_name !== void 0 ? _c_product_name : \"—\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 599,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-slate-400\",\n children: (_c_sku = c.sku) !== null && _c_sku !== void 0 ? _c_sku : \"\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 600,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 598,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 594,\n columnNumber: 19\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 593,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3\",\n children: c.compliance_type\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 604,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3 font-mono text-slate-600\",\n children: (_c_license_number = c.license_number) !== null && _c_license_number !== void 0 ? _c_license_number : \"—\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 605,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3 text-slate-500\",\n children: c.issue_date ? new Date(c.issue_date).toLocaleDateString() : \"—\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 606,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3\",\n children: c.expiry_date ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: c.days_left != null && c.days_left < 0 ? \"text-rose-600\" : c.days_left != null && c.days_left < 30 ? \"text-amber-600\" : \"text-slate-700\",\n children: new Date(c.expiry_date).toLocaleDateString()\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 610,\n columnNumber: 23\n }, this),\n c.days_left != null && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs \".concat(c.days_left < 0 ? \"text-rose-500\" : \"text-slate-400\"),\n children: c.days_left < 0 ? \"(Expired)\" : \"(In \".concat(c.days_left, \" days)\")\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 613,\n columnNumber: 47\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 609,\n columnNumber: 21\n }, this) : \"—\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 607,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-xs font-semibold px-2 py-0.5 rounded-full capitalize \".concat((_STATUS_c_status = STATUS[c.status]) !== null && _STATUS_c_status !== void 0 ? _STATUS_c_status : \"bg-slate-100\"),\n children: c.status\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 619,\n columnNumber: 43\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 619,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3\",\n children: (_c_country = c.country) !== null && _c_country !== void 0 ? _c_country : \"—\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 620,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3 text-slate-500\",\n children: c.updated_at ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: new Date(c.updated_at).toLocaleDateString(\"en-IN\")\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 624,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-slate-400\",\n children: new Date(c.updated_at).toLocaleTimeString(\"en-IN\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\"\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 627,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 623,\n columnNumber: 5\n }, this) : \"—\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 621,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-4 py-3 relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n title: \"View\",\n onClick: ()=>setDetailId(c.id),\n className: \"h-8 w-8 grid place-items-center rounded-lg border border-slate-200 text-slate-500 hover:bg-slate-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 641,\n columnNumber: 188\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 641,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: (e)=>{\n e.stopPropagation();\n setMenuFor(menuFor === c.id ? null : c.id);\n },\n className: \"h-8 w-8 grid place-items-center rounded-lg border border-slate-200 text-slate-500 hover:bg-slate-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 642,\n columnNumber: 227\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 642,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 640,\n columnNumber: 19\n }, this),\n menuFor === c.id && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n onClick: (e)=>e.stopPropagation(),\n className: \"absolute right-4 top-12 z-20 w-44 bg-white rounded-xl border border-slate-200 shadow-lg py-1 text-left\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>{\n openEdit(c);\n setMenuFor(null);\n },\n className: \"w-full flex items-center gap-2 px-3 py-2 text-sm text-slate-700 hover:bg-slate-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 646,\n columnNumber: 176\n }, this),\n \" Edit\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 646,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>{\n setDetailId(c.id);\n setMenuFor(null);\n },\n className: \"w-full flex items-center gap-2 px-3 py-2 text-sm text-slate-700 hover:bg-slate-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 647,\n columnNumber: 182\n }, this),\n \" Upload Document\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 647,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"my-1 border-t border-slate-100\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 649,\n columnNumber: 3\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>{\n setDeleteRow(c);\n setMenuFor(null);\n },\n className: \"w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 hover:bg-red-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 658,\n columnNumber: 5\n }, this),\n \"Delete\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 651,\n columnNumber: 3\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 645,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 639,\n columnNumber: 17\n }, this)\n ]\n }, c.id, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 585,\n columnNumber: 15\n }, this);\n }),\n paged.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n colSpan: 8,\n className: \"px-4 py-12 text-center text-slate-400\",\n children: \"No compliance records.\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 666,\n columnNumber: 40\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 666,\n columnNumber: 36\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 583,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 562,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between px-4 py-3 text-sm text-slate-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: [\n \"Showing \",\n rows.length === 0 ? 0 : (page - 1) * pageSize + 1,\n \" to \",\n Math.min(page * pageSize, rows.length),\n \" of \",\n rows.length\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 670,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n disabled: page === 1,\n onClick: ()=>setPage(page - 1),\n className: \"px-3 py-1 rounded border border-slate-200 disabled:opacity-40\",\n children: \"‹\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 672,\n columnNumber: 13\n }, this),\n Array.from({\n length: totalPages\n }).slice(0, 5).map((_, i)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setPage(i + 1),\n className: \"px-3 py-1 rounded \".concat(page === i + 1 ? \"bg-brand-600 text-white\" : \"border border-slate-200\"),\n children: i + 1\n }, i, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 674,\n columnNumber: 15\n }, this)),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n disabled: page === totalPages,\n onClick: ()=>setPage(page + 1),\n className: \"px-3 py-1 rounded border border-slate-200 disabled:opacity-40\",\n children: \"›\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 676,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 671,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 669,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 561,\n columnNumber: 7\n }, this),\n detailId && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ComplianceDetailModal__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n cid: detailId,\n onClose: ()=>setDetailId(null),\n onEdit: ()=>{\n const r = rows.find((x)=>x.id === detailId);\n if (r) openEdit(r);\n },\n onChanged: load\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 683,\n columnNumber: 9\n }, this),\n deleteRow && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\",\n onClick: ()=>setDeleteRow(null),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n onClick: (e)=>e.stopPropagation(),\n className: \"w-full max-w-md rounded-2xl bg-white shadow-xl\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b px-6 py-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-lg font-bold text-slate-900\",\n children: \"Delete Compliance\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 699,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 698,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"p-6 space-y-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-4\",\n children: [\n deleteRow.product_image ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n src: imgSrc(deleteRow.product_image),\n className: \"h-16 w-16 rounded-lg border object-contain\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 707,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"h-16 w-16 rounded-lg bg-slate-100\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 712,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"font-semibold text-slate-900\",\n children: deleteRow.product_name\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 716,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-slate-500\",\n children: deleteRow.compliance_type\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 720,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-slate-400\",\n children: deleteRow.license_number || \"No License Number\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 724,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 715,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 705,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"rounded-lg border border-red-200 bg-red-50 p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-700\",\n children: \"Are you sure you want to delete this compliance record?\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 731,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-xs text-red-600\",\n children: \"This action cannot be undone.\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 735,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 730,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 704,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-3 border-t px-6 py-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setDeleteRow(null),\n className: \"rounded-lg border border-slate-200 px-4 py-2 text-sm\",\n children: \"Cancel\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 742,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: confirmDelete,\n disabled: deleting,\n className: \"rounded-lg bg-red-600 px-5 py-2 text-sm font-semibold text-white hover:bg-red-700 disabled:opacity-50\",\n children: deleting ? \"Deleting...\" : \"Delete\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 749,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 741,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 694,\n columnNumber: 5\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 690,\n columnNumber: 3\n }, this),\n bulkDeleteOpen && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"fixed inset-0 z-50 flex items-center justify-center bg-black/50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full max-w-md rounded-xl bg-white shadow-xl\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b px-6 py-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-lg font-bold\",\n children: \"Delete Compliance Records\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 765,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 764,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"p-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-slate-700\",\n children: [\n \"Are you sure you want to delete\",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-bold text-red-600\",\n children: [\n \" \",\n selectedRows.length,\n \" compliance record\",\n selectedRows.length > 1 ? \"s\" : \"\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 773,\n columnNumber: 11\n }, this),\n \"?\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 771,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-slate-500\",\n children: \"This action cannot be undone.\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 781,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 770,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-3 border-t px-6 py-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setBulkDeleteOpen(false),\n className: \"rounded-lg border px-4 py-2\",\n children: \"Cancel\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 787,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: deleteSelected,\n disabled: deleting,\n className: \"rounded-lg bg-red-600 px-5 py-2 text-white\",\n children: deleting ? \"Deleting...\" : \"Delete (\".concat(selectedRows.length, \")\")\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 794,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 786,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 763,\n columnNumber: 5\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 762,\n columnNumber: 3\n }, this),\n form && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"fixed inset-0 bg-black/40 z-50 grid place-items-center p-4 overflow-y-auto\",\n onClick: ()=>setForm(null),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"bg-white rounded-2xl w-full max-w-lg my-4 max-h-[92vh] overflow-y-auto\",\n onClick: (e)=>e.stopPropagation(),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between px-5 py-4 border-b border-slate-100 sticky top-0 bg-white rounded-t-2xl\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h3\", {\n className: \"font-bold\",\n children: form._id ? \"Edit Compliance\" : \"Add Compliance\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 812,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setForm(null),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertTriangle_Calendar_CheckCircle2_Clock_Download_Eye_MoreVertical_Package_Pencil_Plus_Search_Trash2_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n className: \"h-5 w-5 text-slate-400\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 813,\n columnNumber: 53\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 813,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 811,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"p-5 grid grid-cols-2 gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Fld, {\n label: \"Product\",\n full: true,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n value: form.product_id,\n onChange: (e)=>setForm({\n ...form,\n product_id: e.target.value\n }),\n className: \"input\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"\",\n children: \"Select product\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 818,\n columnNumber: 19\n }, this),\n products.map((p)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: p.id,\n children: p.name\n }, p.id, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 819,\n columnNumber: 40\n }, this))\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 817,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 816,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Fld, {\n label: \"Compliance Type\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n value: form.compliance_type,\n onChange: (e)=>setForm({\n ...form,\n compliance_type: e.target.value\n }),\n className: \"input\",\n children: TYPES.map((t)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n children: t\n }, t, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 824,\n columnNumber: 37\n }, this))\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 823,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 822,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"License / Reg. No.\",\n v: form.license_number,\n on: (x)=>setForm({\n ...form,\n license_number: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 827,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"License Name\",\n v: form.license_name,\n on: (x)=>setForm({\n ...form,\n license_name: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 828,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"Issuing Authority\",\n v: form.issuing_authority,\n on: (x)=>setForm({\n ...form,\n issuing_authority: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 829,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"Issue Date\",\n type: \"date\",\n v: form.issue_date,\n on: (x)=>setForm({\n ...form,\n issue_date: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 830,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"Expiry Date\",\n type: \"date\",\n v: form.expiry_date,\n on: (x)=>setForm({\n ...form,\n expiry_date: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 831,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"Country\",\n v: form.country,\n on: (x)=>setForm({\n ...form,\n country: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 832,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"State\",\n v: form.state,\n on: (x)=>setForm({\n ...form,\n state: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 833,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"Category\",\n v: form.category,\n on: (x)=>setForm({\n ...form,\n category: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 834,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"Applicable To\",\n v: form.applicable_to,\n on: (x)=>setForm({\n ...form,\n applicable_to: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 835,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"Manufacturing Plant\",\n v: form.plant,\n on: (x)=>setForm({\n ...form,\n plant: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 836,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Inp, {\n label: \"Remarks\",\n full: true,\n v: form.remarks,\n on: (x)=>setForm({\n ...form,\n remarks: x\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 837,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 815,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-3 px-5 py-4 border-t border-slate-100 sticky bottom-0 bg-white\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setForm(null),\n className: \"px-5 py-2 rounded-lg border border-slate-200 text-sm font-medium\",\n children: \"Cancel\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 840,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: saveForm,\n className: \"px-6 py-2 rounded-lg bg-brand-600 text-white text-sm font-semibold\",\n children: \"Save\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 841,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 839,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 810,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 809,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"style\", {\n children: \".input{margin-top:.25rem;width:100%;padding:.5rem .75rem;border-radius:.5rem;border:1px solid #e2e8f0;font-size:.875rem}\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 846,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 435,\n columnNumber: 5\n }, this);\n}\n_s(Compliance, \"xW+7PF4i2njBORx+fM3/QhKLL8I=\");\n_c = Compliance;\nfunction Kpi(param) {\n let { label, value, sub, subColor = \"text-slate-400\", icon, tint } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"card p-5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"h-12 w-12 rounded-xl grid place-items-center shrink-0 \".concat(tint),\n children: icon\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 855,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-slate-500\",\n children: label\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 857,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-extrabold text-slate-900 mt-0.5\",\n children: value\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 858,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-medium mt-1 \".concat(subColor),\n children: sub\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 859,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 856,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 854,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 853,\n columnNumber: 5\n }, this);\n}\n_c1 = Kpi;\nfunction Filter(param) {\n let { label, value, onChange, opts, all } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"block\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-xs text-slate-500\",\n children: label\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 870,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n value: value,\n onChange: (e)=>onChange(e.target.value),\n className: \"mt-1 block px-3 py-2 rounded-lg border border-slate-200 text-sm min-w-[130px] capitalize\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"\",\n children: all\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 872,\n columnNumber: 9\n }, this),\n opts.map((o)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: o.value,\n children: o.label\n }, o.value, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 873,\n columnNumber: 26\n }, this))\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 871,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 869,\n columnNumber: 5\n }, this);\n}\n_c2 = Filter;\nfunction Fld(param) {\n let { label, children, full } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"block \".concat(full ? \"col-span-2\" : \"\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm font-medium\",\n children: label\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 879,\n columnNumber: 65\n }, this),\n children\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 879,\n columnNumber: 10\n }, this);\n}\n_c3 = Fld;\nfunction Inp(param) {\n let { label, v, on, type = \"text\", full } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"block \".concat(full ? \"col-span-2\" : \"\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm font-medium\",\n children: label\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 884,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: type,\n value: v !== null && v !== void 0 ? v : \"\",\n onChange: (e)=>on(e.target.value),\n className: \"input\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 885,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\app\\\\dashboard\\\\compliance\\\\page.tsx\",\n lineNumber: 883,\n columnNumber: 5\n }, this);\n}\n_c4 = Inp;\nvar _c, _c1, _c2, _c3, _c4;\n$RefreshReg$(_c, \"Compliance\");\n$RefreshReg$(_c1, \"Kpi\");\n$RefreshReg$(_c2, \"Filter\");\n$RefreshReg$(_c3, \"Fld\");\n$RefreshReg$(_c4, \"Inp\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9kYXNoYm9hcmQvY29tcGxpYW5jZS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDcUQ7QUFJL0I7QUFDbUI7QUFDOEI7QUFDN0M7QUFDYztBQUd4QyxTQUFTc0IsT0FBT0MsR0FBWTtJQUMxQixJQUFJLENBQUNBLEtBQUssT0FBTztJQUNqQixJQUFJQSxJQUFJQyxVQUFVLENBQUMsWUFBWUQsSUFBSUMsVUFBVSxDQUFDLFNBQVMsT0FBT0Q7SUFDOUQsT0FBTyxHQUFhQSxPQUFWTCw2Q0FBT0EsRUFBTyxPQUFKSztBQUN0QjtBQUVBLE1BQU1FLFFBQVE7SUFBQztJQUFpQjtJQUFnQjtJQUFtQjtJQUNqRTtJQUFvQjtJQUFtQjtJQUFzQjtDQUF5QjtBQUV4RixNQUFNQyxTQUFpQztJQUNyQ0MsVUFBVTtJQUNWQyxTQUFTO0lBQ1RDLFVBQVU7SUFDVkMsU0FBUztBQUNYO0FBRWUsU0FBU0M7UUFtYlRDOztJQWxiYixNQUFNLENBQUNDLE1BQU1DLFFBQVEsR0FBR2hDLCtDQUFRQSxDQUFRLEVBQUU7SUFDMUMsTUFBTSxDQUFDOEIsR0FBR0csS0FBSyxHQUFHakMsK0NBQVFBLENBQU07SUFDaEMsTUFBTSxDQUFDa0MsVUFBVUMsWUFBWSxHQUFHbkMsK0NBQVFBLENBQVEsRUFBRTtJQUNsRCxNQUFNLENBQUNvQyxTQUFTQyxXQUFXLEdBQUdyQywrQ0FBUUEsQ0FBQztRQUFFc0MsUUFBUTtRQUFJQyxlQUFlO1FBQUlDLGlCQUFpQjtRQUFJQyxTQUFTO0lBQUc7SUFDekcsTUFBTSxDQUFDQyxVQUFVQyxZQUFZLEdBQUczQywrQ0FBUUEsQ0FBZ0I7SUFDeEQsTUFBTSxDQUFDNEMsU0FBU0MsV0FBVyxHQUFHN0MsK0NBQVFBLENBQWdCO0lBQ3RELE1BQU0sQ0FBQzhDLE1BQU1DLFFBQVEsR0FBRy9DLCtDQUFRQSxDQUFNLE9BQWEsc0NBQXNDO0lBQ3pGLE1BQU0sQ0FBQ2dELE1BQU1D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QUFFRSxNQUFNLENBQUNXLEtBQUs7Z0JBQUc4RCxXQUFVOztrQ0FDekUsOERBQUN5RDt3QkFBT3ZILE9BQU07a0NBQUlvRDs7Ozs7O29CQUNqQjJCLEtBQUtsSSxHQUFHLENBQUMsQ0FBQytLLGtCQUFNLDhEQUFDTDs0QkFBcUJ2SCxPQUFPNEgsRUFBRTVILEtBQUs7c0NBQUc0SCxFQUFFMUQsS0FBSzsyQkFBakMwRCxFQUFFNUgsS0FBSzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJN0M7TUFaUzhFO0FBYVQsU0FBU3NDLElBQUksS0FBOEI7UUFBOUIsRUFBRWxELEtBQUssRUFBRTJELFFBQVEsRUFBRVIsSUFBSSxFQUFPLEdBQTlCO0lBQ1gscUJBQU8sOERBQUNuRDtRQUFNSixXQUFXLFNBQWtDLE9BQXpCdUQsT0FBTyxlQUFlOzswQkFBTSw4REFBQzlCO2dCQUFLekIsV0FBVTswQkFBdUJJOzs7Ozs7WUFBYzJEOzs7Ozs7O0FBQ3JIO01BRlNUO0FBR1QsU0FBU0ssSUFBSSxLQUF3SDtRQUF4SCxFQUFFdkQsS0FBSyxFQUFFOUksQ0FBQyxFQUFFc00sRUFBRSxFQUFFdEosT0FBTyxNQUFNLEVBQUVpSixJQUFJLEVBQXFGLEdBQXhIO0lBQ1gscUJBQ0UsOERBQUNuRDtRQUFNSixXQUFXLFNBQWtDLE9BQXpCdUQsT0FBTyxlQUFlOzswQkFDL0MsOERBQUM5QjtnQkFBS3pCLFdBQVU7MEJBQXVCSTs7Ozs7OzBCQUN2Qyw4REFBQ1M7Z0JBQU12RyxNQUFNQTtnQkFBTTRCLE9BQU81RSxjQUFBQSxlQUFBQSxJQUFLO2dCQUFJd0osVUFBVSxDQUFDekYsSUFBTXVJLEdBQUd2SSxFQUFFRSxNQUFNLENBQUNXLEtBQUs7Z0JBQUc4RCxXQUFVOzs7Ozs7Ozs7Ozs7QUFHeEY7TUFQUzJEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9kYXNoYm9hcmQvY29tcGxpYW5jZS9wYWdlLnRzeD8zYTgzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgUGFja2FnZSwgQ2hlY2tDaXJjbGUyLCBDbG9jaywgQWxlcnRUcmlhbmdsZSwgQ2FsZW5kYXIsIFNlYXJjaCxcbiAgUGx1cywgRG93bmxvYWQsIEV5ZSwgUGVuY2lsLCBVcGxvYWQsIE1vcmVWZXJ0aWNhbCwgWCxUcmFzaDIsXG59IGZyb20gXCJsdWNpZGUtcmVhY3RcIjtcbmltcG9ydCB7IGFwaSwgYXBpQmFzZSB9IGZyb20gXCJAL2xpYi9hcGlcIjtcbmltcG9ydCBDb21wbGlhbmNlRGV0YWlsTW9kYWwgZnJvbSBcIkAvY29tcG9uZW50cy9Db21wbGlhbmNlRGV0YWlsTW9kYWxcIjtcbmltcG9ydCBqc1BERiBmcm9tIFwianNwZGZcIjtcbmltcG9ydCBhdXRvVGFibGUgZnJvbSBcImpzcGRmLWF1dG90YWJsZVwiO1xuXG5cbmZ1bmN0aW9uIGltZ1NyYyh1cmw/OiBzdHJpbmcpIHtcbiAgaWYgKCF1cmwpIHJldHVybiBcIlwiO1xuICBpZiAodXJsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSB8fCB1cmwuc3RhcnRzV2l0aChcImh0dHBcIikpIHJldHVybiB1cmw7XG4gIHJldHVybiBgJHthcGlCYXNlfSR7dXJsfWA7XG59XG5cbmNvbnN0IFRZUEVTID0gW1wiRlNTQUkgTGljZW5zZVwiLCBcIkRydWcgTGljZW5zZVwiLCBcIkdNUCBDZXJ0aWZpY2F0ZVwiLCBcIklTTyBDZXJ0aWZpY2F0ZVwiLFxuICBcIkVQUiBSZWdpc3RyYXRpb25cIiwgXCJGYWN0b3J5IExpY2Vuc2VcIiwgXCJJbXBvcnQgRXhwb3J0IENvZGVcIiwgXCJUcmFkZW1hcmsgUmVnaXN0cmF0aW9uXCJdO1xuXG5jb25zdCBTVEFUVVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGNvbXBsZXRlOiBcImJnLWVtZXJhbGQtNTAgdGV4dC1lbWVyYWxkLTcwMFwiLFxuICBwZW5kaW5nOiBcImJnLWFtYmVyLTUwIHRleHQtYW1iZXItNzAwXCIsXG4gIGV4cGlyaW5nOiBcImJnLWFtYmVyLTUwIHRleHQtYW1iZXItNzAwXCIsXG4gIGV4cGlyZWQ6IFwiYmctcm9zZS01MCB0ZXh0LXJvc2UtNzAwXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDb21wbGlhbmNlKCkge1xuICBjb25zdCBbcm93cywgc2V0Um93c10gPSB1c2VTdGF0ZTxhbnlbXT4oW10pO1xuICBjb25zdCBbcywgc2V0U10gPSB1c2VTdGF0ZTxhbnk+KG51bGwpO1xuICBjb25zdCBbcHJvZHVjdHMsIHNldFByb2R1Y3RzXSA9IHVzZVN0YXRlPGFueVtdPihbXSk7XG4gIGNvbnN0IFtmaWx0ZXJzLCBzZXRGaWx0ZXJzXSA9IHVzZVN0YXRlKHsgc2VhcmNoOiBcIlwiLCBzdGF0dXNfZmlsdGVyOiBcIlwiLCBjb21wbGlhbmNlX3R5cGU6IFwiXCIsIGNvdW50cnk6IFwiXCIgfSk7XG4gIGNvbnN0IFtkZXRhaWxJZCwgc2V0RGV0YWlsSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFttZW51Rm9yLCBzZXRNZW51Rm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZm9ybSwgc2V0Rm9ybV0gPSB1c2VTdGF0ZTxhbnk+KG51bGwpOyAgICAgICAvLyBhZGQvZWRpdCBmb3JtIHN0YXRlIChudWxsID0gY2xvc2VkKVxuICBjb25zdCBbcGFnZSwgc2V0UGFnZV0gPSB1c2VTdGF0ZSgxKTtcbiAgY29uc3QgcGFnZVNpemUgPSAyNTtcbiAgY29uc3QgW3Nob3dBbGVydHMsIHNldFNob3dBbGVydHNdID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtkZWxldGVSb3csIHNldERlbGV0ZVJvd10gPSB1c2VTdGF0ZTxhbnk+KG51bGwpO1xuY29uc3QgW2RlbGV0aW5nLCBzZXREZWxldGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzZWxlY3RlZFJvd3MsIHNldFNlbGVjdGVkUm93c10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oW10pO1xuY29uc3QgW2J1bGtEZWxldGVPcGVuLCBzZXRCdWxrRGVsZXRlT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIFxuXG4gIGZ1bmN0aW9uIGxvYWQoKSB7XG4gIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhcbiAgICBPYmplY3QuZW50cmllcyhmaWx0ZXJzKS5maWx0ZXIoKFssIHZdKSA9PiB2KSBhcyBhbnlcbiAgKS50b1N0cmluZygpO1xuXG4gIGFwaShgL2NvbXBsaWFuY2Uke3FzID8gXCI/XCIgKyBxcyA6IFwiXCJ9YClcbiAgICAudGhlbihzZXRSb3dzKVxuICAgIC5jYXRjaCgoKSA9PiBzZXRSb3dzKFtdKSk7XG5cbiAgYXBpKFwiL2NvbXBsaWFuY2Uvc3VtbWFyeVwiKVxuICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICBzZXRTKGRhdGEpO1xuICAgICAgc2V0U2hvd0FsZXJ0cyh0cnVlKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiB7fSk7XG59XG4gIHVzZUVmZmVjdCgoKSA9PiB7IGxvYWQoKTsgfSwgW2ZpbHRlcnNdKTtcbiAgdXNlRWZmZWN0KCgpID0+IHsgYXBpKFwiL3Byb2R1Y3RzXCIpLnRoZW4oKGQpID0+IHNldFByb2R1Y3RzKGQuaXRlbXMgPz8gW10pKS5jYXRjaCgoKSA9PiB7fSk7IH0sIFtdKTtcblxuICBjb25zdCBwYWdlZCA9IHVzZU1lbW8oKCkgPT4gcm93cy5zbGljZSgocGFnZSAtIDEpICogcGFnZVNpemUsIHBhZ2UgKiBwYWdlU2l6ZSksIFtyb3dzLCBwYWdlXSk7XG4gIGNvbnN0IHRvdGFsUGFnZXMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwocm93cy5sZW5ndGggLyBwYWdlU2l6ZSkpO1xuICBjb25zdCBzZXQgPSAoazogc3RyaW5nLCB2OiBzdHJpbmcpID0+IHsgc2V0UGFnZSgxKTsgc2V0RmlsdGVycygoZikgPT4gKHsgLi4uZiwgW2tdOiB2IH0pKTsgfTtcbiAgZnVuY3Rpb24gaGFuZGxlRXhwb3J0KCkge1xuICBjb25zdCBleHBvcnRSb3dzID1cbiAgICBzZWxlY3RlZFJvd3MubGVuZ3RoID4gMFxuICAgICAgPyByb3dzLmZpbHRlcigocikgPT4gc2VsZWN0ZWRSb3dzLmluY2x1ZGVzKHIuaWQpKVxuICAgICAgOiByb3dzO1xuXG4gIGNvbnN0IGhlYWRlcnMgPSBbXG4gICAgXCJQcm9kdWN0XCIsXG4gICAgXCJTS1VcIixcbiAgICBcIkNvbXBsaWFuY2UgVHlwZVwiLFxuICAgIFwiTGljZW5zZSBOdW1iZXJcIixcbiAgICBcIkxpY2Vuc2UgTmFtZVwiLFxuICAgIFwiSXNzdWluZyBBdXRob3JpdHlcIixcbiAgICBcIklzc3VlIERhdGVcIixcbiAgICBcIkV4cGlyeSBEYXRlXCIsXG4gICAgXCJEYXlzIExlZnRcIixcbiAgICBcIlN0YXR1c1wiLFxuICAgIFwiQ291bnRyeVwiLFxuICAgIFwiU3RhdGVcIixcbiAgICBcIkNhdGVnb3J5XCIsXG4gICAgXCJBcHBsaWNhYmxlIFRvXCIsXG4gICAgXCJNYW51ZmFjdHVyaW5nIFBsYW50XCIsXG4gICAgXCJSZW1hcmtzXCIsXG4gICAgXCJDcmVhdGVkIEJ5XCIsXG4gICAgXCJDcmVhdGVkIE9uXCIsXG4gICAgXCJMYXN0IFVwZGF0ZWRcIixcbiAgICBcIkRvY3VtZW50IFVSTFwiLFxuICBdO1xuXG4gIGNvbnN0IGNzdiA9IFtcbiAgICBoZWFkZXJzLmpvaW4oXCIsXCIpLFxuICAgIC4uLmV4cG9ydFJvd3MubWFwKChyKSA9PlxuICAgICAgW1xuICAgICAgICBgXCIke3IucHJvZHVjdF9uYW1lID8/IFwiXCJ9XCJgLFxuICAgICAgICBgXCIke3Iuc2t1ID8/IFwiXCJ9XCJgLFxuICAgICAgICBgXCIke3IuY29tcGxpYW5jZV90eXBlID8/IFwiXCJ9XCJgLFxuICAgICAgICBgXCIke3IubGljZW5zZV9udW1iZXIgPz8gXCJcIn1cImAsXG4gICAgICAgIGBcIiR7ci5saWNlbnNlX25hbWUgPz8gXCJcIn1cImAsXG4gICAgICAgIGBcIiR7ci5pc3N1aW5nX2F1dGhvcml0eSA/PyBcIlwifVwiYCxcbiAgICAgICAgYFwiJHtyLmlzc3VlX2RhdGUgPz8gXCJcIn1cImAsXG4gICAgICAgIGBcIiR7ci5leHBpcnlfZGF0ZSA/PyBcIlwifVwiYCxcbiAgICAgICAgYFwiJHtyLmRheXNfbGVmdCA9PSBudWxsXG4gICA/IFwiLVwiXG4gICAgOiByLmRheXNfbGVmdCA8IDBcbiAgICA/IFwiRXhwaXJlZFwiXG4gICAgOiByLmRheXNfbGVmdCA9PT0gMFxuICAgID8gXCJUb2RheVwiXG4gICAgOiBgJHtyLmRheXNfbGVmdH0gRGF5c2Bcbn1cImAsXG4gICAgICAgIGBcIiR7ci5zdGF0dXMgPz8gXCJcIn1cImAsXG4gICAgICAgIGBcIiR7ci5jb3VudHJ5ID8/IFwiXCJ9XCJgLFxuICAgICAgICBgXCIke3Iuc3RhdGUgPz8gXCJcIn1cImAsXG4gICAgICAgIGBcIiR7ci5jYXRlZ29yeSA/PyBcIlwifVwiYCxcbiAgICAgICAgYFwiJHtyLmFwcGxpY2FibGVfdG8gPz8gXCJcIn1cImAsXG4gICAgICAgIGBcIiR7ci5wbGFudCA/PyBcIlwifVwiYCxcbiAgICAgICAgYFwiJHtyLnJlbWFya3MgPz8gXCJcIn1cImAsXG4gICAgICAgIGBcIiR7ci5jcmVhdGVkX2J5ID8/IFwiXCJ9XCJgLFxuICAgICAgICBgXCIke3IuY3JlYXRlZF9hdCA/IG5ldyBEYXRlKHIuY3JlYXRlZF9hdCkudG9Mb2NhbGVTdHJpbmcoXCJlbi1JTlwiKSA6IFwiXCJ9XCJgLFxuICAgICAgICBgXCIke3IudXBkYXRlZF9hdCA/IG5ldyBEYXRlKHIudXBkYXRlZF9hdCkudG9Mb2NhbGVTdHJpbmcoXCJlbi1JTlwiKSA6IFwiXCJ9XCJgLFxuICAgICAgICBgXCIke3IuZG9jdW1lbnRfdXJsID8/IFwiXCJ9XCJgLFxuICAgICAgXS5qb2luKFwiLFwiKVxuICAgICksXG4gIF0uam9pbihcIlxcblwiKTtcblxuICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2Nzdl0sIHtcbiAgICB0eXBlOiBcInRleHQvY3N2O2NoYXJzZXQ9dXRmLTg7XCIsXG4gIH0pO1xuXG4gIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICBhLmhyZWYgPSB1cmw7XG4gIGEuZG93bmxvYWQgPVxuICAgIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwXG4gICAgICA/IGBzZWxlY3RlZF9jb21wbGlhbmNlXyR7c2VsZWN0ZWRSb3dzLmxlbmd0aH0uY3N2YFxuICAgICAgOiBgY29tcGxpYW5jZV8ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9LmNzdmA7XG5cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgYS5jbGljaygpO1xuICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuXG4gIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUltcG9ydChcbiAgZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD5cbikge1xuICBjb25zdCBmaWxlID0gZS50YXJnZXQuZmlsZXM/LlswXTtcbiAgaWYgKCFmaWxlKSByZXR1cm47XG5cbiAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCBmaWxlKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGZldGNoKGAke2FwaUJhc2V9L2NvbXBsaWFuY2UvaW1wb3J0YCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ2cF90b2tlblwiKX1gLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGxvYWQoKTtcbiAgICBhbGVydChcIkltcG9ydCBzdWNjZXNzZnVsXCIpO1xuICB9IGNhdGNoIHtcbiAgICBhbGVydChcIkltcG9ydCBmYWlsZWRcIik7XG4gIH1cblxuICBlLnRhcmdldC52YWx1ZSA9IFwiXCI7XG59XG5cblxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVQZGZFeHBvcnQoKSB7XG4gIGNvbnN0IGV4cG9ydFJvd3MgPVxuICAgIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwXG4gICAgICA/IHJvd3MuZmlsdGVyKChyKSA9PiBzZWxlY3RlZFJvd3MuaW5jbHVkZXMoci5pZCkpXG4gICAgICA6IHJvd3M7XG5cbiAgY29uc3QgZG9jID0gbmV3IGpzUERGKHtcbiAgICBvcmllbnRhdGlvbjogXCJsYW5kc2NhcGVcIixcbiAgICB1bml0OiBcIm1tXCIsXG4gICAgZm9ybWF0OiBcImE0XCIsXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMb2dvXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB0cnkge1xuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGltZy5zcmMgPSBcIi9sb2dvLnBuZ1wiO1xuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGltZy5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgaW1nLm9uZXJyb3IgPSByZXNvbHZlO1xuICAgIH0pO1xuXG4gICAgZG9jLmFkZEltYWdlKGltZywgXCJQTkdcIiwgMTQsIDEwLCAxOCwgMTgpO1xuICB9IGNhdGNoIHt9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbXBhbnkgSGVhZGVyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkb2Muc2V0Rm9udChcImhlbHZldGljYVwiLCBcImJvbGRcIik7XG4gIGRvYy5zZXRGb250U2l6ZSgxOCk7XG4gIGRvYy50ZXh0KFwiVmVyaWZ5UGFja1wiLCAzOCwgMTgpO1xuXG4gIGRvYy5zZXRGb250KFwiaGVsdmV0aWNhXCIsIFwibm9ybWFsXCIpO1xuICBkb2Muc2V0Rm9udFNpemUoMTApO1xuICBkb2Muc2V0VGV4dENvbG9yKDEwMCk7XG4gIGRvYy50ZXh0KFwiRGlnaXRhbCBUcnVzdCBmb3IgRXZlcnkgUHJvZHVjdFwiLCAzOCwgMjQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZXBvcnQgVGl0bGVcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGRvYy5zZXREcmF3Q29sb3IoMjIwKTtcbiAgZG9jLmxpbmUoMTQsIDMyLCAyODMsIDMyKTtcblxuICBkb2Muc2V0VGV4dENvbG9yKDApO1xuXG4gIGRvYy5zZXRGb250KFwiaGVsdmV0aWNhXCIsIFwiYm9sZFwiKTtcbiAgZG9jLnNldEZvbnRTaXplKDE1KTtcbiAgZG9jLnRleHQoXCJDb21wbGlhbmNlIFJlcG9ydFwiLCAxNCwgNDApO1xuXG4gIGRvYy5zZXRGb250KFwiaGVsdmV0aWNhXCIsIFwibm9ybWFsXCIpO1xuICBkb2Muc2V0Rm9udFNpemUoMTApO1xuXG4gIGRvYy50ZXh0KFxuICAgIGBHZW5lcmF0ZWQgT24gOiAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoXCJlbi1JTlwiKX1gLFxuICAgIDE0LFxuICAgIDQ3XG4gICk7XG5cbiAgZG9jLnRleHQoXG4gICAgYFRvdGFsIFJlY29yZHMgOiAke2V4cG9ydFJvd3MubGVuZ3RofWAsXG4gICAgMjUwLFxuICAgIDQ3LFxuICAgIHsgYWxpZ246IFwicmlnaHRcIiB9XG4gICk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRhYmxlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhdXRvVGFibGUoZG9jLCB7XG4gICAgc3RhcnRZOiA1NSxcblxuICAgIGhlYWQ6IFtbXG4gICAgICBcIlByb2R1Y3RcIixcbiAgICAgIFwiU0tVXCIsXG4gICAgICBcIkNvbXBsaWFuY2UgVHlwZVwiLFxuICAgICAgXCJMaWNlbnNlIE5vXCIsXG4gICAgICBcIklzc3VlIERhdGVcIixcbiAgICAgIFwiRXhwaXJ5IERhdGVcIixcbiAgICAgIFwiRGF5cyBMZWZ0XCIsXG4gICAgICBcIlN0YXR1c1wiLFxuICAgICAgXCJDb3VudHJ5XCIsXG4gICAgICBcIkF1dGhvcml0eVwiLFxuICAgIF1dLFxuXG4gICAgYm9keTogZXhwb3J0Um93cy5tYXAoKHIpID0+IFtcblxuICAgICAgci5wcm9kdWN0X25hbWUgfHwgXCJcIixcblxuICAgICAgci5za3UgfHwgXCJcIixcblxuICAgICAgci5jb21wbGlhbmNlX3R5cGUgfHwgXCJcIixcblxuICAgICAgci5saWNlbnNlX251bWJlciB8fCBcIlwiLFxuXG4gICAgICByLmlzc3VlX2RhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShyLmlzc3VlX2RhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZyhcImVuLUlOXCIpXG4gICAgICAgIDogXCItXCIsXG5cbiAgICAgIHIuZXhwaXJ5X2RhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShyLmV4cGlyeV9kYXRlKS50b0xvY2FsZURhdGVTdHJpbmcoXCJlbi1JTlwiKVxuICAgICAgICA6IFwiLVwiLFxuXG4gICAgICByLmRheXNfbGVmdCA9PSBudWxsXG4gICAgICAgID8gXCItXCJcbiAgICAgICAgOiByLmRheXNfbGVmdCA8IDBcbiAgICAgICAgPyBcIkV4cGlyZWRcIlxuICAgICAgICA6IHIuZGF5c19sZWZ0ID09PSAwXG4gICAgICAgID8gXCJUb2RheVwiXG4gICAgICAgIDogYCR7ci5kYXlzX2xlZnR9IERheXNgLFxuXG4gICAgICByLmRheXNfbGVmdCA9PSBudWxsXG4gICAgICAgID8gXCJQZW5kaW5nXCJcbiAgICAgICAgOiByLmRheXNfbGVmdCA8IDBcbiAgICAgICAgPyBcIkV4cGlyZWRcIlxuICAgICAgICA6IHIuZGF5c19sZWZ0IDw9IDMwXG4gICAgICAgID8gXCJFeHBpcmluZ1wiXG4gICAgICAgIDogXCJDb21wbGV0ZVwiLFxuXG4gICAgICByLmNvdW50cnkgfHwgXCItXCIsXG5cbiAgICAgIHIuaXNzdWluZ19hdXRob3JpdHkgfHwgXCItXCIsXG4gICAgXSksXG5cbiAgICBzdHlsZXM6IHtcbiAgICAgIGZvbnRTaXplOiA4LFxuICAgICAgY2VsbFBhZGRpbmc6IDIsXG4gICAgfSxcbiAgICBoZWFkU3R5bGVzOiB7XG4gICAgICBmaWxsQ29sb3I6IFszNywgOTksIDIzNV0sXG4gICAgICB0ZXh0Q29sb3I6IDI1NSxcbiAgICAgIGZvbnRTdHlsZTogXCJib2xkXCIsXG4gICAgfSxcbiAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHtcbiAgICAgIGZpbGxDb2xvcjogWzI0NSwgMjQ1LCAyNDVdLFxuICAgIH0sXG5cbiAgICBtYXJnaW46IHtcbiAgICAgIGxlZnQ6IDE0LFxuICAgICAgcmlnaHQ6IDE0LFxuICAgIH0sXG5cbiAgICBkaWREcmF3UGFnZTogKGRhdGEpID0+IHtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcblxuICAgICAgZG9jLnNldFRleHRDb2xvcigxMjApO1xuXG4gICAgICBkb2MudGV4dChcbiAgICAgICAgYFBhZ2UgJHtkYXRhLnBhZ2VOdW1iZXJ9YCxcbiAgICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCkgLSAyMCxcbiAgICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gOCxcbiAgICAgICAge1xuICAgICAgICAgIGFsaWduOiBcInJpZ2h0XCIsXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGRvYy50ZXh0KFxuICAgICAgICBcIkdlbmVyYXRlZCBieSBWZXJpZnlQYWNrXCIsXG4gICAgICAgIDE0LFxuICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSA4XG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTYXZlIFBERlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZG9jLnNhdmUoXG4gICAgc2VsZWN0ZWRSb3dzLmxlbmd0aFxuICAgICAgPyBgc2VsZWN0ZWRfY29tcGxpYW5jZV9yZXBvcnQucGRmYFxuICAgICAgOiBgY29tcGxpYW5jZV9yZXBvcnQucGRmYFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb25maXJtRGVsZXRlKCkge1xuICBpZiAoIWRlbGV0ZVJvdykgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgc2V0RGVsZXRpbmcodHJ1ZSk7XG5cbiAgICBhd2FpdCBhcGkoYC9jb21wbGlhbmNlLyR7ZGVsZXRlUm93LmlkfWAsIHtcbiAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICB9KTtcblxuICAgIHNldERlbGV0ZVJvdyhudWxsKTtcbiAgICBsb2FkKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGFsZXJ0KFwiRmFpbGVkIHRvIGRlbGV0ZSBjb21wbGlhbmNlIHJlY29yZC5cIik7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0RGVsZXRpbmcoZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZVJvdyhpZDogc3RyaW5nKSB7XG4gIHNldFNlbGVjdGVkUm93cygocHJldikgPT5cbiAgICBwcmV2LmluY2x1ZGVzKGlkKVxuICAgICAgPyBwcmV2LmZpbHRlcigoeCkgPT4geCAhPT0gaWQpXG4gICAgICA6IFsuLi5wcmV2LCBpZF1cbiAgKTtcbn1cbmNvbnN0IGFsbFNlbGVjdGVkID1cbiAgcGFnZWQubGVuZ3RoID4gMCAmJlxuICBwYWdlZC5ldmVyeSgocikgPT4gc2VsZWN0ZWRSb3dzLmluY2x1ZGVzKHIuaWQpKTtcblxuZnVuY3Rpb24gdG9nZ2xlQWxsKCkge1xuICBpZiAoYWxsU2VsZWN0ZWQpIHtcbiAgICBzZXRTZWxlY3RlZFJvd3MoKHByZXYpID0+XG4gICAgICBwcmV2LmZpbHRlcigoaWQpID0+ICFwYWdlZC5zb21lKChyKSA9PiByLmlkID09PSBpZCkpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRTZWxlY3RlZFJvd3MoKHByZXYpID0+IFtcbiAgICAgIC4uLm5ldyBTZXQoWy4uLnByZXYsIC4uLnBhZ2VkLm1hcCgocikgPT4gci5pZCldKSxcbiAgICBdKTtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlU2VsZWN0ZWQoKSB7XG4gIHRyeSB7XG4gICAgc2V0RGVsZXRpbmcodHJ1ZSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHNlbGVjdGVkUm93cy5tYXAoKGlkKSA9PlxuICAgICAgICBhcGkoYC9jb21wbGlhbmNlLyR7aWR9YCwge1xuICAgICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgc2V0U2VsZWN0ZWRSb3dzKFtdKTtcbiAgICBzZXRCdWxrRGVsZXRlT3BlbihmYWxzZSk7XG4gICAgbG9hZCgpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldERlbGV0aW5nKGZhbHNlKTtcbiAgfVxufVxuXG4gIGZ1bmN0aW9uIG9wZW5BZGQoKSB7XG4gICAgc2V0Rm9ybSh7IHByb2R1Y3RfaWQ6IFwiXCIsIGNvbXBsaWFuY2VfdHlwZTogVFlQRVNbMF0sIGxpY2Vuc2VfbnVtYmVyOiBcIlwiLCBsaWNlbnNlX25hbWU6IFwiXCIsXG4gICAgICBpc3N1aW5nX2F1dGhvcml0eTogXCJcIiwgaXNzdWVfZGF0ZTogXCJcIiwgZXhwaXJ5X2RhdGU6IFwiXCIsIGNvdW50cnk6IFwiSW5kaWFcIiwgc3RhdGU6IFwiXCIsXG4gICAgICBjYXRlZ29yeTogXCJcIiwgYXBwbGljYWJsZV90bzogXCJNYW51ZmFjdHVyaW5nIFBsYW50XCIsIHBsYW50OiBcIlwiLCByZW1hcmtzOiBcIlwiLCBfaWQ6IFwiXCIgfSk7XG4gIH1cbiAgZnVuY3Rpb24gb3BlbkVkaXQocjogYW55KSB7XG4gICAgc2V0RGV0YWlsSWQobnVsbCk7XG4gICAgc2V0Rm9ybSh7IC4uLnIsIF9pZDogci5pZCwgcHJvZHVjdF9pZDogci5wcm9kdWN0X2lkID8/IFwiXCIsXG4gICAgICBpc3N1ZV9kYXRlOiByLmlzc3VlX2RhdGUgPyByLmlzc3VlX2RhdGUuc2xpY2UoMCwgMTApIDogXCJcIixcbiAgICAgIGV4cGlyeV9kYXRlOiByLmV4cGlyeV9kYXRlID8gci5leHBpcnlfZGF0ZS5zbGljZSgwLCAxMCkgOiBcIlwiIH0pO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVGb3JtKCkge1xuICAgIGNvbnN0IHsgX2lkLCAuLi5wYXlsb2FkIH0gPSBmb3JtO1xuICAgIGlmIChfaWQpIGF3YWl0IGFwaShgL2NvbXBsaWFuY2UvJHtfaWR9YCwgeyBtZXRob2Q6IFwiUFVUXCIsIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpIH0pO1xuICAgIGVsc2UgYXdhaXQgYXBpKFwiL2NvbXBsaWFuY2VcIiwgeyBtZXRob2Q6IFwiUE9TVFwiLCBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSB9KTtcbiAgICBzZXRGb3JtKG51bGwpOyBsb2FkKCk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS01XCIgb25DbGljaz17KCkgPT4gc2V0TWVudUZvcihudWxsKX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICA8aDIgY2xhc3NOYW1lPVwidGV4dC14bCBmb250LWJvbGRcIj5Db21wbGlhbmNlIENlbnRlcjwvaDI+XG5cbjwvZGl2PlxuXG4gICAgICB7LyogS1BJcyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtNSBnYXAtNFwiPlxuICAgICAgICA8S3BpIGxhYmVsPVwiVG90YWwgUHJvZHVjdHNcIiB2YWx1ZT17cz8udG90YWxfcHJvZHVjdHMgPz8gMH0gc3ViPVwiQWxsIHByb2R1Y3RzXCIgaWNvbj17PFBhY2thZ2UgY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+fSB0aW50PVwiYmctYmx1ZS01MCB0ZXh0LWJsdWUtNjAwXCIgLz5cbiAgICAgICAgPEtwaSBsYWJlbD1cIkNvbXBsZXRlXCIgdmFsdWU9e3M/LmNvbXBsZXRlID8/IDB9IHN1Yj17YCR7cz8uY29tcGxldGVfcGN0ID8/IDB9JSBvZiB0b3RhbGB9IHN1YkNvbG9yPVwidGV4dC1lbWVyYWxkLTYwMFwiIGljb249ezxDaGVja0NpcmNsZTIgY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+fSB0aW50PVwiYmctZW1lcmFsZC01MCB0ZXh0LWVtZXJhbGQtNjAwXCIgLz5cbiAgICAgICAgPEtwaSBsYWJlbD1cIlBlbmRpbmdcIiB2YWx1ZT17cz8ucGVuZGluZyA/PyAwfSBzdWI9e2Ake3M/LnBlbmRpbmdfcGN0ID8/IDB9JSBvZiB0b3RhbGB9IHN1YkNvbG9yPVwidGV4dC1hbWJlci02MDBcIiBpY29uPXs8Q2xvY2sgY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+fSB0aW50PVwiYmctYW1iZXItNTAgdGV4dC1hbWJlci02MDBcIiAvPlxuICAgICAgICA8S3BpIGxhYmVsPVwiRXhwaXJlZFwiIHZhbHVlPXtzPy5leHBpcmVkID8/IDB9IHN1Yj17YCR7cz8uZXhwaXJlZF9wY3QgPz8gMH0lIG9mIHRvdGFsYH0gc3ViQ29sb3I9XCJ0ZXh0LXJvc2UtNjAwXCIgaWNvbj17PEFsZXJ0VHJpYW5nbGUgY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+fSB0aW50PVwiYmctcm9zZS01MCB0ZXh0LXJvc2UtNTAwXCIgLz5cbiAgICAgICAgPEtwaSBsYWJlbD1cIlVwY29taW5nIEV4cGlyeVwiIHZhbHVlPXtzPy5leHBpcmluZyA/PyAwfSBzdWI9XCJOZXh0IDMwIGRheXNcIiBpY29uPXs8Q2FsZW5kYXIgY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+fSB0aW50PVwiYmctdmlvbGV0LTUwIHRleHQtdmlvbGV0LTYwMFwiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIEZpbHRlcnMgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNhcmQgcC00IGZsZXggZmxleC13cmFwIGl0ZW1zLWVuZCBnYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgPFNlYXJjaCBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTMgdG9wLTIuNSBoLTQgdy00IHRleHQtc2xhdGUtNDAwXCIgLz5cbiAgICAgICAgICA8aW5wdXQgdmFsdWU9e2ZpbHRlcnMuc2VhcmNofSBvbkNoYW5nZT17KGUpID0+IHNldChcInNlYXJjaFwiLCBlLnRhcmdldC52YWx1ZSl9IHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNvbXBsaWFuY2XigKZcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwicGwtOSBwci0zIHB5LTIgdy01MiByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIHRleHQtc21cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPEZpbHRlciBsYWJlbD1cIlN0YXR1c1wiIHZhbHVlPXtmaWx0ZXJzLnN0YXR1c19maWx0ZXJ9IG9uQ2hhbmdlPXsodikgPT4gc2V0KFwic3RhdHVzX2ZpbHRlclwiLCB2KX0gb3B0cz17W1wiY29tcGxldGVcIiwgXCJwZW5kaW5nXCIsIFwiZXhwaXJpbmdcIiwgXCJleHBpcmVkXCJdLm1hcCgoeCkgPT4gKHsgdmFsdWU6IHgsIGxhYmVsOiB4IH0pKX0gYWxsPVwiQWxsIFN0YXR1c1wiIC8+XG4gICAgICAgIDxGaWx0ZXIgbGFiZWw9XCJUeXBlXCIgdmFsdWU9e2ZpbHRlcnMuY29tcGxpYW5jZV90eXBlfSBvbkNoYW5nZT17KHYpID0+IHNldChcImNvbXBsaWFuY2VfdHlwZVwiLCB2KX0gb3B0cz17VFlQRVMubWFwKCh0KSA9PiAoeyB2YWx1ZTogdCwgbGFiZWw6IHQgfSkpfSBhbGw9XCJBbGwgVHlwZXNcIiAvPlxuICAgICAgICA8RmlsdGVyIGxhYmVsPVwiQ291bnRyeVwiIHZhbHVlPXtmaWx0ZXJzLmNvdW50cnl9IG9uQ2hhbmdlPXsodikgPT4gc2V0KFwiY291bnRyeVwiLCB2KX0gb3B0cz17W3sgdmFsdWU6IFwiSW5kaWFcIiwgbGFiZWw6IFwiSW5kaWFcIiB9XX0gYWxsPVwiQWxsIENvdW50cmllc1wiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIEFsZXJ0cyAqL31cbiAgICAgIHsvKiBBbGVydHMgKi99XG57c2hvd0FsZXJ0cyAmJiBzPy5hbGVydHM/Lmxlbmd0aCA+IDAgJiYgKFxuICA8ZGl2IGNsYXNzTmFtZT1cImNhcmQgcC00IGJnLWFtYmVyLTUwIGJvcmRlciBib3JkZXItYW1iZXItMjAwIHJvdW5kZWQteGwgcmVsYXRpdmVcIj5cbiAgICA8YnV0dG9uXG4gICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93QWxlcnRzKGZhbHNlKX1cbiAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0zIHJpZ2h0LTMgcm91bmRlZC1tZCBwLTEgdGV4dC1hbWJlci03MDAgaG92ZXI6YmctYW1iZXItMTAwXCJcbiAgICA+XG4gICAgICA8WCBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTgwMCB0ZXh0LXNtIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIG1iLTJcIj5cbiAgICAgIDxBbGVydFRyaWFuZ2xlIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgQXR0ZW50aW9uIG5lZWRlZFxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTFcIj5cbiAgICAgIHtzLmFsZXJ0cy5tYXAoKGE6IGFueSwgaTogbnVtYmVyKSA9PiAoXG4gICAgICAgIDxkaXYga2V5PXtpfSBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtYW1iZXItNzAwXCI+XG4gICAgICAgICAge2EudHlwZX1cbiAgICAgICAgICB7YS5udW1iZXIgPyBgICgke2EubnVtYmVyfSlgIDogXCJcIn1cbiAgICAgICAgICB7XCIg4oCUIFwifVxuICAgICAgICAgIHthLnN0YXR1c31cbiAgICAgICAgICB7YS5leHBpcnlcbiAgICAgICAgICAgID8gYCDCtyBleHBpcmVzICR7bmV3IERhdGUoYS5leHBpcnkpLnRvTG9jYWxlRGF0ZVN0cmluZygpfWBcbiAgICAgICAgICAgIDogXCJcIn1cbiAgICAgICAgPC9kaXY+XG4gICAgICApKX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4pfVxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICBcbiAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTUwMFwiPlxuICAgIFRvdGFsOiB7cm93cy5sZW5ndGh9XG4gIDwvZGl2PlxuXG4gICAgey8qIEltcG9ydCAqL31cbiAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtNCBweS0yIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1zbGF0ZS0yMDAgYmctd2hpdGUgaG92ZXI6Ymctc2xhdGUtNTAgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bVwiPlxuICAgICAgPFVwbG9hZCBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgIEltcG9ydFxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgYWNjZXB0PVwiLmNzdiwueGxzeCwueGxzLC5qc29uXCJcbiAgICAgICAgY2xhc3NOYW1lPVwiaGlkZGVuXCJcbiAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUltcG9ydH1cbiAgICAgIC8+XG4gICAgPC9sYWJlbD5cblxuICAgIHsvKiBFeHBvcnQgKi99XG4gICAgPGJ1dHRvblxuICAgICAgb25DbGljaz17aGFuZGxlRXhwb3J0fVxuICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtNCBweS0yIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1zbGF0ZS0yMDAgYmctd2hpdGUgaG92ZXI6Ymctc2xhdGUtNTAgdGV4dC1zbSBmb250LW1lZGl1bVwiXG4gICAgPlxuICAgICAgPERvd25sb2FkIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAge3NlbGVjdGVkUm93cy5sZW5ndGggPiAwXG4gID8gYEV4cG9ydCBTZWxlY3RlZCAoJHtzZWxlY3RlZFJvd3MubGVuZ3RofSlgXG4gIDogXCJFeHBvcnRcIn1cbiAgICA8L2J1dHRvbj5cbjxidXR0b25cbiAgb25DbGljaz17aGFuZGxlUGRmRXhwb3J0fVxuICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIGJnLXdoaXRlIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOmJnLXNsYXRlLTUwXCJcbj5cbiAgPERvd25sb2FkIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuXG4gIHtzZWxlY3RlZFJvd3MubGVuZ3RoXG4gICAgPyBgUERGICgke3NlbGVjdGVkUm93cy5sZW5ndGh9KWBcbiAgICA6IFwiUERGIFJlcG9ydFwifVxuPC9idXR0b24+XG4gICAgey8qIEFkZCAqL31cbiAgICA8YnV0dG9uXG4gICAgICBvbkNsaWNrPXtvcGVuQWRkfVxuICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgYmctYnJhbmQtNjAwIHRleHQtd2hpdGUgcHgtNCBweS0yIHJvdW5kZWQtbGcgdGV4dC1zbSBmb250LXNlbWlib2xkXCJcbiAgICA+XG4gICAgICA8UGx1cyBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgIEFkZCBDb21wbGlhbmNlXG4gICAgPC9idXR0b24+XG5cbiAgPC9kaXY+XG5cbiAge3NlbGVjdGVkUm93cy5sZW5ndGggPiAwICYmIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtYnJhbmQtNjAwXCI+XG4gICAgICAgIHtzZWxlY3RlZFJvd3MubGVuZ3RofSBTZWxlY3RlZFxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEJ1bGtEZWxldGVPcGVuKHRydWUpfVxuICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJnLXJlZC02MDAgcHgtNCBweS0yIHRleHQtc20gdGV4dC13aGl0ZVwiXG4gICAgICA+XG4gICAgICAgIERlbGV0ZSBTZWxlY3RlZFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICl9XG48L2Rpdj5cblxuICAgICAgey8qIFRhYmxlICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjYXJkIG92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICA8dGFibGUgY2xhc3NOYW1lPVwidy1mdWxsIHRleHQtc21cIj5cbiAgICAgICAgICA8dGhlYWQgY2xhc3NOYW1lPVwiYmctc2xhdGUtNTAgdGV4dC1zbGF0ZS01MDAgdGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTNcIj5cbiAgPGlucHV0XG4gICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICBjaGVja2VkPXthbGxTZWxlY3RlZH1cbiAgICBvbkNoYW5nZT17dG9nZ2xlQWxsfVxuICAvPlxuPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LW1lZGl1bVwiPlByb2R1Y3Q8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtNCBweS0zIGZvbnQtbWVkaXVtXCI+VHlwZTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1tZWRpdW1cIj5MaWNlbnNlIC8gUmVnLjwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1tZWRpdW1cIj5Jc3N1ZSBEYXRlPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LW1lZGl1bVwiPkV4cGlyeSBEYXRlPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LW1lZGl1bVwiPlN0YXR1czwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1tZWRpdW1cIj5Db3VudHJ5PC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LW1lZGl1bVwiPkxhc3QgVXBkYXRlZDwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1tZWRpdW1cIj5BY3Rpb25zPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHkgY2xhc3NOYW1lPVwiZGl2aWRlLXkgZGl2aWRlLXNsYXRlLTEwMFwiPlxuICAgICAgICAgICAge3BhZ2VkLm1hcCgoYykgPT4gKFxuICAgICAgICAgICAgICA8dHIga2V5PXtjLmlkfSBjbGFzc05hbWU9XCJob3ZlcjpiZy1zbGF0ZS01MFwiPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTNcIj5cbiAgPGlucHV0XG4gICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICBjaGVja2VkPXtzZWxlY3RlZFJvd3MuaW5jbHVkZXMoYy5pZCl9XG4gICAgb25DaGFuZ2U9eygpID0+IHRvZ2dsZVJvdyhjLmlkKX1cbiAgLz5cbjwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTQgcHktM1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICB7Yy5wcm9kdWN0X2ltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgPyA8aW1nIHNyYz17aW1nU3JjKGMucHJvZHVjdF9pbWFnZSl9IGNsYXNzTmFtZT1cImgtMTAgdy0xMCByb3VuZGVkIG9iamVjdC1jb250YWluIGJvcmRlciBib3JkZXItc2xhdGUtMTAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA6IDxkaXYgY2xhc3NOYW1lPVwiaC0xMCB3LTEwIHJvdW5kZWQgYmctc2xhdGUtMTAwXCIgLz59XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb250LW1lZGl1bSB0ZXh0LXNsYXRlLTgwMFwiPntjLnByb2R1Y3RfbmFtZSA/PyBcIuKAlFwifTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXNsYXRlLTQwMFwiPntjLnNrdSA/PyBcIlwifTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTQgcHktM1wiPntjLmNvbXBsaWFuY2VfdHlwZX08L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1tb25vIHRleHQtc2xhdGUtNjAwXCI+e2MubGljZW5zZV9udW1iZXIgPz8gXCLigJRcIn08L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTMgdGV4dC1zbGF0ZS01MDBcIj57Yy5pc3N1ZV9kYXRlID8gbmV3IERhdGUoYy5pc3N1ZV9kYXRlKS50b0xvY2FsZURhdGVTdHJpbmcoKSA6IFwi4oCUXCJ9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHgtNCBweS0zXCI+XG4gICAgICAgICAgICAgICAgICB7Yy5leHBpcnlfZGF0ZSA/IChcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Yy5kYXlzX2xlZnQgIT0gbnVsbCAmJiBjLmRheXNfbGVmdCA8IDAgPyBcInRleHQtcm9zZS02MDBcIiA6IGMuZGF5c19sZWZ0ICE9IG51bGwgJiYgYy5kYXlzX2xlZnQgPCAzMCA/IFwidGV4dC1hbWJlci02MDBcIiA6IFwidGV4dC1zbGF0ZS03MDBcIn0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7bmV3IERhdGUoYy5leHBpcnlfZGF0ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge2MuZGF5c19sZWZ0ICE9IG51bGwgJiYgPGRpdiBjbGFzc05hbWU9e2B0ZXh0LXhzICR7Yy5kYXlzX2xlZnQgPCAwID8gXCJ0ZXh0LXJvc2UtNTAwXCIgOiBcInRleHQtc2xhdGUtNDAwXCJ9YH0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Yy5kYXlzX2xlZnQgPCAwID8gXCIoRXhwaXJlZClcIiA6IGAoSW4gJHtjLmRheXNfbGVmdH0gZGF5cylgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pn1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApIDogXCLigJRcIn1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTNcIj48c3BhbiBjbGFzc05hbWU9e2B0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgcHgtMiBweS0wLjUgcm91bmRlZC1mdWxsIGNhcGl0YWxpemUgJHtTVEFUVVNbYy5zdGF0dXNdID8/IFwiYmctc2xhdGUtMTAwXCJ9YH0+e2Muc3RhdHVzfTwvc3Bhbj48L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTNcIj57Yy5jb3VudHJ5ID8/IFwi4oCUXCJ9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHgtNCBweS0zIHRleHQtc2xhdGUtNTAwXCI+XG4gIHtjLnVwZGF0ZWRfYXQgPyAoXG4gICAgPGRpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIHtuZXcgRGF0ZShjLnVwZGF0ZWRfYXQpLnRvTG9jYWxlRGF0ZVN0cmluZyhcImVuLUlOXCIpfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1zbGF0ZS00MDBcIj5cbiAgICAgICAge25ldyBEYXRlKGMudXBkYXRlZF9hdCkudG9Mb2NhbGVUaW1lU3RyaW5nKFwiZW4tSU5cIiwge1xuICAgICAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgICAgIG1pbnV0ZTogXCIyLWRpZ2l0XCIsXG4gICAgICAgICAgc2Vjb25kOiBcIjItZGlnaXRcIixcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKSA6IChcbiAgICBcIuKAlFwiXG4gICl9XG48L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTMgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0aXRsZT1cIlZpZXdcIiBvbkNsaWNrPXsoKSA9PiBzZXREZXRhaWxJZChjLmlkKX0gY2xhc3NOYW1lPVwiaC04IHctOCBncmlkIHBsYWNlLWl0ZW1zLWNlbnRlciByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIHRleHQtc2xhdGUtNTAwIGhvdmVyOmJnLXNsYXRlLTUwXCI+PEV5ZSBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoZSkgPT4geyBlLnN0b3BQcm9wYWdhdGlvbigpOyBzZXRNZW51Rm9yKG1lbnVGb3IgPT09IGMuaWQgPyBudWxsIDogYy5pZCk7IH19IGNsYXNzTmFtZT1cImgtOCB3LTggZ3JpZCBwbGFjZS1pdGVtcy1jZW50ZXIgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCB0ZXh0LXNsYXRlLTUwMCBob3ZlcjpiZy1zbGF0ZS01MFwiPjxNb3JlVmVydGljYWwgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIHttZW51Rm9yID09PSBjLmlkICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX0gY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtNCB0b3AtMTIgei0yMCB3LTQ0IGJnLXdoaXRlIHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1zbGF0ZS0yMDAgc2hhZG93LWxnIHB5LTEgdGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB7IG9wZW5FZGl0KGMpOyBzZXRNZW51Rm9yKG51bGwpOyB9fSBjbGFzc05hbWU9XCJ3LWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0yIHRleHQtc20gdGV4dC1zbGF0ZS03MDAgaG92ZXI6Ymctc2xhdGUtNTBcIj48UGVuY2lsIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPiBFZGl0PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB7IHNldERldGFpbElkKGMuaWQpOyBzZXRNZW51Rm9yKG51bGwpOyB9fSBjbGFzc05hbWU9XCJ3LWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0yIHRleHQtc20gdGV4dC1zbGF0ZS03MDAgaG92ZXI6Ymctc2xhdGUtNTBcIj48VXBsb2FkIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPiBVcGxvYWQgRG9jdW1lbnQ8L2J1dHRvbj5cblxuICA8ZGl2IGNsYXNzTmFtZT1cIm15LTEgYm9yZGVyLXQgYm9yZGVyLXNsYXRlLTEwMFwiPjwvZGl2PlxuXG4gIDxidXR0b25cbiAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICBzZXREZWxldGVSb3coYyk7XG4gICAgICBzZXRNZW51Rm9yKG51bGwpO1xuICAgIH19XG4gICAgY2xhc3NOYW1lPVwidy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTMgcHktMiB0ZXh0LXNtIHRleHQtcmVkLTYwMCBob3ZlcjpiZy1yZWQtNTBcIlxuICA+XG4gICAgPFRyYXNoMiBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICBEZWxldGVcbiAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICB7cGFnZWQubGVuZ3RoID09PSAwICYmIDx0cj48dGQgY29sU3Bhbj17OH0gY2xhc3NOYW1lPVwicHgtNCBweS0xMiB0ZXh0LWNlbnRlciB0ZXh0LXNsYXRlLTQwMFwiPk5vIGNvbXBsaWFuY2UgcmVjb3Jkcy48L3RkPjwvdHI+fVxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTQgcHktMyB0ZXh0LXNtIHRleHQtc2xhdGUtNTAwXCI+XG4gICAgICAgICAgPHNwYW4+U2hvd2luZyB7cm93cy5sZW5ndGggPT09IDAgPyAwIDogKHBhZ2UgLSAxKSAqIHBhZ2VTaXplICsgMX0gdG8ge01hdGgubWluKHBhZ2UgKiBwYWdlU2l6ZSwgcm93cy5sZW5ndGgpfSBvZiB7cm93cy5sZW5ndGh9PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZD17cGFnZSA9PT0gMX0gb25DbGljaz17KCkgPT4gc2V0UGFnZShwYWdlIC0gMSl9IGNsYXNzTmFtZT1cInB4LTMgcHktMSByb3VuZGVkIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIGRpc2FibGVkOm9wYWNpdHktNDBcIj7igLk8L2J1dHRvbj5cbiAgICAgICAgICAgIHtBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b3RhbFBhZ2VzIH0pLnNsaWNlKDAsIDUpLm1hcCgoXywgaSkgPT4gKFxuICAgICAgICAgICAgICA8YnV0dG9uIGtleT17aX0gb25DbGljaz17KCkgPT4gc2V0UGFnZShpICsgMSl9IGNsYXNzTmFtZT17YHB4LTMgcHktMSByb3VuZGVkICR7cGFnZSA9PT0gaSArIDEgPyBcImJnLWJyYW5kLTYwMCB0ZXh0LXdoaXRlXCIgOiBcImJvcmRlciBib3JkZXItc2xhdGUtMjAwXCJ9YH0+e2kgKyAxfTwvYnV0dG9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkPXtwYWdlID09PSB0b3RhbFBhZ2VzfSBvbkNsaWNrPXsoKSA9PiBzZXRQYWdlKHBhZ2UgKyAxKX0gY2xhc3NOYW1lPVwicHgtMyBweS0xIHJvdW5kZWQgYm9yZGVyIGJvcmRlci1zbGF0ZS0yMDAgZGlzYWJsZWQ6b3BhY2l0eS00MFwiPuKAujwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRGV0YWlsIG1vZGFsICovfVxuICAgICAge2RldGFpbElkICYmIChcbiAgICAgICAgPENvbXBsaWFuY2VEZXRhaWxNb2RhbCBjaWQ9e2RldGFpbElkfVxuICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldERldGFpbElkKG51bGwpfVxuICAgICAgICAgIG9uRWRpdD17KCkgPT4geyBjb25zdCByID0gcm93cy5maW5kKCh4KSA9PiB4LmlkID09PSBkZXRhaWxJZCk7IGlmIChyKSBvcGVuRWRpdChyKTsgfX1cbiAgICAgICAgICBvbkNoYW5nZWQ9e2xvYWR9IC8+XG4gICAgICApfVxuICAgICAgXG4gICAgICB7ZGVsZXRlUm93ICYmIChcbiAgPGRpdlxuICAgIGNsYXNzTmFtZT1cImZpeGVkIGluc2V0LTAgei01MCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBiZy1ibGFjay81MCBwLTRcIlxuICAgIG9uQ2xpY2s9eygpID0+IHNldERlbGV0ZVJvdyhudWxsKX1cbiAgPlxuICAgIDxkaXZcbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIG1heC13LW1kIHJvdW5kZWQtMnhsIGJnLXdoaXRlIHNoYWRvdy14bFwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItYiBweC02IHB5LTRcIj5cbiAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1ib2xkIHRleHQtc2xhdGUtOTAwXCI+XG4gICAgICAgICAgRGVsZXRlIENvbXBsaWFuY2VcbiAgICAgICAgPC9oMj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNiBzcGFjZS15LTRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxuICAgICAgICAgIHtkZWxldGVSb3cucHJvZHVjdF9pbWFnZSA/IChcbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgc3JjPXtpbWdTcmMoZGVsZXRlUm93LnByb2R1Y3RfaW1hZ2UpfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTE2IHctMTYgcm91bmRlZC1sZyBib3JkZXIgb2JqZWN0LWNvbnRhaW5cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLTE2IHctMTYgcm91bmRlZC1sZyBiZy1zbGF0ZS0xMDBcIiAvPlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkIHRleHQtc2xhdGUtOTAwXCI+XG4gICAgICAgICAgICAgIHtkZWxldGVSb3cucHJvZHVjdF9uYW1lfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTUwMFwiPlxuICAgICAgICAgICAgICB7ZGVsZXRlUm93LmNvbXBsaWFuY2VfdHlwZX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1zbGF0ZS00MDBcIj5cbiAgICAgICAgICAgICAge2RlbGV0ZVJvdy5saWNlbnNlX251bWJlciB8fCBcIk5vIExpY2Vuc2UgTnVtYmVyXCJ9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItcmVkLTIwMCBiZy1yZWQtNTAgcC00XCI+XG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC03MDBcIj5cbiAgICAgICAgICAgIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBjb21wbGlhbmNlIHJlY29yZD9cbiAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQteHMgdGV4dC1yZWQtNjAwXCI+XG4gICAgICAgICAgICBUaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC0zIGJvcmRlci10IHB4LTYgcHktNFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RGVsZXRlUm93KG51bGwpfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1zbGF0ZS0yMDAgcHgtNCBweS0yIHRleHQtc21cIlxuICAgICAgICA+XG4gICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXtjb25maXJtRGVsZXRlfVxuICAgICAgICAgIGRpc2FibGVkPXtkZWxldGluZ31cbiAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJnLXJlZC02MDAgcHgtNSBweS0yIHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXdoaXRlIGhvdmVyOmJnLXJlZC03MDAgZGlzYWJsZWQ6b3BhY2l0eS01MFwiXG4gICAgICAgID5cbiAgICAgICAgICB7ZGVsZXRpbmcgPyBcIkRlbGV0aW5nLi4uXCIgOiBcIkRlbGV0ZVwifVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbil9XG5cbntidWxrRGVsZXRlT3BlbiAmJiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiZml4ZWQgaW5zZXQtMCB6LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJnLWJsYWNrLzUwXCI+XG4gICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgbWF4LXctbWQgcm91bmRlZC14bCBiZy13aGl0ZSBzaGFkb3cteGxcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLWIgcHgtNiBweS00XCI+XG4gICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtYm9sZFwiPlxuICAgICAgICAgIERlbGV0ZSBDb21wbGlhbmNlIFJlY29yZHNcbiAgICAgICAgPC9oMj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNsYXRlLTcwMFwiPlxuICAgICAgICAgIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGVcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LWJvbGQgdGV4dC1yZWQtNjAwXCI+XG4gICAgICAgICAgICB7XCIgXCJ9XG4gICAgICAgICAgICB7c2VsZWN0ZWRSb3dzLmxlbmd0aH0gY29tcGxpYW5jZSByZWNvcmRcbiAgICAgICAgICAgIHtzZWxlY3RlZFJvd3MubGVuZ3RoID4gMSA/IFwic1wiIDogXCJcIn1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgP1xuICAgICAgICA8L3A+XG5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtc2xhdGUtNTAwXCI+XG4gICAgICAgICAgVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMyBib3JkZXItdCBweC02IHB5LTRcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEJ1bGtEZWxldGVPcGVuKGZhbHNlKX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBweC00IHB5LTJcIlxuICAgICAgICA+XG4gICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXtkZWxldGVTZWxlY3RlZH1cbiAgICAgICAgICBkaXNhYmxlZD17ZGVsZXRpbmd9XG4gICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1sZyBiZy1yZWQtNjAwIHB4LTUgcHktMiB0ZXh0LXdoaXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIHtkZWxldGluZ1xuICAgICAgICAgICAgPyBcIkRlbGV0aW5nLi4uXCJcbiAgICAgICAgICAgIDogYERlbGV0ZSAoJHtzZWxlY3RlZFJvd3MubGVuZ3RofSlgfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbil9XG4gICAgICB7LyogQWRkL0VkaXQgZm9ybSBtb2RhbCAqL31cbiAgICAgIHtmb3JtICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCBpbnNldC0wIGJnLWJsYWNrLzQwIHotNTAgZ3JpZCBwbGFjZS1pdGVtcy1jZW50ZXIgcC00IG92ZXJmbG93LXktYXV0b1wiIG9uQ2xpY2s9eygpID0+IHNldEZvcm0obnVsbCl9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2hpdGUgcm91bmRlZC0yeGwgdy1mdWxsIG1heC13LWxnIG15LTQgbWF4LWgtWzkydmhdIG92ZXJmbG93LXktYXV0b1wiIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTUgcHktNCBib3JkZXItYiBib3JkZXItc2xhdGUtMTAwIHN0aWNreSB0b3AtMCBiZy13aGl0ZSByb3VuZGVkLXQtMnhsXCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJmb250LWJvbGRcIj57Zm9ybS5faWQgPyBcIkVkaXQgQ29tcGxpYW5jZVwiIDogXCJBZGQgQ29tcGxpYW5jZVwifTwvaDM+XG4gICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gc2V0Rm9ybShudWxsKX0+PFggY2xhc3NOYW1lPVwiaC01IHctNSB0ZXh0LXNsYXRlLTQwMFwiIC8+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC01IGdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgPEZsZCBsYWJlbD1cIlByb2R1Y3RcIiBmdWxsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgdmFsdWU9e2Zvcm0ucHJvZHVjdF9pZH0gb25DaGFuZ2U9eyhlKSA9PiBzZXRGb3JtKHsgLi4uZm9ybSwgcHJvZHVjdF9pZDogZS50YXJnZXQudmFsdWUgfSl9IGNsYXNzTmFtZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IHByb2R1Y3Q8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIHtwcm9kdWN0cy5tYXAoKHApID0+IDxvcHRpb24ga2V5PXtwLmlkfSB2YWx1ZT17cC5pZH0+e3AubmFtZX08L29wdGlvbj4pfVxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L0ZsZD5cbiAgICAgICAgICAgICAgPEZsZCBsYWJlbD1cIkNvbXBsaWFuY2UgVHlwZVwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgdmFsdWU9e2Zvcm0uY29tcGxpYW5jZV90eXBlfSBvbkNoYW5nZT17KGUpID0+IHNldEZvcm0oeyAuLi5mb3JtLCBjb21wbGlhbmNlX3R5cGU6IGUudGFyZ2V0LnZhbHVlIH0pfSBjbGFzc05hbWU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAge1RZUEVTLm1hcCgodCkgPT4gPG9wdGlvbiBrZXk9e3R9Pnt0fTwvb3B0aW9uPil9XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvRmxkPlxuICAgICAgICAgICAgICA8SW5wIGxhYmVsPVwiTGljZW5zZSAvIFJlZy4gTm8uXCIgdj17Zm9ybS5saWNlbnNlX251bWJlcn0gb249eyh4KSA9PiBzZXRGb3JtKHsgLi4uZm9ybSwgbGljZW5zZV9udW1iZXI6IHggfSl9IC8+XG4gICAgICAgICAgICAgIDxJbnAgbGFiZWw9XCJMaWNlbnNlIE5hbWVcIiB2PXtmb3JtLmxpY2Vuc2VfbmFtZX0gb249eyh4KSA9PiBzZXRGb3JtKHsgLi4uZm9ybSwgbGljZW5zZV9uYW1lOiB4IH0pfSAvPlxuICAgICAgICAgICAgICA8SW5wIGxhYmVsPVwiSXNzdWluZyBBdXRob3JpdHlcIiB2PXtmb3JtLmlzc3VpbmdfYXV0aG9yaXR5fSBvbj17KHgpID0+IHNldEZvcm0oeyAuLi5mb3JtLCBpc3N1aW5nX2F1dGhvcml0eTogeCB9KX0gLz5cbiAgICAgICAgICAgICAgPElucCBsYWJlbD1cIklzc3VlIERhdGVcIiB0eXBlPVwiZGF0ZVwiIHY9e2Zvcm0uaXNzdWVfZGF0ZX0gb249eyh4KSA9PiBzZXRGb3JtKHsgLi4uZm9ybSwgaXNzdWVfZGF0ZTogeCB9KX0gLz5cbiAgICAgICAgICAgICAgPElucCBsYWJlbD1cIkV4cGlyeSBEYXRlXCIgdHlwZT1cImRhdGVcIiB2PXtmb3JtLmV4cGlyeV9kYXRlfSBvbj17KHgpID0+IHNldEZvcm0oeyAuLi5mb3JtLCBleHBpcnlfZGF0ZTogeCB9KX0gLz5cbiAgICAgICAgICAgICAgPElucCBsYWJlbD1cIkNvdW50cnlcIiB2PXtmb3JtLmNvdW50cnl9IG9uPXsoeCkgPT4gc2V0Rm9ybSh7IC4uLmZvcm0sIGNvdW50cnk6IHggfSl9IC8+XG4gICAgICAgICAgICAgIDxJbnAgbGFiZWw9XCJTdGF0ZVwiIHY9e2Zvcm0uc3RhdGV9IG9uPXsoeCkgPT4gc2V0Rm9ybSh7IC4uLmZvcm0sIHN0YXRlOiB4IH0pfSAvPlxuICAgICAgICAgICAgICA8SW5wIGxhYmVsPVwiQ2F0ZWdvcnlcIiB2PXtmb3JtLmNhdGVnb3J5fSBvbj17KHgpID0+IHNldEZvcm0oeyAuLi5mb3JtLCBjYXRlZ29yeTogeCB9KX0gLz5cbiAgICAgICAgICAgICAgPElucCBsYWJlbD1cIkFwcGxpY2FibGUgVG9cIiB2PXtmb3JtLmFwcGxpY2FibGVfdG99IG9uPXsoeCkgPT4gc2V0Rm9ybSh7IC4uLmZvcm0sIGFwcGxpY2FibGVfdG86IHggfSl9IC8+XG4gICAgICAgICAgICAgIDxJbnAgbGFiZWw9XCJNYW51ZmFjdHVyaW5nIFBsYW50XCIgdj17Zm9ybS5wbGFudH0gb249eyh4KSA9PiBzZXRGb3JtKHsgLi4uZm9ybSwgcGxhbnQ6IHggfSl9IC8+XG4gICAgICAgICAgICAgIDxJbnAgbGFiZWw9XCJSZW1hcmtzXCIgZnVsbCB2PXtmb3JtLnJlbWFya3N9IG9uPXsoeCkgPT4gc2V0Rm9ybSh7IC4uLmZvcm0sIHJlbWFya3M6IHggfSl9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMyBweC01IHB5LTQgYm9yZGVyLXQgYm9yZGVyLXNsYXRlLTEwMCBzdGlja3kgYm90dG9tLTAgYmctd2hpdGVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBzZXRGb3JtKG51bGwpfSBjbGFzc05hbWU9XCJweC01IHB5LTIgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCB0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17c2F2ZUZvcm19IGNsYXNzTmFtZT1cInB4LTYgcHktMiByb3VuZGVkLWxnIGJnLWJyYW5kLTYwMCB0ZXh0LXdoaXRlIHRleHQtc20gZm9udC1zZW1pYm9sZFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8c3R5bGU+e2AuaW5wdXR7bWFyZ2luLXRvcDouMjVyZW07d2lkdGg6MTAwJTtwYWRkaW5nOi41cmVtIC43NXJlbTtib3JkZXItcmFkaXVzOi41cmVtO2JvcmRlcjoxcHggc29saWQgI2UyZThmMDtmb250LXNpemU6Ljg3NXJlbX1gfTwvc3R5bGU+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEtwaSh7IGxhYmVsLCB2YWx1ZSwgc3ViLCBzdWJDb2xvciA9IFwidGV4dC1zbGF0ZS00MDBcIiwgaWNvbiwgdGludCB9OiBhbnkpIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImNhcmQgcC01XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQgZ2FwLTRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BoLTEyIHctMTIgcm91bmRlZC14bCBncmlkIHBsYWNlLWl0ZW1zLWNlbnRlciBzaHJpbmstMCAke3RpbnR9YH0+e2ljb259PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTUwMFwiPntsYWJlbH08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtZXh0cmFib2xkIHRleHQtc2xhdGUtOTAwIG10LTAuNVwiPnt2YWx1ZX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YHRleHQteHMgZm9udC1tZWRpdW0gbXQtMSAke3N1YkNvbG9yfWB9PntzdWJ9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5mdW5jdGlvbiBGaWx0ZXIoeyBsYWJlbCwgdmFsdWUsIG9uQ2hhbmdlLCBvcHRzLCBhbGwgfToge1xuICBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBvbkNoYW5nZTogKHY6IHN0cmluZykgPT4gdm9pZDsgb3B0czogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXTsgYWxsOiBzdHJpbmc7XG59KSB7XG4gIHJldHVybiAoXG4gICAgPGxhYmVsIGNsYXNzTmFtZT1cImJsb2NrXCI+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtc2xhdGUtNTAwXCI+e2xhYmVsfTwvc3Bhbj5cbiAgICAgIDxzZWxlY3QgdmFsdWU9e3ZhbHVlfSBvbkNoYW5nZT17KGUpID0+IG9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX0gY2xhc3NOYW1lPVwibXQtMSBibG9jayBweC0zIHB5LTIgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCB0ZXh0LXNtIG1pbi13LVsxMzBweF0gY2FwaXRhbGl6ZVwiPlxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e2FsbH08L29wdGlvbj5cbiAgICAgICAge29wdHMubWFwKChvKSA9PiA8b3B0aW9uIGtleT17by52YWx1ZX0gdmFsdWU9e28udmFsdWV9PntvLmxhYmVsfTwvb3B0aW9uPil9XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2xhYmVsPlxuICApO1xufVxuZnVuY3Rpb24gRmxkKHsgbGFiZWwsIGNoaWxkcmVuLCBmdWxsIH06IGFueSkge1xuICByZXR1cm4gPGxhYmVsIGNsYXNzTmFtZT17YGJsb2NrICR7ZnVsbCA/IFwiY29sLXNwYW4tMlwiIDogXCJcIn1gfT48c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+e2xhYmVsfTwvc3Bhbj57Y2hpbGRyZW59PC9sYWJlbD47XG59XG5mdW5jdGlvbiBJbnAoeyBsYWJlbCwgdiwgb24sIHR5cGUgPSBcInRleHRcIiwgZnVsbCB9OiB7IGxhYmVsOiBzdHJpbmc7IHY6IGFueTsgb246ICh4OiBzdHJpbmcpID0+IHZvaWQ7IHR5cGU/OiBzdHJpbmc7IGZ1bGw/OiBib29sZWFuIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8bGFiZWwgY2xhc3NOYW1lPXtgYmxvY2sgJHtmdWxsID8gXCJjb2wtc3Bhbi0yXCIgOiBcIlwifWB9PlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bVwiPntsYWJlbH08L3NwYW4+XG4gICAgICA8aW5wdXQgdHlwZT17dHlwZX0gdmFsdWU9e3YgPz8gXCJcIn0gb25DaGFuZ2U9eyhlKSA9PiBvbihlLnRhcmdldC52YWx1ZSl9IGNsYXNzTmFtZT1cImlucHV0XCIgLz5cbiAgICA8L2xhYmVsPlxuICApO1xufVxuIl0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIlBhY2thZ2UiLCJDaGVja0NpcmNsZTIiLCJDbG9jayIsIkFsZXJ0VHJpYW5nbGUiLCJDYWxlbmRhciIsIlNlYXJjaCIsIlBsdXMiLCJEb3dubG9hZCIsIkV5ZSIsIlBlbmNpbCIsIlVwbG9hZCIsIk1vcmVWZXJ0aWNhbCIsIlgiLCJUcmFzaDIiLCJhcGkiLCJhcGlCYXNlIiwiQ29tcGxpYW5jZURldGFpbE1vZGFsIiwianNQREYiLCJhdXRvVGFibGUiLCJpbWdTcmMiLCJ1cmwiLCJzdGFydHNXaXRoIiwiVFlQRVMiLCJTVEFUVVMiLCJjb21wbGV0ZSIsInBlbmRpbmciLCJleHBpcmluZyIsImV4cGlyZWQiLCJDb21wbGlhbmNlIiwicyIsInJvd3MiLCJzZXRSb3dzIiwic2V0UyIsInByb2R1Y3RzIiwic2V0UHJvZHVjdHMiLCJmaWx0ZXJzIiwic2V0RmlsdGVycyIsInNlYXJjaCIsInN0YXR1c19maWx0ZXIiLCJjb21wbGlhbmNlX3R5cGUiLCJjb3VudHJ5IiwiZGV0YWlsSWQiLCJzZXREZXRhaWxJZCIsIm1lbnVGb3IiLCJzZXRNZW51Rm9yIiwiZm9ybSIsInNldEZvcm0iLCJwYWdlIiwic2V0UGFnZSIsInBhZ2VTaXplIiwic2hvd0FsZXJ0cyIsInNldFNob3dBbGVydHMiLCJkZWxldGVSb3ciLCJzZXREZWxldGVSb3ciLCJkZWxldGluZyIsInNldERlbGV0aW5nIiwic2VsZWN0ZWRSb3dzIiwic2V0U2VsZWN0ZWRSb3dzIiwiYnVsa0RlbGV0ZU9wZW4iLCJzZXRCdWxrRGVsZXRlT3BlbiIsImxvYWQiLCJxcyIsIlVSTFNlYXJjaFBhcmFtcyIsIk9iamVjdCIsImVudHJpZXMiLCJmaWx0ZXIiLCJ2IiwidG9TdHJpbmciLCJ0aGVuIiwiY2F0Y2giLCJkYXRhIiwiZCIsIml0ZW1zIiwicGFnZWQiLCJzbGljZSIsInRvdGFsUGFnZXMiLCJNYXRoIiwibWF4IiwiY2VpbCIsImxlbmd0aCIsInNldCIsImsiLCJmIiwiaGFuZGxlRXhwb3J0IiwiZXhwb3J0Um93cyIsInIiLCJpbmNsdWRlcyIsImlkIiwiaGVhZGVycyIsImNzdiIsImpvaW4iLCJtYXAiLCJwcm9kdWN0X25hbWUiLCJza3UiLCJsaWNlbnNlX251bWJlciIsImxpY2Vuc2VfbmFtZSIsImlzc3VpbmdfYXV0aG9yaXR5IiwiaXNzdWVfZGF0ZSIsImV4cGlyeV9kYXRlIiwiZGF5c19sZWZ0Iiwic3RhdHVzIiwic3RhdGUiLCJjYXRlZ29yeSIsImFwcGxpY2FibGVfdG8iLCJwbGFudCIsInJlbWFya3MiLCJjcmVhdGVkX2J5IiwiY3JlYXRlZF9hdCIsIkRhdGUiLCJ0b0xvY2FsZVN0cmluZyIsInVwZGF0ZWRfYXQiLCJkb2N1bWVudF91cmwiLCJibG9iIiwiQmxvYiIsInR5cGUiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJhIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaHJlZiIsImRvd25sb2FkIiwidG9JU09TdHJpbmciLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjbGljayIsInJlbW92ZUNoaWxkIiwicmV2b2tlT2JqZWN0VVJMIiwiaGFuZGxlSW1wb3J0IiwiZSIsImZpbGUiLCJ0YXJnZXQiLCJmaWxlcyIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJmZXRjaCIsIm1ldGhvZCIsIkF1dGhvcml6YXRpb24iLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiYWxlcnQiLCJ2YWx1ZSIsImhhbmRsZVBkZkV4cG9ydCIsImRvYyIsIm9yaWVudGF0aW9uIiwidW5pdCIsImZvcm1hdCIsImltZyIsIkltYWdlIiwic3JjIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvbmxvYWQiLCJvbmVycm9yIiwiYWRkSW1hZ2UiLCJzZXRGb250Iiwic2V0Rm9udFNpemUiLCJ0ZXh0Iiwic2V0VGV4dENvbG9yIiwic2V0RHJhd0NvbG9yIiwibGluZSIsImFsaWduIiwic3RhcnRZIiwiaGVhZCIsInRvTG9jYWxlRGF0ZVN0cmluZyIsInN0eWxlcyIsImZvbnRTaXplIiwiY2VsbFBhZGRpbmciLCJoZWFkU3R5bGVzIiwiZmlsbENvbG9yIiwidGV4dENvbG9yIiwiZm9udFN0eWxlIiwiYWx0ZXJuYXRlUm93U3R5bGVzIiwibWFyZ2luIiwibGVmdCIsInJpZ2h0IiwiZGlkRHJhd1BhZ2UiLCJwYWdlTnVtYmVyIiwiaW50ZXJuYWwiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsInNhdmUiLCJjb25maXJtRGVsZXRlIiwiZXJyIiwidG9nZ2xlUm93IiwicHJldiIsIngiLCJhbGxTZWxlY3RlZCIsImV2ZXJ5IiwidG9nZ2xlQWxsIiwic29tZSIsIlNldCIsImRlbGV0ZVNlbGVjdGVkIiwiYWxsIiwib3BlbkFkZCIsInByb2R1Y3RfaWQiLCJfaWQiLCJvcGVuRWRpdCIsInNhdmVGb3JtIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaXYiLCJjbGFzc05hbWUiLCJvbkNsaWNrIiwiaDIiLCJLcGkiLCJsYWJlbCIsInRvdGFsX3Byb2R1Y3RzIiwic3ViIiwiaWNvbiIsInRpbnQiLCJjb21wbGV0ZV9wY3QiLCJzdWJDb2xvciIsInBlbmRpbmdfcGN0IiwiZXhwaXJlZF9wY3QiLCJpbnB1dCIsIm9uQ2hhbmdlIiwicGxhY2Vob2xkZXIiLCJGaWx0ZXIiLCJvcHRzIiwidCIsImFsZXJ0cyIsImJ1dHRvbiIsImkiLCJudW1iZXIiLCJleHBpcnkiLCJhY2NlcHQiLCJzcGFuIiwidGFibGUiLCJ0aGVhZCIsInRyIiwidGgiLCJjaGVja2VkIiwidGJvZHkiLCJjIiwidGQiLCJwcm9kdWN0X2ltYWdlIiwidG9Mb2NhbGVUaW1lU3RyaW5nIiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsInRpdGxlIiwic3RvcFByb3BhZ2F0aW9uIiwiY29sU3BhbiIsIm1pbiIsImRpc2FibGVkIiwiQXJyYXkiLCJmcm9tIiwiXyIsImNpZCIsIm9uQ2xvc2UiLCJvbkVkaXQiLCJmaW5kIiwib25DaGFuZ2VkIiwicCIsImgzIiwiRmxkIiwiZnVsbCIsInNlbGVjdCIsIm9wdGlvbiIsIm5hbWUiLCJJbnAiLCJvbiIsInN0eWxlIiwibyIsImNoaWxkcmVuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/dashboard/compliance/page.tsx\n"));
/***/ }),
/***/ "(app-pages-browser)/./components/ComplianceDetailModal.tsx":
/*!**********************************************!*\
!*** ./components/ComplianceDetailModal.tsx ***!
\**********************************************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ ComplianceDetailModal; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! __barrel_optimize__?names=ExternalLink,FileText,Pencil,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/x.js\");\n/* harmony import */ var _barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! __barrel_optimize__?names=ExternalLink,FileText,Pencil,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/file-text.js\");\n/* harmony import */ var _barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! __barrel_optimize__?names=ExternalLink,FileText,Pencil,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/pencil.js\");\n/* harmony import */ var _barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! __barrel_optimize__?names=ExternalLink,FileText,Pencil,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/upload.js\");\n/* harmony import */ var _barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! __barrel_optimize__?names=ExternalLink,FileText,Pencil,Upload,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/external-link.js\");\n/* harmony import */ var _lib_api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/api */ \"(app-pages-browser)/./lib/api.ts\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\nfunction imgSrc(url) {\n if (!url) return \"\";\n if (url.startsWith(\"data:\") || url.startsWith(\"http\")) return url;\n return \"\".concat(_lib_api__WEBPACK_IMPORTED_MODULE_2__.apiBase).concat(url);\n}\nconst STATUS = {\n complete: \"bg-emerald-50 text-emerald-700\",\n pending: \"bg-amber-50 text-amber-700\",\n expiring: \"bg-amber-50 text-amber-700\",\n expired: \"bg-rose-50 text-rose-700\"\n};\nfunction ComplianceDetailModal(param) {\n let { cid, onClose, onEdit, onChanged } = param;\n var _d_documents;\n _s();\n const [d, setD] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [tab, setTab] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"overview\");\n const fileRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n function load() {\n (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__.api)(\"/compliance/\".concat(cid, \"/detail\")).then(setD).catch(()=>{});\n }\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n load();\n }, [\n cid\n ]);\n async function onUpload(e) {\n var _e_target_files;\n const file = (_e_target_files = e.target.files) === null || _e_target_files === void 0 ? void 0 : _e_target_files[0];\n if (!file) return;\n const r = new FileReader();\n r.onload = async ()=>{\n await (0,_lib_api__WEBPACK_IMPORTED_MODULE_2__.api)(\"/compliance/\".concat(cid, \"/document\"), {\n method: \"POST\",\n body: JSON.stringify({\n data_url: r.result,\n filename: file.name\n })\n });\n load();\n onChanged();\n };\n r.readAsDataURL(file);\n }\n if (!d) return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"fixed inset-0 bg-black/40 z-50 grid place-items-center p-4\",\n onClick: onClose,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"bg-white rounded-2xl w-full max-w-md p-5\",\n onClick: (e)=>e.stopPropagation(),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"skeleton h-40 rounded-xl\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 48,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 47,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 46,\n columnNumber: 5\n }, this);\n const expColor = d.days_left != null && d.days_left < 0 ? \"text-rose-600\" : d.days_left != null && d.days_left < 30 ? \"text-amber-600\" : \"text-slate-700\";\n var _d_product_name, _d_sku, _STATUS_d_status, _d_documents_length, _d_documents1, _d_history;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"fixed inset-0 bg-black/40 z-50 grid place-items-center p-4 overflow-y-auto\",\n onClick: onClose,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"bg-white rounded-2xl w-full max-w-md my-4 flex flex-col max-h-[92vh] overflow-y-auto\",\n onClick: (e)=>e.stopPropagation(),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between px-5 py-4 border-b border-slate-100 sticky top-0 bg-white rounded-t-2xl\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h3\", {\n className: \"font-bold\",\n children: \"Compliance Details\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 60,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: onClose,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: \"h-5 w-5 text-slate-400\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 61,\n columnNumber: 37\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 61,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 59,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"p-5 space-y-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-3\",\n children: [\n d.product_image ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n src: imgSrc(d.product_image),\n className: \"h-14 w-14 rounded-lg object-contain border border-slate-100\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 67,\n columnNumber: 17\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"h-14 w-14 rounded-lg bg-slate-100\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 68,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"font-bold\",\n children: (_d_product_name = d.product_name) !== null && _d_product_name !== void 0 ? _d_product_name : \"—\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 70,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-slate-400\",\n children: [\n \"SKU: \",\n (_d_sku = d.sku) !== null && _d_sku !== void 0 ? _d_sku : \"—\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 71,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 69,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-xs font-semibold px-2 py-0.5 rounded-full capitalize \".concat((_STATUS_d_status = STATUS[d.status]) !== null && _STATUS_d_status !== void 0 ? _STATUS_d_status : \"bg-slate-100\"),\n children: d.status\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 73,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 65,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-1 border-b border-slate-200 text-sm\",\n children: [\n [\n \"overview\",\n \"Overview\"\n ],\n [\n \"documents\",\n \"Documents (\".concat((_d_documents_length = (_d_documents = d.documents) === null || _d_documents === void 0 ? void 0 : _d_documents.length) !== null && _d_documents_length !== void 0 ? _d_documents_length : 0, \")\")\n ],\n [\n \"history\",\n \"History\"\n ]\n ].map((param)=>{\n let [t, l] = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setTab(t),\n className: \"px-3 py-2 border-b-2 -mb-px font-medium \".concat(tab === t ? \"border-brand-600 text-brand-700\" : \"border-transparent text-slate-500\"),\n children: l\n }, t, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 78,\n columnNumber: 15\n }, this);\n })\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 76,\n columnNumber: 11\n }, this),\n tab === \"overview\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2 text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Compliance Type\",\n value: d.compliance_type\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 85,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"License / Reg. No.\",\n value: d.license_number\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 86,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"License Name\",\n value: d.license_name\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 87,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Issue Date\",\n value: fmt(d.issue_date)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 88,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between border-b border-slate-50 py-1.5\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-slate-400\",\n children: \"Expiry Date\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 90,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-medium text-right \".concat(expColor),\n children: [\n fmt(d.expiry_date),\n d.days_left != null && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"block text-xs\",\n children: d.days_left < 0 ? \"(Expired)\" : \"(In \".concat(d.days_left, \" days)\")\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 93,\n columnNumber: 43\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 91,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 89,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Status\",\n value: d.status,\n cap: true\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 98,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Issuing Authority\",\n value: d.issuing_authority\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 99,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Country\",\n value: d.country\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 100,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"State\",\n value: d.state\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 101,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Category\",\n value: d.category\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 102,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Applicable To\",\n value: d.applicable_to\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 103,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Manufacturing Plant\",\n value: d.plant\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 104,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Remarks\",\n value: d.remarks\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 105,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Created By\",\n value: d.created_by\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 106,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Created On\",\n value: fmt(d.created_at, true)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 107,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Row, {\n label: \"Last Updated\",\n value: fmt(d.updated_at, true)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 108,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 84,\n columnNumber: 13\n }, this),\n tab === \"documents\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2 text-sm\",\n children: [\n ((_d_documents1 = d.documents) !== null && _d_documents1 !== void 0 ? _d_documents1 : []).map((doc, i)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"a\", {\n href: \"\".concat(_lib_api__WEBPACK_IMPORTED_MODULE_2__.apiBase).concat(doc.url),\n target: \"_blank\",\n rel: \"noreferrer\",\n className: \"flex items-center gap-2 border border-slate-100 rounded-lg px-3 py-2 hover:bg-slate-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"h-4 w-4 text-slate-400\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 117,\n columnNumber: 19\n }, this),\n \" \",\n doc.name\n ]\n }, i, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 115,\n columnNumber: 17\n }, this)),\n (!d.documents || d.documents.length === 0) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-slate-400\",\n children: \"No documents uploaded.\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 120,\n columnNumber: 62\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 113,\n columnNumber: 13\n }, this),\n tab === \"history\" && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-1 text-sm\",\n children: ((_d_history = d.history) !== null && _d_history !== void 0 ? _d_history : []).map((h, i)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between border-b border-slate-50 py-1.5\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: [\n h.action,\n \" \",\n h.by ? \"\\xb7 \".concat(h.by) : \"\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 128,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-slate-400\",\n children: fmt(h.at, true)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 129,\n columnNumber: 19\n }, this)\n ]\n }, i, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 127,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 125,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2 pt-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid grid-cols-2 gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: onEdit,\n className: \"flex items-center justify-center gap-1 border border-slate-200 rounded-lg py-2 text-sm font-medium\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 138,\n columnNumber: 17\n }, this),\n \" Edit\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 137,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>{\n var _fileRef_current;\n return (_fileRef_current = fileRef.current) === null || _fileRef_current === void 0 ? void 0 : _fileRef_current.click();\n },\n className: \"flex items-center justify-center gap-1 bg-brand-600 text-white rounded-lg py-2 text-sm font-semibold\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 141,\n columnNumber: 17\n }, this),\n \" Upload Document\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 140,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n ref: fileRef,\n type: \"file\",\n accept: \"application/pdf,image/*\",\n className: \"hidden\",\n onChange: onUpload\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 143,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 136,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"a\", {\n href: \"#\",\n onClick: (e)=>e.preventDefault(),\n className: \"flex items-center justify-center gap-1 border border-brand-200 text-brand-700 rounded-lg py-2 text-sm font-medium\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ExternalLink_FileText_Pencil_Upload_X_lucide_react__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 147,\n columnNumber: 15\n }, this),\n \" View on Verification Page\"\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 145,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 135,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 64,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 58,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 57,\n columnNumber: 5\n }, this);\n}\n_s(ComplianceDetailModal, \"fc/dYR0NjD41DuieICnRXluE9Y4=\");\n_c = ComplianceDetailModal;\nfunction fmt(d) {\n let time = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;\n if (!d) return \"—\";\n const dt = new Date(d);\n return isNaN(+dt) ? \"—\" : time ? dt.toLocaleString() : dt.toLocaleDateString();\n}\nfunction Row(param) {\n let { label, value, cap } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between border-b border-slate-50 py-1.5\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-slate-400\",\n children: label\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 164,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-medium text-slate-700 text-right \".concat(cap ? \"capitalize\" : \"\"),\n children: value !== null && value !== void 0 ? value : \"—\"\n }, void 0, false, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 165,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\company_projects\\\\verify pack\\\\frontend\\\\components\\\\ComplianceDetailModal.tsx\",\n lineNumber: 163,\n columnNumber: 5\n }, this);\n}\n_c1 = Row;\nvar _c, _c1;\n$RefreshReg$(_c, \"ComplianceDetailModal\");\n$RefreshReg$(_c1, \"Row\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2NvbXBvbmVudHMvQ29tcGxpYW5jZURldGFpbE1vZGFsLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFDb0Q7QUFDcUI7QUFDaEM7QUFFekMsU0FBU1UsT0FBT0MsR0FBWTtJQUMxQixJQUFJLENBQUNBLEtBQUssT0FBTztJQUNqQixJQUFJQSxJQUFJQyxVQUFVLENBQUMsWUFBWUQsSUFBSUMsVUFBVSxDQUFDLFNBQVMsT0FBT0Q7SUFDOUQsT0FBTyxHQUFhQSxPQUFWRiw2Q0FBT0EsRUFBTyxPQUFKRTtBQUN0QjtBQUlBLE1BQU1FLFNBQWlDO0lBQ3JDQyxVQUFVO0lBQ1ZDLFNBQVM7SUFDVEMsVUFBVTtJQUNWQyxTQUFTO0FBQ1g7QUFFZSxTQUFTQyxzQkFBc0IsS0FFN0M7UUFGNkMsRUFBRUMsR0FBRyxFQUFFQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxFQUU5RSxHQUY2QztRQXdEdUJDOztJQXJEbkUsTUFBTSxDQUFDQSxHQUFHQyxLQUFLLEdBQUd0QiwrQ0FBUUEsQ0FBTTtJQUNoQyxNQUFNLENBQUN1QixLQUFLQyxPQUFPLEdBQUd4QiwrQ0FBUUEsQ0FBTTtJQUNwQyxNQUFNeUIsVUFBVTFCLDZDQUFNQSxDQUFtQjtJQUV6QyxTQUFTMkI7UUFBU3BCLDZDQUFHQSxDQUFDLGVBQW1CLE9BQUpXLEtBQUksWUFBVVUsSUFBSSxDQUFDTCxNQUFNTSxLQUFLLENBQUMsS0FBTztJQUFJO0lBQy9FOUIsZ0RBQVNBLENBQUM7UUFBUTRCO0lBQVEsR0FBRztRQUFDVDtLQUFJO0lBRWxDLGVBQWVZLFNBQVNDLENBQXNDO1lBQy9DQTtRQUFiLE1BQU1DLFFBQU9ELGtCQUFBQSxFQUFFRSxNQUFNLENBQUNDLEtBQUssY0FBZEgsc0NBQUFBLGVBQWdCLENBQUMsRUFBRTtRQUNoQyxJQUFJLENBQUNDLE1BQU07UUFDWCxNQUFNRyxJQUFJLElBQUlDO1FBQ2RELEVBQUVFLE1BQU0sR0FBRztZQUNULE1BQU05Qiw2Q0FBR0EsQ0FBQyxlQUFtQixPQUFKVyxLQUFJLGNBQVk7Z0JBQ3ZDb0IsUUFBUTtnQkFDUkMsTUFBTUMsS0FBS0MsU0FBUyxDQUFDO29CQUFFQyxVQUFVUCxFQUFFUSxNQUFNO29CQUFFQyxVQUFVWixLQUFLYSxJQUFJO2dCQUFDO1lBQ2pFO1lBQ0FsQjtZQUFRTjtRQUNWO1FBQ0FjLEVBQUVXLGFBQWEsQ0FBQ2Q7SUFDbEI7SUFFQSxJQUFJLENBQUNWLEdBQUcscUJBQ04sOERBQUN5QjtRQUFJQyxXQUFVO1FBQTZEQyxTQUFTOUI7a0JBQ25GLDRFQUFDNEI7WUFBSUMsV0FBVTtZQUEyQ0MsU0FBUyxDQUFDbEIsSUFBTUEsRUFBRW1CLGVBQWU7c0JBQ3pGLDRFQUFDSDtnQkFBSUMsV0FBVTs7Ozs7Ozs7Ozs7Ozs7OztJQUtyQixNQUFNRyxXQUFXN0IsRUFBRThCLFNBQVMsSUFBSSxRQUFROUIsRUFBRThCLFNBQVMsR0FBRyxJQUFJLGtCQUN0RDlCLEVBQUU4QixTQUFTLElBQUksUUFBUTlCLEVBQUU4QixTQUFTLEdBQUcsS0FBSyxtQkFBbUI7UUFnQnpCOUIsaUJBQ2tCQSxRQUU4QlYsa0JBSXJCVSxxQkFxQ3JEQSxlQVlBQTtJQXRFZCxxQkFDRSw4REFBQ3lCO1FBQUlDLFdBQVU7UUFBNkVDLFNBQVM5QjtrQkFDbkcsNEVBQUM0QjtZQUFJQyxXQUFVO1lBQXVGQyxTQUFTLENBQUNsQixJQUFNQSxFQUFFbUIsZUFBZTs7OEJBQ3JJLDhEQUFDSDtvQkFBSUMsV0FBVTs7c0NBQ2IsOERBQUNLOzRCQUFHTCxXQUFVO3NDQUFZOzs7Ozs7c0NBQzFCLDhEQUFDTTs0QkFBT0wsU0FBUzlCO3NDQUFTLDRFQUFDakIsaUhBQUNBO2dDQUFDOEMsV0FBVTs7Ozs7Ozs7Ozs7Ozs7Ozs7OEJBR3pDLDhEQUFDRDtvQkFBSUMsV0FBVTs7c0NBQ2IsOERBQUNEOzRCQUFJQyxXQUFVOztnQ0FDWjFCLEVBQUVpQyxhQUFhLGlCQUNaLDhEQUFDQztvQ0FBSUMsS0FBS2hELE9BQU9hLEVBQUVpQyxhQUFhO29DQUFHUCxXQUFVOzs7Ozt5REFDN0MsOERBQUNEO29DQUFJQyxXQUFVOzs7Ozs7OENBQ25CLDhEQUFDRDtvQ0FBSUMsV0FBVTs7c0RBQ2IsOERBQUNEOzRDQUFJQyxXQUFVO3NEQUFhMUIsQ0FBQUEsa0JBQUFBLEVBQUVvQyxZQUFZLGNBQWRwQyw2QkFBQUEsa0JBQWtCOzs7Ozs7c0RBQzlDLDhEQUFDeUI7NENBQUlDLFdBQVU7O2dEQUF5QjtnREFBTTFCLENBQUFBLFNBQUFBLEVBQUVxQyxHQUFHLGNBQUxyQyxvQkFBQUEsU0FBUzs7Ozs7Ozs7Ozs7Ozs4Q0FFekQsOERBQUNzQztvQ0FBS1osV0FBVyw2REFBZ0csT0FBbkNwQyxDQUFBQSxtQkFBQUEsTUFBTSxDQUFDVSxFQUFFdUMsTUFBTSxDQUFDLGNBQWhCakQsOEJBQUFBLG1CQUFvQjs4Q0FBbUJVLEVBQUV1QyxNQUFNOzs7Ozs7Ozs7Ozs7c0NBRy9ILDhEQUFDZDs0QkFBSUMsV0FBVTtzQ0FDWjtnQ0FBRTtvQ0FBQztvQ0FBWTtpQ0FBVztnQ0FBRTtvQ0FBQztvQ0FBYyxjQUFzQyxPQUF6QjFCLENBQUFBLHVCQUFBQSxlQUFBQSxFQUFFd0MsU0FBUyxjQUFYeEMsbUNBQUFBLGFBQWF5QyxNQUFNLGNBQW5CekMsaUNBQUFBLHNCQUF1QixHQUFFO2lDQUFHO2dDQUFFO29DQUFDO29DQUFXO2lDQUFVOzZCQUFDLENBQVcwQyxHQUFHLENBQUM7b0NBQUMsQ0FBQ0MsR0FBR0MsRUFBRTtxREFDbEksOERBQUNaO29DQUFlTCxTQUFTLElBQU14QixPQUFPd0M7b0NBQ3BDakIsV0FBVywyQ0FBK0gsT0FBcEZ4QixRQUFReUMsSUFBSSxvQ0FBb0M7OENBQXdDQzttQ0FEbklEOzs7Ozs7Ozs7Ozt3QkFLaEJ6QyxRQUFRLDRCQUNQLDhEQUFDdUI7NEJBQUlDLFdBQVU7OzhDQUNiLDhEQUFDbUI7b0NBQUlDLE9BQU07b0NBQWtCQyxPQUFPL0MsRUFBRWdELGVBQWU7Ozs7Ozs4Q0FDckQsOERBQUNIO29DQUFJQyxPQUFNO29DQUFxQkMsT0FBTy9DLEVBQUVpRCxjQUFjOzs7Ozs7OENBQ3ZELDhEQUFDSjtvQ0FBSUMsT0FBTTtvQ0FBZUMsT0FBTy9DLEVBQUVrRCxZQUFZOzs7Ozs7OENBQy9DLDhEQUFDTDtvQ0FBSUMsT0FBTTtvQ0FBYUMsT0FBT0ksSUFBSW5ELEVBQUVvRCxVQUFVOzs7Ozs7OENBQy9DLDhEQUFDM0I7b0NBQUlDLFdBQVU7O3NEQUNiLDhEQUFDWTs0Q0FBS1osV0FBVTtzREFBaUI7Ozs7OztzREFDakMsOERBQUNZOzRDQUFLWixXQUFXLDBCQUFtQyxPQUFURzs7Z0RBQ3hDc0IsSUFBSW5ELEVBQUVxRCxXQUFXO2dEQUNqQnJELEVBQUU4QixTQUFTLElBQUksc0JBQVEsOERBQUNRO29EQUFLWixXQUFVOzhEQUNyQzFCLEVBQUU4QixTQUFTLEdBQUcsSUFBSSxjQUFjLE9BQW1CLE9BQVo5QixFQUFFOEIsU0FBUyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OENBSTFELDhEQUFDZTtvQ0FBSUMsT0FBTTtvQ0FBU0MsT0FBTy9DLEVBQUV1QyxNQUFNO29DQUFFZSxHQUFHOzs7Ozs7OENBQ3hDLDhEQUFDVDtvQ0FBSUMsT0FBTTtvQ0FBb0JDLE9BQU8vQyxFQUFFdUQsaUJBQWlCOzs7Ozs7OENBQ3pELDhEQUFDVjtvQ0FBSUMsT0FBTTtvQ0FBVUMsT0FBTy9DLEVBQUV3RCxPQUFPOzs7Ozs7OENBQ3JDLDhEQUFDWDtvQ0FBSUMsT0FBTTtvQ0FBUUMsT0FBTy9DLEVBQUV5RCxLQUFLOzs7Ozs7OENBQ2pDLDhEQUFDWjtvQ0FBSUMsT0FBTTtvQ0FBV0MsT0FBTy9DLEVBQUUwRCxRQUFROzs7Ozs7OENBQ3ZDLDhEQUFDYjtvQ0FBSUMsT0FBTTtvQ0FBZ0JDLE9BQU8vQyxFQUFFMkQsYUFBYTs7Ozs7OzhDQUNqRCw4REFBQ2Q7b0NBQUlDLE9BQU07b0NBQXNCQyxPQUFPL0MsRUFBRTRELEtBQUs7Ozs7Ozs4Q0FDL0MsOERBQUNmO29DQUFJQyxPQUFNO29DQUFVQyxPQUFPL0MsRUFBRTZELE9BQU87Ozs7Ozs4Q0FDckMsOERBQUNoQjtvQ0FBSUMsT0FBTTtvQ0FBYUMsT0FBTy9DLEVBQUU4RCxVQUFVOzs7Ozs7OENBQzNDLDhEQUFDakI7b0NBQUlDLE9BQU07b0NBQWFDLE9BQU9JLElBQUluRCxFQUFFK0QsVUFBVSxFQUFFOzs7Ozs7OENBQ2pELDhEQUFDbEI7b0NBQUlDLE9BQU07b0NBQWVDLE9BQU9JLElBQUluRCxFQUFFZ0UsVUFBVSxFQUFFOzs7Ozs7Ozs7Ozs7d0JBSXREOUQsUUFBUSw2QkFDUCw4REFBQ3VCOzRCQUFJQyxXQUFVOztnQ0FDWDFCLENBQUFBLENBQUFBLGdCQUFBQSxFQUFFd0MsU0FBUyxjQUFYeEMsMkJBQUFBLGdCQUFlLEVBQUUsRUFBRTBDLEdBQUcsQ0FBQyxDQUFDdUIsS0FBVUMsa0JBQ2xDLDhEQUFDQzt3Q0FBVUMsTUFBTSxHQUFhSCxPQUFWL0UsNkNBQU9BLEVBQVcsT0FBUitFLElBQUk3RSxHQUFHO3dDQUFJdUIsUUFBTzt3Q0FBUzBELEtBQUk7d0NBQzNEM0MsV0FBVTs7MERBQ1YsOERBQUMxQyxpSEFBUUE7Z0RBQUMwQyxXQUFVOzs7Ozs7NENBQTJCOzRDQUFFdUMsSUFBSTFDLElBQUk7O3VDQUZuRDJDOzs7OztnQ0FLUixFQUFDbEUsRUFBRXdDLFNBQVMsSUFBSXhDLEVBQUV3QyxTQUFTLENBQUNDLE1BQU0sS0FBSyxvQkFBTSw4REFBQzZCO29DQUFFNUMsV0FBVTs4Q0FBaUI7Ozs7Ozs7Ozs7Ozt3QkFJaEZ4QixRQUFRLDJCQUNQLDhEQUFDdUI7NEJBQUlDLFdBQVU7c0NBQ1osQ0FBQzFCLENBQUFBLGFBQUFBLEVBQUV1RSxPQUFPLGNBQVR2RSx3QkFBQUEsYUFBYSxFQUFFLEVBQUUwQyxHQUFHLENBQUMsQ0FBQzhCLEdBQVFOLGtCQUM5Qiw4REFBQ3pDO29DQUFZQyxXQUFVOztzREFDckIsOERBQUNZOztnREFBTWtDLEVBQUVDLE1BQU07Z0RBQUM7Z0RBQUVELEVBQUVFLEVBQUUsR0FBRyxRQUFVLE9BQUxGLEVBQUVFLEVBQUUsSUFBSzs7Ozs7OztzREFDdkMsOERBQUNwQzs0Q0FBS1osV0FBVTtzREFBa0J5QixJQUFJcUIsRUFBRUcsRUFBRSxFQUFFOzs7Ozs7O21DQUZwQ1Q7Ozs7Ozs7Ozs7c0NBUWhCLDhEQUFDekM7NEJBQUlDLFdBQVU7OzhDQUNiLDhEQUFDRDtvQ0FBSUMsV0FBVTs7c0RBQ2IsOERBQUNNOzRDQUFPTCxTQUFTN0I7NENBQVE0QixXQUFVOzs4REFDakMsOERBQUM3QyxpSEFBTUE7b0RBQUM2QyxXQUFVOzs7Ozs7Z0RBQVk7Ozs7Ozs7c0RBRWhDLDhEQUFDTTs0Q0FBT0wsU0FBUztvREFBTXZCO3dEQUFBQSxtQkFBQUEsUUFBUXdFLE9BQU8sY0FBZnhFLHVDQUFBQSxpQkFBaUJ5RSxLQUFLOzs0Q0FBSW5ELFdBQVU7OzhEQUN6RCw4REFBQzVDLGlIQUFNQTtvREFBQzRDLFdBQVU7Ozs7OztnREFBWTs7Ozs7OztzREFFaEMsOERBQUNvRDs0Q0FBTUMsS0FBSzNFOzRDQUFTNEUsTUFBSzs0Q0FBT0MsUUFBTzs0Q0FBMEJ2RCxXQUFVOzRDQUFTd0QsVUFBVTFFOzs7Ozs7Ozs7Ozs7OENBRWpHLDhEQUFDMkQ7b0NBQUVDLE1BQUs7b0NBQUl6QyxTQUFTLENBQUNsQixJQUFNQSxFQUFFMEUsY0FBYztvQ0FDMUN6RCxXQUFVOztzREFDViw4REFBQzNDLGlIQUFZQTs0Q0FBQzJDLFdBQVU7Ozs7Ozt3Q0FBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT2xEO0dBckl3Qi9CO0tBQUFBO0FBdUl4QixTQUFTd0QsSUFBSW5ELENBQVU7UUFBRW9GLE9BQUFBLGlFQUFPO0lBQzlCLElBQUksQ0FBQ3BGLEdBQUcsT0FBTztJQUNmLE1BQU1xRixLQUFLLElBQUlDLEtBQUt0RjtJQUNwQixPQUFPdUYsTUFBTSxDQUFDRixNQUFNLE1BQU1ELE9BQU9DLEdBQUdHLGNBQWMsS0FBS0gsR0FBR0ksa0JBQWtCO0FBQzlFO0FBQ0EsU0FBUzVDLElBQUksS0FBMEI7UUFBMUIsRUFBRUMsS0FBSyxFQUFFQyxLQUFLLEVBQUVPLEdBQUcsRUFBTyxHQUExQjtJQUNYLHFCQUNFLDhEQUFDN0I7UUFBSUMsV0FBVTs7MEJBQ2IsOERBQUNZO2dCQUFLWixXQUFVOzBCQUFrQm9COzs7Ozs7MEJBQ2xDLDhEQUFDUjtnQkFBS1osV0FBVyx5Q0FBaUUsT0FBeEI0QixNQUFNLGVBQWU7MEJBQU9QLGtCQUFBQSxtQkFBQUEsUUFBUzs7Ozs7Ozs7Ozs7O0FBR3JHO01BUFNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2NvbXBvbmVudHMvQ29tcGxpYW5jZURldGFpbE1vZGFsLnRzeD8xYTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBYLCBQZW5jaWwsIFVwbG9hZCwgRXh0ZXJuYWxMaW5rLCBGaWxlVGV4dCB9IGZyb20gXCJsdWNpZGUtcmVhY3RcIjtcbmltcG9ydCB7IGFwaSwgYXBpQmFzZSB9IGZyb20gXCJAL2xpYi9hcGlcIjtcblxuZnVuY3Rpb24gaW1nU3JjKHVybD86IHN0cmluZykge1xuICBpZiAoIXVybCkgcmV0dXJuIFwiXCI7XG4gIGlmICh1cmwuc3RhcnRzV2l0aChcImRhdGE6XCIpIHx8IHVybC5zdGFydHNXaXRoKFwiaHR0cFwiKSkgcmV0dXJuIHVybDtcbiAgcmV0dXJuIGAke2FwaUJhc2V9JHt1cmx9YDtcbn1cblxudHlwZSBUYWIgPSBcIm92ZXJ2aWV3XCIgfCBcImRvY3VtZW50c1wiIHwgXCJoaXN0b3J5XCI7XG5cbmNvbnN0IFNUQVRVUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgY29tcGxldGU6IFwiYmctZW1lcmFsZC01MCB0ZXh0LWVtZXJhbGQtNzAwXCIsXG4gIHBlbmRpbmc6IFwiYmctYW1iZXItNTAgdGV4dC1hbWJlci03MDBcIixcbiAgZXhwaXJpbmc6IFwiYmctYW1iZXItNTAgdGV4dC1hbWJlci03MDBcIixcbiAgZXhwaXJlZDogXCJiZy1yb3NlLTUwIHRleHQtcm9zZS03MDBcIixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbXBsaWFuY2VEZXRhaWxNb2RhbCh7IGNpZCwgb25DbG9zZSwgb25FZGl0LCBvbkNoYW5nZWQgfToge1xuICBjaWQ6IHN0cmluZzsgb25DbG9zZTogKCkgPT4gdm9pZDsgb25FZGl0OiAoKSA9PiB2b2lkOyBvbkNoYW5nZWQ6ICgpID0+IHZvaWQ7XG59KSB7XG4gIGNvbnN0IFtkLCBzZXREXSA9IHVzZVN0YXRlPGFueT4obnVsbCk7XG4gIGNvbnN0IFt0YWIsIHNldFRhYl0gPSB1c2VTdGF0ZTxUYWI+KFwib3ZlcnZpZXdcIik7XG4gIGNvbnN0IGZpbGVSZWYgPSB1c2VSZWY8SFRNTElucHV0RWxlbWVudD4obnVsbCk7XG5cbiAgZnVuY3Rpb24gbG9hZCgpIHsgYXBpKGAvY29tcGxpYW5jZS8ke2NpZH0vZGV0YWlsYCkudGhlbihzZXREKS5jYXRjaCgoKSA9PiB7fSk7IH1cbiAgdXNlRWZmZWN0KCgpID0+IHsgbG9hZCgpOyB9LCBbY2lkXSk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gb25VcGxvYWQoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pIHtcbiAgICBjb25zdCBmaWxlID0gZS50YXJnZXQuZmlsZXM/LlswXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBjb25zdCByID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByLm9ubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFwaShgL2NvbXBsaWFuY2UvJHtjaWR9L2RvY3VtZW50YCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRhdGFfdXJsOiByLnJlc3VsdCwgZmlsZW5hbWU6IGZpbGUubmFtZSB9KSxcbiAgICAgIH0pO1xuICAgICAgbG9hZCgpOyBvbkNoYW5nZWQoKTtcbiAgICB9O1xuICAgIHIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgfVxuXG4gIGlmICghZCkgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIGluc2V0LTAgYmctYmxhY2svNDAgei01MCBncmlkIHBsYWNlLWl0ZW1zLWNlbnRlciBwLTRcIiBvbkNsaWNrPXtvbkNsb3NlfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2hpdGUgcm91bmRlZC0yeGwgdy1mdWxsIG1heC13LW1kIHAtNVwiIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJza2VsZXRvbiBoLTQwIHJvdW5kZWQteGxcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG5cbiAgY29uc3QgZXhwQ29sb3IgPSBkLmRheXNfbGVmdCAhPSBudWxsICYmIGQuZGF5c19sZWZ0IDwgMCA/IFwidGV4dC1yb3NlLTYwMFwiXG4gICAgOiBkLmRheXNfbGVmdCAhPSBudWxsICYmIGQuZGF5c19sZWZ0IDwgMzAgPyBcInRleHQtYW1iZXItNjAwXCIgOiBcInRleHQtc2xhdGUtNzAwXCI7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIGluc2V0LTAgYmctYmxhY2svNDAgei01MCBncmlkIHBsYWNlLWl0ZW1zLWNlbnRlciBwLTQgb3ZlcmZsb3cteS1hdXRvXCIgb25DbGljaz17b25DbG9zZX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlIHJvdW5kZWQtMnhsIHctZnVsbCBtYXgtdy1tZCBteS00IGZsZXggZmxleC1jb2wgbWF4LWgtWzkydmhdIG92ZXJmbG93LXktYXV0b1wiIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNSBweS00IGJvcmRlci1iIGJvcmRlci1zbGF0ZS0xMDAgc3RpY2t5IHRvcC0wIGJnLXdoaXRlIHJvdW5kZWQtdC0yeGxcIj5cbiAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwiZm9udC1ib2xkXCI+Q29tcGxpYW5jZSBEZXRhaWxzPC9oMz5cbiAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e29uQ2xvc2V9PjxYIGNsYXNzTmFtZT1cImgtNSB3LTUgdGV4dC1zbGF0ZS00MDBcIiAvPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNSBzcGFjZS15LTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICB7ZC5wcm9kdWN0X2ltYWdlXG4gICAgICAgICAgICAgID8gPGltZyBzcmM9e2ltZ1NyYyhkLnByb2R1Y3RfaW1hZ2UpfSBjbGFzc05hbWU9XCJoLTE0IHctMTQgcm91bmRlZC1sZyBvYmplY3QtY29udGFpbiBib3JkZXIgYm9yZGVyLXNsYXRlLTEwMFwiIC8+XG4gICAgICAgICAgICAgIDogPGRpdiBjbGFzc05hbWU9XCJoLTE0IHctMTQgcm91bmRlZC1sZyBiZy1zbGF0ZS0xMDBcIiAvPn1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9udC1ib2xkXCI+e2QucHJvZHVjdF9uYW1lID8/IFwi4oCUXCJ9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXNsYXRlLTQwMFwiPlNLVToge2Quc2t1ID8/IFwi4oCUXCJ9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17YHRleHQteHMgZm9udC1zZW1pYm9sZCBweC0yIHB5LTAuNSByb3VuZGVkLWZ1bGwgY2FwaXRhbGl6ZSAke1NUQVRVU1tkLnN0YXR1c10gPz8gXCJiZy1zbGF0ZS0xMDBcIn1gfT57ZC5zdGF0dXN9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0xIGJvcmRlci1iIGJvcmRlci1zbGF0ZS0yMDAgdGV4dC1zbVwiPlxuICAgICAgICAgICAgeyhbW1wib3ZlcnZpZXdcIiwgXCJPdmVydmlld1wiXSwgW1wiZG9jdW1lbnRzXCIsIGBEb2N1bWVudHMgKCR7ZC5kb2N1bWVudHM/Lmxlbmd0aCA/PyAwfSlgXSwgW1wiaGlzdG9yeVwiLCBcIkhpc3RvcnlcIl1dIGFzIGNvbnN0KS5tYXAoKFt0LCBsXSkgPT4gKFxuICAgICAgICAgICAgICA8YnV0dG9uIGtleT17dH0gb25DbGljaz17KCkgPT4gc2V0VGFiKHQpfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMiBib3JkZXItYi0yIC1tYi1weCBmb250LW1lZGl1bSAke3RhYiA9PT0gdCA/IFwiYm9yZGVyLWJyYW5kLTYwMCB0ZXh0LWJyYW5kLTcwMFwiIDogXCJib3JkZXItdHJhbnNwYXJlbnQgdGV4dC1zbGF0ZS01MDBcIn1gfT57bH08L2J1dHRvbj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAge3RhYiA9PT0gXCJvdmVydmlld1wiICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgPFJvdyBsYWJlbD1cIkNvbXBsaWFuY2UgVHlwZVwiIHZhbHVlPXtkLmNvbXBsaWFuY2VfdHlwZX0gLz5cbiAgICAgICAgICAgICAgPFJvdyBsYWJlbD1cIkxpY2Vuc2UgLyBSZWcuIE5vLlwiIHZhbHVlPXtkLmxpY2Vuc2VfbnVtYmVyfSAvPlxuICAgICAgICAgICAgICA8Um93IGxhYmVsPVwiTGljZW5zZSBOYW1lXCIgdmFsdWU9e2QubGljZW5zZV9uYW1lfSAvPlxuICAgICAgICAgICAgICA8Um93IGxhYmVsPVwiSXNzdWUgRGF0ZVwiIHZhbHVlPXtmbXQoZC5pc3N1ZV9kYXRlKX0gLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc2xhdGUtNTAgcHktMS41XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbGF0ZS00MDBcIj5FeHBpcnkgRGF0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Bmb250LW1lZGl1bSB0ZXh0LXJpZ2h0ICR7ZXhwQ29sb3J9YH0+XG4gICAgICAgICAgICAgICAgICB7Zm10KGQuZXhwaXJ5X2RhdGUpfVxuICAgICAgICAgICAgICAgICAge2QuZGF5c19sZWZ0ICE9IG51bGwgJiYgPHNwYW4gY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC14c1wiPlxuICAgICAgICAgICAgICAgICAgICB7ZC5kYXlzX2xlZnQgPCAwID8gXCIoRXhwaXJlZClcIiA6IGAoSW4gJHtkLmRheXNfbGVmdH0gZGF5cylgfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPn1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8Um93IGxhYmVsPVwiU3RhdHVzXCIgdmFsdWU9e2Quc3RhdHVzfSBjYXAgLz5cbiAgICAgICAgICAgICAgPFJvdyBsYWJlbD1cIklzc3VpbmcgQXV0aG9yaXR5XCIgdmFsdWU9e2QuaXNzdWluZ19hdXRob3JpdHl9IC8+XG4gICAgICAgICAgICAgIDxSb3cgbGFiZWw9XCJDb3VudHJ5XCIgdmFsdWU9e2QuY291bnRyeX0gLz5cbiAgICAgICAgICAgICAgPFJvdyBsYWJlbD1cIlN0YXRlXCIgdmFsdWU9e2Quc3RhdGV9IC8+XG4gICAgICAgICAgICAgIDxSb3cgbGFiZWw9XCJDYXRlZ29yeVwiIHZhbHVlPXtkLmNhdGVnb3J5fSAvPlxuICAgICAgICAgICAgICA8Um93IGxhYmVsPVwiQXBwbGljYWJsZSBUb1wiIHZhbHVlPXtkLmFwcGxpY2FibGVfdG99IC8+XG4gICAgICAgICAgICAgIDxSb3cgbGFiZWw9XCJNYW51ZmFjdHVyaW5nIFBsYW50XCIgdmFsdWU9e2QucGxhbnR9IC8+XG4gICAgICAgICAgICAgIDxSb3cgbGFiZWw9XCJSZW1hcmtzXCIgdmFsdWU9e2QucmVtYXJrc30gLz5cbiAgICAgICAgICAgICAgPFJvdyBsYWJlbD1cIkNyZWF0ZWQgQnlcIiB2YWx1ZT17ZC5jcmVhdGVkX2J5fSAvPlxuICAgICAgICAgICAgICA8Um93IGxhYmVsPVwiQ3JlYXRlZCBPblwiIHZhbHVlPXtmbXQoZC5jcmVhdGVkX2F0LCB0cnVlKX0gLz5cbiAgICAgICAgICAgICAgPFJvdyBsYWJlbD1cIkxhc3QgVXBkYXRlZFwiIHZhbHVlPXtmbXQoZC51cGRhdGVkX2F0LCB0cnVlKX0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7dGFiID09PSBcImRvY3VtZW50c1wiICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgeyhkLmRvY3VtZW50cyA/PyBbXSkubWFwKChkb2M6IGFueSwgaTogbnVtYmVyKSA9PiAoXG4gICAgICAgICAgICAgICAgPGEga2V5PXtpfSBocmVmPXtgJHthcGlCYXNlfSR7ZG9jLnVybH1gfSB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIGJvcmRlciBib3JkZXItc2xhdGUtMTAwIHJvdW5kZWQtbGcgcHgtMyBweS0yIGhvdmVyOmJnLXNsYXRlLTUwXCI+XG4gICAgICAgICAgICAgICAgICA8RmlsZVRleHQgY2xhc3NOYW1lPVwiaC00IHctNCB0ZXh0LXNsYXRlLTQwMFwiIC8+IHtkb2MubmFtZX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICB7KCFkLmRvY3VtZW50cyB8fCBkLmRvY3VtZW50cy5sZW5ndGggPT09IDApICYmIDxwIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtNDAwXCI+Tm8gZG9jdW1lbnRzIHVwbG9hZGVkLjwvcD59XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge3RhYiA9PT0gXCJoaXN0b3J5XCIgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTEgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICB7KGQuaGlzdG9yeSA/PyBbXSkubWFwKChoOiBhbnksIGk6IG51bWJlcikgPT4gKFxuICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpfSBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc2xhdGUtNTAgcHktMS41XCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57aC5hY3Rpb259IHtoLmJ5ID8gYMK3ICR7aC5ieX1gIDogXCJcIn08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNsYXRlLTQwMFwiPntmbXQoaC5hdCwgdHJ1ZSl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMiBwdC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtvbkVkaXR9IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIHJvdW5kZWQtbGcgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgPFBlbmNpbCBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz4gRWRpdFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBmaWxlUmVmLmN1cnJlbnQ/LmNsaWNrKCl9IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xIGJnLWJyYW5kLTYwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgcHktMiB0ZXh0LXNtIGZvbnQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgICAgICA8VXBsb2FkIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPiBVcGxvYWQgRG9jdW1lbnRcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxpbnB1dCByZWY9e2ZpbGVSZWZ9IHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiYXBwbGljYXRpb24vcGRmLGltYWdlLypcIiBjbGFzc05hbWU9XCJoaWRkZW5cIiBvbkNoYW5nZT17b25VcGxvYWR9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgb25DbGljaz17KGUpID0+IGUucHJldmVudERlZmF1bHQoKX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEgYm9yZGVyIGJvcmRlci1icmFuZC0yMDAgdGV4dC1icmFuZC03MDAgcm91bmRlZC1sZyBweS0yIHRleHQtc20gZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgPEV4dGVybmFsTGluayBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz4gVmlldyBvbiBWZXJpZmljYXRpb24gUGFnZVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBmbXQoZD86IHN0cmluZywgdGltZSA9IGZhbHNlKSB7XG4gIGlmICghZCkgcmV0dXJuIFwi4oCUXCI7XG4gIGNvbnN0IGR0ID0gbmV3IERhdGUoZCk7XG4gIHJldHVybiBpc05hTigrZHQpID8gXCLigJRcIiA6IHRpbWUgPyBkdC50b0xvY2FsZVN0cmluZygpIDogZHQudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG59XG5mdW5jdGlvbiBSb3coeyBsYWJlbCwgdmFsdWUsIGNhcCB9OiBhbnkpIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zbGF0ZS01MCBweS0xLjVcIj5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtNDAwXCI+e2xhYmVsfTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT17YGZvbnQtbWVkaXVtIHRleHQtc2xhdGUtNzAwIHRleHQtcmlnaHQgJHtjYXAgPyBcImNhcGl0YWxpemVcIiA6IFwiXCJ9YH0+e3ZhbHVlID8/IFwi4oCUXCJ9PC9zcGFuPlxuICAgIDwvZGl2PlxuICApO1xufVxuIl0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiWCIsIlBlbmNpbCIsIlVwbG9hZCIsIkV4dGVybmFsTGluayIsIkZpbGVUZXh0IiwiYXBpIiwiYXBpQmFzZSIsImltZ1NyYyIsInVybCIsInN0YXJ0c1dpdGgiLCJTVEFUVVMiLCJjb21wbGV0ZSIsInBlbmRpbmciLCJleHBpcmluZyIsImV4cGlyZWQiLCJDb21wbGlhbmNlRGV0YWlsTW9kYWwiLCJjaWQiLCJvbkNsb3NlIiwib25FZGl0Iiwib25DaGFuZ2VkIiwiZCIsInNldEQiLCJ0YWIiLCJzZXRUYWIiLCJmaWxlUmVmIiwibG9hZCIsInRoZW4iLCJjYXRjaCIsIm9uVXBsb2FkIiwiZSIsImZpbGUiLCJ0YXJnZXQiLCJmaWxlcyIsInIiLCJGaWxlUmVhZGVyIiwib25sb2FkIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkYXRhX3VybCIsInJlc3VsdCIsImZpbGVuYW1lIiwibmFtZSIsInJlYWRBc0RhdGFVUkwiLCJkaXYiLCJjbGFzc05hbWUiLCJvbkNsaWNrIiwic3RvcFByb3BhZ2F0aW9uIiwiZXhwQ29sb3IiLCJkYXlzX2xlZnQiLCJoMyIsImJ1dHRvbiIsInByb2R1Y3RfaW1hZ2UiLCJpbWciLCJzcmMiLCJwcm9kdWN0X25hbWUiLCJza3UiLCJzcGFuIiwic3RhdHVzIiwiZG9jdW1lbnRzIiwibGVuZ3RoIiwibWFwIiwidCIsImwiLCJSb3ciLCJsYWJlbCIsInZhbHVlIiwiY29tcGxpYW5jZV90eXBlIiwibGljZW5zZV9udW1iZXIiLCJsaWNlbnNlX25hbWUiLCJmbXQiLCJpc3N1ZV9kYXRlIiwiZXhwaXJ5X2RhdGUiLCJjYXAiLCJpc3N1aW5nX2F1dGhvcml0eSIsImNvdW50cnkiLCJzdGF0ZSIsImNhdGVnb3J5IiwiYXBwbGljYWJsZV90byIsInBsYW50IiwicmVtYXJrcyIsImNyZWF0ZWRfYnkiLCJjcmVhdGVkX2F0IiwidXBkYXRlZF9hdCIsImRvYyIsImkiLCJhIiwiaHJlZiIsInJlbCIsInAiLCJoaXN0b3J5IiwiaCIsImFjdGlvbiIsImJ5IiwiYXQiLCJjdXJyZW50IiwiY2xpY2siLCJpbnB1dCIsInJlZiIsInR5cGUiLCJhY2NlcHQiLCJvbkNoYW5nZSIsInByZXZlbnREZWZhdWx0IiwidGltZSIsImR0IiwiRGF0ZSIsImlzTmFOIiwidG9Mb2NhbGVTdHJpbmciLCJ0b0xvY2FsZURhdGVTdHJpbmciXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./components/ComplianceDetailModal.tsx\n"));
/***/ }),
/***/ "(app-pages-browser)/./lib/api.ts":
/*!********************!*\
!*** ./lib/api.ts ***!
\********************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ api: function() { return /* binding */ api; },\n/* harmony export */ apiBase: function() { return /* binding */ apiBase; },\n/* harmony export */ clearToken: function() { return /* binding */ clearToken; },\n/* harmony export */ setToken: function() { return /* binding */ setToken; }\n/* harmony export */ });\nconst API = \"http://localhost:8000\" || 0;\nfunction getToken() {\n if (false) {}\n return window.localStorage.getItem(\"vp_token\");\n}\nfunction setToken(token) {\n window.localStorage.setItem(\"vp_token\", token);\n}\nfunction clearToken() {\n window.localStorage.removeItem(\"vp_token\");\n}\nasync function api(path) {\n let opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n const token = getToken();\n const res = await fetch(\"\".concat(API).concat(path), {\n ...opts,\n headers: {\n \"Content-Type\": \"application/json\",\n ...token ? {\n Authorization: \"Bearer \".concat(token)\n } : {},\n ...opts.headers || {}\n }\n });\n if (!res.ok) {\n let detail = res.statusText;\n try {\n var _detail;\n detail = (_detail = (await res.json()).detail) !== null && _detail !== void 0 ? _detail : detail;\n } catch (e) {}\n throw {\n status: res.status,\n detail\n };\n }\n if (res.status === 204) return undefined;\n return res.json();\n}\nconst apiBase = API;\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2xpYi9hcGkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLE1BQU1BLE1BQU1DLHVCQUErQixJQUFJLENBQXVCO0FBR3RFLFNBQVNHO0lBQ1AsSUFBSSxLQUE2QixFQUFFLEVBQVk7SUFDL0MsT0FBT0MsT0FBT0MsWUFBWSxDQUFDQyxPQUFPLENBQUM7QUFDckM7QUFFTyxTQUFTQyxTQUFTQyxLQUFhO0lBQ3BDSixPQUFPQyxZQUFZLENBQUNJLE9BQU8sQ0FBQyxZQUFZRDtBQUMxQztBQUVPLFNBQVNFO0lBQ2ROLE9BQU9DLFlBQVksQ0FBQ00sVUFBVSxDQUFDO0FBQ2pDO0FBRU8sZUFBZUMsSUFDcEJDLElBQVk7UUFDWkMsT0FBQUEsaUVBQW9CLENBQUM7SUFFckIsTUFBTU4sUUFBUUw7SUFDZCxNQUFNWSxNQUFNLE1BQU1DLE1BQU0sR0FBU0gsT0FBTmQsS0FBVyxPQUFMYyxPQUFRO1FBQ3ZDLEdBQUdDLElBQUk7UUFDUEcsU0FBUztZQUNQLGdCQUFnQjtZQUNoQixHQUFJVCxRQUFRO2dCQUFFVSxlQUFlLFVBQWdCLE9BQU5WO1lBQVEsSUFBSSxDQUFDLENBQUM7WUFDckQsR0FBSU0sS0FBS0csT0FBTyxJQUFJLENBQUMsQ0FBQztRQUN4QjtJQUNGO0lBQ0EsSUFBSSxDQUFDRixJQUFJSSxFQUFFLEVBQUU7UUFDWCxJQUFJQyxTQUFjTCxJQUFJTSxVQUFVO1FBQ2hDLElBQUk7Z0JBQ087WUFBVEQsU0FBUyxZQUFDLE1BQU1MLElBQUlPLElBQUksRUFBQyxFQUFHRixNQUFNLGNBQXpCLCtCQUE2QkE7UUFDeEMsRUFBRSxVQUFNLENBQUM7UUFDVCxNQUFNO1lBQUVHLFFBQVFSLElBQUlRLE1BQU07WUFBRUg7UUFBTztJQUNyQztJQUNBLElBQUlMLElBQUlRLE1BQU0sS0FBSyxLQUFLLE9BQU9DO0lBQy9CLE9BQU9ULElBQUlPLElBQUk7QUFDakI7QUFFTyxNQUFNRyxVQUFVMUIsSUFBSSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9saWIvYXBpLnRzPzY4YTEiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgQVBJID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX1VSTCB8fCBcImh0dHA6Ly9sb2NhbGhvc3Q6ODAwMFwiO1xuXG5cbmZ1bmN0aW9uIGdldFRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIG51bGw7XG4gIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ2cF90b2tlblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRva2VuKHRva2VuOiBzdHJpbmcpIHtcbiAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidnBfdG9rZW5cIiwgdG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUb2tlbigpIHtcbiAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwidnBfdG9rZW5cIik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcGk8VCA9IGFueT4oXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0czogUmVxdWVzdEluaXQgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHRva2VuID0gZ2V0VG9rZW4oKTtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJfSR7cGF0aH1gLCB7XG4gICAgLi4ub3B0cyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIC4uLih0b2tlbiA/IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRzLmhlYWRlcnMgfHwge30pLFxuICAgIH0sXG4gIH0pO1xuICBpZiAoIXJlcy5vaykge1xuICAgIGxldCBkZXRhaWw6IGFueSA9IHJlcy5zdGF0dXNUZXh0O1xuICAgIHRyeSB7XG4gICAgICBkZXRhaWwgPSAoYXdhaXQgcmVzLmpzb24oKSkuZGV0YWlsID8/IGRldGFpbDtcbiAgICB9IGNhdGNoIHt9XG4gICAgdGhyb3cgeyBzdGF0dXM6IHJlcy5zdGF0dXMsIGRldGFpbCB9O1xuICB9XG4gIGlmIChyZXMuc3RhdHVzID09PSAyMDQpIHJldHVybiB1bmRlZmluZWQgYXMgVDtcbiAgcmV0dXJuIHJlcy5qc29uKCk7XG59XG5cbmV4cG9ydCBjb25zdCBhcGlCYXNlID0gQVBJO1xuIl0sIm5hbWVzIjpbIkFQSSIsInByb2Nlc3MiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfVVJMIiwiZ2V0VG9rZW4iLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwic2V0VG9rZW4iLCJ0b2tlbiIsInNldEl0ZW0iLCJjbGVhclRva2VuIiwicmVtb3ZlSXRlbSIsImFwaSIsInBhdGgiLCJvcHRzIiwicmVzIiwiZmV0Y2giLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIm9rIiwiZGV0YWlsIiwic3RhdHVzVGV4dCIsImpzb24iLCJzdGF0dXMiLCJ1bmRlZmluZWQiLCJhcGlCYXNlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./lib/api.ts\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js":
/*!****************************************************************************************!*\
!*** ./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js ***!
\****************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("/**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nif (true) {\n (function() {\n'use strict';\n\nvar React = __webpack_require__(/*! next/dist/compiled/react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider'); // TODO: Delete with enableRenderableContext\n\nvar REACT_CONSUMER_TYPE = Symbol.for('react.consumer');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar REACT_CACHE_TYPE = Symbol.for('react.cache');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\nvar enableRenderableContext = false;\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false;\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n}\n\nvar REACT_CLIENT_REFERENCE$2 = Symbol.for('react.client.reference'); // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n if (typeof type === 'function') {\n if (type.$$typeof === REACT_CLIENT_REFERENCE$2) {\n // TODO: Create a convention for naming client references with debug info.\n return null;\n }\n\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n case REACT_CACHE_TYPE:\n {\n return 'Cache';\n }\n\n }\n\n if (typeof type === 'object') {\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n switch (type.$$typeof) {\n case REACT_PROVIDER_TYPE:\n {\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n }\n\n case REACT_CONTEXT_TYPE:\n var context = type;\n\n {\n return getContextName(context) + '.Consumer';\n }\n\n case REACT_CONSUMER_TYPE:\n {\n return null;\n }\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n }\n }\n\n return null;\n}\n\n// $FlowFixMe[method-unbinding]\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar assign = Object.assign;\n\n/*\n * The `'' + value` pattern (used in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe[incompatible-return] only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object'; // $FlowFixMe[incompatible-return]\n\n return type;\n }\n} // $FlowFixMe[incompatible-return] only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar REACT_CLIENT_REFERENCE$1 = Symbol.for('react.client.reference');\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || enableRenderableContext || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_CLIENT_REFERENCE$1 || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe[cannot-write] Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe[cannot-write] Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n/**\n * Leverages native browser/VM stack frames to get proper details (e.g.\n * filename, line + col number) for a single component in a component stack. We\n * do this by:\n * (1) throwing and catching an error in the function - this will be our\n * control error.\n * (2) calling the component which will eventually throw an error that we'll\n * catch - this will be our sample error.\n * (3) diffing the control and sample error stacks to find the stack frame\n * which represents our component.\n */\n\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if (!fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe[incompatible-type] It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n /**\n * Finding a common stack frame between sample and control errors can be\n * tricky given the different types and levels of stack trace truncation from\n * different JS VMs. So instead we'll attempt to control what that common\n * frame should be through this object method:\n * Having both the sample and control errors be in the function under the\n * `DescribeNativeComponentFrameRoot` property, + setting the `name` and\n * `displayName` properties of the function ensures that a stack\n * frame exists that has the method name `DescribeNativeComponentFrameRoot` in\n * it for both control and sample stacks.\n */\n\n\n var RunInRootFrame = {\n DetermineComponentFrameRoot: function () {\n var control;\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe[prop-missing]\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n } // $FlowFixMe[prop-missing] found when upgrading Flow\n\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n } // TODO(luna): This will currently only throw if the function component\n // tries to access React/ReactDOM/props. We should probably make this throw\n // in simple components too\n\n\n var maybePromise = fn(); // If the function component returns a promise, it's likely an async\n // component, which we don't yet support. Attach a noop catch handler to\n // silence the error.\n // TODO: Implement component stacks for async client components?\n\n if (maybePromise && typeof maybePromise.catch === 'function') {\n maybePromise.catch(function () {});\n }\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n return [sample.stack, control.stack];\n }\n }\n\n return [null, null];\n }\n }; // $FlowFixMe[prop-missing]\n\n RunInRootFrame.DetermineComponentFrameRoot.displayName = 'DetermineComponentFrameRoot';\n var namePropDescriptor = Object.getOwnPropertyDescriptor(RunInRootFrame.DetermineComponentFrameRoot, 'name'); // Before ES6, the `name` property was not configurable.\n\n if (namePropDescriptor && namePropDescriptor.configurable) {\n // V8 utilizes a function's `name` property when generating a stack trace.\n Object.defineProperty(RunInRootFrame.DetermineComponentFrameRoot, // Configurable properties can be updated even if its writable descriptor\n // is set to `false`.\n // $FlowFixMe[cannot-write]\n 'name', {\n value: 'DetermineComponentFrameRoot'\n });\n }\n\n try {\n var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(),\n sampleStack = _RunInRootFrame$Deter[0],\n controlStack = _RunInRootFrame$Deter[1];\n\n if (sampleStack && controlStack) {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sampleStack.split('\\n');\n var controlLines = controlStack.split('\\n');\n var s = 0;\n var c = 0;\n\n while (s < sampleLines.length && !sampleLines[s].includes('DetermineComponentFrameRoot')) {\n s++;\n }\n\n while (c < controlLines.length && !controlLines[c].includes('DetermineComponentFrameRoot')) {\n c++;\n } // We couldn't find our intentionally injected common root frame, attempt\n // to find another common root frame by search from the bottom of the\n // control stack...\n\n\n if (s === sampleLines.length || c === controlLines.length) {\n s = sampleLines.length - 1;\n c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('')) {\n _frame = _frame.replace('', fn.displayName);\n }\n\n if (true) {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\nvar REACT_CLIENT_REFERENCE = Symbol.for('react.client.reference');\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nfunction ReactElement(type, key, _ref, self, source, owner, props) {\n var ref;\n\n {\n ref = _ref;\n }\n\n var element;\n\n {\n // In prod, `ref` is a regular property. It will be removed in a\n // future release.\n element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n }\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // debugInfo contains Server Component debug information.\n\n Object.defineProperty(element, '_debugInfo', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: null\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n}\nvar didWarnAboutKeySpread = {};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV$1(type, config, maybeKey, isStaticChildren, source, self) {\n {\n if (!isValidElementType(type)) {\n // This is an invalid element type.\n //\n // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n } else {\n // This is a valid element type.\n // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing\n // errors. We don't want exception behavior to differ between dev and\n // prod. (Rendering will throw with a helpful message and as soon as the\n // type is fixed, the key warnings will appear.)\n var children = config.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n } // Warn about key spread regardless of whether the type is valid.\n\n\n if (hasOwnProperty.call(config, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. \n // or ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // , because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n {\n ref = config.ref;\n }\n\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && // Skip over reserved prop names\n propName !== 'key' && (propName !== 'ref')) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n var element = ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n }\n\n return element;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner.current) {\n var name = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object' || !node) {\n return;\n }\n\n if (node.$$typeof === REACT_CLIENT_REFERENCE) ; else if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nvar ownerHasKeyUseWarning = {};\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement(null);\n }\n}\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = getComponentNameFromType(parentType);\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n // TODO: Move this to render phase instead of at element creation.\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement(null);\n }\n }\n}\n\nvar jsxDEV = jsxDEV$1 ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsxDEV = jsxDEV;\n })();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvcmVhY3QvY2pzL3JlYWN0LWpzeC1kZXYtcnVudGltZS5kZXZlbG9wbWVudC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsSUFBSSxJQUFxQztBQUN6QztBQUNBOztBQUVBLFlBQVksbUJBQU8sQ0FBQyxzR0FBMEI7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlHQUFpRyxlQUFlO0FBQ2hIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQSxLQUFLLEdBQUc7O0FBRVIsa0RBQWtEO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDRCQUE0QjtBQUM1QjtBQUNBLHFDQUFxQzs7QUFFckMsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBOztBQUVBLHFFQUFxRTs7QUFFckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0dBQWtHOztBQUVsRztBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLGVBQWU7QUFDMUIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxHQUFHOztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHFCQUFxQjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLDhDQUE4QyxnREFBZ0QsTUFBTSxhQUFhOztBQUVqSDtBQUNBLCtDQUErQyxrQ0FBa0MsT0FBTzs7QUFFeEYsdUdBQXVHLGNBQWMsVUFBVSxnR0FBZ0csa0JBQWtCLFVBQVUsVUFBVTs7QUFFclE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQiwyREFBMkQsVUFBVTtBQUNyRSx5QkFBeUIsVUFBVTtBQUNuQztBQUNBLGFBQWEsVUFBVTtBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxHQUFHO0FBQ2Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0RBQW9EO0FBQ3BELHNCQUFzQixpQkFBaUI7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFlBQVksU0FBUztBQUNyQjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxHQUFHO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw2REFBNkQ7QUFDN0Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixpQkFBaUI7QUFDckM7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdCQUFnQjtBQUNoQixjQUFjO0FBQ2QsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvcmVhY3QvY2pzL3JlYWN0LWpzeC1kZXYtcnVudGltZS5kZXZlbG9wbWVudC5qcz84OTRlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWpzeC1kZXYtcnVudGltZS5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gcmVxdWlyZShcIm5leHQvZGlzdC9jb21waWxlZC9yZWFjdFwiKTtcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTsgLy8gVE9ETzogRGVsZXRlIHdpdGggZW5hYmxlUmVuZGVyYWJsZUNvbnRleHRcblxudmFyIFJFQUNUX0NPTlNVTUVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb25zdW1lcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0NBQ0hFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG52YXIgZW5hYmxlUmVuZGVyYWJsZUNvbnRleHQgPSBmYWxzZTtcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbnZhciBSRUFDVF9DTElFTlRfUkVGRVJFTkNFJDIgPSBTeW1ib2wuZm9yKCdyZWFjdC5jbGllbnQucmVmZXJlbmNlJyk7IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMikge1xuICAgICAgLy8gVE9ETzogQ3JlYXRlIGEgY29udmVudGlvbiBmb3IgbmFtaW5nIGNsaWVudCByZWZlcmVuY2VzIHdpdGggZGVidWcgaW5mby5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICAgIGNhc2UgUkVBQ1RfQ0FDSEVfVFlQRTpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuICdDYWNoZSc7XG4gICAgICB9XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcblxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9DT05TVU1FUl9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyAkRmxvd0ZpeE1lW21ldGhvZC11bmJpbmRpbmddXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl0gb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnOyAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG52YXIgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxID0gU3ltYm9sLmZvcigncmVhY3QuY2xpZW50LnJlZmVyZW5jZScpO1xuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgZW5hYmxlUmVuZGVyYWJsZUNvbnRleHQgIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lW2Nhbm5vdC13cml0ZV0gRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cbi8qKlxuICogTGV2ZXJhZ2VzIG5hdGl2ZSBicm93c2VyL1ZNIHN0YWNrIGZyYW1lcyB0byBnZXQgcHJvcGVyIGRldGFpbHMgKGUuZy5cbiAqIGZpbGVuYW1lLCBsaW5lICsgY29sIG51bWJlcikgZm9yIGEgc2luZ2xlIGNvbXBvbmVudCBpbiBhIGNvbXBvbmVudCBzdGFjay4gV2VcbiAqIGRvIHRoaXMgYnk6XG4gKiAgICgxKSB0aHJvd2luZyBhbmQgY2F0Y2hpbmcgYW4gZXJyb3IgaW4gdGhlIGZ1bmN0aW9uIC0gdGhpcyB3aWxsIGJlIG91clxuICogICAgICAgY29udHJvbCBlcnJvci5cbiAqICAgKDIpIGNhbGxpbmcgdGhlIGNvbXBvbmVudCB3aGljaCB3aWxsIGV2ZW50dWFsbHkgdGhyb3cgYW4gZXJyb3IgdGhhdCB3ZSdsbFxuICogICAgICAgY2F0Y2ggLSB0aGlzIHdpbGwgYmUgb3VyIHNhbXBsZSBlcnJvci5cbiAqICAgKDMpIGRpZmZpbmcgdGhlIGNvbnRyb2wgYW5kIHNhbXBsZSBlcnJvciBzdGFja3MgdG8gZmluZCB0aGUgc3RhY2sgZnJhbWVcbiAqICAgICAgIHdoaWNoIHJlcHJlc2VudHMgb3VyIGNvbXBvbmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEZpbmRpbmcgYSBjb21tb24gc3RhY2sgZnJhbWUgYmV0d2VlbiBzYW1wbGUgYW5kIGNvbnRyb2wgZXJyb3JzIGNhbiBiZVxuICAgKiB0cmlja3kgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcyBhbmQgbGV2ZWxzIG9mIHN0YWNrIHRyYWNlIHRydW5jYXRpb24gZnJvbVxuICAgKiBkaWZmZXJlbnQgSlMgVk1zLiBTbyBpbnN0ZWFkIHdlJ2xsIGF0dGVtcHQgdG8gY29udHJvbCB3aGF0IHRoYXQgY29tbW9uXG4gICAqIGZyYW1lIHNob3VsZCBiZSB0aHJvdWdoIHRoaXMgb2JqZWN0IG1ldGhvZDpcbiAgICogSGF2aW5nIGJvdGggdGhlIHNhbXBsZSBhbmQgY29udHJvbCBlcnJvcnMgYmUgaW4gdGhlIGZ1bmN0aW9uIHVuZGVyIHRoZVxuICAgKiBgRGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZVJvb3RgIHByb3BlcnR5LCArIHNldHRpbmcgdGhlIGBuYW1lYCBhbmRcbiAgICogYGRpc3BsYXlOYW1lYCBwcm9wZXJ0aWVzIG9mIHRoZSBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgYSBzdGFja1xuICAgKiBmcmFtZSBleGlzdHMgdGhhdCBoYXMgdGhlIG1ldGhvZCBuYW1lIGBEZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lUm9vdGAgaW5cbiAgICogaXQgZm9yIGJvdGggY29udHJvbCBhbmQgc2FtcGxlIHN0YWNrcy5cbiAgICovXG5cblxuICB2YXIgUnVuSW5Sb290RnJhbWUgPSB7XG4gICAgRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY29udHJvbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgfTsgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG5cblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgICAgIH0gLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddIGZvdW5kIHdoZW4gdXBncmFkaW5nIEZsb3dcblxuXG4gICAgICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgICAgfSAvLyBUT0RPKGx1bmEpOiBUaGlzIHdpbGwgY3VycmVudGx5IG9ubHkgdGhyb3cgaWYgdGhlIGZ1bmN0aW9uIGNvbXBvbmVudFxuICAgICAgICAgIC8vIHRyaWVzIHRvIGFjY2VzcyBSZWFjdC9SZWFjdERPTS9wcm9wcy4gV2Ugc2hvdWxkIHByb2JhYmx5IG1ha2UgdGhpcyB0aHJvd1xuICAgICAgICAgIC8vIGluIHNpbXBsZSBjb21wb25lbnRzIHRvb1xuXG5cbiAgICAgICAgICB2YXIgbWF5YmVQcm9taXNlID0gZm4oKTsgLy8gSWYgdGhlIGZ1bmN0aW9uIGNvbXBvbmVudCByZXR1cm5zIGEgcHJvbWlzZSwgaXQncyBsaWtlbHkgYW4gYXN5bmNcbiAgICAgICAgICAvLyBjb21wb25lbnQsIHdoaWNoIHdlIGRvbid0IHlldCBzdXBwb3J0LiBBdHRhY2ggYSBub29wIGNhdGNoIGhhbmRsZXIgdG9cbiAgICAgICAgICAvLyBzaWxlbmNlIHRoZSBlcnJvci5cbiAgICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgY29tcG9uZW50IHN0YWNrcyBmb3IgYXN5bmMgY2xpZW50IGNvbXBvbmVudHM/XG5cbiAgICAgICAgICBpZiAobWF5YmVQcm9taXNlICYmIHR5cGVvZiBtYXliZVByb21pc2UuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG1heWJlUHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICAgICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIFtzYW1wbGUuc3RhY2ssIGNvbnRyb2wuc3RhY2tdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gICAgfVxuICB9OyAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cblxuICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QuZGlzcGxheU5hbWUgPSAnRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290JztcbiAgdmFyIG5hbWVQcm9wRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LCAnbmFtZScpOyAvLyBCZWZvcmUgRVM2LCB0aGUgYG5hbWVgIHByb3BlcnR5IHdhcyBub3QgY29uZmlndXJhYmxlLlxuXG4gIGlmIChuYW1lUHJvcERlc2NyaXB0b3IgJiYgbmFtZVByb3BEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgIC8vIFY4IHV0aWxpemVzIGEgZnVuY3Rpb24ncyBgbmFtZWAgcHJvcGVydHkgd2hlbiBnZW5lcmF0aW5nIGEgc3RhY2sgdHJhY2UuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCwgLy8gQ29uZmlndXJhYmxlIHByb3BlcnRpZXMgY2FuIGJlIHVwZGF0ZWQgZXZlbiBpZiBpdHMgd3JpdGFibGUgZGVzY3JpcHRvclxuICAgIC8vIGlzIHNldCB0byBgZmFsc2VgLlxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuICAgICduYW1lJywge1xuICAgICAgdmFsdWU6ICdEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QnXG4gICAgfSk7XG4gIH1cblxuICB0cnkge1xuICAgIHZhciBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPSBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QoKSxcbiAgICAgICAgc2FtcGxlU3RhY2sgPSBfUnVuSW5Sb290RnJhbWUkRGV0ZXJbMF0sXG4gICAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcblxuICAgIGlmIChzYW1wbGVTdGFjayAmJiBjb250cm9sU3RhY2spIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZVN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sU3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSAwO1xuICAgICAgdmFyIGMgPSAwO1xuXG4gICAgICB3aGlsZSAocyA8IHNhbXBsZUxpbmVzLmxlbmd0aCAmJiAhc2FtcGxlTGluZXNbc10uaW5jbHVkZXMoJ0RldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCcpKSB7XG4gICAgICAgIHMrKztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGMgPCBjb250cm9sTGluZXMubGVuZ3RoICYmICFjb250cm9sTGluZXNbY10uaW5jbHVkZXMoJ0RldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCcpKSB7XG4gICAgICAgIGMrKztcbiAgICAgIH0gLy8gV2UgY291bGRuJ3QgZmluZCBvdXIgaW50ZW50aW9uYWxseSBpbmplY3RlZCBjb21tb24gcm9vdCBmcmFtZSwgYXR0ZW1wdFxuICAgICAgLy8gdG8gZmluZCBhbm90aGVyIGNvbW1vbiByb290IGZyYW1lIGJ5IHNlYXJjaCBmcm9tIHRoZSBib3R0b20gb2YgdGhlXG4gICAgICAvLyBjb250cm9sIHN0YWNrLi4uXG5cblxuICAgICAgaWYgKHMgPT09IHNhbXBsZUxpbmVzLmxlbmd0aCB8fCBjID09PSBjb250cm9sTGluZXMubGVuZ3RoKSB7XG4gICAgICAgIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgICBjLS07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbnZhciBSRUFDVF9DTElFTlRfUkVGRVJFTkNFID0gU3ltYm9sLmZvcigncmVhY3QuY2xpZW50LnJlZmVyZW5jZScpO1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duO1xudmFyIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnLCBzZWxmKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB7XG4gICAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxuZnVuY3Rpb24gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgX3JlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIHJlZjtcblxuICB7XG4gICAgcmVmID0gX3JlZjtcbiAgfVxuXG4gIHZhciBlbGVtZW50O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kLCBgcmVmYCBpcyBhIHJlZ3VsYXIgcHJvcGVydHkuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBhXG4gICAgLy8gZnV0dXJlIHJlbGVhc2UuXG4gICAgZWxlbWVudCA9IHtcbiAgICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBrZXk6IGtleSxcbiAgICAgIHJlZjogcmVmLFxuICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICAgIF9vd25lcjogb3duZXJcbiAgICB9O1xuICB9XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBkZWJ1Z0luZm8gY29udGFpbnMgU2VydmVyIENvbXBvbmVudCBkZWJ1ZyBpbmZvcm1hdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX2RlYnVnSW5mbycsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IG51bGxcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbnZhciBkaWRXYXJuQWJvdXRLZXlTcHJlYWQgPSB7fTtcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmZjcy9wdWxsLzEwN1xuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqL1xuXG5mdW5jdGlvbiBqc3hERVYkMSh0eXBlLCBjb25maWcsIG1heWJlS2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBzb3VyY2UsIHNlbGYpIHtcbiAge1xuICAgIGlmICghaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpKSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGludmFsaWQgZWxlbWVudCB0eXBlLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gICAgICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICAgIH1cblxuICAgICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSAnbnVsbCc7XG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCdSZWFjdC5qc3g6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYSB2YWxpZCBlbGVtZW50IHR5cGUuXG4gICAgICAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgICAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9ycy4gV2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gYmVoYXZpb3IgdG8gZGlmZmVyIGJldHdlZW4gZGV2IGFuZFxuICAgICAgLy8gcHJvZC4gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlXG4gICAgICAvLyB0eXBlIGlzIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcbiAgICAgIHZhciBjaGlsZHJlbiA9IGNvbmZpZy5jaGlsZHJlbjtcblxuICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljQ2hpbGRyZW4pIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW5baV0sIHR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IoJ1JlYWN0LmpzeDogU3RhdGljIGNoaWxkcmVuIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXkuICcgKyAnWW91IGFyZSBsaWtlbHkgZXhwbGljaXRseSBjYWxsaW5nIFJlYWN0LmpzeHMgb3IgUmVhY3QuanN4REVWLiAnICsgJ1VzZSB0aGUgQmFiZWwgdHJhbnNmb3JtIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gV2FybiBhYm91dCBrZXkgc3ByZWFkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdHlwZSBpcyB2YWxpZC5cblxuXG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb25maWcpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gayAhPT0gJ2tleSc7XG4gICAgICB9KTtcbiAgICAgIHZhciBiZWZvcmVFeGFtcGxlID0ga2V5cy5sZW5ndGggPiAwID8gJ3trZXk6IHNvbWVLZXksICcgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3trZXk6IHNvbWVLZXl9JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY29tcG9uZW50TmFtZSArIGJlZm9yZUV4YW1wbGVdKSB7XG4gICAgICAgIHZhciBhZnRlckV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAneycgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3t9JztcblxuICAgICAgICBlcnJvcignQSBwcm9wcyBvYmplY3QgY29udGFpbmluZyBhIFwia2V5XCIgcHJvcCBpcyBiZWluZyBzcHJlYWQgaW50byBKU1g6XFxuJyArICcgIGxldCBwcm9wcyA9ICVzO1xcbicgKyAnICA8JXMgey4uLnByb3BzfSAvPlxcbicgKyAnUmVhY3Qga2V5cyBtdXN0IGJlIHBhc3NlZCBkaXJlY3RseSB0byBKU1ggd2l0aG91dCB1c2luZyBzcHJlYWQ6XFxuJyArICcgIGxldCBwcm9wcyA9ICVzO1xcbicgKyAnICA8JXMga2V5PXtzb21lS2V5fSB7Li4ucHJvcHN9IC8+JywgYmVmb3JlRXhhbXBsZSwgY29tcG9uZW50TmFtZSwgYWZ0ZXJFeGFtcGxlLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY29tcG9uZW50TmFtZSArIGJlZm9yZUV4YW1wbGVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIHZhciBrZXkgPSBudWxsO1xuICAgIHZhciByZWYgPSBudWxsOyAvLyBDdXJyZW50bHksIGtleSBjYW4gYmUgc3ByZWFkIGluIGFzIGEgcHJvcC4gVGhpcyBjYXVzZXMgYSBwb3RlbnRpYWxcbiAgICAvLyBpc3N1ZSBpZiBrZXkgaXMgYWxzbyBleHBsaWNpdGx5IGRlY2xhcmVkIChpZS4gPGRpdiB7Li4ucHJvcHN9IGtleT1cIkhpXCIgLz5cbiAgICAvLyBvciA8ZGl2IGtleT1cIkhpXCIgey4uLnByb3BzfSAvPiApLiBXZSB3YW50IHRvIGRlcHJlY2F0ZSBrZXkgc3ByZWFkLFxuICAgIC8vIGJ1dCBhcyBhbiBpbnRlcm1lZGlhcnkgc3RlcCwgd2Ugd2lsbCB1c2UganN4REVWIGZvciBldmVyeXRoaW5nIGV4Y2VwdFxuICAgIC8vIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+LCBiZWNhdXNlIHdlIGFyZW4ndCBjdXJyZW50bHkgYWJsZSB0byB0ZWxsIGlmXG4gICAgLy8ga2V5IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgdG8gYmUgdW5kZWZpbmVkIG9yIG5vdC5cblxuICAgIGlmIChtYXliZUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWF5YmVLZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIG1heWJlS2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgfVxuXG4gICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnLCBzZWxmKTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmIC8vIFNraXAgb3ZlciByZXNlcnZlZCBwcm9wIG5hbWVzXG4gICAgICBwcm9wTmFtZSAhPT0gJ2tleScgJiYgKHByb3BOYW1lICE9PSAncmVmJykpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xuXG4gICAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIHtcbiAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnIHx8ICFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UpIDsgZWxzZSBpZiAoaXNBcnJheShub2RlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICB7XG4gICAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gICAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAgIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICAgIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAge1xuICAgIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgICBpZiAoIWluZm8pIHtcbiAgICAgIHZhciBwYXJlbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHBhcmVudFR5cGUpO1xuXG4gICAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZm87XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcmVuZGVyIHBoYXNlIGluc3RlYWQgb2YgYXQgZWxlbWVudCBjcmVhdGlvbi5cbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIganN4REVWID0ganN4REVWJDEgO1xuXG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuanN4REVWID0ganN4REVWO1xuICB9KSgpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js":
/*!******************************************************************!*\
!*** ./node_modules/next/dist/compiled/react/jsx-dev-runtime.js ***!
\******************************************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("\n\nif (false) {} else {\n module.exports = __webpack_require__(/*! ./cjs/react-jsx-dev-runtime.development.js */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js\");\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvcmVhY3QvanN4LWRldi1ydW50aW1lLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUksS0FBcUMsRUFBRSxFQUUxQyxDQUFDO0FBQ0YsRUFBRSw4TEFBc0U7QUFDeEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jb21waWxlZC9yZWFjdC9qc3gtZGV2LXJ1bnRpbWUuanM/OTY3YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1kZXYtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js":
/*!*********************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js ***!
\*********************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ _arrayLikeToArray; }\n/* harmony export */ });\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheUxpa2VUb0FycmF5LmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0EsZ0NBQWdDLE9BQU87QUFDdkM7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlMaWtlVG9BcnJheS5qcz85ZTYzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIHtcbiAgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpO1xuICBmb3IgKHZhciBlID0gMCwgbiA9IEFycmF5KGEpOyBlIDwgYTsgZSsrKSBuW2VdID0gcltlXTtcbiAgcmV0dXJuIG47XG59XG5leHBvcnQgeyBfYXJyYXlMaWtlVG9BcnJheSBhcyBkZWZhdWx0IH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js":
/*!*******************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js ***!
\*******************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ _arrayWithHoles; }\n/* harmony export */ });\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcz82MzM5Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjtcbn1cbmV4cG9ydCB7IF9hcnJheVdpdGhIb2xlcyBhcyBkZWZhdWx0IH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js":
/*!*************************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js ***!
\*************************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ _iterableToArrayLimit; }\n/* harmony export */ });\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsWUFBWSxrRUFBa0U7QUFDdEYsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcz8yMTVlIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7XG4gIHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmIChudWxsICE9IHQpIHtcbiAgICB2YXIgZSxcbiAgICAgIG4sXG4gICAgICBpLFxuICAgICAgdSxcbiAgICAgIGEgPSBbXSxcbiAgICAgIGYgPSAhMCxcbiAgICAgIG8gPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkge1xuICAgICAgICBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47XG4gICAgICAgIGYgPSAhMTtcbiAgICAgIH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTtcbiAgICB9IGNhdGNoIChyKSB7XG4gICAgICBvID0gITAsIG4gPSByO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWYgJiYgbnVsbCAhPSB0W1wicmV0dXJuXCJdICYmICh1ID0gdFtcInJldHVyblwiXSgpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobykgdGhyb3cgbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cbn1cbmV4cG9ydCB7IF9pdGVyYWJsZVRvQXJyYXlMaW1pdCBhcyBkZWZhdWx0IH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js":
/*!********************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js ***!
\********************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ _nonIterableRest; }\n/* harmony export */ });\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9ub25JdGVyYWJsZVJlc3QuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzP2ZkOWEiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmV4cG9ydCB7IF9ub25JdGVyYWJsZVJlc3QgYXMgZGVmYXVsdCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js":
/*!******************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js ***!
\******************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ _slicedToArray; }\n/* harmony export */ });\n/* harmony import */ var _arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithHoles.js */ \"(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\");\n/* harmony import */ var _iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArrayLimit.js */ \"(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\");\n/* harmony import */ var _unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray.js */ \"(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\");\n/* harmony import */ var _nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableRest.js */ \"(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\");\n\n\n\n\nfunction _slicedToArray(r, e) {\n return (0,_arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(r) || (0,_iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(r, e) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(r, e) || (0,_nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQWlEO0FBQ1k7QUFDWTtBQUN0QjtBQUNuRDtBQUNBLFNBQVMsOERBQWMsT0FBTyxvRUFBb0IsVUFBVSwwRUFBMEIsVUFBVSwrREFBZTtBQUMvRyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheS5qcz83Nzk1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhcnJheVdpdGhIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheUxpbWl0IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCI7XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShyLCBlKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBlKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBlKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cbmV4cG9ydCB7IF9zbGljZWRUb0FycmF5IGFzIGRlZmF1bHQgfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/typeof.js":
/*!***********************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/esm/typeof.js ***!
\***********************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ _typeof; }\n/* harmony export */ });\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzPzliODYiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgX3R5cGVvZihvKTtcbn1cbmV4cG9ydCB7IF90eXBlb2YgYXMgZGVmYXVsdCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/typeof.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js":
/*!*******************************************************************************!*\
!*** ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js ***!
\*******************************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ _unsupportedIterableToArray; }\n/* harmony export */ });\n/* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ \"(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\");\n\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(r, a) : void 0;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFxRDtBQUNyRDtBQUNBO0FBQ0EscUNBQXFDLGdFQUFnQjtBQUNyRCxjQUFjO0FBQ2QsK0xBQStMLGdFQUFnQjtBQUMvTTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcz84NDhkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7XG4gIGlmIChyKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KHIsIGEpO1xuICAgIHZhciB0ID0ge30udG9TdHJpbmcuY2FsbChyKS5zbGljZSg4LCAtMSk7XG4gICAgcmV0dXJuIFwiT2JqZWN0XCIgPT09IHQgJiYgci5jb25zdHJ1Y3RvciAmJiAodCA9IHIuY29uc3RydWN0b3IubmFtZSksIFwiTWFwXCIgPT09IHQgfHwgXCJTZXRcIiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiBcIkFyZ3VtZW50c1wiID09PSB0IHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHQpID8gYXJyYXlMaWtlVG9BcnJheShyLCBhKSA6IHZvaWQgMDtcbiAgfVxufVxuZXhwb3J0IHsgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGFzIGRlZmF1bHQgfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/jspdf-autotable/dist/jspdf.plugin.autotable.mjs":
/*!**********************************************************************!*\
!*** ./node_modules/jspdf-autotable/dist/jspdf.plugin.autotable.mjs ***!
\**********************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Cell: function() { return /* binding */ Cell; },\n/* harmony export */ CellHookData: function() { return /* binding */ CellHookData; },\n/* harmony export */ Column: function() { return /* binding */ Column; },\n/* harmony export */ HookData: function() { return /* binding */ HookData; },\n/* harmony export */ Row: function() { return /* binding */ Row; },\n/* harmony export */ Table: function() { return /* binding */ Table; },\n/* harmony export */ __createTable: function() { return /* binding */ __createTable; },\n/* harmony export */ __drawTable: function() { return /* binding */ __drawTable; },\n/* harmony export */ applyPlugin: function() { return /* binding */ applyPlugin; },\n/* harmony export */ autoTable: function() { return /* binding */ autoTable; },\n/* harmony export */ \"default\": function() { return /* binding */ autoTable; }\n/* harmony export */ });\n/**\n * Improved text function with halign and valign support\n * Inspiration from: http://stackoverflow.com/questions/28327510/align-text-right-using-jspdf/28433113#28433113\n */\nfunction autoTableText (text, x, y, styles, doc) {\n styles = styles || {};\n var PHYSICAL_LINE_HEIGHT = 1.15;\n var k = doc.internal.scaleFactor;\n var fontSize = doc.internal.getFontSize() / k;\n var lineHeightFactor = doc.getLineHeightFactor\n ? doc.getLineHeightFactor()\n : PHYSICAL_LINE_HEIGHT;\n var lineHeight = fontSize * lineHeightFactor;\n var splitRegex = /\\r\\n|\\r|\\n/g;\n var splitText = '';\n var lineCount = 1;\n if (styles.valign === 'middle' ||\n styles.valign === 'bottom' ||\n styles.halign === 'center' ||\n styles.halign === 'right') {\n splitText = typeof text === 'string' ? text.split(splitRegex) : text;\n lineCount = splitText.length || 1;\n }\n // Align the top\n y += fontSize * (2 - PHYSICAL_LINE_HEIGHT);\n if (styles.valign === 'middle')\n y -= (lineCount / 2) * lineHeight;\n else if (styles.valign === 'bottom')\n y -= lineCount * lineHeight;\n if (styles.halign === 'center' || styles.halign === 'right') {\n var alignSize = fontSize;\n if (styles.halign === 'center')\n alignSize *= 0.5;\n if (splitText && lineCount >= 1) {\n for (var iLine = 0; iLine < splitText.length; iLine++) {\n doc.text(splitText[iLine], x - doc.getStringUnitWidth(splitText[iLine]) * alignSize, y);\n y += lineHeight;\n }\n return doc;\n }\n x -= doc.getStringUnitWidth(text) * alignSize;\n }\n if (styles.halign === 'justify') {\n doc.text(text, x, y, { maxWidth: styles.maxWidth || 100, align: 'justify' });\n }\n else {\n doc.text(text, x, y);\n }\n return doc;\n}\n\nvar globalDefaults = {};\nvar DocHandler = /** @class */ (function () {\n function DocHandler(jsPDFDocument) {\n this.jsPDFDocument = jsPDFDocument;\n this.userStyles = {\n // Black for versions of jspdf without getTextColor\n textColor: jsPDFDocument.getTextColor\n ? this.jsPDFDocument.getTextColor()\n : 0,\n fontSize: jsPDFDocument.internal.getFontSize(),\n fontStyle: jsPDFDocument.internal.getFont().fontStyle,\n font: jsPDFDocument.internal.getFont().fontName,\n // 0 for versions of jspdf without getLineWidth\n lineWidth: jsPDFDocument.getLineWidth\n ? this.jsPDFDocument.getLineWidth()\n : 0,\n // Black for versions of jspdf without getDrawColor\n lineColor: jsPDFDocument.getDrawColor\n ? this.jsPDFDocument.getDrawColor()\n : 0,\n };\n }\n DocHandler.setDefaults = function (defaults, doc) {\n if (doc === void 0) { doc = null; }\n if (doc) {\n doc.__autoTableDocumentDefaults = defaults;\n }\n else {\n globalDefaults = defaults;\n }\n };\n DocHandler.unifyColor = function (c) {\n if (Array.isArray(c)) {\n return c;\n }\n else if (typeof c === 'number') {\n return [c, c, c];\n }\n else if (typeof c === 'string') {\n return [c];\n }\n else {\n return null;\n }\n };\n DocHandler.prototype.applyStyles = function (styles, fontOnly) {\n // Font style needs to be applied before font\n // https://github.com/simonbengtsson/jsPDF-AutoTable/issues/632\n var _a, _b, _c;\n if (fontOnly === void 0) { fontOnly = false; }\n if (styles.fontStyle && this.jsPDFDocument.setFontStyle) {\n this.jsPDFDocument.setFontStyle(styles.fontStyle);\n }\n var _d = this.jsPDFDocument.internal.getFont(), fontStyle = _d.fontStyle, fontName = _d.fontName;\n if (styles.font)\n fontName = styles.font;\n if (styles.fontStyle) {\n fontStyle = styles.fontStyle;\n var availableFontStyles = this.getFontList()[fontName];\n if (availableFontStyles &&\n availableFontStyles.indexOf(fontStyle) === -1 &&\n this.jsPDFDocument.setFontStyle) {\n // Common issue was that the default bold in headers\n // made custom fonts not work. For example:\n // https://github.com/simonbengtsson/jsPDF-AutoTable/issues/653\n this.jsPDFDocument.setFontStyle(availableFontStyles[0]);\n fontStyle = availableFontStyles[0];\n }\n }\n this.jsPDFDocument.setFont(fontName, fontStyle);\n if (styles.fontSize)\n this.jsPDFDocument.setFontSize(styles.fontSize);\n if (fontOnly) {\n return; // Performance improvement\n }\n var color = DocHandler.unifyColor(styles.fillColor);\n if (color)\n (_a = this.jsPDFDocument).setFillColor.apply(_a, color);\n color = DocHandler.unifyColor(styles.textColor);\n if (color)\n (_b = this.jsPDFDocument).setTextColor.apply(_b, color);\n color = DocHandler.unifyColor(styles.lineColor);\n if (color)\n (_c = this.jsPDFDocument).setDrawColor.apply(_c, color);\n if (typeof styles.lineWidth === 'number') {\n this.jsPDFDocument.setLineWidth(styles.lineWidth);\n }\n };\n DocHandler.prototype.splitTextToSize = function (text, size, opts) {\n return this.jsPDFDocument.splitTextToSize(text, size, opts);\n };\n /**\n * Adds a rectangle to the PDF\n * @param x Coordinate (in units declared at inception of PDF document) against left edge of the page\n * @param y Coordinate (in units declared at inception of PDF document) against upper edge of the page\n * @param width Width (in units declared at inception of PDF document)\n * @param height Height (in units declared at inception of PDF document)\n * @param fillStyle A string specifying the painting style or null. Valid styles include: 'S' [default] - stroke, 'F' - fill, and 'DF' (or 'FD') - fill then stroke.\n */\n DocHandler.prototype.rect = function (x, y, width, height, fillStyle) {\n // null is excluded from fillStyle possible values because it isn't needed\n // and is prone to bugs as it's used to postpone setting the style\n // https://rawgit.com/MrRio/jsPDF/master/docs/jsPDF.html#rect\n return this.jsPDFDocument.rect(x, y, width, height, fillStyle);\n };\n DocHandler.prototype.getLastAutoTable = function () {\n return this.jsPDFDocument.lastAutoTable || null;\n };\n DocHandler.prototype.getTextWidth = function (text) {\n return this.jsPDFDocument.getTextWidth(text);\n };\n DocHandler.prototype.getDocument = function () {\n return this.jsPDFDocument;\n };\n DocHandler.prototype.setPage = function (page) {\n this.jsPDFDocument.setPage(page);\n };\n DocHandler.prototype.addPage = function () {\n return this.jsPDFDocument.addPage();\n };\n DocHandler.prototype.getFontList = function () {\n return this.jsPDFDocument.getFontList();\n };\n DocHandler.prototype.getGlobalOptions = function () {\n return globalDefaults || {};\n };\n DocHandler.prototype.getDocumentOptions = function () {\n return this.jsPDFDocument.__autoTableDocumentDefaults || {};\n };\n DocHandler.prototype.pageSize = function () {\n var pageSize = this.jsPDFDocument.internal.pageSize;\n // JSPDF 1.4 uses get functions instead of properties on pageSize\n if (pageSize.width == null) {\n pageSize = { width: pageSize.getWidth(), height: pageSize.getHeight() };\n }\n return pageSize;\n };\n DocHandler.prototype.scaleFactor = function () {\n return this.jsPDFDocument.internal.scaleFactor;\n };\n DocHandler.prototype.getLineHeightFactor = function () {\n var doc = this.jsPDFDocument;\n return doc.getLineHeightFactor ? doc.getLineHeightFactor() : 1.15;\n };\n DocHandler.prototype.getLineHeight = function (fontSize) {\n return (fontSize / this.scaleFactor()) * this.getLineHeightFactor();\n };\n DocHandler.prototype.pageNumber = function () {\n var pageInfo = this.jsPDFDocument.internal.getCurrentPageInfo();\n if (!pageInfo) {\n // Only recent versions of jspdf has pageInfo\n return this.jsPDFDocument.internal.getNumberOfPages();\n }\n return pageInfo.pageNumber;\n };\n return DocHandler;\n}());\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar HtmlRowInput = /** @class */ (function (_super) {\n __extends(HtmlRowInput, _super);\n function HtmlRowInput(element) {\n var _this = _super.call(this) || this;\n _this._element = element;\n return _this;\n }\n return HtmlRowInput;\n}(Array));\n// Base style for all themes\nfunction defaultStyles(scaleFactor) {\n return {\n font: 'helvetica', // helvetica, times, courier\n fontStyle: 'normal', // normal, bold, italic, bolditalic\n overflow: 'linebreak', // linebreak, ellipsize, visible or hidden\n fillColor: false, // Either false for transparent, rbg array e.g. [255, 255, 255] or gray level e.g 200\n textColor: 20,\n halign: 'left', // left, center, right, justify\n valign: 'top', // top, middle, bottom\n fontSize: 10,\n cellPadding: 5 / scaleFactor, // number or {top,left,right,left,vertical,horizontal}\n lineColor: 200,\n lineWidth: 0,\n cellWidth: 'auto', // 'auto'|'wrap'|number\n minCellHeight: 0,\n minCellWidth: 0,\n };\n}\nfunction getTheme(name) {\n var themes = {\n striped: {\n table: { fillColor: 255, textColor: 80, fontStyle: 'normal' },\n head: { textColor: 255, fillColor: [41, 128, 185], fontStyle: 'bold' },\n body: {},\n foot: { textColor: 255, fillColor: [41, 128, 185], fontStyle: 'bold' },\n alternateRow: { fillColor: 245 },\n },\n grid: {\n table: {\n fillColor: 255,\n textColor: 80,\n fontStyle: 'normal',\n lineWidth: 0.1,\n },\n head: {\n textColor: 255,\n fillColor: [26, 188, 156],\n fontStyle: 'bold',\n lineWidth: 0,\n },\n body: {},\n foot: {\n textColor: 255,\n fillColor: [26, 188, 156],\n fontStyle: 'bold',\n lineWidth: 0,\n },\n alternateRow: {},\n },\n plain: { head: { fontStyle: 'bold' }, foot: { fontStyle: 'bold' } },\n };\n return themes[name];\n}\n\nfunction getStringWidth(text, styles, doc) {\n doc.applyStyles(styles, true);\n var textArr = Array.isArray(text) ? text : [text];\n var widestLineWidth = textArr\n .map(function (text) { return doc.getTextWidth(text); })\n .reduce(function (a, b) { return Math.max(a, b); }, 0);\n return widestLineWidth;\n}\nfunction addTableBorder(doc, table, startPos, cursor) {\n var lineWidth = table.settings.tableLineWidth;\n var lineColor = table.settings.tableLineColor;\n doc.applyStyles({ lineWidth: lineWidth, lineColor: lineColor });\n var fillStyle = getFillStyle(lineWidth, false);\n if (fillStyle) {\n doc.rect(startPos.x, startPos.y, table.getWidth(doc.pageSize().width), cursor.y - startPos.y, fillStyle);\n }\n}\nfunction getFillStyle(lineWidth, fillColor) {\n var drawLine = lineWidth > 0;\n var drawBackground = fillColor || fillColor === 0;\n if (drawLine && drawBackground) {\n return 'DF'; // Fill then stroke\n }\n else if (drawLine) {\n return 'S'; // Only stroke (transparent background)\n }\n else if (drawBackground) {\n return 'F'; // Only fill, no stroke\n }\n else {\n return null;\n }\n}\nfunction parseSpacing(value, defaultValue) {\n var _a, _b, _c, _d;\n value = value || defaultValue;\n if (Array.isArray(value)) {\n if (value.length >= 4) {\n return {\n top: value[0],\n right: value[1],\n bottom: value[2],\n left: value[3],\n };\n }\n else if (value.length === 3) {\n return {\n top: value[0],\n right: value[1],\n bottom: value[2],\n left: value[1],\n };\n }\n else if (value.length === 2) {\n return {\n top: value[0],\n right: value[1],\n bottom: value[0],\n left: value[1],\n };\n }\n else if (value.length === 1) {\n value = value[0];\n }\n else {\n value = defaultValue;\n }\n }\n if (typeof value === 'object') {\n if (typeof value.vertical === 'number') {\n value.top = value.vertical;\n value.bottom = value.vertical;\n }\n if (typeof value.horizontal === 'number') {\n value.right = value.horizontal;\n value.left = value.horizontal;\n }\n return {\n left: (_a = value.left) !== null && _a !== void 0 ? _a : defaultValue,\n top: (_b = value.top) !== null && _b !== void 0 ? _b : defaultValue,\n right: (_c = value.right) !== null && _c !== void 0 ? _c : defaultValue,\n bottom: (_d = value.bottom) !== null && _d !== void 0 ? _d : defaultValue,\n };\n }\n if (typeof value !== 'number') {\n value = defaultValue;\n }\n return { top: value, right: value, bottom: value, left: value };\n}\nfunction getPageAvailableWidth(doc, table) {\n var margins = parseSpacing(table.settings.margin, 0);\n return doc.pageSize().width - (margins.left + margins.right);\n}\n\n// Limitations\n// - No support for border spacing\n// - No support for transparency\nfunction parseCss(supportedFonts, element, scaleFactor, style, window) {\n var result = {};\n var pxScaleFactor = 96 / 72;\n var backgroundColor = parseColor(element, function (elem) {\n return window.getComputedStyle(elem)['backgroundColor'];\n });\n if (backgroundColor != null)\n result.fillColor = backgroundColor;\n var textColor = parseColor(element, function (elem) {\n return window.getComputedStyle(elem)['color'];\n });\n if (textColor != null)\n result.textColor = textColor;\n var padding = parsePadding(style, scaleFactor);\n if (padding)\n result.cellPadding = padding;\n var borderColorSide = 'borderTopColor';\n var finalScaleFactor = pxScaleFactor * scaleFactor;\n var btw = style.borderTopWidth;\n if (style.borderBottomWidth === btw &&\n style.borderRightWidth === btw &&\n style.borderLeftWidth === btw) {\n var borderWidth = (parseFloat(btw) || 0) / finalScaleFactor;\n if (borderWidth)\n result.lineWidth = borderWidth;\n }\n else {\n result.lineWidth = {\n top: (parseFloat(style.borderTopWidth) || 0) / finalScaleFactor,\n right: (parseFloat(style.borderRightWidth) || 0) / finalScaleFactor,\n bottom: (parseFloat(style.borderBottomWidth) || 0) / finalScaleFactor,\n left: (parseFloat(style.borderLeftWidth) || 0) / finalScaleFactor,\n };\n // Choose border color of first available side\n // could be improved by supporting object as lineColor\n if (!result.lineWidth.top) {\n if (result.lineWidth.right) {\n borderColorSide = 'borderRightColor';\n }\n else if (result.lineWidth.bottom) {\n borderColorSide = 'borderBottomColor';\n }\n else if (result.lineWidth.left) {\n borderColorSide = 'borderLeftColor';\n }\n }\n }\n var borderColor = parseColor(element, function (elem) {\n return window.getComputedStyle(elem)[borderColorSide];\n });\n if (borderColor != null)\n result.lineColor = borderColor;\n var accepted = ['left', 'right', 'center', 'justify'];\n if (accepted.indexOf(style.textAlign) !== -1) {\n result.halign = style.textAlign;\n }\n accepted = ['middle', 'bottom', 'top'];\n if (accepted.indexOf(style.verticalAlign) !== -1) {\n result.valign = style.verticalAlign;\n }\n var res = parseInt(style.fontSize || '');\n if (!isNaN(res))\n result.fontSize = res / pxScaleFactor;\n var fontStyle = parseFontStyle(style);\n if (fontStyle)\n result.fontStyle = fontStyle;\n var font = (style.fontFamily || '').toLowerCase();\n if (supportedFonts.indexOf(font) !== -1) {\n result.font = font;\n }\n return result;\n}\nfunction parseFontStyle(style) {\n var res = '';\n if (style.fontWeight === 'bold' ||\n style.fontWeight === 'bolder' ||\n parseInt(style.fontWeight) >= 700) {\n res = 'bold';\n }\n if (style.fontStyle === 'italic' || style.fontStyle === 'oblique') {\n res += 'italic';\n }\n return res;\n}\nfunction parseColor(element, styleGetter) {\n var cssColor = realColor(element, styleGetter);\n if (!cssColor)\n return null;\n var rgba = cssColor.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d*\\.?\\d*))?\\)$/);\n if (!rgba || !Array.isArray(rgba)) {\n return null;\n }\n var color = [\n parseInt(rgba[1]),\n parseInt(rgba[2]),\n parseInt(rgba[3]),\n ];\n var alpha = parseInt(rgba[4]);\n if (alpha === 0 || isNaN(color[0]) || isNaN(color[1]) || isNaN(color[2])) {\n return null;\n }\n return color;\n}\nfunction realColor(elem, styleGetter) {\n var bg = styleGetter(elem);\n if (bg === 'rgba(0, 0, 0, 0)' ||\n bg === 'transparent' ||\n bg === 'initial' ||\n bg === 'inherit') {\n if (elem.parentElement == null) {\n return null;\n }\n return realColor(elem.parentElement, styleGetter);\n }\n else {\n return bg;\n }\n}\nfunction parsePadding(style, scaleFactor) {\n var val = [\n style.paddingTop,\n style.paddingRight,\n style.paddingBottom,\n style.paddingLeft,\n ];\n var pxScaleFactor = 96 / (72 / scaleFactor);\n var linePadding = (parseInt(style.lineHeight) - parseInt(style.fontSize)) / scaleFactor / 2;\n var inputPadding = val.map(function (n) {\n return parseInt(n || '0') / pxScaleFactor;\n });\n var padding = parseSpacing(inputPadding, 0);\n if (linePadding > padding.top) {\n padding.top = linePadding;\n }\n if (linePadding > padding.bottom) {\n padding.bottom = linePadding;\n }\n return padding;\n}\n\nfunction parseHtml(doc, input, window, includeHiddenHtml, useCss) {\n var _a, _b;\n if (includeHiddenHtml === void 0) { includeHiddenHtml = false; }\n if (useCss === void 0) { useCss = false; }\n var tableElement;\n if (typeof input === 'string') {\n tableElement = window.document.querySelector(input);\n }\n else {\n tableElement = input;\n }\n var supportedFonts = Object.keys(doc.getFontList());\n var scaleFactor = doc.scaleFactor();\n var head = [], body = [], foot = [];\n if (!tableElement) {\n console.error('Html table could not be found with input: ', input);\n return { head: head, body: body, foot: foot };\n }\n for (var i = 0; i < tableElement.rows.length; i++) {\n var element = tableElement.rows[i];\n var tagName = (_b = (_a = element === null || element === void 0 ? void 0 : element.parentElement) === null || _a === void 0 ? void 0 : _a.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase();\n var row = parseRowContent(supportedFonts, scaleFactor, window, element, includeHiddenHtml, useCss);\n if (!row)\n continue;\n if (tagName === 'thead') {\n head.push(row);\n }\n else if (tagName === 'tfoot') {\n foot.push(row);\n }\n else {\n // Add to body both if parent is tbody or table\n body.push(row);\n }\n }\n return { head: head, body: body, foot: foot };\n}\nfunction parseRowContent(supportedFonts, scaleFactor, window, row, includeHidden, useCss) {\n var resultRow = new HtmlRowInput(row);\n for (var i = 0; i < row.cells.length; i++) {\n var cell = row.cells[i];\n var style_1 = window.getComputedStyle(cell);\n if (includeHidden || style_1.display !== 'none') {\n var cellStyles = void 0;\n if (useCss) {\n cellStyles = parseCss(supportedFonts, cell, scaleFactor, style_1, window);\n }\n resultRow.push({\n rowSpan: cell.rowSpan,\n colSpan: cell.colSpan,\n styles: cellStyles,\n _element: cell,\n content: parseCellContent(cell),\n });\n }\n }\n var style = window.getComputedStyle(row);\n if (resultRow.length > 0 && (includeHidden || style.display !== 'none')) {\n return resultRow;\n }\n}\nfunction parseCellContent(orgCell) {\n // Work on cloned node to make sure no changes are applied to html table\n var cell = orgCell.cloneNode(true);\n // Remove extra space and line breaks in markup to make it more similar to\n // what would be shown in html\n cell.innerHTML = cell.innerHTML.replace(/\\n/g, '').replace(/ +/g, ' ');\n // Preserve
tags as line breaks in the pdf\n cell.innerHTML = cell.innerHTML\n .split(//) //start with '
'.\n .map(function (part) { return part.trim(); })\n .join('\\n');\n // innerText for ie\n return cell.innerText || cell.textContent || '';\n}\n\nfunction validateInput(global, document, current) {\n for (var _i = 0, _a = [global, document, current]; _i < _a.length; _i++) {\n var options = _a[_i];\n if (options && typeof options !== 'object') {\n console.error('The options parameter should be of type object, is: ' + typeof options);\n }\n if (options.startY && typeof options.startY !== 'number') {\n console.error('Invalid value for startY option', options.startY);\n delete options.startY;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\nfunction assign(target, s, s1, s2, s3) {\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n var to = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n // eslint-disable-next-line prefer-rest-params\n var nextSource = arguments[index];\n if (nextSource != null) {\n // Skip over if undefined or null\n for (var nextKey in nextSource) {\n // Avoid bugs when hasOwnProperty is shadowed\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n}\n\nfunction parseInput(d, current) {\n var doc = new DocHandler(d);\n var document = doc.getDocumentOptions();\n var global = doc.getGlobalOptions();\n validateInput(global, document, current);\n var options = assign({}, global, document, current);\n var win;\n if (typeof window !== 'undefined') {\n win = window;\n }\n var styles = parseStyles(global, document, current);\n var hooks = parseHooks(global, document, current);\n var settings = parseSettings(doc, options);\n var content = parseContent$1(doc, options, win);\n return { id: current.tableId, content: content, hooks: hooks, styles: styles, settings: settings };\n}\nfunction parseStyles(gInput, dInput, cInput) {\n var styleOptions = {\n styles: {},\n headStyles: {},\n bodyStyles: {},\n footStyles: {},\n alternateRowStyles: {},\n columnStyles: {},\n };\n var _loop_1 = function (prop) {\n if (prop === 'columnStyles') {\n var global = gInput[prop];\n var document_1 = dInput[prop];\n var current = cInput[prop];\n styleOptions.columnStyles = assign({}, global, document_1, current);\n }\n else {\n var allOptions = [gInput, dInput, cInput];\n var styles = allOptions.map(function (opts) { return opts[prop] || {}; });\n styleOptions[prop] = assign({}, styles[0], styles[1], styles[2]);\n }\n };\n for (var _i = 0, _a = Object.keys(styleOptions); _i < _a.length; _i++) {\n var prop = _a[_i];\n _loop_1(prop);\n }\n return styleOptions;\n}\nfunction parseHooks(global, document, current) {\n var allOptions = [global, document, current];\n var result = {\n didParseCell: [],\n willDrawCell: [],\n didDrawCell: [],\n willDrawPage: [],\n didDrawPage: [],\n };\n for (var _i = 0, allOptions_1 = allOptions; _i < allOptions_1.length; _i++) {\n var options = allOptions_1[_i];\n if (options.didParseCell)\n result.didParseCell.push(options.didParseCell);\n if (options.willDrawCell)\n result.willDrawCell.push(options.willDrawCell);\n if (options.didDrawCell)\n result.didDrawCell.push(options.didDrawCell);\n if (options.willDrawPage)\n result.willDrawPage.push(options.willDrawPage);\n if (options.didDrawPage)\n result.didDrawPage.push(options.didDrawPage);\n }\n return result;\n}\nfunction parseSettings(doc, options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;\n var margin = parseSpacing(options.margin, 40 / doc.scaleFactor());\n var startY = (_a = getStartY(doc, options.startY)) !== null && _a !== void 0 ? _a : margin.top;\n var showFoot;\n if (options.showFoot === true) {\n showFoot = 'everyPage';\n }\n else if (options.showFoot === false) {\n showFoot = 'never';\n }\n else {\n showFoot = (_b = options.showFoot) !== null && _b !== void 0 ? _b : 'everyPage';\n }\n var showHead;\n if (options.showHead === true) {\n showHead = 'everyPage';\n }\n else if (options.showHead === false) {\n showHead = 'never';\n }\n else {\n showHead = (_c = options.showHead) !== null && _c !== void 0 ? _c : 'everyPage';\n }\n var useCss = (_d = options.useCss) !== null && _d !== void 0 ? _d : false;\n var theme = options.theme || (useCss ? 'plain' : 'striped');\n var horizontalPageBreak = !!options.horizontalPageBreak;\n var horizontalPageBreakRepeat = (_e = options.horizontalPageBreakRepeat) !== null && _e !== void 0 ? _e : null;\n return {\n includeHiddenHtml: (_f = options.includeHiddenHtml) !== null && _f !== void 0 ? _f : false,\n useCss: useCss,\n theme: theme,\n startY: startY,\n margin: margin,\n pageBreak: (_g = options.pageBreak) !== null && _g !== void 0 ? _g : 'auto',\n rowPageBreak: (_h = options.rowPageBreak) !== null && _h !== void 0 ? _h : 'auto',\n tableWidth: (_j = options.tableWidth) !== null && _j !== void 0 ? _j : 'auto',\n showHead: showHead,\n showFoot: showFoot,\n tableLineWidth: (_k = options.tableLineWidth) !== null && _k !== void 0 ? _k : 0,\n tableLineColor: (_l = options.tableLineColor) !== null && _l !== void 0 ? _l : 200,\n horizontalPageBreak: horizontalPageBreak,\n horizontalPageBreakRepeat: horizontalPageBreakRepeat,\n horizontalPageBreakBehaviour: (_m = options.horizontalPageBreakBehaviour) !== null && _m !== void 0 ? _m : 'afterAllRows',\n };\n}\nfunction getStartY(doc, userStartY) {\n var previous = doc.getLastAutoTable();\n var sf = doc.scaleFactor();\n var currentPage = doc.pageNumber();\n var isSamePageAsPreviousTable = false;\n if (previous && previous.startPageNumber) {\n var endingPage = previous.startPageNumber + previous.pageNumber - 1;\n isSamePageAsPreviousTable = endingPage === currentPage;\n }\n if (typeof userStartY === 'number') {\n return userStartY;\n }\n else if (userStartY == null || userStartY === false) {\n if (isSamePageAsPreviousTable && (previous === null || previous === void 0 ? void 0 : previous.finalY) != null) {\n // Some users had issues with overlapping tables when they used multiple\n // tables without setting startY so setting it here to a sensible default.\n return previous.finalY + 20 / sf;\n }\n }\n return null;\n}\nfunction parseContent$1(doc, options, window) {\n var head = options.head || [];\n var body = options.body || [];\n var foot = options.foot || [];\n if (options.html) {\n var hidden = options.includeHiddenHtml;\n if (window) {\n var htmlContent = parseHtml(doc, options.html, window, hidden, options.useCss) || {};\n head = htmlContent.head || head;\n body = htmlContent.body || head;\n foot = htmlContent.foot || head;\n }\n else {\n console.error('Cannot parse html in non browser environment');\n }\n }\n var columns = options.columns || parseColumns(head, body, foot);\n return { columns: columns, head: head, body: body, foot: foot };\n}\nfunction parseColumns(head, body, foot) {\n var firstRow = head[0] || body[0] || foot[0] || [];\n var result = [];\n Object.keys(firstRow)\n .filter(function (key) { return key !== '_element'; })\n .forEach(function (key) {\n var colSpan = 1;\n var input;\n if (Array.isArray(firstRow)) {\n input = firstRow[parseInt(key)];\n }\n else {\n input = firstRow[key];\n }\n if (typeof input === 'object' && !Array.isArray(input)) {\n colSpan = (input === null || input === void 0 ? void 0 : input.colSpan) || 1;\n }\n for (var i = 0; i < colSpan; i++) {\n var id = void 0;\n if (Array.isArray(firstRow)) {\n id = result.length;\n }\n else {\n id = key + (i > 0 ? \"_\".concat(i) : '');\n }\n var rowResult = { dataKey: id };\n result.push(rowResult);\n }\n });\n return result;\n}\n\nvar HookData = /** @class */ (function () {\n function HookData(doc, table, cursor) {\n this.table = table;\n this.pageNumber = table.pageNumber;\n this.settings = table.settings;\n this.cursor = cursor;\n this.doc = doc.getDocument();\n }\n return HookData;\n}());\nvar CellHookData = /** @class */ (function (_super) {\n __extends(CellHookData, _super);\n function CellHookData(doc, table, cell, row, column, cursor) {\n var _this = _super.call(this, doc, table, cursor) || this;\n _this.cell = cell;\n _this.row = row;\n _this.column = column;\n _this.section = row.section;\n return _this;\n }\n return CellHookData;\n}(HookData));\n\nvar Table = /** @class */ (function () {\n function Table(input, content) {\n this.pageNumber = 1;\n this.id = input.id;\n this.settings = input.settings;\n this.styles = input.styles;\n this.hooks = input.hooks;\n this.columns = content.columns;\n this.head = content.head;\n this.body = content.body;\n this.foot = content.foot;\n }\n Table.prototype.getHeadHeight = function (columns) {\n return this.head.reduce(function (acc, row) { return acc + row.getMaxCellHeight(columns); }, 0);\n };\n Table.prototype.getFootHeight = function (columns) {\n return this.foot.reduce(function (acc, row) { return acc + row.getMaxCellHeight(columns); }, 0);\n };\n Table.prototype.allRows = function () {\n return this.head.concat(this.body).concat(this.foot);\n };\n Table.prototype.callCellHooks = function (doc, handlers, cell, row, column, cursor) {\n for (var _i = 0, handlers_1 = handlers; _i < handlers_1.length; _i++) {\n var handler = handlers_1[_i];\n var data = new CellHookData(doc, this, cell, row, column, cursor);\n var result = handler(data) === false;\n // Make sure text is always string[] since user can assign string\n cell.text = Array.isArray(cell.text) ? cell.text : [cell.text];\n if (result) {\n return false;\n }\n }\n return true;\n };\n Table.prototype.callEndPageHooks = function (doc, cursor) {\n doc.applyStyles(doc.userStyles);\n for (var _i = 0, _a = this.hooks.didDrawPage; _i < _a.length; _i++) {\n var handler = _a[_i];\n handler(new HookData(doc, this, cursor));\n }\n };\n Table.prototype.callWillDrawPageHooks = function (doc, cursor) {\n for (var _i = 0, _a = this.hooks.willDrawPage; _i < _a.length; _i++) {\n var handler = _a[_i];\n handler(new HookData(doc, this, cursor));\n }\n };\n Table.prototype.getWidth = function (pageWidth) {\n if (typeof this.settings.tableWidth === 'number') {\n return this.settings.tableWidth;\n }\n else if (this.settings.tableWidth === 'wrap') {\n var wrappedWidth = this.columns.reduce(function (total, col) { return total + col.wrappedWidth; }, 0);\n return wrappedWidth;\n }\n else {\n var margin = this.settings.margin;\n return pageWidth - margin.left - margin.right;\n }\n };\n return Table;\n}());\nvar Row = /** @class */ (function () {\n function Row(raw, index, section, cells, spansMultiplePages) {\n if (spansMultiplePages === void 0) { spansMultiplePages = false; }\n this.height = 0;\n this.raw = raw;\n if (raw instanceof HtmlRowInput) {\n this.raw = raw._element;\n this.element = raw._element;\n }\n this.index = index;\n this.section = section;\n this.cells = cells;\n this.spansMultiplePages = spansMultiplePages;\n }\n Row.prototype.getMaxCellHeight = function (columns) {\n var _this = this;\n return columns.reduce(function (acc, column) { var _a; return Math.max(acc, ((_a = _this.cells[column.index]) === null || _a === void 0 ? void 0 : _a.height) || 0); }, 0);\n };\n Row.prototype.hasRowSpan = function (columns) {\n var _this = this;\n return (columns.filter(function (column) {\n var cell = _this.cells[column.index];\n if (!cell)\n return false;\n return cell.rowSpan > 1;\n }).length > 0);\n };\n Row.prototype.canEntireRowFit = function (height, columns) {\n return this.getMaxCellHeight(columns) <= height;\n };\n Row.prototype.getMinimumRowHeight = function (columns, doc) {\n var _this = this;\n return columns.reduce(function (acc, column) {\n var cell = _this.cells[column.index];\n if (!cell)\n return 0;\n var lineHeight = doc.getLineHeight(cell.styles.fontSize);\n var vPadding = cell.padding('vertical');\n var oneRowHeight = vPadding + lineHeight;\n return oneRowHeight > acc ? oneRowHeight : acc;\n }, 0);\n };\n return Row;\n}());\nvar Cell = /** @class */ (function () {\n function Cell(raw, styles, section) {\n var _a;\n this.contentHeight = 0;\n this.contentWidth = 0;\n this.wrappedWidth = 0;\n this.minReadableWidth = 0;\n this.minWidth = 0;\n this.width = 0;\n this.height = 0;\n this.x = 0;\n this.y = 0;\n this.styles = styles;\n this.section = section;\n this.raw = raw;\n var content = raw;\n if (raw != null && typeof raw === 'object' && !Array.isArray(raw)) {\n this.rowSpan = raw.rowSpan || 1;\n this.colSpan = raw.colSpan || 1;\n content = (_a = raw.content) !== null && _a !== void 0 ? _a : raw;\n if (raw._element) {\n this.raw = raw._element;\n }\n }\n else {\n this.rowSpan = 1;\n this.colSpan = 1;\n }\n // Stringify 0 and false, but not undefined or null\n var text = content != null ? '' + content : '';\n var splitRegex = /\\r\\n|\\r|\\n/g;\n this.text = text.split(splitRegex);\n }\n Cell.prototype.getTextPos = function () {\n var y;\n if (this.styles.valign === 'top') {\n y = this.y + this.padding('top');\n }\n else if (this.styles.valign === 'bottom') {\n y = this.y + this.height - this.padding('bottom');\n }\n else {\n var netHeight = this.height - this.padding('vertical');\n y = this.y + netHeight / 2 + this.padding('top');\n }\n var x;\n if (this.styles.halign === 'right') {\n x = this.x + this.width - this.padding('right');\n }\n else if (this.styles.halign === 'center') {\n var netWidth = this.width - this.padding('horizontal');\n x = this.x + netWidth / 2 + this.padding('left');\n }\n else {\n x = this.x + this.padding('left');\n }\n return { x: x, y: y };\n };\n // TODO (v4): replace parameters with only (lineHeight)\n Cell.prototype.getContentHeight = function (scaleFactor, lineHeightFactor) {\n if (lineHeightFactor === void 0) { lineHeightFactor = 1.15; }\n var lineCount = Array.isArray(this.text) ? this.text.length : 1;\n var lineHeight = (this.styles.fontSize / scaleFactor) * lineHeightFactor;\n var height = lineCount * lineHeight + this.padding('vertical');\n return Math.max(height, this.styles.minCellHeight);\n };\n Cell.prototype.padding = function (name) {\n var padding = parseSpacing(this.styles.cellPadding, 0);\n if (name === 'vertical') {\n return padding.top + padding.bottom;\n }\n else if (name === 'horizontal') {\n return padding.left + padding.right;\n }\n else {\n return padding[name];\n }\n };\n return Cell;\n}());\nvar Column = /** @class */ (function () {\n function Column(dataKey, raw, index) {\n this.wrappedWidth = 0;\n this.minReadableWidth = 0;\n this.minWidth = 0;\n this.width = 0;\n this.dataKey = dataKey;\n this.raw = raw;\n this.index = index;\n }\n Column.prototype.getMaxCustomCellWidth = function (table) {\n var max = 0;\n for (var _i = 0, _a = table.allRows(); _i < _a.length; _i++) {\n var row = _a[_i];\n var cell = row.cells[this.index];\n if (cell && typeof cell.styles.cellWidth === 'number') {\n max = Math.max(max, cell.styles.cellWidth);\n }\n }\n return max;\n };\n return Column;\n}());\n\n/**\n * Calculate the column widths\n */\nfunction calculateWidths(doc, table) {\n calculate(doc, table);\n var resizableColumns = [];\n var initialTableWidth = 0;\n table.columns.forEach(function (column) {\n var customWidth = column.getMaxCustomCellWidth(table);\n if (customWidth) {\n // final column width\n column.width = customWidth;\n }\n else {\n // initial column width (will be resized)\n column.width = column.wrappedWidth;\n resizableColumns.push(column);\n }\n initialTableWidth += column.width;\n });\n // width difference that needs to be distributed\n var resizeWidth = table.getWidth(doc.pageSize().width) - initialTableWidth;\n // first resize attempt: with respect to minReadableWidth and minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, function (column) {\n return Math.max(column.minReadableWidth, column.minWidth);\n });\n }\n // second resize attempt: ignore minReadableWidth but respect minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, function (column) { return column.minWidth; });\n }\n resizeWidth = Math.abs(resizeWidth);\n if (!table.settings.horizontalPageBreak &&\n resizeWidth > 0.1 / doc.scaleFactor()) {\n // Table can't get smaller due to custom-width or minWidth restrictions\n // We can't really do much here. Up to user to for example\n // reduce font size, increase page size or remove custom cell widths\n // to allow more columns to be reduced in size\n resizeWidth = resizeWidth < 1 ? resizeWidth : Math.round(resizeWidth);\n console.log(\"Of the table content, \".concat(resizeWidth, \" units width could not fit page\"));\n }\n applyColSpans(table);\n fitContent(table, doc);\n applyRowSpans(table);\n}\nfunction calculate(doc, table) {\n var sf = doc.scaleFactor();\n var horizontalPageBreak = table.settings.horizontalPageBreak;\n var availablePageWidth = getPageAvailableWidth(doc, table);\n table.allRows().forEach(function (row) {\n for (var _i = 0, _a = table.columns; _i < _a.length; _i++) {\n var column = _a[_i];\n var cell = row.cells[column.index];\n if (!cell)\n continue;\n var hooks = table.hooks.didParseCell;\n table.callCellHooks(doc, hooks, cell, row, column, null);\n var padding = cell.padding('horizontal');\n cell.contentWidth = getStringWidth(cell.text, cell.styles, doc) + padding;\n // Using [^\\S\\u00A0] instead of \\s ensures that we split the text on all\n // whitespace except non-breaking spaces (\\u00A0). We need to preserve\n // them in the split process to ensure correct word separation and width\n // calculation.\n var longestWordWidth = getStringWidth(cell.text.join(' ').split(/[^\\S\\u00A0]+/), cell.styles, doc);\n cell.minReadableWidth = longestWordWidth + cell.padding('horizontal');\n if (typeof cell.styles.cellWidth === 'number') {\n cell.minWidth = cell.styles.cellWidth;\n cell.wrappedWidth = cell.styles.cellWidth;\n }\n else if (cell.styles.cellWidth === 'wrap' ||\n horizontalPageBreak === true) {\n // cell width should not be more than available page width\n if (cell.contentWidth > availablePageWidth) {\n cell.minWidth = availablePageWidth;\n cell.wrappedWidth = availablePageWidth;\n }\n else {\n cell.minWidth = cell.contentWidth;\n cell.wrappedWidth = cell.contentWidth;\n }\n }\n else {\n // auto\n var defaultMinWidth = 10 / sf;\n cell.minWidth = cell.styles.minCellWidth || defaultMinWidth;\n cell.wrappedWidth = cell.contentWidth;\n if (cell.minWidth > cell.wrappedWidth) {\n cell.wrappedWidth = cell.minWidth;\n }\n }\n }\n });\n table.allRows().forEach(function (row) {\n for (var _i = 0, _a = table.columns; _i < _a.length; _i++) {\n var column = _a[_i];\n var cell = row.cells[column.index];\n // For now we ignore the minWidth and wrappedWidth of colspan cells when calculating colspan widths.\n // Could probably be improved upon however.\n if (cell && cell.colSpan === 1) {\n column.wrappedWidth = Math.max(column.wrappedWidth, cell.wrappedWidth);\n column.minWidth = Math.max(column.minWidth, cell.minWidth);\n column.minReadableWidth = Math.max(column.minReadableWidth, cell.minReadableWidth);\n }\n else {\n // Respect cellWidth set in columnStyles even if there is no cells for this column\n // or if the column only have colspan cells. Since the width of colspan cells\n // does not affect the width of columns, setting columnStyles cellWidth enables the\n // user to at least do it manually.\n // Note that this is not perfect for now since for example row and table styles are\n // not accounted for\n var columnStyles = table.styles.columnStyles[column.dataKey] ||\n table.styles.columnStyles[column.index] ||\n {};\n var cellWidth = columnStyles.cellWidth || columnStyles.minCellWidth;\n if (cellWidth && typeof cellWidth === 'number') {\n column.minWidth = cellWidth;\n column.wrappedWidth = cellWidth;\n }\n }\n if (cell) {\n // Make sure all columns get at least min width even though width calculations are not based on them\n if (cell.colSpan > 1 && !column.minWidth) {\n column.minWidth = cell.minWidth;\n }\n if (cell.colSpan > 1 && !column.wrappedWidth) {\n column.wrappedWidth = cell.minWidth;\n }\n }\n }\n });\n}\n/**\n * Distribute resizeWidth on passed resizable columns\n */\nfunction resizeColumns(columns, resizeWidth, getMinWidth) {\n var initialResizeWidth = resizeWidth;\n var sumWrappedWidth = columns.reduce(function (acc, column) { return acc + column.wrappedWidth; }, 0);\n for (var i = 0; i < columns.length; i++) {\n var column = columns[i];\n var ratio = column.wrappedWidth / sumWrappedWidth;\n var suggestedChange = initialResizeWidth * ratio;\n var suggestedWidth = column.width + suggestedChange;\n var minWidth = getMinWidth(column);\n var newWidth = suggestedWidth < minWidth ? minWidth : suggestedWidth;\n resizeWidth -= newWidth - column.width;\n column.width = newWidth;\n }\n resizeWidth = Math.round(resizeWidth * 1e10) / 1e10;\n // Run the resizer again if there's remaining width needs\n // to be distributed and there're columns that can be resized\n if (resizeWidth) {\n var resizableColumns = columns.filter(function (column) {\n return resizeWidth < 0\n ? column.width > getMinWidth(column) // check if column can shrink\n : true; // check if column can grow\n });\n if (resizableColumns.length) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, getMinWidth);\n }\n }\n return resizeWidth;\n}\nfunction applyRowSpans(table) {\n var rowSpanCells = {};\n var colRowSpansLeft = 1;\n var all = table.allRows();\n for (var rowIndex = 0; rowIndex < all.length; rowIndex++) {\n var row = all[rowIndex];\n for (var _i = 0, _a = table.columns; _i < _a.length; _i++) {\n var column = _a[_i];\n var data = rowSpanCells[column.index];\n if (colRowSpansLeft > 1) {\n colRowSpansLeft--;\n delete row.cells[column.index];\n }\n else if (data) {\n data.cell.height += row.height;\n colRowSpansLeft = data.cell.colSpan;\n delete row.cells[column.index];\n data.left--;\n if (data.left <= 1) {\n delete rowSpanCells[column.index];\n }\n }\n else {\n var cell = row.cells[column.index];\n if (!cell) {\n continue;\n }\n cell.height = row.height;\n if (cell.rowSpan > 1) {\n var remaining = all.length - rowIndex;\n var left = cell.rowSpan > remaining ? remaining : cell.rowSpan;\n rowSpanCells[column.index] = { cell: cell, left: left, row: row };\n }\n }\n }\n }\n}\nfunction applyColSpans(table) {\n var all = table.allRows();\n for (var rowIndex = 0; rowIndex < all.length; rowIndex++) {\n var row = all[rowIndex];\n var colSpanCell = null;\n var combinedColSpanWidth = 0;\n var colSpansLeft = 0;\n for (var columnIndex = 0; columnIndex < table.columns.length; columnIndex++) {\n var column = table.columns[columnIndex];\n // Width and colspan\n colSpansLeft -= 1;\n if (colSpansLeft > 1 && table.columns[columnIndex + 1]) {\n combinedColSpanWidth += column.width;\n delete row.cells[column.index];\n }\n else if (colSpanCell) {\n var cell = colSpanCell;\n delete row.cells[column.index];\n colSpanCell = null;\n cell.width = column.width + combinedColSpanWidth;\n }\n else {\n var cell = row.cells[column.index];\n if (!cell)\n continue;\n colSpansLeft = cell.colSpan;\n combinedColSpanWidth = 0;\n if (cell.colSpan > 1) {\n colSpanCell = cell;\n combinedColSpanWidth += column.width;\n continue;\n }\n cell.width = column.width + combinedColSpanWidth;\n }\n }\n }\n}\nfunction fitContent(table, doc) {\n var rowSpanHeight = { count: 0, height: 0 };\n for (var _i = 0, _a = table.allRows(); _i < _a.length; _i++) {\n var row = _a[_i];\n for (var _b = 0, _c = table.columns; _b < _c.length; _b++) {\n var column = _c[_b];\n var cell = row.cells[column.index];\n if (!cell)\n continue;\n doc.applyStyles(cell.styles, true);\n var textSpace = cell.width - cell.padding('horizontal');\n if (cell.styles.overflow === 'linebreak') {\n // Add one pt to textSpace to fix rounding error\n cell.text = doc.splitTextToSize(cell.text, textSpace + 1 / doc.scaleFactor(), { fontSize: cell.styles.fontSize });\n }\n else if (cell.styles.overflow === 'ellipsize') {\n cell.text = ellipsize(cell.text, textSpace, cell.styles, doc, '...');\n }\n else if (cell.styles.overflow === 'hidden') {\n cell.text = ellipsize(cell.text, textSpace, cell.styles, doc, '');\n }\n else if (typeof cell.styles.overflow === 'function') {\n var result = cell.styles.overflow(cell.text, textSpace);\n if (typeof result === 'string') {\n cell.text = [result];\n }\n else {\n cell.text = result;\n }\n }\n cell.contentHeight = cell.getContentHeight(doc.scaleFactor(), doc.getLineHeightFactor());\n var realContentHeight = cell.contentHeight / cell.rowSpan;\n if (cell.rowSpan > 1 &&\n rowSpanHeight.count * rowSpanHeight.height <\n realContentHeight * cell.rowSpan) {\n rowSpanHeight = { height: realContentHeight, count: cell.rowSpan };\n }\n else if (rowSpanHeight && rowSpanHeight.count > 0) {\n if (rowSpanHeight.height > realContentHeight) {\n realContentHeight = rowSpanHeight.height;\n }\n }\n if (realContentHeight > row.height) {\n row.height = realContentHeight;\n }\n }\n rowSpanHeight.count--;\n }\n}\nfunction ellipsize(text, width, styles, doc, overflow) {\n return text.map(function (str) { return ellipsizeStr(str, width, styles, doc, overflow); });\n}\nfunction ellipsizeStr(text, width, styles, doc, overflow) {\n var precision = 10000 * doc.scaleFactor();\n width = Math.ceil(width * precision) / precision;\n if (width >= getStringWidth(text, styles, doc)) {\n return text;\n }\n while (width < getStringWidth(text + overflow, styles, doc)) {\n if (text.length <= 1) {\n break;\n }\n text = text.substring(0, text.length - 1);\n }\n return text.trim() + overflow;\n}\n\nfunction createTable(jsPDFDoc, input) {\n var doc = new DocHandler(jsPDFDoc);\n var content = parseContent(input, doc.scaleFactor());\n var table = new Table(input, content);\n calculateWidths(doc, table);\n doc.applyStyles(doc.userStyles);\n return table;\n}\nfunction parseContent(input, sf) {\n var content = input.content;\n var columns = createColumns(content.columns);\n // If no head or foot is set, try generating it with content from columns\n if (content.head.length === 0) {\n var sectionRow = generateSectionRow(columns, 'head');\n if (sectionRow)\n content.head.push(sectionRow);\n }\n if (content.foot.length === 0) {\n var sectionRow = generateSectionRow(columns, 'foot');\n if (sectionRow)\n content.foot.push(sectionRow);\n }\n var theme = input.settings.theme;\n var styles = input.styles;\n return {\n columns: columns,\n head: parseSection('head', content.head, columns, styles, theme, sf),\n body: parseSection('body', content.body, columns, styles, theme, sf),\n foot: parseSection('foot', content.foot, columns, styles, theme, sf),\n };\n}\nfunction parseSection(sectionName, sectionRows, columns, styleProps, theme, scaleFactor) {\n var rowSpansLeftForColumn = {};\n var result = sectionRows.map(function (rawRow, rowIndex) {\n var skippedRowForRowSpans = 0;\n var cells = {};\n var colSpansAdded = 0;\n var columnSpansLeft = 0;\n for (var _i = 0, columns_1 = columns; _i < columns_1.length; _i++) {\n var column = columns_1[_i];\n if (rowSpansLeftForColumn[column.index] == null ||\n rowSpansLeftForColumn[column.index].left === 0) {\n if (columnSpansLeft === 0) {\n var rawCell = void 0;\n if (Array.isArray(rawRow)) {\n rawCell =\n rawRow[column.index - colSpansAdded - skippedRowForRowSpans];\n }\n else {\n rawCell = rawRow[column.dataKey];\n }\n var cellInputStyles = {};\n if (typeof rawCell === 'object' && !Array.isArray(rawCell)) {\n cellInputStyles = (rawCell === null || rawCell === void 0 ? void 0 : rawCell.styles) || {};\n }\n var styles = cellStyles(sectionName, column, rowIndex, theme, styleProps, scaleFactor, cellInputStyles);\n var cell = new Cell(rawCell, styles, sectionName);\n // dataKey is not used internally no more but keep for\n // backwards compat in hooks\n cells[column.dataKey] = cell;\n cells[column.index] = cell;\n columnSpansLeft = cell.colSpan - 1;\n rowSpansLeftForColumn[column.index] = {\n left: cell.rowSpan - 1,\n times: columnSpansLeft,\n };\n }\n else {\n columnSpansLeft--;\n colSpansAdded++;\n }\n }\n else {\n rowSpansLeftForColumn[column.index].left--;\n columnSpansLeft = rowSpansLeftForColumn[column.index].times;\n skippedRowForRowSpans++;\n }\n }\n return new Row(rawRow, rowIndex, sectionName, cells);\n });\n return result;\n}\nfunction generateSectionRow(columns, section) {\n var sectionRow = {};\n columns.forEach(function (col) {\n if (col.raw != null) {\n var title = getSectionTitle(section, col.raw);\n if (title != null)\n sectionRow[col.dataKey] = title;\n }\n });\n return Object.keys(sectionRow).length > 0 ? sectionRow : null;\n}\nfunction getSectionTitle(section, column) {\n if (section === 'head') {\n if (typeof column === 'object') {\n return column.header || null;\n }\n else if (typeof column === 'string' || typeof column === 'number') {\n return column;\n }\n }\n else if (section === 'foot' && typeof column === 'object') {\n return column.footer;\n }\n return null;\n}\nfunction createColumns(columns) {\n return columns.map(function (input, index) {\n var _a;\n var key;\n if (typeof input === 'object') {\n key = (_a = input.dataKey) !== null && _a !== void 0 ? _a : index;\n }\n else {\n key = index;\n }\n return new Column(key, input, index);\n });\n}\nfunction cellStyles(sectionName, column, rowIndex, themeName, styles, scaleFactor, cellInputStyles) {\n var theme = getTheme(themeName);\n var sectionStyles;\n if (sectionName === 'head') {\n sectionStyles = styles.headStyles;\n }\n else if (sectionName === 'body') {\n sectionStyles = styles.bodyStyles;\n }\n else if (sectionName === 'foot') {\n sectionStyles = styles.footStyles;\n }\n var otherStyles = assign({}, theme.table, theme[sectionName], styles.styles, sectionStyles);\n var columnStyles = styles.columnStyles[column.dataKey] ||\n styles.columnStyles[column.index] ||\n {};\n var colStyles = sectionName === 'body' ? columnStyles : {};\n var rowStyles = sectionName === 'body' && rowIndex % 2 === 0\n ? assign({}, theme.alternateRow, styles.alternateRowStyles)\n : {};\n var defaultStyle = defaultStyles(scaleFactor);\n var themeStyles = assign({}, defaultStyle, otherStyles, rowStyles, colStyles);\n return assign(themeStyles, cellInputStyles);\n}\n\n// get columns can be fit into page\nfunction getColumnsCanFitInPage(doc, table, config) {\n var _a;\n if (config === void 0) { config = {}; }\n // Get page width\n var remainingWidth = getPageAvailableWidth(doc, table);\n // Get column data key to repeat\n var repeatColumnsMap = new Map();\n var colIndexes = [];\n var columns = [];\n var horizontalPageBreakRepeat = [];\n if (Array.isArray(table.settings.horizontalPageBreakRepeat)) {\n horizontalPageBreakRepeat = table.settings.horizontalPageBreakRepeat;\n // It can be a single value of type string or number (even number: 0)\n }\n else if (typeof table.settings.horizontalPageBreakRepeat === 'string' ||\n typeof table.settings.horizontalPageBreakRepeat === 'number') {\n horizontalPageBreakRepeat = [table.settings.horizontalPageBreakRepeat];\n }\n // Code to repeat the given column in split pages\n horizontalPageBreakRepeat.forEach(function (field) {\n var col = table.columns.find(function (item) { return item.dataKey === field || item.index === field; });\n if (col && !repeatColumnsMap.has(col.index)) {\n repeatColumnsMap.set(col.index, true);\n colIndexes.push(col.index);\n columns.push(table.columns[col.index]);\n remainingWidth -= col.wrappedWidth;\n }\n });\n var first = true;\n var i = (_a = config === null || config === void 0 ? void 0 : config.start) !== null && _a !== void 0 ? _a : 0; // make sure couter is initiated outside the loop\n while (i < table.columns.length) {\n // Prevent duplicates\n if (repeatColumnsMap.has(i)) {\n i++;\n continue;\n }\n var colWidth = table.columns[i].wrappedWidth;\n // Take at least one column even if it doesn't fit\n if (first || remainingWidth >= colWidth) {\n first = false;\n colIndexes.push(i);\n columns.push(table.columns[i]);\n remainingWidth -= colWidth;\n }\n else {\n break;\n }\n i++;\n }\n return { colIndexes: colIndexes, columns: columns, lastIndex: i - 1 };\n}\nfunction calculateAllColumnsCanFitInPage(doc, table) {\n var allResults = [];\n for (var i = 0; i < table.columns.length; i++) {\n var result = getColumnsCanFitInPage(doc, table, { start: i });\n if (result.columns.length) {\n allResults.push(result);\n i = result.lastIndex;\n }\n }\n return allResults;\n}\n\nfunction drawTable(jsPDFDoc, table) {\n var settings = table.settings;\n var startY = settings.startY;\n var margin = settings.margin;\n var cursor = { x: margin.left, y: startY };\n var sectionsHeight = table.getHeadHeight(table.columns) + table.getFootHeight(table.columns);\n var minTableBottomPos = startY + margin.bottom + sectionsHeight;\n if (settings.pageBreak === 'avoid') {\n var rows = table.body;\n var tableHeight = rows.reduce(function (acc, row) { return acc + row.height; }, 0);\n minTableBottomPos += tableHeight;\n }\n var doc = new DocHandler(jsPDFDoc);\n if (settings.pageBreak === 'always' ||\n (settings.startY != null && minTableBottomPos > doc.pageSize().height)) {\n nextPage(doc);\n cursor.y = margin.top;\n }\n table.callWillDrawPageHooks(doc, cursor);\n var startPos = assign({}, cursor);\n table.startPageNumber = doc.pageNumber();\n if (settings.horizontalPageBreak) {\n // managed flow for split columns\n printTableWithHorizontalPageBreak(doc, table, startPos, cursor);\n }\n else {\n // normal flow\n doc.applyStyles(doc.userStyles);\n if (settings.showHead === 'firstPage' ||\n settings.showHead === 'everyPage') {\n table.head.forEach(function (row) {\n return printRow(doc, table, row, cursor, table.columns);\n });\n }\n doc.applyStyles(doc.userStyles);\n table.body.forEach(function (row, index) {\n var isLastRow = index === table.body.length - 1;\n printFullRow(doc, table, row, isLastRow, startPos, cursor, table.columns);\n });\n doc.applyStyles(doc.userStyles);\n if (settings.showFoot === 'lastPage' || settings.showFoot === 'everyPage') {\n table.foot.forEach(function (row) {\n return printRow(doc, table, row, cursor, table.columns);\n });\n }\n }\n addTableBorder(doc, table, startPos, cursor);\n table.callEndPageHooks(doc, cursor);\n table.finalY = cursor.y;\n jsPDFDoc.lastAutoTable = table;\n doc.applyStyles(doc.userStyles);\n}\nfunction printTableWithHorizontalPageBreak(doc, table, startPos, cursor) {\n // calculate width of columns and render only those which can fit into page\n var allColumnsCanFitResult = calculateAllColumnsCanFitInPage(doc, table);\n var settings = table.settings;\n if (settings.horizontalPageBreakBehaviour === 'afterAllRows') {\n allColumnsCanFitResult.forEach(function (colsAndIndexes, index) {\n doc.applyStyles(doc.userStyles);\n // add page to print next columns in new page\n if (index > 0) {\n // When adding a page here, make sure not to print the footers\n // because they were already printed before on this same loop\n addPage(doc, table, startPos, cursor, colsAndIndexes.columns, true);\n }\n else {\n // print head for selected columns\n printHead(doc, table, cursor, colsAndIndexes.columns);\n }\n // print body & footer for selected columns\n printBody(doc, table, startPos, cursor, colsAndIndexes.columns);\n printFoot(doc, table, cursor, colsAndIndexes.columns);\n });\n }\n else {\n var lastRowIndexOfLastPage_1 = -1;\n var firstColumnsToFitResult = allColumnsCanFitResult[0];\n var _loop_1 = function () {\n // Print the first columns, taking note of the last row printed\n var lastPrintedRowIndex = lastRowIndexOfLastPage_1;\n if (firstColumnsToFitResult) {\n doc.applyStyles(doc.userStyles);\n var firstColumnsToFit = firstColumnsToFitResult.columns;\n if (lastRowIndexOfLastPage_1 >= 0) {\n // When adding a page here, make sure not to print the footers\n // because they were already printed before on this same loop\n addPage(doc, table, startPos, cursor, firstColumnsToFit, true);\n }\n else {\n printHead(doc, table, cursor, firstColumnsToFit);\n }\n lastPrintedRowIndex = printBodyWithoutPageBreaks(doc, table, lastRowIndexOfLastPage_1 + 1, cursor, firstColumnsToFit);\n printFoot(doc, table, cursor, firstColumnsToFit);\n }\n // Check how many rows were printed, so that the next columns would not print more rows than that\n var maxNumberOfRows = lastPrintedRowIndex - lastRowIndexOfLastPage_1;\n // Print the next columns, never exceding maxNumberOfRows\n allColumnsCanFitResult.slice(1).forEach(function (colsAndIndexes) {\n doc.applyStyles(doc.userStyles);\n // When adding a page here, make sure not to print the footers\n // because they were already printed before on this same loop\n addPage(doc, table, startPos, cursor, colsAndIndexes.columns, true);\n printBodyWithoutPageBreaks(doc, table, lastRowIndexOfLastPage_1 + 1, cursor, colsAndIndexes.columns, maxNumberOfRows);\n printFoot(doc, table, cursor, colsAndIndexes.columns);\n });\n lastRowIndexOfLastPage_1 = lastPrintedRowIndex;\n };\n while (lastRowIndexOfLastPage_1 < table.body.length - 1) {\n _loop_1();\n }\n }\n}\nfunction printHead(doc, table, cursor, columns) {\n var settings = table.settings;\n doc.applyStyles(doc.userStyles);\n if (settings.showHead === 'firstPage' || settings.showHead === 'everyPage') {\n table.head.forEach(function (row) { return printRow(doc, table, row, cursor, columns); });\n }\n}\nfunction printBody(doc, table, startPos, cursor, columns) {\n doc.applyStyles(doc.userStyles);\n table.body.forEach(function (row, index) {\n var isLastRow = index === table.body.length - 1;\n printFullRow(doc, table, row, isLastRow, startPos, cursor, columns);\n });\n}\nfunction printBodyWithoutPageBreaks(doc, table, startRowIndex, cursor, columns, maxNumberOfRows) {\n doc.applyStyles(doc.userStyles);\n maxNumberOfRows = maxNumberOfRows !== null && maxNumberOfRows !== void 0 ? maxNumberOfRows : table.body.length;\n var endRowIndex = Math.min(startRowIndex + maxNumberOfRows, table.body.length);\n var lastPrintedRowIndex = -1;\n var rows = table.body.slice(startRowIndex, endRowIndex);\n for (var index = 0; index < rows.length; index++) {\n var row = rows[index];\n var isLastRow = startRowIndex + index === table.body.length - 1;\n var remainingSpace = getRemainingPageSpace(doc, table, isLastRow, cursor);\n if (row.canEntireRowFit(remainingSpace, columns)) {\n printRow(doc, table, row, cursor, columns);\n lastPrintedRowIndex = startRowIndex + index;\n }\n else {\n break;\n }\n }\n return lastPrintedRowIndex;\n}\nfunction printFoot(doc, table, cursor, columns) {\n var settings = table.settings;\n doc.applyStyles(doc.userStyles);\n if (settings.showFoot === 'lastPage' || settings.showFoot === 'everyPage') {\n table.foot.forEach(function (row) { return printRow(doc, table, row, cursor, columns); });\n }\n}\nfunction getRemainingLineCount(cell, remainingPageSpace, doc) {\n var lineHeight = doc.getLineHeight(cell.styles.fontSize);\n var vPadding = cell.padding('vertical');\n var remainingLines = Math.floor((remainingPageSpace - vPadding) / lineHeight);\n return Math.max(0, remainingLines);\n}\nfunction modifyRowToFit(row, remainingPageSpace, table, doc) {\n var cells = {};\n row.spansMultiplePages = true;\n row.height = 0;\n var rowHeight = 0;\n for (var _i = 0, _a = table.columns; _i < _a.length; _i++) {\n var column = _a[_i];\n var cell = row.cells[column.index];\n if (!cell)\n continue;\n if (!Array.isArray(cell.text)) {\n cell.text = [cell.text];\n }\n var remainderCell = new Cell(cell.raw, cell.styles, cell.section);\n remainderCell = assign(remainderCell, cell);\n remainderCell.text = [];\n var remainingLineCount = getRemainingLineCount(cell, remainingPageSpace, doc);\n if (cell.text.length > remainingLineCount) {\n remainderCell.text = cell.text.splice(remainingLineCount, cell.text.length);\n }\n var scaleFactor = doc.scaleFactor();\n var lineHeightFactor = doc.getLineHeightFactor();\n cell.contentHeight = cell.getContentHeight(scaleFactor, lineHeightFactor);\n if (cell.contentHeight >= remainingPageSpace) {\n cell.contentHeight = remainingPageSpace;\n remainderCell.styles.minCellHeight -= remainingPageSpace;\n }\n if (cell.contentHeight > row.height) {\n row.height = cell.contentHeight;\n }\n remainderCell.contentHeight = remainderCell.getContentHeight(scaleFactor, lineHeightFactor);\n if (remainderCell.contentHeight > rowHeight) {\n rowHeight = remainderCell.contentHeight;\n }\n cells[column.index] = remainderCell;\n }\n var remainderRow = new Row(row.raw, -1, row.section, cells, true);\n remainderRow.height = rowHeight;\n for (var _b = 0, _c = table.columns; _b < _c.length; _b++) {\n var column = _c[_b];\n var remainderCell = remainderRow.cells[column.index];\n if (remainderCell) {\n remainderCell.height = remainderRow.height;\n }\n var cell = row.cells[column.index];\n if (cell) {\n cell.height = row.height;\n }\n }\n return remainderRow;\n}\nfunction shouldPrintOnCurrentPage(doc, row, remainingPageSpace, table) {\n var pageHeight = doc.pageSize().height;\n var margin = table.settings.margin;\n var marginHeight = margin.top + margin.bottom;\n var maxRowHeight = pageHeight - marginHeight;\n if (row.section === 'body') {\n // Should also take into account that head and foot is not\n // on every page with some settings\n maxRowHeight -=\n table.getHeadHeight(table.columns) + table.getFootHeight(table.columns);\n }\n var minRowHeight = row.getMinimumRowHeight(table.columns, doc);\n var minRowFits = minRowHeight < remainingPageSpace;\n if (minRowHeight > maxRowHeight) {\n console.log(\"Will not be able to print row \".concat(row.index, \" correctly since it's minimum height is larger than page height\"));\n return true;\n }\n if (!minRowFits) {\n return false;\n }\n var rowHasRowSpanCell = row.hasRowSpan(table.columns);\n var rowHigherThanPage = row.getMaxCellHeight(table.columns) > maxRowHeight;\n if (rowHigherThanPage) {\n if (rowHasRowSpanCell) {\n console.log(\"The content of row \".concat(row.index, \" will not be drawn correctly since drawing rows with a height larger than the page height and has cells with rowspans is not supported.\"));\n }\n return true;\n }\n if (rowHasRowSpanCell) {\n // Currently a new page is required whenever a rowspan row don't fit a page.\n return false;\n }\n if (table.settings.rowPageBreak === 'avoid') {\n return false;\n }\n // In all other cases print the row on current page\n return true;\n}\nfunction printFullRow(doc, table, row, isLastRow, startPos, cursor, columns) {\n var remainingSpace = getRemainingPageSpace(doc, table, isLastRow, cursor);\n if (row.canEntireRowFit(remainingSpace, columns)) {\n // The row fits in the current page\n printRow(doc, table, row, cursor, columns);\n }\n else if (shouldPrintOnCurrentPage(doc, row, remainingSpace, table)) {\n // The row gets split in two here, each piece in one page\n var remainderRow = modifyRowToFit(row, remainingSpace, table, doc);\n printRow(doc, table, row, cursor, columns);\n addPage(doc, table, startPos, cursor, columns);\n printFullRow(doc, table, remainderRow, isLastRow, startPos, cursor, columns);\n }\n else {\n // The row get printed entirelly on the next page\n addPage(doc, table, startPos, cursor, columns);\n printFullRow(doc, table, row, isLastRow, startPos, cursor, columns);\n }\n}\nfunction printRow(doc, table, row, cursor, columns) {\n cursor.x = table.settings.margin.left;\n for (var _i = 0, columns_1 = columns; _i < columns_1.length; _i++) {\n var column = columns_1[_i];\n var cell = row.cells[column.index];\n if (!cell) {\n cursor.x += column.width;\n continue;\n }\n doc.applyStyles(cell.styles);\n cell.x = cursor.x;\n cell.y = cursor.y;\n var result = table.callCellHooks(doc, table.hooks.willDrawCell, cell, row, column, cursor);\n if (result === false) {\n cursor.x += column.width;\n continue;\n }\n drawCellRect(doc, cell, cursor);\n var textPos = cell.getTextPos();\n autoTableText(cell.text, textPos.x, textPos.y, {\n halign: cell.styles.halign,\n valign: cell.styles.valign,\n maxWidth: Math.ceil(cell.width - cell.padding('left') - cell.padding('right')),\n }, doc.getDocument());\n table.callCellHooks(doc, table.hooks.didDrawCell, cell, row, column, cursor);\n cursor.x += column.width;\n }\n cursor.y += row.height;\n}\nfunction drawCellRect(doc, cell, cursor) {\n var cellStyles = cell.styles;\n // https://github.com/simonbengtsson/jsPDF-AutoTable/issues/774\n // TODO (v4): better solution?\n doc.getDocument().setFillColor(doc.getDocument().getFillColor());\n if (typeof cellStyles.lineWidth === 'number') {\n // Draw cell background with normal borders\n var fillStyle = getFillStyle(cellStyles.lineWidth, cellStyles.fillColor);\n if (fillStyle) {\n doc.rect(cell.x, cursor.y, cell.width, cell.height, fillStyle);\n }\n }\n else if (typeof cellStyles.lineWidth === 'object') {\n // Draw cell background\n if (cellStyles.fillColor) {\n doc.rect(cell.x, cursor.y, cell.width, cell.height, 'F');\n }\n // Draw cell individual borders\n drawCellBorders(doc, cell, cursor, cellStyles.lineWidth);\n }\n}\n/**\n * Draw all specified borders. Borders are centered on cell's edge and lengthened\n * to overlap with neighbours to create sharp corners.\n * @param doc\n * @param cell\n * @param cursor\n * @param fillColor\n * @param lineWidth\n */\nfunction drawCellBorders(doc, cell, cursor, lineWidth) {\n var x1, y1, x2, y2;\n if (lineWidth.top) {\n x1 = cursor.x;\n y1 = cursor.y;\n x2 = cursor.x + cell.width;\n y2 = cursor.y;\n if (lineWidth.right) {\n x2 += 0.5 * lineWidth.right;\n }\n if (lineWidth.left) {\n x1 -= 0.5 * lineWidth.left;\n }\n drawLine(lineWidth.top, x1, y1, x2, y2);\n }\n if (lineWidth.bottom) {\n x1 = cursor.x;\n y1 = cursor.y + cell.height;\n x2 = cursor.x + cell.width;\n y2 = cursor.y + cell.height;\n if (lineWidth.right) {\n x2 += 0.5 * lineWidth.right;\n }\n if (lineWidth.left) {\n x1 -= 0.5 * lineWidth.left;\n }\n drawLine(lineWidth.bottom, x1, y1, x2, y2);\n }\n if (lineWidth.left) {\n x1 = cursor.x;\n y1 = cursor.y;\n x2 = cursor.x;\n y2 = cursor.y + cell.height;\n if (lineWidth.top) {\n y1 -= 0.5 * lineWidth.top;\n }\n if (lineWidth.bottom) {\n y2 += 0.5 * lineWidth.bottom;\n }\n drawLine(lineWidth.left, x1, y1, x2, y2);\n }\n if (lineWidth.right) {\n x1 = cursor.x + cell.width;\n y1 = cursor.y;\n x2 = cursor.x + cell.width;\n y2 = cursor.y + cell.height;\n if (lineWidth.top) {\n y1 -= 0.5 * lineWidth.top;\n }\n if (lineWidth.bottom) {\n y2 += 0.5 * lineWidth.bottom;\n }\n drawLine(lineWidth.right, x1, y1, x2, y2);\n }\n function drawLine(width, x1, y1, x2, y2) {\n doc.getDocument().setLineWidth(width);\n doc.getDocument().line(x1, y1, x2, y2, 'S');\n }\n}\nfunction getRemainingPageSpace(doc, table, isLastRow, cursor) {\n var bottomContentHeight = table.settings.margin.bottom;\n var showFoot = table.settings.showFoot;\n if (showFoot === 'everyPage' || (showFoot === 'lastPage' && isLastRow)) {\n bottomContentHeight += table.getFootHeight(table.columns);\n }\n return doc.pageSize().height - cursor.y - bottomContentHeight;\n}\nfunction addPage(doc, table, startPos, cursor, columns, suppressFooter) {\n if (columns === void 0) { columns = []; }\n if (suppressFooter === void 0) { suppressFooter = false; }\n doc.applyStyles(doc.userStyles);\n if (table.settings.showFoot === 'everyPage' && !suppressFooter) {\n table.foot.forEach(function (row) { return printRow(doc, table, row, cursor, columns); });\n }\n // Add user content just before adding new page ensure it will\n // be drawn above other things on the page\n table.callEndPageHooks(doc, cursor);\n var margin = table.settings.margin;\n addTableBorder(doc, table, startPos, cursor);\n nextPage(doc);\n table.pageNumber++;\n cursor.x = margin.left;\n cursor.y = margin.top;\n startPos.y = margin.top;\n // call didAddPage hooks before any content is added to the page\n table.callWillDrawPageHooks(doc, cursor);\n if (table.settings.showHead === 'everyPage') {\n table.head.forEach(function (row) { return printRow(doc, table, row, cursor, columns); });\n doc.applyStyles(doc.userStyles);\n }\n}\nfunction nextPage(doc) {\n var current = doc.pageNumber();\n doc.setPage(current + 1);\n var newCurrent = doc.pageNumber();\n if (newCurrent === current) {\n doc.addPage();\n return true;\n }\n return false;\n}\n\nfunction applyPlugin(jsPDF) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n jsPDF.API.autoTable = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var options = args[0];\n var input = parseInput(this, options);\n var table = createTable(this, input);\n drawTable(this, table);\n return this;\n };\n // Assign false to enable `doc.lastAutoTable.finalY || 40` sugar\n jsPDF.API.lastAutoTable = false;\n jsPDF.API.autoTableText = function (text, x, y, styles) {\n autoTableText(text, x, y, styles, this);\n };\n jsPDF.API.autoTableSetDefaults = function (defaults) {\n DocHandler.setDefaults(defaults, this);\n return this;\n };\n jsPDF.autoTableSetDefaults = function (defaults, doc) {\n DocHandler.setDefaults(defaults, doc);\n };\n jsPDF.API.autoTableHtmlToJson = function (tableElem, includeHiddenElements) {\n var _a;\n if (includeHiddenElements === void 0) { includeHiddenElements = false; }\n if (typeof window === 'undefined') {\n console.error('Cannot run autoTableHtmlToJson in non browser environment');\n return null;\n }\n var doc = new DocHandler(this);\n var _b = parseHtml(doc, tableElem, window, includeHiddenElements, false), head = _b.head, body = _b.body;\n var columns = ((_a = head[0]) === null || _a === void 0 ? void 0 : _a.map(function (c) { return c.content; })) || [];\n return { columns: columns, rows: body, data: body };\n };\n}\n\nvar _a;\nfunction autoTable(d, options) {\n var input = parseInput(d, options);\n var table = createTable(d, input);\n drawTable(d, table);\n}\n// Experimental export\nfunction __createTable(d, options) {\n var input = parseInput(d, options);\n return createTable(d, input);\n}\nfunction __drawTable(d, table) {\n drawTable(d, table);\n}\ntry {\n if (typeof window !== 'undefined' && window) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n var anyWindow = window;\n var jsPDF = anyWindow.jsPDF || ((_a = anyWindow.jspdf) === null || _a === void 0 ? void 0 : _a.jsPDF);\n if (jsPDF) {\n applyPlugin(jsPDF);\n }\n }\n}\ncatch (error) {\n console.error('Could not apply autoTable plugin', error);\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qc3BkZi1hdXRvdGFibGUvZGlzdC9qc3BkZi5wbHVnaW4uYXV0b3RhYmxlLm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLDBCQUEwQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLG9EQUFvRDtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxvQkFBb0IsOEJBQThCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBLDJFQUEyRSxrQ0FBa0M7QUFDN0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFFBQVEsK0dBQStHO0FBQzlLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsZ0JBQWdCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFD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Q0EsS0FBSztBQUNMO0FBQ0Esb0hBQW9IO0FBQ3BIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwwQkFBMEI7QUFDOUMsMERBQTBELFVBQVU7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsMEJBQTBCO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLG9EQUFvRDtBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixxQkFBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxvREFBb0Q7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsZ0JBQWdCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsZ0JBQWdCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsdUJBQXVCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSw0Q0FBNEMsb0RBQW9EO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsb0RBQW9EO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHVCQUF1QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpR0FBaUcsbUJBQW1CO0FBQ3BILGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFc0kiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2pzcGRmLWF1dG90YWJsZS9kaXN0L2pzcGRmLnBsdWdpbi5hdXRvdGFibGUubWpzPzE0YTAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbXByb3ZlZCB0ZXh0IGZ1bmN0aW9uIHdpdGggaGFsaWduIGFuZCB2YWxpZ24gc3VwcG9ydFxuICogSW5zcGlyYXRpb24gZnJvbTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODMyNzUxMC9hbGlnbi10ZXh0LXJpZ2h0LXVzaW5nLWpzcGRmLzI4NDMzMTEzIzI4NDMzMTEzXG4gKi9cbmZ1bmN0aW9uIGF1dG9UYWJsZVRleHQgKHRleHQsIHgsIHksIHN0eWxlcywgZG9jKSB7XG4gICAgc3R5bGVzID0gc3R5bGVzIHx8IHt9O1xuICAgIHZhciBQSFlTSUNBTF9MSU5FX0hFSUdIVCA9IDEuMTU7XG4gICAgdmFyIGsgPSBkb2MuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgdmFyIGZvbnRTaXplID0gZG9jLmludGVybmFsLmdldEZvbnRTaXplKCkgLyBrO1xuICAgIHZhciBsaW5lSGVpZ2h0RmFjdG9yID0gZG9jLmdldExpbmVIZWlnaHRGYWN0b3JcbiAgICAgICAgPyBkb2MuZ2V0TGluZUhlaWdodEZhY3RvcigpXG4gICAgICAgIDogUEhZU0lDQUxfTElORV9IRUlHSFQ7XG4gICAgdmFyIGxpbmVIZWlnaHQgPSBmb250U2l6ZSAqIGxpbmVIZWlnaHRGYWN0b3I7XG4gICAgdmFyIHNwbGl0UmVnZXggPSAvXFxyXFxufFxccnxcXG4vZztcbiAgICB2YXIgc3BsaXRUZXh0ID0gJyc7XG4gICAgdmFyIGxpbmVDb3VudCA9IDE7XG4gICAgaWYgKHN0eWxlcy52YWxpZ24gPT09ICdtaWRkbGUnIHx8XG4gICAgICAgIHN0eWxlcy52YWxpZ24gPT09ICdib3R0b20nIHx8XG4gICAgICAgIHN0eWxlcy5oYWxpZ24gPT09ICdjZW50ZXInIHx8XG4gICAgICAgIHN0eWxlcy5oYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgc3BsaXRUZXh0ID0gdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dC5zcGxpdChzcGxpdFJlZ2V4KSA6IHRleHQ7XG4gICAgICAgIGxpbmVDb3VudCA9IHNwbGl0VGV4dC5sZW5ndGggfHwgMTtcbiAgICB9XG4gICAgLy8gQWxpZ24gdGhlIHRvcFxuICAgIHkgKz0gZm9udFNpemUgKiAoMiAtIFBIWVNJQ0FMX0xJTkVfSEVJR0hUKTtcbiAgICBpZiAoc3R5bGVzLnZhbGlnbiA9PT0gJ21pZGRsZScpXG4gICAgICAgIHkgLT0gKGxpbmVDb3VudCAvIDIpICogbGluZUhlaWdodDtcbiAgICBlbHNlIGlmIChzdHlsZXMudmFsaWduID09PSAnYm90dG9tJylcbiAgICAgICAgeSAtPSBsaW5lQ291bnQgKiBsaW5lSGVpZ2h0O1xuICAgIGlmIChzdHlsZXMuaGFsaWduID09PSAnY2VudGVyJyB8fCBzdHlsZXMuaGFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgIHZhciBhbGlnblNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgaWYgKHN0eWxlcy5oYWxpZ24gPT09ICdjZW50ZXInKVxuICAgICAgICAgICAgYWxpZ25TaXplICo9IDAuNTtcbiAgICAgICAgaWYgKHNwbGl0VGV4dCAmJiBsaW5lQ291bnQgPj0gMSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaUxpbmUgPSAwOyBpTGluZSA8IHNwbGl0VGV4dC5sZW5ndGg7IGlMaW5lKyspIHtcbiAgICAgICAgICAgICAgICBkb2MudGV4dChzcGxpdFRleHRbaUxpbmVdLCB4IC0gZG9jLmdldFN0cmluZ1VuaXRXaWR0aChzcGxpdFRleHRbaUxpbmVdKSAqIGFsaWduU2l6ZSwgeSk7XG4gICAgICAgICAgICAgICAgeSArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRvYztcbiAgICAgICAgfVxuICAgICAgICB4IC09IGRvYy5nZXRTdHJpbmdVbml0V2lkdGgodGV4dCkgKiBhbGlnblNpemU7XG4gICAgfVxuICAgIGlmIChzdHlsZXMuaGFsaWduID09PSAnanVzdGlmeScpIHtcbiAgICAgICAgZG9jLnRleHQodGV4dCwgeCwgeSwgeyBtYXhXaWR0aDogc3R5bGVzLm1heFdpZHRoIHx8IDEwMCwgYWxpZ246ICdqdXN0aWZ5JyB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRvYy50ZXh0KHRleHQsIHgsIHkpO1xuICAgIH1cbiAgICByZXR1cm4gZG9jO1xufVxuXG52YXIgZ2xvYmFsRGVmYXVsdHMgPSB7fTtcbnZhciBEb2NIYW5kbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERvY0hhbmRsZXIoanNQREZEb2N1bWVudCkge1xuICAgICAgICB0aGlzLmpzUERGRG9jdW1lbnQgPSBqc1BERkRvY3VtZW50O1xuICAgICAgICB0aGlzLnVzZXJTdHlsZXMgPSB7XG4gICAgICAgICAgICAvLyBCbGFjayBmb3IgdmVyc2lvbnMgb2YganNwZGYgd2l0aG91dCBnZXRUZXh0Q29sb3JcbiAgICAgICAgICAgIHRleHRDb2xvcjoganNQREZEb2N1bWVudC5nZXRUZXh0Q29sb3JcbiAgICAgICAgICAgICAgICA/IHRoaXMuanNQREZEb2N1bWVudC5nZXRUZXh0Q29sb3IoKVxuICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBqc1BERkRvY3VtZW50LmludGVybmFsLmdldEZvbnRTaXplKCksXG4gICAgICAgICAgICBmb250U3R5bGU6IGpzUERGRG9jdW1lbnQuaW50ZXJuYWwuZ2V0Rm9udCgpLmZvbnRTdHlsZSxcbiAgICAgICAgICAgIGZvbnQ6IGpzUERGRG9jdW1lbnQuaW50ZXJuYWwuZ2V0Rm9udCgpLmZvbnROYW1lLFxuICAgICAgICAgICAgLy8gMCBmb3IgdmVyc2lvbnMgb2YganNwZGYgd2l0aG91dCBnZXRMaW5lV2lkdGhcbiAgICAgICAgICAgIGxpbmVXaWR0aDoganNQREZEb2N1bWVudC5nZXRMaW5lV2lkdGhcbiAgICAgICAgICAgICAgICA/IHRoaXMuanNQREZEb2N1bWVudC5nZXRMaW5lV2lkdGgoKVxuICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIC8vIEJsYWNrIGZvciB2ZXJzaW9ucyBvZiBqc3BkZiB3aXRob3V0IGdldERyYXdDb2xvclxuICAgICAgICAgICAgbGluZUNvbG9yOiBqc1BERkRvY3VtZW50LmdldERyYXdDb2xvclxuICAgICAgICAgICAgICAgID8gdGhpcy5qc1BERkRvY3VtZW50LmdldERyYXdDb2xvcigpXG4gICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBEb2NIYW5kbGVyLnNldERlZmF1bHRzID0gZnVuY3Rpb24gKGRlZmF1bHRzLCBkb2MpIHtcbiAgICAgICAgaWYgKGRvYyA9PT0gdm9pZCAwKSB7IGRvYyA9IG51bGw7IH1cbiAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgZG9jLl9fYXV0b1RhYmxlRG9jdW1lbnREZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsRGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9jSGFuZGxlci51bmlmeUNvbG9yID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIFtjLCBjLCBjXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBbY107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9jSGFuZGxlci5wcm90b3R5cGUuYXBwbHlTdHlsZXMgPSBmdW5jdGlvbiAoc3R5bGVzLCBmb250T25seSkge1xuICAgICAgICAvLyBGb250IHN0eWxlIG5lZWRzIHRvIGJlIGFwcGxpZWQgYmVmb3JlIGZvbnRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NpbW9uYmVuZ3Rzc29uL2pzUERGLUF1dG9UYWJsZS9pc3N1ZXMvNjMyXG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBpZiAoZm9udE9ubHkgPT09IHZvaWQgMCkgeyBmb250T25seSA9IGZhbHNlOyB9XG4gICAgICAgIGlmIChzdHlsZXMuZm9udFN0eWxlICYmIHRoaXMuanNQREZEb2N1bWVudC5zZXRGb250U3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuanNQREZEb2N1bWVudC5zZXRGb250U3R5bGUoc3R5bGVzLmZvbnRTdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9kID0gdGhpcy5qc1BERkRvY3VtZW50LmludGVybmFsLmdldEZvbnQoKSwgZm9udFN0eWxlID0gX2QuZm9udFN0eWxlLCBmb250TmFtZSA9IF9kLmZvbnROYW1lO1xuICAgICAgICBpZiAoc3R5bGVzLmZvbnQpXG4gICAgICAgICAgICBmb250TmFtZSA9IHN0eWxlcy5mb250O1xuICAgICAgICBpZiAoc3R5bGVzLmZvbnRTdHlsZSkge1xuICAgICAgICAgICAgZm9udFN0eWxlID0gc3R5bGVzLmZvbnRTdHlsZTtcbiAgICAgICAgICAgIHZhciBhdmFpbGFibGVGb250U3R5bGVzID0gdGhpcy5nZXRGb250TGlzdCgpW2ZvbnROYW1lXTtcbiAgICAgICAgICAgIGlmIChhdmFpbGFibGVGb250U3R5bGVzICYmXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlRm9udFN0eWxlcy5pbmRleE9mKGZvbnRTdHlsZSkgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgdGhpcy5qc1BERkRvY3VtZW50LnNldEZvbnRTdHlsZSkge1xuICAgICAgICAgICAgICAgIC8vIENvbW1vbiBpc3N1ZSB3YXMgdGhhdCB0aGUgZGVmYXVsdCBib2xkIGluIGhlYWRlcnNcbiAgICAgICAgICAgICAgICAvLyBtYWRlIGN1c3RvbSBmb250cyBub3Qgd29yay4gRm9yIGV4YW1wbGU6XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NpbW9uYmVuZ3Rzc29uL2pzUERGLUF1dG9UYWJsZS9pc3N1ZXMvNjUzXG4gICAgICAgICAgICAgICAgdGhpcy5qc1BERkRvY3VtZW50LnNldEZvbnRTdHlsZShhdmFpbGFibGVGb250U3R5bGVzWzBdKTtcbiAgICAgICAgICAgICAgICBmb250U3R5bGUgPSBhdmFpbGFibGVGb250U3R5bGVzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuanNQREZEb2N1bWVudC5zZXRGb250KGZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICBpZiAoc3R5bGVzLmZvbnRTaXplKVxuICAgICAgICAgICAgdGhpcy5qc1BERkRvY3VtZW50LnNldEZvbnRTaXplKHN0eWxlcy5mb250U2l6ZSk7XG4gICAgICAgIGlmIChmb250T25seSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudFxuICAgICAgICB9XG4gICAgICAgIHZhciBjb2xvciA9IERvY0hhbmRsZXIudW5pZnlDb2xvcihzdHlsZXMuZmlsbENvbG9yKTtcbiAgICAgICAgaWYgKGNvbG9yKVxuICAgICAgICAgICAgKF9hID0gdGhpcy5qc1BERkRvY3VtZW50KS5zZXRGaWxsQ29sb3IuYXBwbHkoX2EsIGNvbG9yKTtcbiAgICAgICAgY29sb3IgPSBEb2NIYW5kbGVyLnVuaWZ5Q29sb3Ioc3R5bGVzLnRleHRDb2xvcik7XG4gICAgICAgIGlmIChjb2xvcilcbiAgICAgICAgICAgIChfYiA9IHRoaXMuanNQREZEb2N1bWVudCkuc2V0VGV4dENvbG9yLmFwcGx5KF9iLCBjb2xvcik7XG4gICAgICAgIGNvbG9yID0gRG9jSGFuZGxlci51bmlmeUNvbG9yKHN0eWxlcy5saW5lQ29sb3IpO1xuICAgICAgICBpZiAoY29sb3IpXG4gICAgICAgICAgICAoX2MgPSB0aGlzLmpzUERGRG9jdW1lbnQpLnNldERyYXdDb2xvci5hcHBseShfYywgY29sb3IpO1xuICAgICAgICBpZiAodHlwZW9mIHN0eWxlcy5saW5lV2lkdGggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmpzUERGRG9jdW1lbnQuc2V0TGluZVdpZHRoKHN0eWxlcy5saW5lV2lkdGgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5zcGxpdFRleHRUb1NpemUgPSBmdW5jdGlvbiAodGV4dCwgc2l6ZSwgb3B0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5qc1BERkRvY3VtZW50LnNwbGl0VGV4dFRvU2l6ZSh0ZXh0LCBzaXplLCBvcHRzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYSByZWN0YW5nbGUgdG8gdGhlIFBERlxuICAgICAqIEBwYXJhbSB4IENvb3JkaW5hdGUgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIGFnYWluc3QgbGVmdCBlZGdlIG9mIHRoZSBwYWdlXG4gICAgICogQHBhcmFtIHkgQ29vcmRpbmF0ZSAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgYWdhaW5zdCB1cHBlciBlZGdlIG9mIHRoZSBwYWdlXG4gICAgICogQHBhcmFtIHdpZHRoIFdpZHRoIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KVxuICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KVxuICAgICAqIEBwYXJhbSBmaWxsU3R5bGUgQSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcGFpbnRpbmcgc3R5bGUgb3IgbnVsbC4gVmFsaWQgc3R5bGVzIGluY2x1ZGU6ICdTJyBbZGVmYXVsdF0gLSBzdHJva2UsICdGJyAtIGZpbGwsIGFuZCAnREYnIChvciAnRkQnKSAtIGZpbGwgdGhlbiBzdHJva2UuXG4gICAgICovXG4gICAgRG9jSGFuZGxlci5wcm90b3R5cGUucmVjdCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsU3R5bGUpIHtcbiAgICAgICAgLy8gbnVsbCBpcyBleGNsdWRlZCBmcm9tIGZpbGxTdHlsZSBwb3NzaWJsZSB2YWx1ZXMgYmVjYXVzZSBpdCBpc24ndCBuZWVkZWRcbiAgICAgICAgLy8gYW5kIGlzIHByb25lIHRvIGJ1Z3MgYXMgaXQncyB1c2VkIHRvIHBvc3Rwb25lIHNldHRpbmcgdGhlIHN0eWxlXG4gICAgICAgIC8vIGh0dHBzOi8vcmF3Z2l0LmNvbS9NclJpby9qc1BERi9tYXN0ZXIvZG9jcy9qc1BERi5odG1sI3JlY3RcbiAgICAgICAgcmV0dXJuIHRoaXMuanNQREZEb2N1bWVudC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGxTdHlsZSk7XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5nZXRMYXN0QXV0b1RhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qc1BERkRvY3VtZW50Lmxhc3RBdXRvVGFibGUgfHwgbnVsbDtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLmdldFRleHRXaWR0aCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpzUERGRG9jdW1lbnQuZ2V0VGV4dFdpZHRoKHRleHQpO1xuICAgIH07XG4gICAgRG9jSGFuZGxlci5wcm90b3R5cGUuZ2V0RG9jdW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpzUERGRG9jdW1lbnQ7XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5zZXRQYWdlID0gZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgdGhpcy5qc1BERkRvY3VtZW50LnNldFBhZ2UocGFnZSk7XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5hZGRQYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qc1BERkRvY3VtZW50LmFkZFBhZ2UoKTtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLmdldEZvbnRMaXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qc1BERkRvY3VtZW50LmdldEZvbnRMaXN0KCk7XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5nZXRHbG9iYWxPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2xvYmFsRGVmYXVsdHMgfHwge307XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5nZXREb2N1bWVudE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpzUERGRG9jdW1lbnQuX19hdXRvVGFibGVEb2N1bWVudERlZmF1bHRzIHx8IHt9O1xuICAgIH07XG4gICAgRG9jSGFuZGxlci5wcm90b3R5cGUucGFnZVNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYWdlU2l6ZSA9IHRoaXMuanNQREZEb2N1bWVudC5pbnRlcm5hbC5wYWdlU2l6ZTtcbiAgICAgICAgLy8gSlNQREYgMS40IHVzZXMgZ2V0IGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIHByb3BlcnRpZXMgb24gcGFnZVNpemVcbiAgICAgICAgaWYgKHBhZ2VTaXplLndpZHRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHBhZ2VTaXplID0geyB3aWR0aDogcGFnZVNpemUuZ2V0V2lkdGgoKSwgaGVpZ2h0OiBwYWdlU2l6ZS5nZXRIZWlnaHQoKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlU2l6ZTtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLnNjYWxlRmFjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qc1BERkRvY3VtZW50LmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgIH07XG4gICAgRG9jSGFuZGxlci5wcm90b3R5cGUuZ2V0TGluZUhlaWdodEZhY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRvYyA9IHRoaXMuanNQREZEb2N1bWVudDtcbiAgICAgICAgcmV0dXJuIGRvYy5nZXRMaW5lSGVpZ2h0RmFjdG9yID8gZG9jLmdldExpbmVIZWlnaHRGYWN0b3IoKSA6IDEuMTU7XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5nZXRMaW5lSGVpZ2h0ID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIHJldHVybiAoZm9udFNpemUgLyB0aGlzLnNjYWxlRmFjdG9yKCkpICogdGhpcy5nZXRMaW5lSGVpZ2h0RmFjdG9yKCk7XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5wYWdlTnVtYmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGFnZUluZm8gPSB0aGlzLmpzUERGRG9jdW1lbnQuaW50ZXJuYWwuZ2V0Q3VycmVudFBhZ2VJbmZvKCk7XG4gICAgICAgIGlmICghcGFnZUluZm8pIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mIGpzcGRmIGhhcyBwYWdlSW5mb1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuanNQREZEb2N1bWVudC5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2VJbmZvLnBhZ2VOdW1iZXI7XG4gICAgfTtcbiAgICByZXR1cm4gRG9jSGFuZGxlcjtcbn0oKSk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG50eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcblxudmFyIEh0bWxSb3dJbnB1dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSHRtbFJvd0lucHV0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEh0bWxSb3dJbnB1dChlbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSHRtbFJvd0lucHV0O1xufShBcnJheSkpO1xuLy8gQmFzZSBzdHlsZSBmb3IgYWxsIHRoZW1lc1xuZnVuY3Rpb24gZGVmYXVsdFN0eWxlcyhzY2FsZUZhY3Rvcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZvbnQ6ICdoZWx2ZXRpY2EnLCAvLyBoZWx2ZXRpY2EsIHRpbWVzLCBjb3VyaWVyXG4gICAgICAgIGZvbnRTdHlsZTogJ25vcm1hbCcsIC8vIG5vcm1hbCwgYm9sZCwgaXRhbGljLCBib2xkaXRhbGljXG4gICAgICAgIG92ZXJmbG93OiAnbGluZWJyZWFrJywgLy8gbGluZWJyZWFrLCBlbGxpcHNpemUsIHZpc2libGUgb3IgaGlkZGVuXG4gICAgICAgIGZpbGxDb2xvcjogZmFsc2UsIC8vIEVpdGhlciBmYWxzZSBmb3IgdHJhbnNwYXJlbnQsIHJiZyBhcnJheSBlLmcuIFsyNTUsIDI1NSwgMjU1XSBvciBncmF5IGxldmVsIGUuZyAyMDBcbiAgICAgICAgdGV4dENvbG9yOiAyMCxcbiAgICAgICAgaGFsaWduOiAnbGVmdCcsIC8vIGxlZnQsIGNlbnRlciwgcmlnaHQsIGp1c3RpZnlcbiAgICAgICAgdmFsaWduOiAndG9wJywgLy8gdG9wLCBtaWRkbGUsIGJvdHRvbVxuICAgICAgICBmb250U2l6ZTogMTAsXG4gICAgICAgIGNlbGxQYWRkaW5nOiA1IC8gc2NhbGVGYWN0b3IsIC8vIG51bWJlciBvciB7dG9wLGxlZnQscmlnaHQsbGVmdCx2ZXJ0aWNhbCxob3Jpem9udGFsfVxuICAgICAgICBsaW5lQ29sb3I6IDIwMCxcbiAgICAgICAgbGluZVdpZHRoOiAwLFxuICAgICAgICBjZWxsV2lkdGg6ICdhdXRvJywgLy8gJ2F1dG8nfCd3cmFwJ3xudW1iZXJcbiAgICAgICAgbWluQ2VsbEhlaWdodDogMCxcbiAgICAgICAgbWluQ2VsbFdpZHRoOiAwLFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRUaGVtZShuYW1lKSB7XG4gICAgdmFyIHRoZW1lcyA9IHtcbiAgICAgICAgc3RyaXBlZDoge1xuICAgICAgICAgICAgdGFibGU6IHsgZmlsbENvbG9yOiAyNTUsIHRleHRDb2xvcjogODAsIGZvbnRTdHlsZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIGhlYWQ6IHsgdGV4dENvbG9yOiAyNTUsIGZpbGxDb2xvcjogWzQxLCAxMjgsIDE4NV0sIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICAgICAgICBib2R5OiB7fSxcbiAgICAgICAgICAgIGZvb3Q6IHsgdGV4dENvbG9yOiAyNTUsIGZpbGxDb2xvcjogWzQxLCAxMjgsIDE4NV0sIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICAgICAgICBhbHRlcm5hdGVSb3c6IHsgZmlsbENvbG9yOiAyNDUgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgdGFibGU6IHtcbiAgICAgICAgICAgICAgICBmaWxsQ29sb3I6IDI1NSxcbiAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IDgwLFxuICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogJ25vcm1hbCcsXG4gICAgICAgICAgICAgICAgbGluZVdpZHRoOiAwLjEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZDoge1xuICAgICAgICAgICAgICAgIHRleHRDb2xvcjogMjU1LFxuICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogWzI2LCAxODgsIDE1Nl0sXG4gICAgICAgICAgICAgICAgZm9udFN0eWxlOiAnYm9sZCcsXG4gICAgICAgICAgICAgICAgbGluZVdpZHRoOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IHt9LFxuICAgICAgICAgICAgZm9vdDoge1xuICAgICAgICAgICAgICAgIHRleHRDb2xvcjogMjU1LFxuICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogWzI2LCAxODgsIDE1Nl0sXG4gICAgICAgICAgICAgICAgZm9udFN0eWxlOiAnYm9sZCcsXG4gICAgICAgICAgICAgICAgbGluZVdpZHRoOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFsdGVybmF0ZVJvdzoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHBsYWluOiB7IGhlYWQ6IHsgZm9udFN0eWxlOiAnYm9sZCcgfSwgZm9vdDogeyBmb250U3R5bGU6ICdib2xkJyB9IH0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhlbWVzW25hbWVdO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdXaWR0aCh0ZXh0LCBzdHlsZXMsIGRvYykge1xuICAgIGRvYy5hcHBseVN0eWxlcyhzdHlsZXMsIHRydWUpO1xuICAgIHZhciB0ZXh0QXJyID0gQXJyYXkuaXNBcnJheSh0ZXh0KSA/IHRleHQgOiBbdGV4dF07XG4gICAgdmFyIHdpZGVzdExpbmVXaWR0aCA9IHRleHRBcnJcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodGV4dCkgeyByZXR1cm4gZG9jLmdldFRleHRXaWR0aCh0ZXh0KTsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gTWF0aC5tYXgoYSwgYik7IH0sIDApO1xuICAgIHJldHVybiB3aWRlc3RMaW5lV2lkdGg7XG59XG5mdW5jdGlvbiBhZGRUYWJsZUJvcmRlcihkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yKSB7XG4gICAgdmFyIGxpbmVXaWR0aCA9IHRhYmxlLnNldHRpbmdzLnRhYmxlTGluZVdpZHRoO1xuICAgIHZhciBsaW5lQ29sb3IgPSB0YWJsZS5zZXR0aW5ncy50YWJsZUxpbmVDb2xvcjtcbiAgICBkb2MuYXBwbHlTdHlsZXMoeyBsaW5lV2lkdGg6IGxpbmVXaWR0aCwgbGluZUNvbG9yOiBsaW5lQ29sb3IgfSk7XG4gICAgdmFyIGZpbGxTdHlsZSA9IGdldEZpbGxTdHlsZShsaW5lV2lkdGgsIGZhbHNlKTtcbiAgICBpZiAoZmlsbFN0eWxlKSB7XG4gICAgICAgIGRvYy5yZWN0KHN0YXJ0UG9zLngsIHN0YXJ0UG9zLnksIHRhYmxlLmdldFdpZHRoKGRvYy5wYWdlU2l6ZSgpLndpZHRoKSwgY3Vyc29yLnkgLSBzdGFydFBvcy55LCBmaWxsU3R5bGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEZpbGxTdHlsZShsaW5lV2lkdGgsIGZpbGxDb2xvcikge1xuICAgIHZhciBkcmF3TGluZSA9IGxpbmVXaWR0aCA+IDA7XG4gICAgdmFyIGRyYXdCYWNrZ3JvdW5kID0gZmlsbENvbG9yIHx8IGZpbGxDb2xvciA9PT0gMDtcbiAgICBpZiAoZHJhd0xpbmUgJiYgZHJhd0JhY2tncm91bmQpIHtcbiAgICAgICAgcmV0dXJuICdERic7IC8vIEZpbGwgdGhlbiBzdHJva2VcbiAgICB9XG4gICAgZWxzZSBpZiAoZHJhd0xpbmUpIHtcbiAgICAgICAgcmV0dXJuICdTJzsgLy8gT25seSBzdHJva2UgKHRyYW5zcGFyZW50IGJhY2tncm91bmQpXG4gICAgfVxuICAgIGVsc2UgaWYgKGRyYXdCYWNrZ3JvdW5kKSB7XG4gICAgICAgIHJldHVybiAnRic7IC8vIE9ubHkgZmlsbCwgbm8gc3Ryb2tlXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZVNwYWNpbmcodmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICB2YWx1ZSA9IHZhbHVlIHx8IGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvcDogdmFsdWVbMF0sXG4gICAgICAgICAgICAgICAgcmlnaHQ6IHZhbHVlWzFdLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogdmFsdWVbMl0sXG4gICAgICAgICAgICAgICAgbGVmdDogdmFsdWVbM10sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b3A6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiB2YWx1ZVsxXSxcbiAgICAgICAgICAgICAgICBib3R0b206IHZhbHVlWzJdLFxuICAgICAgICAgICAgICAgIGxlZnQ6IHZhbHVlWzFdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9wOiB2YWx1ZVswXSxcbiAgICAgICAgICAgICAgICByaWdodDogdmFsdWVbMV0sXG4gICAgICAgICAgICAgICAgYm90dG9tOiB2YWx1ZVswXSxcbiAgICAgICAgICAgICAgICBsZWZ0OiB2YWx1ZVsxXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS52ZXJ0aWNhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHZhbHVlLnRvcCA9IHZhbHVlLnZlcnRpY2FsO1xuICAgICAgICAgICAgdmFsdWUuYm90dG9tID0gdmFsdWUudmVydGljYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5ob3Jpem9udGFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFsdWUucmlnaHQgPSB2YWx1ZS5ob3Jpem9udGFsO1xuICAgICAgICAgICAgdmFsdWUubGVmdCA9IHZhbHVlLmhvcml6b250YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IChfYSA9IHZhbHVlLmxlZnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIHRvcDogKF9iID0gdmFsdWUudG9wKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICByaWdodDogKF9jID0gdmFsdWUucmlnaHQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIGJvdHRvbTogKF9kID0gdmFsdWUuYm90dG9tKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4geyB0b3A6IHZhbHVlLCByaWdodDogdmFsdWUsIGJvdHRvbTogdmFsdWUsIGxlZnQ6IHZhbHVlIH07XG59XG5mdW5jdGlvbiBnZXRQYWdlQXZhaWxhYmxlV2lkdGgoZG9jLCB0YWJsZSkge1xuICAgIHZhciBtYXJnaW5zID0gcGFyc2VTcGFjaW5nKHRhYmxlLnNldHRpbmdzLm1hcmdpbiwgMCk7XG4gICAgcmV0dXJuIGRvYy5wYWdlU2l6ZSgpLndpZHRoIC0gKG1hcmdpbnMubGVmdCArIG1hcmdpbnMucmlnaHQpO1xufVxuXG4vLyBMaW1pdGF0aW9uc1xuLy8gLSBObyBzdXBwb3J0IGZvciBib3JkZXIgc3BhY2luZ1xuLy8gLSBObyBzdXBwb3J0IGZvciB0cmFuc3BhcmVuY3lcbmZ1bmN0aW9uIHBhcnNlQ3NzKHN1cHBvcnRlZEZvbnRzLCBlbGVtZW50LCBzY2FsZUZhY3Rvciwgc3R5bGUsIHdpbmRvdykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIgcHhTY2FsZUZhY3RvciA9IDk2IC8gNzI7XG4gICAgdmFyIGJhY2tncm91bmRDb2xvciA9IHBhcnNlQ29sb3IoZWxlbWVudCwgZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pWydiYWNrZ3JvdW5kQ29sb3InXTtcbiAgICB9KTtcbiAgICBpZiAoYmFja2dyb3VuZENvbG9yICE9IG51bGwpXG4gICAgICAgIHJlc3VsdC5maWxsQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgdmFyIHRleHRDb2xvciA9IHBhcnNlQ29sb3IoZWxlbWVudCwgZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pWydjb2xvciddO1xuICAgIH0pO1xuICAgIGlmICh0ZXh0Q29sb3IgIT0gbnVsbClcbiAgICAgICAgcmVzdWx0LnRleHRDb2xvciA9IHRleHRDb2xvcjtcbiAgICB2YXIgcGFkZGluZyA9IHBhcnNlUGFkZGluZyhzdHlsZSwgc2NhbGVGYWN0b3IpO1xuICAgIGlmIChwYWRkaW5nKVxuICAgICAgICByZXN1bHQuY2VsbFBhZGRpbmcgPSBwYWRkaW5nO1xuICAgIHZhciBib3JkZXJDb2xvclNpZGUgPSAnYm9yZGVyVG9wQ29sb3InO1xuICAgIHZhciBmaW5hbFNjYWxlRmFjdG9yID0gcHhTY2FsZUZhY3RvciAqIHNjYWxlRmFjdG9yO1xuICAgIHZhciBidHcgPSBzdHlsZS5ib3JkZXJUb3BXaWR0aDtcbiAgICBpZiAoc3R5bGUuYm9yZGVyQm90dG9tV2lkdGggPT09IGJ0dyAmJlxuICAgICAgICBzdHlsZS5ib3JkZXJSaWdodFdpZHRoID09PSBidHcgJiZcbiAgICAgICAgc3R5bGUuYm9yZGVyTGVmdFdpZHRoID09PSBidHcpIHtcbiAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gKHBhcnNlRmxvYXQoYnR3KSB8fCAwKSAvIGZpbmFsU2NhbGVGYWN0b3I7XG4gICAgICAgIGlmIChib3JkZXJXaWR0aClcbiAgICAgICAgICAgIHJlc3VsdC5saW5lV2lkdGggPSBib3JkZXJXaWR0aDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdC5saW5lV2lkdGggPSB7XG4gICAgICAgICAgICB0b3A6IChwYXJzZUZsb2F0KHN0eWxlLmJvcmRlclRvcFdpZHRoKSB8fCAwKSAvIGZpbmFsU2NhbGVGYWN0b3IsXG4gICAgICAgICAgICByaWdodDogKHBhcnNlRmxvYXQoc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCkgfHwgMCkgLyBmaW5hbFNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgYm90dG9tOiAocGFyc2VGbG9hdChzdHlsZS5ib3JkZXJCb3R0b21XaWR0aCkgfHwgMCkgLyBmaW5hbFNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgbGVmdDogKHBhcnNlRmxvYXQoc3R5bGUuYm9yZGVyTGVmdFdpZHRoKSB8fCAwKSAvIGZpbmFsU2NhbGVGYWN0b3IsXG4gICAgICAgIH07XG4gICAgICAgIC8vIENob29zZSBib3JkZXIgY29sb3Igb2YgZmlyc3QgYXZhaWxhYmxlIHNpZGVcbiAgICAgICAgLy8gY291bGQgYmUgaW1wcm92ZWQgYnkgc3VwcG9ydGluZyBvYmplY3QgYXMgbGluZUNvbG9yXG4gICAgICAgIGlmICghcmVzdWx0LmxpbmVXaWR0aC50b3ApIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQubGluZVdpZHRoLnJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3JTaWRlID0gJ2JvcmRlclJpZ2h0Q29sb3InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmxpbmVXaWR0aC5ib3R0b20pIHtcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvclNpZGUgPSAnYm9yZGVyQm90dG9tQ29sb3InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmxpbmVXaWR0aC5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3JTaWRlID0gJ2JvcmRlckxlZnRDb2xvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGJvcmRlckNvbG9yID0gcGFyc2VDb2xvcihlbGVtZW50LCBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSlbYm9yZGVyQ29sb3JTaWRlXTtcbiAgICB9KTtcbiAgICBpZiAoYm9yZGVyQ29sb3IgIT0gbnVsbClcbiAgICAgICAgcmVzdWx0LmxpbmVDb2xvciA9IGJvcmRlckNvbG9yO1xuICAgIHZhciBhY2NlcHRlZCA9IFsnbGVmdCcsICdyaWdodCcsICdjZW50ZXInLCAnanVzdGlmeSddO1xuICAgIGlmIChhY2NlcHRlZC5pbmRleE9mKHN0eWxlLnRleHRBbGlnbikgIT09IC0xKSB7XG4gICAgICAgIHJlc3VsdC5oYWxpZ24gPSBzdHlsZS50ZXh0QWxpZ247XG4gICAgfVxuICAgIGFjY2VwdGVkID0gWydtaWRkbGUnLCAnYm90dG9tJywgJ3RvcCddO1xuICAgIGlmIChhY2NlcHRlZC5pbmRleE9mKHN0eWxlLnZlcnRpY2FsQWxpZ24pICE9PSAtMSkge1xuICAgICAgICByZXN1bHQudmFsaWduID0gc3R5bGUudmVydGljYWxBbGlnbjtcbiAgICB9XG4gICAgdmFyIHJlcyA9IHBhcnNlSW50KHN0eWxlLmZvbnRTaXplIHx8ICcnKTtcbiAgICBpZiAoIWlzTmFOKHJlcykpXG4gICAgICAgIHJlc3VsdC5mb250U2l6ZSA9IHJlcyAvIHB4U2NhbGVGYWN0b3I7XG4gICAgdmFyIGZvbnRTdHlsZSA9IHBhcnNlRm9udFN0eWxlKHN0eWxlKTtcbiAgICBpZiAoZm9udFN0eWxlKVxuICAgICAgICByZXN1bHQuZm9udFN0eWxlID0gZm9udFN0eWxlO1xuICAgIHZhciBmb250ID0gKHN0eWxlLmZvbnRGYW1pbHkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHN1cHBvcnRlZEZvbnRzLmluZGV4T2YoZm9udCkgIT09IC0xKSB7XG4gICAgICAgIHJlc3VsdC5mb250ID0gZm9udDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHBhcnNlRm9udFN0eWxlKHN0eWxlKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIGlmIChzdHlsZS5mb250V2VpZ2h0ID09PSAnYm9sZCcgfHxcbiAgICAgICAgc3R5bGUuZm9udFdlaWdodCA9PT0gJ2JvbGRlcicgfHxcbiAgICAgICAgcGFyc2VJbnQoc3R5bGUuZm9udFdlaWdodCkgPj0gNzAwKSB7XG4gICAgICAgIHJlcyA9ICdib2xkJztcbiAgICB9XG4gICAgaWYgKHN0eWxlLmZvbnRTdHlsZSA9PT0gJ2l0YWxpYycgfHwgc3R5bGUuZm9udFN0eWxlID09PSAnb2JsaXF1ZScpIHtcbiAgICAgICAgcmVzICs9ICdpdGFsaWMnO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gcGFyc2VDb2xvcihlbGVtZW50LCBzdHlsZUdldHRlcikge1xuICAgIHZhciBjc3NDb2xvciA9IHJlYWxDb2xvcihlbGVtZW50LCBzdHlsZUdldHRlcik7XG4gICAgaWYgKCFjc3NDb2xvcilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJnYmEgPSBjc3NDb2xvci5tYXRjaCgvXnJnYmE/XFwoKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrKSg/OixcXHMqKFxcZCpcXC4/XFxkKikpP1xcKSQvKTtcbiAgICBpZiAoIXJnYmEgfHwgIUFycmF5LmlzQXJyYXkocmdiYSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBjb2xvciA9IFtcbiAgICAgICAgcGFyc2VJbnQocmdiYVsxXSksXG4gICAgICAgIHBhcnNlSW50KHJnYmFbMl0pLFxuICAgICAgICBwYXJzZUludChyZ2JhWzNdKSxcbiAgICBdO1xuICAgIHZhciBhbHBoYSA9IHBhcnNlSW50KHJnYmFbNF0pO1xuICAgIGlmIChhbHBoYSA9PT0gMCB8fCBpc05hTihjb2xvclswXSkgfHwgaXNOYU4oY29sb3JbMV0pIHx8IGlzTmFOKGNvbG9yWzJdKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yO1xufVxuZnVuY3Rpb24gcmVhbENvbG9yKGVsZW0sIHN0eWxlR2V0dGVyKSB7XG4gICAgdmFyIGJnID0gc3R5bGVHZXR0ZXIoZWxlbSk7XG4gICAgaWYgKGJnID09PSAncmdiYSgwLCAwLCAwLCAwKScgfHxcbiAgICAgICAgYmcgPT09ICd0cmFuc3BhcmVudCcgfHxcbiAgICAgICAgYmcgPT09ICdpbml0aWFsJyB8fFxuICAgICAgICBiZyA9PT0gJ2luaGVyaXQnKSB7XG4gICAgICAgIGlmIChlbGVtLnBhcmVudEVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlYWxDb2xvcihlbGVtLnBhcmVudEVsZW1lbnQsIHN0eWxlR2V0dGVyKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBiZztcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZVBhZGRpbmcoc3R5bGUsIHNjYWxlRmFjdG9yKSB7XG4gICAgdmFyIHZhbCA9IFtcbiAgICAgICAgc3R5bGUucGFkZGluZ1RvcCxcbiAgICAgICAgc3R5bGUucGFkZGluZ1JpZ2h0LFxuICAgICAgICBzdHlsZS5wYWRkaW5nQm90dG9tLFxuICAgICAgICBzdHlsZS5wYWRkaW5nTGVmdCxcbiAgICBdO1xuICAgIHZhciBweFNjYWxlRmFjdG9yID0gOTYgLyAoNzIgLyBzY2FsZUZhY3Rvcik7XG4gICAgdmFyIGxpbmVQYWRkaW5nID0gKHBhcnNlSW50KHN0eWxlLmxpbmVIZWlnaHQpIC0gcGFyc2VJbnQoc3R5bGUuZm9udFNpemUpKSAvIHNjYWxlRmFjdG9yIC8gMjtcbiAgICB2YXIgaW5wdXRQYWRkaW5nID0gdmFsLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQobiB8fCAnMCcpIC8gcHhTY2FsZUZhY3RvcjtcbiAgICB9KTtcbiAgICB2YXIgcGFkZGluZyA9IHBhcnNlU3BhY2luZyhpbnB1dFBhZGRpbmcsIDApO1xuICAgIGlmIChsaW5lUGFkZGluZyA+IHBhZGRpbmcudG9wKSB7XG4gICAgICAgIHBhZGRpbmcudG9wID0gbGluZVBhZGRpbmc7XG4gICAgfVxuICAgIGlmIChsaW5lUGFkZGluZyA+IHBhZGRpbmcuYm90dG9tKSB7XG4gICAgICAgIHBhZGRpbmcuYm90dG9tID0gbGluZVBhZGRpbmc7XG4gICAgfVxuICAgIHJldHVybiBwYWRkaW5nO1xufVxuXG5mdW5jdGlvbiBwYXJzZUh0bWwoZG9jLCBpbnB1dCwgd2luZG93LCBpbmNsdWRlSGlkZGVuSHRtbCwgdXNlQ3NzKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAoaW5jbHVkZUhpZGRlbkh0bWwgPT09IHZvaWQgMCkgeyBpbmNsdWRlSGlkZGVuSHRtbCA9IGZhbHNlOyB9XG4gICAgaWYgKHVzZUNzcyA9PT0gdm9pZCAwKSB7IHVzZUNzcyA9IGZhbHNlOyB9XG4gICAgdmFyIHRhYmxlRWxlbWVudDtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0YWJsZUVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YWJsZUVsZW1lbnQgPSBpbnB1dDtcbiAgICB9XG4gICAgdmFyIHN1cHBvcnRlZEZvbnRzID0gT2JqZWN0LmtleXMoZG9jLmdldEZvbnRMaXN0KCkpO1xuICAgIHZhciBzY2FsZUZhY3RvciA9IGRvYy5zY2FsZUZhY3RvcigpO1xuICAgIHZhciBoZWFkID0gW10sIGJvZHkgPSBbXSwgZm9vdCA9IFtdO1xuICAgIGlmICghdGFibGVFbGVtZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0h0bWwgdGFibGUgY291bGQgbm90IGJlIGZvdW5kIHdpdGggaW5wdXQ6ICcsIGlucHV0KTtcbiAgICAgICAgcmV0dXJuIHsgaGVhZDogaGVhZCwgYm9keTogYm9keSwgZm9vdDogZm9vdCB9O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlRWxlbWVudC5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gdGFibGVFbGVtZW50LnJvd3NbaV07XG4gICAgICAgIHZhciB0YWdOYW1lID0gKF9iID0gKF9hID0gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbGVtZW50LnBhcmVudEVsZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdOYW1lKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIHJvdyA9IHBhcnNlUm93Q29udGVudChzdXBwb3J0ZWRGb250cywgc2NhbGVGYWN0b3IsIHdpbmRvdywgZWxlbWVudCwgaW5jbHVkZUhpZGRlbkh0bWwsIHVzZUNzcyk7XG4gICAgICAgIGlmICghcm93KVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmICh0YWdOYW1lID09PSAndGhlYWQnKSB7XG4gICAgICAgICAgICBoZWFkLnB1c2gocm93KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0YWdOYW1lID09PSAndGZvb3QnKSB7XG4gICAgICAgICAgICBmb290LnB1c2gocm93KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFkZCB0byBib2R5IGJvdGggaWYgcGFyZW50IGlzIHRib2R5IG9yIHRhYmxlXG4gICAgICAgICAgICBib2R5LnB1c2gocm93KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBoZWFkOiBoZWFkLCBib2R5OiBib2R5LCBmb290OiBmb290IH07XG59XG5mdW5jdGlvbiBwYXJzZVJvd0NvbnRlbnQoc3VwcG9ydGVkRm9udHMsIHNjYWxlRmFjdG9yLCB3aW5kb3csIHJvdywgaW5jbHVkZUhpZGRlbiwgdXNlQ3NzKSB7XG4gICAgdmFyIHJlc3VsdFJvdyA9IG5ldyBIdG1sUm93SW5wdXQocm93KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tpXTtcbiAgICAgICAgdmFyIHN0eWxlXzEgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcbiAgICAgICAgaWYgKGluY2x1ZGVIaWRkZW4gfHwgc3R5bGVfMS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHZhciBjZWxsU3R5bGVzID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHVzZUNzcykge1xuICAgICAgICAgICAgICAgIGNlbGxTdHlsZXMgPSBwYXJzZUNzcyhzdXBwb3J0ZWRGb250cywgY2VsbCwgc2NhbGVGYWN0b3IsIHN0eWxlXzEsIHdpbmRvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRSb3cucHVzaCh7XG4gICAgICAgICAgICAgICAgcm93U3BhbjogY2VsbC5yb3dTcGFuLFxuICAgICAgICAgICAgICAgIGNvbFNwYW46IGNlbGwuY29sU3BhbixcbiAgICAgICAgICAgICAgICBzdHlsZXM6IGNlbGxTdHlsZXMsXG4gICAgICAgICAgICAgICAgX2VsZW1lbnQ6IGNlbGwsXG4gICAgICAgICAgICAgICAgY29udGVudDogcGFyc2VDZWxsQ29udGVudChjZWxsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHJvdyk7XG4gICAgaWYgKHJlc3VsdFJvdy5sZW5ndGggPiAwICYmIChpbmNsdWRlSGlkZGVuIHx8IHN0eWxlLmRpc3BsYXkgIT09ICdub25lJykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFJvdztcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZUNlbGxDb250ZW50KG9yZ0NlbGwpIHtcbiAgICAvLyBXb3JrIG9uIGNsb25lZCBub2RlIHRvIG1ha2Ugc3VyZSBubyBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIGh0bWwgdGFibGVcbiAgICB2YXIgY2VsbCA9IG9yZ0NlbGwuY2xvbmVOb2RlKHRydWUpO1xuICAgIC8vIFJlbW92ZSBleHRyYSBzcGFjZSBhbmQgbGluZSBicmVha3MgaW4gbWFya3VwIHRvIG1ha2UgaXQgbW9yZSBzaW1pbGFyIHRvXG4gICAgLy8gd2hhdCB3b3VsZCBiZSBzaG93biBpbiBodG1sXG4gICAgY2VsbC5pbm5lckhUTUwgPSBjZWxsLmlubmVySFRNTC5yZXBsYWNlKC9cXG4vZywgJycpLnJlcGxhY2UoLyArL2csICcgJyk7XG4gICAgLy8gUHJlc2VydmUgPGJyPiB0YWdzIGFzIGxpbmUgYnJlYWtzIGluIHRoZSBwZGZcbiAgICBjZWxsLmlubmVySFRNTCA9IGNlbGwuaW5uZXJIVE1MXG4gICAgICAgIC5zcGxpdCgvPGJyLio/Pi8pIC8vc3RhcnQgd2l0aCAnPGJyJyBhbmQgZW5kcyB3aXRoICc+Jy5cbiAgICAgICAgLm1hcChmdW5jdGlvbiAocGFydCkgeyByZXR1cm4gcGFydC50cmltKCk7IH0pXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAvLyBpbm5lclRleHQgZm9yIGllXG4gICAgcmV0dXJuIGNlbGwuaW5uZXJUZXh0IHx8IGNlbGwudGV4dENvbnRlbnQgfHwgJyc7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQoZ2xvYmFsLCBkb2N1bWVudCwgY3VycmVudCkge1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBbZ2xvYmFsLCBkb2N1bWVudCwgY3VycmVudF07IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gX2FbX2ldO1xuICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBvcHRpb25zIHBhcmFtZXRlciBzaG91bGQgYmUgb2YgdHlwZSBvYmplY3QsIGlzOiAnICsgdHlwZW9mIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnN0YXJ0WSAmJiB0eXBlb2Ygb3B0aW9ucy5zdGFydFkgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBzdGFydFkgb3B0aW9uJywgb3B0aW9ucy5zdGFydFkpO1xuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuc3RhcnRZO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbmZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHMsIHMxLCBzMiwgczMpIHtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgfVxuICAgIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgdmFyIG5leHRTb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICBpZiAobmV4dFNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gbmV4dFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3Mgd2hlbiBoYXNPd25Qcm9wZXJ0eSBpcyBzaGFkb3dlZFxuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmV4dFNvdXJjZSwgbmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG87XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5wdXQoZCwgY3VycmVudCkge1xuICAgIHZhciBkb2MgPSBuZXcgRG9jSGFuZGxlcihkKTtcbiAgICB2YXIgZG9jdW1lbnQgPSBkb2MuZ2V0RG9jdW1lbnRPcHRpb25zKCk7XG4gICAgdmFyIGdsb2JhbCA9IGRvYy5nZXRHbG9iYWxPcHRpb25zKCk7XG4gICAgdmFsaWRhdGVJbnB1dChnbG9iYWwsIGRvY3VtZW50LCBjdXJyZW50KTtcbiAgICB2YXIgb3B0aW9ucyA9IGFzc2lnbih7fSwgZ2xvYmFsLCBkb2N1bWVudCwgY3VycmVudCk7XG4gICAgdmFyIHdpbjtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luID0gd2luZG93O1xuICAgIH1cbiAgICB2YXIgc3R5bGVzID0gcGFyc2VTdHlsZXMoZ2xvYmFsLCBkb2N1bWVudCwgY3VycmVudCk7XG4gICAgdmFyIGhvb2tzID0gcGFyc2VIb29rcyhnbG9iYWwsIGRvY3VtZW50LCBjdXJyZW50KTtcbiAgICB2YXIgc2V0dGluZ3MgPSBwYXJzZVNldHRpbmdzKGRvYywgb3B0aW9ucyk7XG4gICAgdmFyIGNvbnRlbnQgPSBwYXJzZUNvbnRlbnQkMShkb2MsIG9wdGlvbnMsIHdpbik7XG4gICAgcmV0dXJuIHsgaWQ6IGN1cnJlbnQudGFibGVJZCwgY29udGVudDogY29udGVudCwgaG9va3M6IGhvb2tzLCBzdHlsZXM6IHN0eWxlcywgc2V0dGluZ3M6IHNldHRpbmdzIH07XG59XG5mdW5jdGlvbiBwYXJzZVN0eWxlcyhnSW5wdXQsIGRJbnB1dCwgY0lucHV0KSB7XG4gICAgdmFyIHN0eWxlT3B0aW9ucyA9IHtcbiAgICAgICAgc3R5bGVzOiB7fSxcbiAgICAgICAgaGVhZFN0eWxlczoge30sXG4gICAgICAgIGJvZHlTdHlsZXM6IHt9LFxuICAgICAgICBmb290U3R5bGVzOiB7fSxcbiAgICAgICAgYWx0ZXJuYXRlUm93U3R5bGVzOiB7fSxcbiAgICAgICAgY29sdW1uU3R5bGVzOiB7fSxcbiAgICB9O1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgaWYgKHByb3AgPT09ICdjb2x1bW5TdHlsZXMnKSB7XG4gICAgICAgICAgICB2YXIgZ2xvYmFsID0gZ0lucHV0W3Byb3BdO1xuICAgICAgICAgICAgdmFyIGRvY3VtZW50XzEgPSBkSW5wdXRbcHJvcF07XG4gICAgICAgICAgICB2YXIgY3VycmVudCA9IGNJbnB1dFtwcm9wXTtcbiAgICAgICAgICAgIHN0eWxlT3B0aW9ucy5jb2x1bW5TdHlsZXMgPSBhc3NpZ24oe30sIGdsb2JhbCwgZG9jdW1lbnRfMSwgY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgYWxsT3B0aW9ucyA9IFtnSW5wdXQsIGRJbnB1dCwgY0lucHV0XTtcbiAgICAgICAgICAgIHZhciBzdHlsZXMgPSBhbGxPcHRpb25zLm1hcChmdW5jdGlvbiAob3B0cykgeyByZXR1cm4gb3B0c1twcm9wXSB8fCB7fTsgfSk7XG4gICAgICAgICAgICBzdHlsZU9wdGlvbnNbcHJvcF0gPSBhc3NpZ24oe30sIHN0eWxlc1swXSwgc3R5bGVzWzFdLCBzdHlsZXNbMl0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMoc3R5bGVPcHRpb25zKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBfYVtfaV07XG4gICAgICAgIF9sb29wXzEocHJvcCk7XG4gICAgfVxuICAgIHJldHVybiBzdHlsZU9wdGlvbnM7XG59XG5mdW5jdGlvbiBwYXJzZUhvb2tzKGdsb2JhbCwgZG9jdW1lbnQsIGN1cnJlbnQpIHtcbiAgICB2YXIgYWxsT3B0aW9ucyA9IFtnbG9iYWwsIGRvY3VtZW50LCBjdXJyZW50XTtcbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICBkaWRQYXJzZUNlbGw6IFtdLFxuICAgICAgICB3aWxsRHJhd0NlbGw6IFtdLFxuICAgICAgICBkaWREcmF3Q2VsbDogW10sXG4gICAgICAgIHdpbGxEcmF3UGFnZTogW10sXG4gICAgICAgIGRpZERyYXdQYWdlOiBbXSxcbiAgICB9O1xuICAgIGZvciAodmFyIF9pID0gMCwgYWxsT3B0aW9uc18xID0gYWxsT3B0aW9uczsgX2kgPCBhbGxPcHRpb25zXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gYWxsT3B0aW9uc18xW19pXTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGlkUGFyc2VDZWxsKVxuICAgICAgICAgICAgcmVzdWx0LmRpZFBhcnNlQ2VsbC5wdXNoKG9wdGlvbnMuZGlkUGFyc2VDZWxsKTtcbiAgICAgICAgaWYgKG9wdGlvbnMud2lsbERyYXdDZWxsKVxuICAgICAgICAgICAgcmVzdWx0LndpbGxEcmF3Q2VsbC5wdXNoKG9wdGlvbnMud2lsbERyYXdDZWxsKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGlkRHJhd0NlbGwpXG4gICAgICAgICAgICByZXN1bHQuZGlkRHJhd0NlbGwucHVzaChvcHRpb25zLmRpZERyYXdDZWxsKTtcbiAgICAgICAgaWYgKG9wdGlvbnMud2lsbERyYXdQYWdlKVxuICAgICAgICAgICAgcmVzdWx0LndpbGxEcmF3UGFnZS5wdXNoKG9wdGlvbnMud2lsbERyYXdQYWdlKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGlkRHJhd1BhZ2UpXG4gICAgICAgICAgICByZXN1bHQuZGlkRHJhd1BhZ2UucHVzaChvcHRpb25zLmRpZERyYXdQYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHBhcnNlU2V0dGluZ3MoZG9jLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX207XG4gICAgdmFyIG1hcmdpbiA9IHBhcnNlU3BhY2luZyhvcHRpb25zLm1hcmdpbiwgNDAgLyBkb2Muc2NhbGVGYWN0b3IoKSk7XG4gICAgdmFyIHN0YXJ0WSA9IChfYSA9IGdldFN0YXJ0WShkb2MsIG9wdGlvbnMuc3RhcnRZKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbWFyZ2luLnRvcDtcbiAgICB2YXIgc2hvd0Zvb3Q7XG4gICAgaWYgKG9wdGlvbnMuc2hvd0Zvb3QgPT09IHRydWUpIHtcbiAgICAgICAgc2hvd0Zvb3QgPSAnZXZlcnlQYWdlJztcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5zaG93Rm9vdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2hvd0Zvb3QgPSAnbmV2ZXInO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2hvd0Zvb3QgPSAoX2IgPSBvcHRpb25zLnNob3dGb290KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnZXZlcnlQYWdlJztcbiAgICB9XG4gICAgdmFyIHNob3dIZWFkO1xuICAgIGlmIChvcHRpb25zLnNob3dIZWFkID09PSB0cnVlKSB7XG4gICAgICAgIHNob3dIZWFkID0gJ2V2ZXJ5UGFnZSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuc2hvd0hlYWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHNob3dIZWFkID0gJ25ldmVyJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNob3dIZWFkID0gKF9jID0gb3B0aW9ucy5zaG93SGVhZCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJ2V2ZXJ5UGFnZSc7XG4gICAgfVxuICAgIHZhciB1c2VDc3MgPSAoX2QgPSBvcHRpb25zLnVzZUNzcykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2U7XG4gICAgdmFyIHRoZW1lID0gb3B0aW9ucy50aGVtZSB8fCAodXNlQ3NzID8gJ3BsYWluJyA6ICdzdHJpcGVkJyk7XG4gICAgdmFyIGhvcml6b250YWxQYWdlQnJlYWsgPSAhIW9wdGlvbnMuaG9yaXpvbnRhbFBhZ2VCcmVhaztcbiAgICB2YXIgaG9yaXpvbnRhbFBhZ2VCcmVha1JlcGVhdCA9IChfZSA9IG9wdGlvbnMuaG9yaXpvbnRhbFBhZ2VCcmVha1JlcGVhdCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmNsdWRlSGlkZGVuSHRtbDogKF9mID0gb3B0aW9ucy5pbmNsdWRlSGlkZGVuSHRtbCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZmFsc2UsXG4gICAgICAgIHVzZUNzczogdXNlQ3NzLFxuICAgICAgICB0aGVtZTogdGhlbWUsXG4gICAgICAgIHN0YXJ0WTogc3RhcnRZLFxuICAgICAgICBtYXJnaW46IG1hcmdpbixcbiAgICAgICAgcGFnZUJyZWFrOiAoX2cgPSBvcHRpb25zLnBhZ2VCcmVhaykgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogJ2F1dG8nLFxuICAgICAgICByb3dQYWdlQnJlYWs6IChfaCA9IG9wdGlvbnMucm93UGFnZUJyZWFrKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAnYXV0bycsXG4gICAgICAgIHRhYmxlV2lkdGg6IChfaiA9IG9wdGlvbnMudGFibGVXaWR0aCkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogJ2F1dG8nLFxuICAgICAgICBzaG93SGVhZDogc2hvd0hlYWQsXG4gICAgICAgIHNob3dGb290OiBzaG93Rm9vdCxcbiAgICAgICAgdGFibGVMaW5lV2lkdGg6IChfayA9IG9wdGlvbnMudGFibGVMaW5lV2lkdGgpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6IDAsXG4gICAgICAgIHRhYmxlTGluZUNvbG9yOiAoX2wgPSBvcHRpb25zLnRhYmxlTGluZUNvbG9yKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiAyMDAsXG4gICAgICAgIGhvcml6b250YWxQYWdlQnJlYWs6IGhvcml6b250YWxQYWdlQnJlYWssXG4gICAgICAgIGhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQ6IGhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQsXG4gICAgICAgIGhvcml6b250YWxQYWdlQnJlYWtCZWhhdmlvdXI6IChfbSA9IG9wdGlvbnMuaG9yaXpvbnRhbFBhZ2VCcmVha0JlaGF2aW91cikgIT09IG51bGwgJiYgX20gIT09IHZvaWQgMCA/IF9tIDogJ2FmdGVyQWxsUm93cycsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldFN0YXJ0WShkb2MsIHVzZXJTdGFydFkpIHtcbiAgICB2YXIgcHJldmlvdXMgPSBkb2MuZ2V0TGFzdEF1dG9UYWJsZSgpO1xuICAgIHZhciBzZiA9IGRvYy5zY2FsZUZhY3RvcigpO1xuICAgIHZhciBjdXJyZW50UGFnZSA9IGRvYy5wYWdlTnVtYmVyKCk7XG4gICAgdmFyIGlzU2FtZVBhZ2VBc1ByZXZpb3VzVGFibGUgPSBmYWxzZTtcbiAgICBpZiAocHJldmlvdXMgJiYgcHJldmlvdXMuc3RhcnRQYWdlTnVtYmVyKSB7XG4gICAgICAgIHZhciBlbmRpbmdQYWdlID0gcHJldmlvdXMuc3RhcnRQYWdlTnVtYmVyICsgcHJldmlvdXMucGFnZU51bWJlciAtIDE7XG4gICAgICAgIGlzU2FtZVBhZ2VBc1ByZXZpb3VzVGFibGUgPSBlbmRpbmdQYWdlID09PSBjdXJyZW50UGFnZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB1c2VyU3RhcnRZID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdXNlclN0YXJ0WTtcbiAgICB9XG4gICAgZWxzZSBpZiAodXNlclN0YXJ0WSA9PSBudWxsIHx8IHVzZXJTdGFydFkgPT09IGZhbHNlKSB7XG4gICAgICAgIGlmIChpc1NhbWVQYWdlQXNQcmV2aW91c1RhYmxlICYmIChwcmV2aW91cyA9PT0gbnVsbCB8fCBwcmV2aW91cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJldmlvdXMuZmluYWxZKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBTb21lIHVzZXJzIGhhZCBpc3N1ZXMgd2l0aCBvdmVybGFwcGluZyB0YWJsZXMgd2hlbiB0aGV5IHVzZWQgbXVsdGlwbGVcbiAgICAgICAgICAgIC8vIHRhYmxlcyB3aXRob3V0IHNldHRpbmcgc3RhcnRZIHNvIHNldHRpbmcgaXQgaGVyZSB0byBhIHNlbnNpYmxlIGRlZmF1bHQuXG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXMuZmluYWxZICsgMjAgLyBzZjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHBhcnNlQ29udGVudCQxKGRvYywgb3B0aW9ucywgd2luZG93KSB7XG4gICAgdmFyIGhlYWQgPSBvcHRpb25zLmhlYWQgfHwgW107XG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHkgfHwgW107XG4gICAgdmFyIGZvb3QgPSBvcHRpb25zLmZvb3QgfHwgW107XG4gICAgaWYgKG9wdGlvbnMuaHRtbCkge1xuICAgICAgICB2YXIgaGlkZGVuID0gb3B0aW9ucy5pbmNsdWRlSGlkZGVuSHRtbDtcbiAgICAgICAgaWYgKHdpbmRvdykge1xuICAgICAgICAgICAgdmFyIGh0bWxDb250ZW50ID0gcGFyc2VIdG1sKGRvYywgb3B0aW9ucy5odG1sLCB3aW5kb3csIGhpZGRlbiwgb3B0aW9ucy51c2VDc3MpIHx8IHt9O1xuICAgICAgICAgICAgaGVhZCA9IGh0bWxDb250ZW50LmhlYWQgfHwgaGVhZDtcbiAgICAgICAgICAgIGJvZHkgPSBodG1sQ29udGVudC5ib2R5IHx8IGhlYWQ7XG4gICAgICAgICAgICBmb290ID0gaHRtbENvbnRlbnQuZm9vdCB8fCBoZWFkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHBhcnNlIGh0bWwgaW4gbm9uIGJyb3dzZXIgZW52aXJvbm1lbnQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgY29sdW1ucyA9IG9wdGlvbnMuY29sdW1ucyB8fCBwYXJzZUNvbHVtbnMoaGVhZCwgYm9keSwgZm9vdCk7XG4gICAgcmV0dXJuIHsgY29sdW1uczogY29sdW1ucywgaGVhZDogaGVhZCwgYm9keTogYm9keSwgZm9vdDogZm9vdCB9O1xufVxuZnVuY3Rpb24gcGFyc2VDb2x1bW5zKGhlYWQsIGJvZHksIGZvb3QpIHtcbiAgICB2YXIgZmlyc3RSb3cgPSBoZWFkWzBdIHx8IGJvZHlbMF0gfHwgZm9vdFswXSB8fCBbXTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgT2JqZWN0LmtleXMoZmlyc3RSb3cpXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSAnX2VsZW1lbnQnOyB9KVxuICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBjb2xTcGFuID0gMTtcbiAgICAgICAgdmFyIGlucHV0O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaXJzdFJvdykpIHtcbiAgICAgICAgICAgIGlucHV0ID0gZmlyc3RSb3dbcGFyc2VJbnQoa2V5KV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnB1dCA9IGZpcnN0Um93W2tleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb2xTcGFuID0gKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbnB1dC5jb2xTcGFuKSB8fCAxO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sU3BhbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaWQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaXJzdFJvdykpIHtcbiAgICAgICAgICAgICAgICBpZCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZCA9IGtleSArIChpID4gMCA/IFwiX1wiLmNvbmNhdChpKSA6ICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByb3dSZXN1bHQgPSB7IGRhdGFLZXk6IGlkIH07XG4gICAgICAgICAgICByZXN1bHQucHVzaChyb3dSZXN1bHQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIEhvb2tEYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEhvb2tEYXRhKGRvYywgdGFibGUsIGN1cnNvcikge1xuICAgICAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgICAgIHRoaXMucGFnZU51bWJlciA9IHRhYmxlLnBhZ2VOdW1iZXI7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSB0YWJsZS5zZXR0aW5ncztcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBjdXJzb3I7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jLmdldERvY3VtZW50KCk7XG4gICAgfVxuICAgIHJldHVybiBIb29rRGF0YTtcbn0oKSk7XG52YXIgQ2VsbEhvb2tEYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDZWxsSG9va0RhdGEsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2VsbEhvb2tEYXRhKGRvYywgdGFibGUsIGNlbGwsIHJvdywgY29sdW1uLCBjdXJzb3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jLCB0YWJsZSwgY3Vyc29yKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jZWxsID0gY2VsbDtcbiAgICAgICAgX3RoaXMucm93ID0gcm93O1xuICAgICAgICBfdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgIF90aGlzLnNlY3Rpb24gPSByb3cuc2VjdGlvbjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2VsbEhvb2tEYXRhO1xufShIb29rRGF0YSkpO1xuXG52YXIgVGFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFibGUoaW5wdXQsIGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcbiAgICAgICAgdGhpcy5pZCA9IGlucHV0LmlkO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gaW5wdXQuc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuc3R5bGVzID0gaW5wdXQuc3R5bGVzO1xuICAgICAgICB0aGlzLmhvb2tzID0gaW5wdXQuaG9va3M7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbnRlbnQuY29sdW1ucztcbiAgICAgICAgdGhpcy5oZWFkID0gY29udGVudC5oZWFkO1xuICAgICAgICB0aGlzLmJvZHkgPSBjb250ZW50LmJvZHk7XG4gICAgICAgIHRoaXMuZm9vdCA9IGNvbnRlbnQuZm9vdDtcbiAgICB9XG4gICAgVGFibGUucHJvdG90eXBlLmdldEhlYWRIZWlnaHQgPSBmdW5jdGlvbiAoY29sdW1ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkLnJlZHVjZShmdW5jdGlvbiAoYWNjLCByb3cpIHsgcmV0dXJuIGFjYyArIHJvdy5nZXRNYXhDZWxsSGVpZ2h0KGNvbHVtbnMpOyB9LCAwKTtcbiAgICB9O1xuICAgIFRhYmxlLnByb3RvdHlwZS5nZXRGb290SGVpZ2h0ID0gZnVuY3Rpb24gKGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9vdC5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcm93KSB7IHJldHVybiBhY2MgKyByb3cuZ2V0TWF4Q2VsbEhlaWdodChjb2x1bW5zKTsgfSwgMCk7XG4gICAgfTtcbiAgICBUYWJsZS5wcm90b3R5cGUuYWxsUm93cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZC5jb25jYXQodGhpcy5ib2R5KS5jb25jYXQodGhpcy5mb290KTtcbiAgICB9O1xuICAgIFRhYmxlLnByb3RvdHlwZS5jYWxsQ2VsbEhvb2tzID0gZnVuY3Rpb24gKGRvYywgaGFuZGxlcnMsIGNlbGwsIHJvdywgY29sdW1uLCBjdXJzb3IpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBoYW5kbGVyc18xID0gaGFuZGxlcnM7IF9pIDwgaGFuZGxlcnNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNfMVtfaV07XG4gICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBDZWxsSG9va0RhdGEoZG9jLCB0aGlzLCBjZWxsLCByb3csIGNvbHVtbiwgY3Vyc29yKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBoYW5kbGVyKGRhdGEpID09PSBmYWxzZTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGlzIGFsd2F5cyBzdHJpbmdbXSBzaW5jZSB1c2VyIGNhbiBhc3NpZ24gc3RyaW5nXG4gICAgICAgICAgICBjZWxsLnRleHQgPSBBcnJheS5pc0FycmF5KGNlbGwudGV4dCkgPyBjZWxsLnRleHQgOiBbY2VsbC50ZXh0XTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBUYWJsZS5wcm90b3R5cGUuY2FsbEVuZFBhZ2VIb29rcyA9IGZ1bmN0aW9uIChkb2MsIGN1cnNvcikge1xuICAgICAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5ob29rcy5kaWREcmF3UGFnZTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gX2FbX2ldO1xuICAgICAgICAgICAgaGFuZGxlcihuZXcgSG9va0RhdGEoZG9jLCB0aGlzLCBjdXJzb3IpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGFibGUucHJvdG90eXBlLmNhbGxXaWxsRHJhd1BhZ2VIb29rcyA9IGZ1bmN0aW9uIChkb2MsIGN1cnNvcikge1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5ob29rcy53aWxsRHJhd1BhZ2U7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IF9hW19pXTtcbiAgICAgICAgICAgIGhhbmRsZXIobmV3IEhvb2tEYXRhKGRvYywgdGhpcywgY3Vyc29yKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRhYmxlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uIChwYWdlV2lkdGgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzLnRhYmxlV2lkdGggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy50YWJsZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc2V0dGluZ3MudGFibGVXaWR0aCA9PT0gJ3dyYXAnKSB7XG4gICAgICAgICAgICB2YXIgd3JhcHBlZFdpZHRoID0gdGhpcy5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbiAodG90YWwsIGNvbCkgeyByZXR1cm4gdG90YWwgKyBjb2wud3JhcHBlZFdpZHRoOyB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbWFyZ2luID0gdGhpcy5zZXR0aW5ncy5tYXJnaW47XG4gICAgICAgICAgICByZXR1cm4gcGFnZVdpZHRoIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUYWJsZTtcbn0oKSk7XG52YXIgUm93ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJvdyhyYXcsIGluZGV4LCBzZWN0aW9uLCBjZWxscywgc3BhbnNNdWx0aXBsZVBhZ2VzKSB7XG4gICAgICAgIGlmIChzcGFuc011bHRpcGxlUGFnZXMgPT09IHZvaWQgMCkgeyBzcGFuc011bHRpcGxlUGFnZXMgPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMucmF3ID0gcmF3O1xuICAgICAgICBpZiAocmF3IGluc3RhbmNlb2YgSHRtbFJvd0lucHV0KSB7XG4gICAgICAgICAgICB0aGlzLnJhdyA9IHJhdy5fZWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IHJhdy5fZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuc2VjdGlvbiA9IHNlY3Rpb247XG4gICAgICAgIHRoaXMuY2VsbHMgPSBjZWxscztcbiAgICAgICAgdGhpcy5zcGFuc011bHRpcGxlUGFnZXMgPSBzcGFuc011bHRpcGxlUGFnZXM7XG4gICAgfVxuICAgIFJvdy5wcm90b3R5cGUuZ2V0TWF4Q2VsbEhlaWdodCA9IGZ1bmN0aW9uIChjb2x1bW5zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBjb2x1bW5zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjb2x1bW4pIHsgdmFyIF9hOyByZXR1cm4gTWF0aC5tYXgoYWNjLCAoKF9hID0gX3RoaXMuY2VsbHNbY29sdW1uLmluZGV4XSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhlaWdodCkgfHwgMCk7IH0sIDApO1xuICAgIH07XG4gICAgUm93LnByb3RvdHlwZS5oYXNSb3dTcGFuID0gZnVuY3Rpb24gKGNvbHVtbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChjb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgY2VsbCA9IF90aGlzLmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgICAgICBpZiAoIWNlbGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGNlbGwucm93U3BhbiA+IDE7XG4gICAgICAgIH0pLmxlbmd0aCA+IDApO1xuICAgIH07XG4gICAgUm93LnByb3RvdHlwZS5jYW5FbnRpcmVSb3dGaXQgPSBmdW5jdGlvbiAoaGVpZ2h0LCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1heENlbGxIZWlnaHQoY29sdW1ucykgPD0gaGVpZ2h0O1xuICAgIH07XG4gICAgUm93LnByb3RvdHlwZS5nZXRNaW5pbXVtUm93SGVpZ2h0ID0gZnVuY3Rpb24gKGNvbHVtbnMsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgY2VsbCA9IF90aGlzLmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgICAgICBpZiAoIWNlbGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB2YXIgbGluZUhlaWdodCA9IGRvYy5nZXRMaW5lSGVpZ2h0KGNlbGwuc3R5bGVzLmZvbnRTaXplKTtcbiAgICAgICAgICAgIHZhciB2UGFkZGluZyA9IGNlbGwucGFkZGluZygndmVydGljYWwnKTtcbiAgICAgICAgICAgIHZhciBvbmVSb3dIZWlnaHQgPSB2UGFkZGluZyArIGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gb25lUm93SGVpZ2h0ID4gYWNjID8gb25lUm93SGVpZ2h0IDogYWNjO1xuICAgICAgICB9LCAwKTtcbiAgICB9O1xuICAgIHJldHVybiBSb3c7XG59KCkpO1xudmFyIENlbGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2VsbChyYXcsIHN0eWxlcywgc2VjdGlvbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuY29udGVudEhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuY29udGVudFdpZHRoID0gMDtcbiAgICAgICAgdGhpcy53cmFwcGVkV2lkdGggPSAwO1xuICAgICAgICB0aGlzLm1pblJlYWRhYmxlV2lkdGggPSAwO1xuICAgICAgICB0aGlzLm1pbldpZHRoID0gMDtcbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy54ID0gMDtcbiAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICAgIHRoaXMuc2VjdGlvbiA9IHNlY3Rpb247XG4gICAgICAgIHRoaXMucmF3ID0gcmF3O1xuICAgICAgICB2YXIgY29udGVudCA9IHJhdztcbiAgICAgICAgaWYgKHJhdyAhPSBudWxsICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICAgICAgICAgIHRoaXMucm93U3BhbiA9IHJhdy5yb3dTcGFuIHx8IDE7XG4gICAgICAgICAgICB0aGlzLmNvbFNwYW4gPSByYXcuY29sU3BhbiB8fCAxO1xuICAgICAgICAgICAgY29udGVudCA9IChfYSA9IHJhdy5jb250ZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiByYXc7XG4gICAgICAgICAgICBpZiAocmF3Ll9lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYXcgPSByYXcuX2VsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvd1NwYW4gPSAxO1xuICAgICAgICAgICAgdGhpcy5jb2xTcGFuID0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpbmdpZnkgMCBhbmQgZmFsc2UsIGJ1dCBub3QgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgdmFyIHRleHQgPSBjb250ZW50ICE9IG51bGwgPyAnJyArIGNvbnRlbnQgOiAnJztcbiAgICAgICAgdmFyIHNwbGl0UmVnZXggPSAvXFxyXFxufFxccnxcXG4vZztcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dC5zcGxpdChzcGxpdFJlZ2V4KTtcbiAgICB9XG4gICAgQ2VsbC5wcm90b3R5cGUuZ2V0VGV4dFBvcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHk7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlcy52YWxpZ24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgICB5ID0gdGhpcy55ICsgdGhpcy5wYWRkaW5nKCd0b3AnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnN0eWxlcy52YWxpZ24gPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICB5ID0gdGhpcy55ICsgdGhpcy5oZWlnaHQgLSB0aGlzLnBhZGRpbmcoJ2JvdHRvbScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG5ldEhlaWdodCA9IHRoaXMuaGVpZ2h0IC0gdGhpcy5wYWRkaW5nKCd2ZXJ0aWNhbCcpO1xuICAgICAgICAgICAgeSA9IHRoaXMueSArIG5ldEhlaWdodCAvIDIgKyB0aGlzLnBhZGRpbmcoJ3RvcCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4O1xuICAgICAgICBpZiAodGhpcy5zdHlsZXMuaGFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB4ID0gdGhpcy54ICsgdGhpcy53aWR0aCAtIHRoaXMucGFkZGluZygncmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnN0eWxlcy5oYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICB2YXIgbmV0V2lkdGggPSB0aGlzLndpZHRoIC0gdGhpcy5wYWRkaW5nKCdob3Jpem9udGFsJyk7XG4gICAgICAgICAgICB4ID0gdGhpcy54ICsgbmV0V2lkdGggLyAyICsgdGhpcy5wYWRkaW5nKCdsZWZ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB4ID0gdGhpcy54ICsgdGhpcy5wYWRkaW5nKCdsZWZ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgeDogeCwgeTogeSB9O1xuICAgIH07XG4gICAgLy8gVE9ETyAodjQpOiByZXBsYWNlIHBhcmFtZXRlcnMgd2l0aCBvbmx5IChsaW5lSGVpZ2h0KVxuICAgIENlbGwucHJvdG90eXBlLmdldENvbnRlbnRIZWlnaHQgPSBmdW5jdGlvbiAoc2NhbGVGYWN0b3IsIGxpbmVIZWlnaHRGYWN0b3IpIHtcbiAgICAgICAgaWYgKGxpbmVIZWlnaHRGYWN0b3IgPT09IHZvaWQgMCkgeyBsaW5lSGVpZ2h0RmFjdG9yID0gMS4xNTsgfVxuICAgICAgICB2YXIgbGluZUNvdW50ID0gQXJyYXkuaXNBcnJheSh0aGlzLnRleHQpID8gdGhpcy50ZXh0Lmxlbmd0aCA6IDE7XG4gICAgICAgIHZhciBsaW5lSGVpZ2h0ID0gKHRoaXMuc3R5bGVzLmZvbnRTaXplIC8gc2NhbGVGYWN0b3IpICogbGluZUhlaWdodEZhY3RvcjtcbiAgICAgICAgdmFyIGhlaWdodCA9IGxpbmVDb3VudCAqIGxpbmVIZWlnaHQgKyB0aGlzLnBhZGRpbmcoJ3ZlcnRpY2FsJyk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChoZWlnaHQsIHRoaXMuc3R5bGVzLm1pbkNlbGxIZWlnaHQpO1xuICAgIH07XG4gICAgQ2VsbC5wcm90b3R5cGUucGFkZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBwYWRkaW5nID0gcGFyc2VTcGFjaW5nKHRoaXMuc3R5bGVzLmNlbGxQYWRkaW5nLCAwKTtcbiAgICAgICAgaWYgKG5hbWUgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWRkaW5nLnRvcCArIHBhZGRpbmcuYm90dG9tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgICAgcmV0dXJuIHBhZGRpbmcubGVmdCArIHBhZGRpbmcucmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFkZGluZ1tuYW1lXTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIENlbGw7XG59KCkpO1xudmFyIENvbHVtbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb2x1bW4oZGF0YUtleSwgcmF3LCBpbmRleCkge1xuICAgICAgICB0aGlzLndyYXBwZWRXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMubWluUmVhZGFibGVXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMubWluV2lkdGggPSAwO1xuICAgICAgICB0aGlzLndpZHRoID0gMDtcbiAgICAgICAgdGhpcy5kYXRhS2V5ID0gZGF0YUtleTtcbiAgICAgICAgdGhpcy5yYXcgPSByYXc7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgQ29sdW1uLnByb3RvdHlwZS5nZXRNYXhDdXN0b21DZWxsV2lkdGggPSBmdW5jdGlvbiAodGFibGUpIHtcbiAgICAgICAgdmFyIG1heCA9IDA7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0YWJsZS5hbGxSb3dzKCk7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgcm93ID0gX2FbX2ldO1xuICAgICAgICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbdGhpcy5pbmRleF07XG4gICAgICAgICAgICBpZiAoY2VsbCAmJiB0eXBlb2YgY2VsbC5zdHlsZXMuY2VsbFdpZHRoID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgY2VsbC5zdHlsZXMuY2VsbFdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH07XG4gICAgcmV0dXJuIENvbHVtbjtcbn0oKSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBjb2x1bW4gd2lkdGhzXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZVdpZHRocyhkb2MsIHRhYmxlKSB7XG4gICAgY2FsY3VsYXRlKGRvYywgdGFibGUpO1xuICAgIHZhciByZXNpemFibGVDb2x1bW5zID0gW107XG4gICAgdmFyIGluaXRpYWxUYWJsZVdpZHRoID0gMDtcbiAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICB2YXIgY3VzdG9tV2lkdGggPSBjb2x1bW4uZ2V0TWF4Q3VzdG9tQ2VsbFdpZHRoKHRhYmxlKTtcbiAgICAgICAgaWYgKGN1c3RvbVdpZHRoKSB7XG4gICAgICAgICAgICAvLyBmaW5hbCBjb2x1bW4gd2lkdGhcbiAgICAgICAgICAgIGNvbHVtbi53aWR0aCA9IGN1c3RvbVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaW5pdGlhbCBjb2x1bW4gd2lkdGggKHdpbGwgYmUgcmVzaXplZClcbiAgICAgICAgICAgIGNvbHVtbi53aWR0aCA9IGNvbHVtbi53cmFwcGVkV2lkdGg7XG4gICAgICAgICAgICByZXNpemFibGVDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICBpbml0aWFsVGFibGVXaWR0aCArPSBjb2x1bW4ud2lkdGg7XG4gICAgfSk7XG4gICAgLy8gd2lkdGggZGlmZmVyZW5jZSB0aGF0IG5lZWRzIHRvIGJlIGRpc3RyaWJ1dGVkXG4gICAgdmFyIHJlc2l6ZVdpZHRoID0gdGFibGUuZ2V0V2lkdGgoZG9jLnBhZ2VTaXplKCkud2lkdGgpIC0gaW5pdGlhbFRhYmxlV2lkdGg7XG4gICAgLy8gZmlyc3QgcmVzaXplIGF0dGVtcHQ6IHdpdGggcmVzcGVjdCB0byBtaW5SZWFkYWJsZVdpZHRoIGFuZCBtaW5XaWR0aFxuICAgIGlmIChyZXNpemVXaWR0aCkge1xuICAgICAgICByZXNpemVXaWR0aCA9IHJlc2l6ZUNvbHVtbnMocmVzaXphYmxlQ29sdW1ucywgcmVzaXplV2lkdGgsIGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChjb2x1bW4ubWluUmVhZGFibGVXaWR0aCwgY29sdW1uLm1pbldpZHRoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIHNlY29uZCByZXNpemUgYXR0ZW1wdDogaWdub3JlIG1pblJlYWRhYmxlV2lkdGggYnV0IHJlc3BlY3QgbWluV2lkdGhcbiAgICBpZiAocmVzaXplV2lkdGgpIHtcbiAgICAgICAgcmVzaXplV2lkdGggPSByZXNpemVDb2x1bW5zKHJlc2l6YWJsZUNvbHVtbnMsIHJlc2l6ZVdpZHRoLCBmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubWluV2lkdGg7IH0pO1xuICAgIH1cbiAgICByZXNpemVXaWR0aCA9IE1hdGguYWJzKHJlc2l6ZVdpZHRoKTtcbiAgICBpZiAoIXRhYmxlLnNldHRpbmdzLmhvcml6b250YWxQYWdlQnJlYWsgJiZcbiAgICAgICAgcmVzaXplV2lkdGggPiAwLjEgLyBkb2Muc2NhbGVGYWN0b3IoKSkge1xuICAgICAgICAvLyBUYWJsZSBjYW4ndCBnZXQgc21hbGxlciBkdWUgdG8gY3VzdG9tLXdpZHRoIG9yIG1pbldpZHRoIHJlc3RyaWN0aW9uc1xuICAgICAgICAvLyBXZSBjYW4ndCByZWFsbHkgZG8gbXVjaCBoZXJlLiBVcCB0byB1c2VyIHRvIGZvciBleGFtcGxlXG4gICAgICAgIC8vIHJlZHVjZSBmb250IHNpemUsIGluY3JlYXNlIHBhZ2Ugc2l6ZSBvciByZW1vdmUgY3VzdG9tIGNlbGwgd2lkdGhzXG4gICAgICAgIC8vIHRvIGFsbG93IG1vcmUgY29sdW1ucyB0byBiZSByZWR1Y2VkIGluIHNpemVcbiAgICAgICAgcmVzaXplV2lkdGggPSByZXNpemVXaWR0aCA8IDEgPyByZXNpemVXaWR0aCA6IE1hdGgucm91bmQocmVzaXplV2lkdGgpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIk9mIHRoZSB0YWJsZSBjb250ZW50LCBcIi5jb25jYXQocmVzaXplV2lkdGgsIFwiIHVuaXRzIHdpZHRoIGNvdWxkIG5vdCBmaXQgcGFnZVwiKSk7XG4gICAgfVxuICAgIGFwcGx5Q29sU3BhbnModGFibGUpO1xuICAgIGZpdENvbnRlbnQodGFibGUsIGRvYyk7XG4gICAgYXBwbHlSb3dTcGFucyh0YWJsZSk7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGUoZG9jLCB0YWJsZSkge1xuICAgIHZhciBzZiA9IGRvYy5zY2FsZUZhY3RvcigpO1xuICAgIHZhciBob3Jpem9udGFsUGFnZUJyZWFrID0gdGFibGUuc2V0dGluZ3MuaG9yaXpvbnRhbFBhZ2VCcmVhaztcbiAgICB2YXIgYXZhaWxhYmxlUGFnZVdpZHRoID0gZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGRvYywgdGFibGUpO1xuICAgIHRhYmxlLmFsbFJvd3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRhYmxlLmNvbHVtbnM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1uID0gX2FbX2ldO1xuICAgICAgICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgICAgIGlmICghY2VsbClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHZhciBob29rcyA9IHRhYmxlLmhvb2tzLmRpZFBhcnNlQ2VsbDtcbiAgICAgICAgICAgIHRhYmxlLmNhbGxDZWxsSG9va3MoZG9jLCBob29rcywgY2VsbCwgcm93LCBjb2x1bW4sIG51bGwpO1xuICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSBjZWxsLnBhZGRpbmcoJ2hvcml6b250YWwnKTtcbiAgICAgICAgICAgIGNlbGwuY29udGVudFdpZHRoID0gZ2V0U3RyaW5nV2lkdGgoY2VsbC50ZXh0LCBjZWxsLnN0eWxlcywgZG9jKSArIHBhZGRpbmc7XG4gICAgICAgICAgICAvLyBVc2luZyBbXlxcU1xcdTAwQTBdIGluc3RlYWQgb2YgXFxzIGVuc3VyZXMgdGhhdCB3ZSBzcGxpdCB0aGUgdGV4dCBvbiBhbGxcbiAgICAgICAgICAgIC8vIHdoaXRlc3BhY2UgZXhjZXB0IG5vbi1icmVha2luZyBzcGFjZXMgKFxcdTAwQTApLiBXZSBuZWVkIHRvIHByZXNlcnZlXG4gICAgICAgICAgICAvLyB0aGVtIGluIHRoZSBzcGxpdCBwcm9jZXNzIHRvIGVuc3VyZSBjb3JyZWN0IHdvcmQgc2VwYXJhdGlvbiBhbmQgd2lkdGhcbiAgICAgICAgICAgIC8vIGNhbGN1bGF0aW9uLlxuICAgICAgICAgICAgdmFyIGxvbmdlc3RXb3JkV2lkdGggPSBnZXRTdHJpbmdXaWR0aChjZWxsLnRleHQuam9pbignICcpLnNwbGl0KC9bXlxcU1xcdTAwQTBdKy8pLCBjZWxsLnN0eWxlcywgZG9jKTtcbiAgICAgICAgICAgIGNlbGwubWluUmVhZGFibGVXaWR0aCA9IGxvbmdlc3RXb3JkV2lkdGggKyBjZWxsLnBhZGRpbmcoJ2hvcml6b250YWwnKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2VsbC5zdHlsZXMuY2VsbFdpZHRoID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNlbGwubWluV2lkdGggPSBjZWxsLnN0eWxlcy5jZWxsV2lkdGg7XG4gICAgICAgICAgICAgICAgY2VsbC53cmFwcGVkV2lkdGggPSBjZWxsLnN0eWxlcy5jZWxsV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjZWxsLnN0eWxlcy5jZWxsV2lkdGggPT09ICd3cmFwJyB8fFxuICAgICAgICAgICAgICAgIGhvcml6b250YWxQYWdlQnJlYWsgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAvLyBjZWxsIHdpZHRoIHNob3VsZCBub3QgYmUgbW9yZSB0aGFuIGF2YWlsYWJsZSBwYWdlIHdpZHRoXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwuY29udGVudFdpZHRoID4gYXZhaWxhYmxlUGFnZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwubWluV2lkdGggPSBhdmFpbGFibGVQYWdlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwud3JhcHBlZFdpZHRoID0gYXZhaWxhYmxlUGFnZVdpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5taW5XaWR0aCA9IGNlbGwuY29udGVudFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBjZWxsLndyYXBwZWRXaWR0aCA9IGNlbGwuY29udGVudFdpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGF1dG9cbiAgICAgICAgICAgICAgICB2YXIgZGVmYXVsdE1pbldpZHRoID0gMTAgLyBzZjtcbiAgICAgICAgICAgICAgICBjZWxsLm1pbldpZHRoID0gY2VsbC5zdHlsZXMubWluQ2VsbFdpZHRoIHx8IGRlZmF1bHRNaW5XaWR0aDtcbiAgICAgICAgICAgICAgICBjZWxsLndyYXBwZWRXaWR0aCA9IGNlbGwuY29udGVudFdpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChjZWxsLm1pbldpZHRoID4gY2VsbC53cmFwcGVkV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbC53cmFwcGVkV2lkdGggPSBjZWxsLm1pbldpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHRhYmxlLmFsbFJvd3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRhYmxlLmNvbHVtbnM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1uID0gX2FbX2ldO1xuICAgICAgICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgICAgIC8vIEZvciBub3cgd2UgaWdub3JlIHRoZSBtaW5XaWR0aCBhbmQgd3JhcHBlZFdpZHRoIG9mIGNvbHNwYW4gY2VsbHMgd2hlbiBjYWxjdWxhdGluZyBjb2xzcGFuIHdpZHRocy5cbiAgICAgICAgICAgIC8vIENvdWxkIHByb2JhYmx5IGJlIGltcHJvdmVkIHVwb24gaG93ZXZlci5cbiAgICAgICAgICAgIGlmIChjZWxsICYmIGNlbGwuY29sU3BhbiA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbi53cmFwcGVkV2lkdGggPSBNYXRoLm1heChjb2x1bW4ud3JhcHBlZFdpZHRoLCBjZWxsLndyYXBwZWRXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29sdW1uLm1pbldpZHRoID0gTWF0aC5tYXgoY29sdW1uLm1pbldpZHRoLCBjZWxsLm1pbldpZHRoKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4ubWluUmVhZGFibGVXaWR0aCA9IE1hdGgubWF4KGNvbHVtbi5taW5SZWFkYWJsZVdpZHRoLCBjZWxsLm1pblJlYWRhYmxlV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzcGVjdCBjZWxsV2lkdGggc2V0IGluIGNvbHVtblN0eWxlcyBldmVuIGlmIHRoZXJlIGlzIG5vIGNlbGxzIGZvciB0aGlzIGNvbHVtblxuICAgICAgICAgICAgICAgIC8vIG9yIGlmIHRoZSBjb2x1bW4gb25seSBoYXZlIGNvbHNwYW4gY2VsbHMuIFNpbmNlIHRoZSB3aWR0aCBvZiBjb2xzcGFuIGNlbGxzXG4gICAgICAgICAgICAgICAgLy8gZG9lcyBub3QgYWZmZWN0IHRoZSB3aWR0aCBvZiBjb2x1bW5zLCBzZXR0aW5nIGNvbHVtblN0eWxlcyBjZWxsV2lkdGggZW5hYmxlcyB0aGVcbiAgICAgICAgICAgICAgICAvLyB1c2VyIHRvIGF0IGxlYXN0IGRvIGl0IG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBwZXJmZWN0IGZvciBub3cgc2luY2UgZm9yIGV4YW1wbGUgcm93IGFuZCB0YWJsZSBzdHlsZXMgYXJlXG4gICAgICAgICAgICAgICAgLy8gbm90IGFjY291bnRlZCBmb3JcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uU3R5bGVzID0gdGFibGUuc3R5bGVzLmNvbHVtblN0eWxlc1tjb2x1bW4uZGF0YUtleV0gfHxcbiAgICAgICAgICAgICAgICAgICAgdGFibGUuc3R5bGVzLmNvbHVtblN0eWxlc1tjb2x1bW4uaW5kZXhdIHx8XG4gICAgICAgICAgICAgICAgICAgIHt9O1xuICAgICAgICAgICAgICAgIHZhciBjZWxsV2lkdGggPSBjb2x1bW5TdHlsZXMuY2VsbFdpZHRoIHx8IGNvbHVtblN0eWxlcy5taW5DZWxsV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGNlbGxXaWR0aCAmJiB0eXBlb2YgY2VsbFdpZHRoID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ubWluV2lkdGggPSBjZWxsV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi53cmFwcGVkV2lkdGggPSBjZWxsV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIGNvbHVtbnMgZ2V0IGF0IGxlYXN0IG1pbiB3aWR0aCBldmVuIHRob3VnaCB3aWR0aCBjYWxjdWxhdGlvbnMgYXJlIG5vdCBiYXNlZCBvbiB0aGVtXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwuY29sU3BhbiA+IDEgJiYgIWNvbHVtbi5taW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ubWluV2lkdGggPSBjZWxsLm1pbldpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2VsbC5jb2xTcGFuID4gMSAmJiAhY29sdW1uLndyYXBwZWRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ud3JhcHBlZFdpZHRoID0gY2VsbC5taW5XaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogRGlzdHJpYnV0ZSByZXNpemVXaWR0aCBvbiBwYXNzZWQgcmVzaXphYmxlIGNvbHVtbnNcbiAqL1xuZnVuY3Rpb24gcmVzaXplQ29sdW1ucyhjb2x1bW5zLCByZXNpemVXaWR0aCwgZ2V0TWluV2lkdGgpIHtcbiAgICB2YXIgaW5pdGlhbFJlc2l6ZVdpZHRoID0gcmVzaXplV2lkdGg7XG4gICAgdmFyIHN1bVdyYXBwZWRXaWR0aCA9IGNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNvbHVtbikgeyByZXR1cm4gYWNjICsgY29sdW1uLndyYXBwZWRXaWR0aDsgfSwgMCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2x1bW4gPSBjb2x1bW5zW2ldO1xuICAgICAgICB2YXIgcmF0aW8gPSBjb2x1bW4ud3JhcHBlZFdpZHRoIC8gc3VtV3JhcHBlZFdpZHRoO1xuICAgICAgICB2YXIgc3VnZ2VzdGVkQ2hhbmdlID0gaW5pdGlhbFJlc2l6ZVdpZHRoICogcmF0aW87XG4gICAgICAgIHZhciBzdWdnZXN0ZWRXaWR0aCA9IGNvbHVtbi53aWR0aCArIHN1Z2dlc3RlZENoYW5nZTtcbiAgICAgICAgdmFyIG1pbldpZHRoID0gZ2V0TWluV2lkdGgoY29sdW1uKTtcbiAgICAgICAgdmFyIG5ld1dpZHRoID0gc3VnZ2VzdGVkV2lkdGggPCBtaW5XaWR0aCA/IG1pbldpZHRoIDogc3VnZ2VzdGVkV2lkdGg7XG4gICAgICAgIHJlc2l6ZVdpZHRoIC09IG5ld1dpZHRoIC0gY29sdW1uLndpZHRoO1xuICAgICAgICBjb2x1bW4ud2lkdGggPSBuZXdXaWR0aDtcbiAgICB9XG4gICAgcmVzaXplV2lkdGggPSBNYXRoLnJvdW5kKHJlc2l6ZVdpZHRoICogMWUxMCkgLyAxZTEwO1xuICAgIC8vIFJ1biB0aGUgcmVzaXplciBhZ2FpbiBpZiB0aGVyZSdzIHJlbWFpbmluZyB3aWR0aCBuZWVkc1xuICAgIC8vIHRvIGJlIGRpc3RyaWJ1dGVkIGFuZCB0aGVyZSdyZSBjb2x1bW5zIHRoYXQgY2FuIGJlIHJlc2l6ZWRcbiAgICBpZiAocmVzaXplV2lkdGgpIHtcbiAgICAgICAgdmFyIHJlc2l6YWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzaXplV2lkdGggPCAwXG4gICAgICAgICAgICAgICAgPyBjb2x1bW4ud2lkdGggPiBnZXRNaW5XaWR0aChjb2x1bW4pIC8vIGNoZWNrIGlmIGNvbHVtbiBjYW4gc2hyaW5rXG4gICAgICAgICAgICAgICAgOiB0cnVlOyAvLyBjaGVjayBpZiBjb2x1bW4gY2FuIGdyb3dcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXNpemFibGVDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzaXplV2lkdGggPSByZXNpemVDb2x1bW5zKHJlc2l6YWJsZUNvbHVtbnMsIHJlc2l6ZVdpZHRoLCBnZXRNaW5XaWR0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc2l6ZVdpZHRoO1xufVxuZnVuY3Rpb24gYXBwbHlSb3dTcGFucyh0YWJsZSkge1xuICAgIHZhciByb3dTcGFuQ2VsbHMgPSB7fTtcbiAgICB2YXIgY29sUm93U3BhbnNMZWZ0ID0gMTtcbiAgICB2YXIgYWxsID0gdGFibGUuYWxsUm93cygpO1xuICAgIGZvciAodmFyIHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCBhbGwubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgIHZhciByb3cgPSBhbGxbcm93SW5kZXhdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGFibGUuY29sdW1uczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfYVtfaV07XG4gICAgICAgICAgICB2YXIgZGF0YSA9IHJvd1NwYW5DZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGNvbFJvd1NwYW5zTGVmdCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb2xSb3dTcGFuc0xlZnQtLTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcm93LmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5jZWxsLmhlaWdodCArPSByb3cuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbFJvd1NwYW5zTGVmdCA9IGRhdGEuY2VsbC5jb2xTcGFuO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgICAgICAgICBkYXRhLmxlZnQtLTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZWZ0IDw9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvd1NwYW5DZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBjZWxsID0gcm93LmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjZWxsLmhlaWdodCA9IHJvdy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNlbGwucm93U3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IGFsbC5sZW5ndGggLSByb3dJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnQgPSBjZWxsLnJvd1NwYW4gPiByZW1haW5pbmcgPyByZW1haW5pbmcgOiBjZWxsLnJvd1NwYW47XG4gICAgICAgICAgICAgICAgICAgIHJvd1NwYW5DZWxsc1tjb2x1bW4uaW5kZXhdID0geyBjZWxsOiBjZWxsLCBsZWZ0OiBsZWZ0LCByb3c6IHJvdyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5Q29sU3BhbnModGFibGUpIHtcbiAgICB2YXIgYWxsID0gdGFibGUuYWxsUm93cygpO1xuICAgIGZvciAodmFyIHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCBhbGwubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgIHZhciByb3cgPSBhbGxbcm93SW5kZXhdO1xuICAgICAgICB2YXIgY29sU3BhbkNlbGwgPSBudWxsO1xuICAgICAgICB2YXIgY29tYmluZWRDb2xTcGFuV2lkdGggPSAwO1xuICAgICAgICB2YXIgY29sU3BhbnNMZWZ0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IHRhYmxlLmNvbHVtbnMubGVuZ3RoOyBjb2x1bW5JbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1uID0gdGFibGUuY29sdW1uc1tjb2x1bW5JbmRleF07XG4gICAgICAgICAgICAvLyBXaWR0aCBhbmQgY29sc3BhblxuICAgICAgICAgICAgY29sU3BhbnNMZWZ0IC09IDE7XG4gICAgICAgICAgICBpZiAoY29sU3BhbnNMZWZ0ID4gMSAmJiB0YWJsZS5jb2x1bW5zW2NvbHVtbkluZGV4ICsgMV0pIHtcbiAgICAgICAgICAgICAgICBjb21iaW5lZENvbFNwYW5XaWR0aCArPSBjb2x1bW4ud2lkdGg7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJvdy5jZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29sU3BhbkNlbGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IGNvbFNwYW5DZWxsO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgICAgICAgICBjb2xTcGFuQ2VsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgY2VsbC53aWR0aCA9IGNvbHVtbi53aWR0aCArIGNvbWJpbmVkQ29sU3BhbldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoIWNlbGwpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbFNwYW5zTGVmdCA9IGNlbGwuY29sU3BhbjtcbiAgICAgICAgICAgICAgICBjb21iaW5lZENvbFNwYW5XaWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGNlbGwuY29sU3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbkNlbGwgPSBjZWxsO1xuICAgICAgICAgICAgICAgICAgICBjb21iaW5lZENvbFNwYW5XaWR0aCArPSBjb2x1bW4ud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjZWxsLndpZHRoID0gY29sdW1uLndpZHRoICsgY29tYmluZWRDb2xTcGFuV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBmaXRDb250ZW50KHRhYmxlLCBkb2MpIHtcbiAgICB2YXIgcm93U3BhbkhlaWdodCA9IHsgY291bnQ6IDAsIGhlaWdodDogMCB9O1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0YWJsZS5hbGxSb3dzKCk7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSBfYVtfaV07XG4gICAgICAgIGZvciAodmFyIF9iID0gMCwgX2MgPSB0YWJsZS5jb2x1bW5zOyBfYiA8IF9jLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IF9jW19iXTtcbiAgICAgICAgICAgIHZhciBjZWxsID0gcm93LmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgICAgICBpZiAoIWNlbGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBkb2MuYXBwbHlTdHlsZXMoY2VsbC5zdHlsZXMsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHRleHRTcGFjZSA9IGNlbGwud2lkdGggLSBjZWxsLnBhZGRpbmcoJ2hvcml6b250YWwnKTtcbiAgICAgICAgICAgIGlmIChjZWxsLnN0eWxlcy5vdmVyZmxvdyA9PT0gJ2xpbmVicmVhaycpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgb25lIHB0IHRvIHRleHRTcGFjZSB0byBmaXggcm91bmRpbmcgZXJyb3JcbiAgICAgICAgICAgICAgICBjZWxsLnRleHQgPSBkb2Muc3BsaXRUZXh0VG9TaXplKGNlbGwudGV4dCwgdGV4dFNwYWNlICsgMSAvIGRvYy5zY2FsZUZhY3RvcigpLCB7IGZvbnRTaXplOiBjZWxsLnN0eWxlcy5mb250U2l6ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwuc3R5bGVzLm92ZXJmbG93ID09PSAnZWxsaXBzaXplJykge1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dCA9IGVsbGlwc2l6ZShjZWxsLnRleHQsIHRleHRTcGFjZSwgY2VsbC5zdHlsZXMsIGRvYywgJy4uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2VsbC5zdHlsZXMub3ZlcmZsb3cgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgY2VsbC50ZXh0ID0gZWxsaXBzaXplKGNlbGwudGV4dCwgdGV4dFNwYWNlLCBjZWxsLnN0eWxlcywgZG9jLCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2VsbC5zdHlsZXMub3ZlcmZsb3cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2VsbC5zdHlsZXMub3ZlcmZsb3coY2VsbC50ZXh0LCB0ZXh0U3BhY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBjZWxsLnRleHQgPSBbcmVzdWx0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwudGV4dCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjZWxsLmNvbnRlbnRIZWlnaHQgPSBjZWxsLmdldENvbnRlbnRIZWlnaHQoZG9jLnNjYWxlRmFjdG9yKCksIGRvYy5nZXRMaW5lSGVpZ2h0RmFjdG9yKCkpO1xuICAgICAgICAgICAgdmFyIHJlYWxDb250ZW50SGVpZ2h0ID0gY2VsbC5jb250ZW50SGVpZ2h0IC8gY2VsbC5yb3dTcGFuO1xuICAgICAgICAgICAgaWYgKGNlbGwucm93U3BhbiA+IDEgJiZcbiAgICAgICAgICAgICAgICByb3dTcGFuSGVpZ2h0LmNvdW50ICogcm93U3BhbkhlaWdodC5oZWlnaHQgPFxuICAgICAgICAgICAgICAgICAgICByZWFsQ29udGVudEhlaWdodCAqIGNlbGwucm93U3Bhbikge1xuICAgICAgICAgICAgICAgIHJvd1NwYW5IZWlnaHQgPSB7IGhlaWdodDogcmVhbENvbnRlbnRIZWlnaHQsIGNvdW50OiBjZWxsLnJvd1NwYW4gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJvd1NwYW5IZWlnaHQgJiYgcm93U3BhbkhlaWdodC5jb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocm93U3BhbkhlaWdodC5oZWlnaHQgPiByZWFsQ29udGVudEhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICByZWFsQ29udGVudEhlaWdodCA9IHJvd1NwYW5IZWlnaHQuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWFsQ29udGVudEhlaWdodCA+IHJvdy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICByb3cuaGVpZ2h0ID0gcmVhbENvbnRlbnRIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcm93U3BhbkhlaWdodC5jb3VudC0tO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVsbGlwc2l6ZSh0ZXh0LCB3aWR0aCwgc3R5bGVzLCBkb2MsIG92ZXJmbG93KSB7XG4gICAgcmV0dXJuIHRleHQubWFwKGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIGVsbGlwc2l6ZVN0cihzdHIsIHdpZHRoLCBzdHlsZXMsIGRvYywgb3ZlcmZsb3cpOyB9KTtcbn1cbmZ1bmN0aW9uIGVsbGlwc2l6ZVN0cih0ZXh0LCB3aWR0aCwgc3R5bGVzLCBkb2MsIG92ZXJmbG93KSB7XG4gICAgdmFyIHByZWNpc2lvbiA9IDEwMDAwICogZG9jLnNjYWxlRmFjdG9yKCk7XG4gICAgd2lkdGggPSBNYXRoLmNlaWwod2lkdGggKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9uO1xuICAgIGlmICh3aWR0aCA+PSBnZXRTdHJpbmdXaWR0aCh0ZXh0LCBzdHlsZXMsIGRvYykpIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIHdoaWxlICh3aWR0aCA8IGdldFN0cmluZ1dpZHRoKHRleHQgKyBvdmVyZmxvdywgc3R5bGVzLCBkb2MpKSB7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQudHJpbSgpICsgb3ZlcmZsb3c7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhYmxlKGpzUERGRG9jLCBpbnB1dCkge1xuICAgIHZhciBkb2MgPSBuZXcgRG9jSGFuZGxlcihqc1BERkRvYyk7XG4gICAgdmFyIGNvbnRlbnQgPSBwYXJzZUNvbnRlbnQoaW5wdXQsIGRvYy5zY2FsZUZhY3RvcigpKTtcbiAgICB2YXIgdGFibGUgPSBuZXcgVGFibGUoaW5wdXQsIGNvbnRlbnQpO1xuICAgIGNhbGN1bGF0ZVdpZHRocyhkb2MsIHRhYmxlKTtcbiAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgIHJldHVybiB0YWJsZTtcbn1cbmZ1bmN0aW9uIHBhcnNlQ29udGVudChpbnB1dCwgc2YpIHtcbiAgICB2YXIgY29udGVudCA9IGlucHV0LmNvbnRlbnQ7XG4gICAgdmFyIGNvbHVtbnMgPSBjcmVhdGVDb2x1bW5zKGNvbnRlbnQuY29sdW1ucyk7XG4gICAgLy8gSWYgbm8gaGVhZCBvciBmb290IGlzIHNldCwgdHJ5IGdlbmVyYXRpbmcgaXQgd2l0aCBjb250ZW50IGZyb20gY29sdW1uc1xuICAgIGlmIChjb250ZW50LmhlYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBzZWN0aW9uUm93ID0gZ2VuZXJhdGVTZWN0aW9uUm93KGNvbHVtbnMsICdoZWFkJyk7XG4gICAgICAgIGlmIChzZWN0aW9uUm93KVxuICAgICAgICAgICAgY29udGVudC5oZWFkLnB1c2goc2VjdGlvblJvdyk7XG4gICAgfVxuICAgIGlmIChjb250ZW50LmZvb3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBzZWN0aW9uUm93ID0gZ2VuZXJhdGVTZWN0aW9uUm93KGNvbHVtbnMsICdmb290Jyk7XG4gICAgICAgIGlmIChzZWN0aW9uUm93KVxuICAgICAgICAgICAgY29udGVudC5mb290LnB1c2goc2VjdGlvblJvdyk7XG4gICAgfVxuICAgIHZhciB0aGVtZSA9IGlucHV0LnNldHRpbmdzLnRoZW1lO1xuICAgIHZhciBzdHlsZXMgPSBpbnB1dC5zdHlsZXM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgaGVhZDogcGFyc2VTZWN0aW9uKCdoZWFkJywgY29udGVudC5oZWFkLCBjb2x1bW5zLCBzdHlsZXMsIHRoZW1lLCBzZiksXG4gICAgICAgIGJvZHk6IHBhcnNlU2VjdGlvbignYm9keScsIGNvbnRlbnQuYm9keSwgY29sdW1ucywgc3R5bGVzLCB0aGVtZSwgc2YpLFxuICAgICAgICBmb290OiBwYXJzZVNlY3Rpb24oJ2Zvb3QnLCBjb250ZW50LmZvb3QsIGNvbHVtbnMsIHN0eWxlcywgdGhlbWUsIHNmKSxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VTZWN0aW9uKHNlY3Rpb25OYW1lLCBzZWN0aW9uUm93cywgY29sdW1ucywgc3R5bGVQcm9wcywgdGhlbWUsIHNjYWxlRmFjdG9yKSB7XG4gICAgdmFyIHJvd1NwYW5zTGVmdEZvckNvbHVtbiA9IHt9O1xuICAgIHZhciByZXN1bHQgPSBzZWN0aW9uUm93cy5tYXAoZnVuY3Rpb24gKHJhd1Jvdywgcm93SW5kZXgpIHtcbiAgICAgICAgdmFyIHNraXBwZWRSb3dGb3JSb3dTcGFucyA9IDA7XG4gICAgICAgIHZhciBjZWxscyA9IHt9O1xuICAgICAgICB2YXIgY29sU3BhbnNBZGRlZCA9IDA7XG4gICAgICAgIHZhciBjb2x1bW5TcGFuc0xlZnQgPSAwO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGNvbHVtbnNfMSA9IGNvbHVtbnM7IF9pIDwgY29sdW1uc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNfMVtfaV07XG4gICAgICAgICAgICBpZiAocm93U3BhbnNMZWZ0Rm9yQ29sdW1uW2NvbHVtbi5pbmRleF0gPT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIHJvd1NwYW5zTGVmdEZvckNvbHVtbltjb2x1bW4uaW5kZXhdLmxlZnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uU3BhbnNMZWZ0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByYXdDZWxsID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdSb3cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdDZWxsID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdSb3dbY29sdW1uLmluZGV4IC0gY29sU3BhbnNBZGRlZCAtIHNraXBwZWRSb3dGb3JSb3dTcGFuc107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdDZWxsID0gcmF3Um93W2NvbHVtbi5kYXRhS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbElucHV0U3R5bGVzID0ge307XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmF3Q2VsbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocmF3Q2VsbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxJbnB1dFN0eWxlcyA9IChyYXdDZWxsID09PSBudWxsIHx8IHJhd0NlbGwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd0NlbGwuc3R5bGVzKSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVzID0gY2VsbFN0eWxlcyhzZWN0aW9uTmFtZSwgY29sdW1uLCByb3dJbmRleCwgdGhlbWUsIHN0eWxlUHJvcHMsIHNjYWxlRmFjdG9yLCBjZWxsSW5wdXRTdHlsZXMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IG5ldyBDZWxsKHJhd0NlbGwsIHN0eWxlcywgc2VjdGlvbk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBkYXRhS2V5IGlzIG5vdCB1c2VkIGludGVybmFsbHkgbm8gbW9yZSBidXQga2VlcCBmb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBpbiBob29rc1xuICAgICAgICAgICAgICAgICAgICBjZWxsc1tjb2x1bW4uZGF0YUtleV0gPSBjZWxsO1xuICAgICAgICAgICAgICAgICAgICBjZWxsc1tjb2x1bW4uaW5kZXhdID0gY2VsbDtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uU3BhbnNMZWZ0ID0gY2VsbC5jb2xTcGFuIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgcm93U3BhbnNMZWZ0Rm9yQ29sdW1uW2NvbHVtbi5pbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBjZWxsLnJvd1NwYW4gLSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXM6IGNvbHVtblNwYW5zTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtblNwYW5zTGVmdC0tO1xuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuc0FkZGVkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcm93U3BhbnNMZWZ0Rm9yQ29sdW1uW2NvbHVtbi5pbmRleF0ubGVmdC0tO1xuICAgICAgICAgICAgICAgIGNvbHVtblNwYW5zTGVmdCA9IHJvd1NwYW5zTGVmdEZvckNvbHVtbltjb2x1bW4uaW5kZXhdLnRpbWVzO1xuICAgICAgICAgICAgICAgIHNraXBwZWRSb3dGb3JSb3dTcGFucysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUm93KHJhd1Jvdywgcm93SW5kZXgsIHNlY3Rpb25OYW1lLCBjZWxscyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlU2VjdGlvblJvdyhjb2x1bW5zLCBzZWN0aW9uKSB7XG4gICAgdmFyIHNlY3Rpb25Sb3cgPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICBpZiAoY29sLnJhdyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgdGl0bGUgPSBnZXRTZWN0aW9uVGl0bGUoc2VjdGlvbiwgY29sLnJhdyk7XG4gICAgICAgICAgICBpZiAodGl0bGUgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBzZWN0aW9uUm93W2NvbC5kYXRhS2V5XSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNlY3Rpb25Sb3cpLmxlbmd0aCA+IDAgPyBzZWN0aW9uUm93IDogbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFNlY3Rpb25UaXRsZShzZWN0aW9uLCBjb2x1bW4pIHtcbiAgICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWQnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29sdW1uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5oZWFkZXIgfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY29sdW1uID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzZWN0aW9uID09PSAnZm9vdCcgJiYgdHlwZW9mIGNvbHVtbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5mb290ZXI7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29sdW1ucyhjb2x1bW5zKSB7XG4gICAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChpbnB1dCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gKF9hID0gaW5wdXQuZGF0YUtleSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBpbmRleDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbHVtbihrZXksIGlucHV0LCBpbmRleCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjZWxsU3R5bGVzKHNlY3Rpb25OYW1lLCBjb2x1bW4sIHJvd0luZGV4LCB0aGVtZU5hbWUsIHN0eWxlcywgc2NhbGVGYWN0b3IsIGNlbGxJbnB1dFN0eWxlcykge1xuICAgIHZhciB0aGVtZSA9IGdldFRoZW1lKHRoZW1lTmFtZSk7XG4gICAgdmFyIHNlY3Rpb25TdHlsZXM7XG4gICAgaWYgKHNlY3Rpb25OYW1lID09PSAnaGVhZCcpIHtcbiAgICAgICAgc2VjdGlvblN0eWxlcyA9IHN0eWxlcy5oZWFkU3R5bGVzO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWN0aW9uTmFtZSA9PT0gJ2JvZHknKSB7XG4gICAgICAgIHNlY3Rpb25TdHlsZXMgPSBzdHlsZXMuYm9keVN0eWxlcztcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VjdGlvbk5hbWUgPT09ICdmb290Jykge1xuICAgICAgICBzZWN0aW9uU3R5bGVzID0gc3R5bGVzLmZvb3RTdHlsZXM7XG4gICAgfVxuICAgIHZhciBvdGhlclN0eWxlcyA9IGFzc2lnbih7fSwgdGhlbWUudGFibGUsIHRoZW1lW3NlY3Rpb25OYW1lXSwgc3R5bGVzLnN0eWxlcywgc2VjdGlvblN0eWxlcyk7XG4gICAgdmFyIGNvbHVtblN0eWxlcyA9IHN0eWxlcy5jb2x1bW5TdHlsZXNbY29sdW1uLmRhdGFLZXldIHx8XG4gICAgICAgIHN0eWxlcy5jb2x1bW5TdHlsZXNbY29sdW1uLmluZGV4XSB8fFxuICAgICAgICB7fTtcbiAgICB2YXIgY29sU3R5bGVzID0gc2VjdGlvbk5hbWUgPT09ICdib2R5JyA/IGNvbHVtblN0eWxlcyA6IHt9O1xuICAgIHZhciByb3dTdHlsZXMgPSBzZWN0aW9uTmFtZSA9PT0gJ2JvZHknICYmIHJvd0luZGV4ICUgMiA9PT0gMFxuICAgICAgICA/IGFzc2lnbih7fSwgdGhlbWUuYWx0ZXJuYXRlUm93LCBzdHlsZXMuYWx0ZXJuYXRlUm93U3R5bGVzKVxuICAgICAgICA6IHt9O1xuICAgIHZhciBkZWZhdWx0U3R5bGUgPSBkZWZhdWx0U3R5bGVzKHNjYWxlRmFjdG9yKTtcbiAgICB2YXIgdGhlbWVTdHlsZXMgPSBhc3NpZ24oe30sIGRlZmF1bHRTdHlsZSwgb3RoZXJTdHlsZXMsIHJvd1N0eWxlcywgY29sU3R5bGVzKTtcbiAgICByZXR1cm4gYXNzaWduKHRoZW1lU3R5bGVzLCBjZWxsSW5wdXRTdHlsZXMpO1xufVxuXG4vLyBnZXQgY29sdW1ucyBjYW4gYmUgZml0IGludG8gcGFnZVxuZnVuY3Rpb24gZ2V0Q29sdW1uc0NhbkZpdEluUGFnZShkb2MsIHRhYmxlLCBjb25maWcpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9XG4gICAgLy8gR2V0IHBhZ2Ugd2lkdGhcbiAgICB2YXIgcmVtYWluaW5nV2lkdGggPSBnZXRQYWdlQXZhaWxhYmxlV2lkdGgoZG9jLCB0YWJsZSk7XG4gICAgLy8gR2V0IGNvbHVtbiBkYXRhIGtleSB0byByZXBlYXRcbiAgICB2YXIgcmVwZWF0Q29sdW1uc01hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgY29sSW5kZXhlcyA9IFtdO1xuICAgIHZhciBjb2x1bW5zID0gW107XG4gICAgdmFyIGhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQgPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWJsZS5zZXR0aW5ncy5ob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0KSkge1xuICAgICAgICBob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0ID0gdGFibGUuc2V0dGluZ3MuaG9yaXpvbnRhbFBhZ2VCcmVha1JlcGVhdDtcbiAgICAgICAgLy8gSXQgY2FuIGJlIGEgc2luZ2xlIHZhbHVlIG9mIHR5cGUgc3RyaW5nIG9yIG51bWJlciAoZXZlbiBudW1iZXI6IDApXG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB0YWJsZS5zZXR0aW5ncy5ob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgdGFibGUuc2V0dGluZ3MuaG9yaXpvbnRhbFBhZ2VCcmVha1JlcGVhdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaG9yaXpvbnRhbFBhZ2VCcmVha1JlcGVhdCA9IFt0YWJsZS5zZXR0aW5ncy5ob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0XTtcbiAgICB9XG4gICAgLy8gQ29kZSB0byByZXBlYXQgdGhlIGdpdmVuIGNvbHVtbiBpbiBzcGxpdCBwYWdlc1xuICAgIGhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIGNvbCA9IHRhYmxlLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gaXRlbS5kYXRhS2V5ID09PSBmaWVsZCB8fCBpdGVtLmluZGV4ID09PSBmaWVsZDsgfSk7XG4gICAgICAgIGlmIChjb2wgJiYgIXJlcGVhdENvbHVtbnNNYXAuaGFzKGNvbC5pbmRleCkpIHtcbiAgICAgICAgICAgIHJlcGVhdENvbHVtbnNNYXAuc2V0KGNvbC5pbmRleCwgdHJ1ZSk7XG4gICAgICAgICAgICBjb2xJbmRleGVzLnB1c2goY29sLmluZGV4KTtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaCh0YWJsZS5jb2x1bW5zW2NvbC5pbmRleF0pO1xuICAgICAgICAgICAgcmVtYWluaW5nV2lkdGggLT0gY29sLndyYXBwZWRXaWR0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBmaXJzdCA9IHRydWU7XG4gICAgdmFyIGkgPSAoX2EgPSBjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuc3RhcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7IC8vIG1ha2Ugc3VyZSBjb3V0ZXIgaXMgaW5pdGlhdGVkIG91dHNpZGUgdGhlIGxvb3BcbiAgICB3aGlsZSAoaSA8IHRhYmxlLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFByZXZlbnQgZHVwbGljYXRlc1xuICAgICAgICBpZiAocmVwZWF0Q29sdW1uc01hcC5oYXMoaSkpIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb2xXaWR0aCA9IHRhYmxlLmNvbHVtbnNbaV0ud3JhcHBlZFdpZHRoO1xuICAgICAgICAvLyBUYWtlIGF0IGxlYXN0IG9uZSBjb2x1bW4gZXZlbiBpZiBpdCBkb2Vzbid0IGZpdFxuICAgICAgICBpZiAoZmlyc3QgfHwgcmVtYWluaW5nV2lkdGggPj0gY29sV2lkdGgpIHtcbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb2xJbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgICBjb2x1bW5zLnB1c2godGFibGUuY29sdW1uc1tpXSk7XG4gICAgICAgICAgICByZW1haW5pbmdXaWR0aCAtPSBjb2xXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIHsgY29sSW5kZXhlczogY29sSW5kZXhlcywgY29sdW1uczogY29sdW1ucywgbGFzdEluZGV4OiBpIC0gMSB9O1xufVxuZnVuY3Rpb24gY2FsY3VsYXRlQWxsQ29sdW1uc0NhbkZpdEluUGFnZShkb2MsIHRhYmxlKSB7XG4gICAgdmFyIGFsbFJlc3VsdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGdldENvbHVtbnNDYW5GaXRJblBhZ2UoZG9jLCB0YWJsZSwgeyBzdGFydDogaSB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWxsUmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICBpID0gcmVzdWx0Lmxhc3RJbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbn1cblxuZnVuY3Rpb24gZHJhd1RhYmxlKGpzUERGRG9jLCB0YWJsZSkge1xuICAgIHZhciBzZXR0aW5ncyA9IHRhYmxlLnNldHRpbmdzO1xuICAgIHZhciBzdGFydFkgPSBzZXR0aW5ncy5zdGFydFk7XG4gICAgdmFyIG1hcmdpbiA9IHNldHRpbmdzLm1hcmdpbjtcbiAgICB2YXIgY3Vyc29yID0geyB4OiBtYXJnaW4ubGVmdCwgeTogc3RhcnRZIH07XG4gICAgdmFyIHNlY3Rpb25zSGVpZ2h0ID0gdGFibGUuZ2V0SGVhZEhlaWdodCh0YWJsZS5jb2x1bW5zKSArIHRhYmxlLmdldEZvb3RIZWlnaHQodGFibGUuY29sdW1ucyk7XG4gICAgdmFyIG1pblRhYmxlQm90dG9tUG9zID0gc3RhcnRZICsgbWFyZ2luLmJvdHRvbSArIHNlY3Rpb25zSGVpZ2h0O1xuICAgIGlmIChzZXR0aW5ncy5wYWdlQnJlYWsgPT09ICdhdm9pZCcpIHtcbiAgICAgICAgdmFyIHJvd3MgPSB0YWJsZS5ib2R5O1xuICAgICAgICB2YXIgdGFibGVIZWlnaHQgPSByb3dzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCByb3cpIHsgcmV0dXJuIGFjYyArIHJvdy5oZWlnaHQ7IH0sIDApO1xuICAgICAgICBtaW5UYWJsZUJvdHRvbVBvcyArPSB0YWJsZUhlaWdodDtcbiAgICB9XG4gICAgdmFyIGRvYyA9IG5ldyBEb2NIYW5kbGVyKGpzUERGRG9jKTtcbiAgICBpZiAoc2V0dGluZ3MucGFnZUJyZWFrID09PSAnYWx3YXlzJyB8fFxuICAgICAgICAoc2V0dGluZ3Muc3RhcnRZICE9IG51bGwgJiYgbWluVGFibGVCb3R0b21Qb3MgPiBkb2MucGFnZVNpemUoKS5oZWlnaHQpKSB7XG4gICAgICAgIG5leHRQYWdlKGRvYyk7XG4gICAgICAgIGN1cnNvci55ID0gbWFyZ2luLnRvcDtcbiAgICB9XG4gICAgdGFibGUuY2FsbFdpbGxEcmF3UGFnZUhvb2tzKGRvYywgY3Vyc29yKTtcbiAgICB2YXIgc3RhcnRQb3MgPSBhc3NpZ24oe30sIGN1cnNvcik7XG4gICAgdGFibGUuc3RhcnRQYWdlTnVtYmVyID0gZG9jLnBhZ2VOdW1iZXIoKTtcbiAgICBpZiAoc2V0dGluZ3MuaG9yaXpvbnRhbFBhZ2VCcmVhaykge1xuICAgICAgICAvLyBtYW5hZ2VkIGZsb3cgZm9yIHNwbGl0IGNvbHVtbnNcbiAgICAgICAgcHJpbnRUYWJsZVdpdGhIb3Jpem9udGFsUGFnZUJyZWFrKGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gbm9ybWFsIGZsb3dcbiAgICAgICAgZG9jLmFwcGx5U3R5bGVzKGRvYy51c2VyU3R5bGVzKTtcbiAgICAgICAgaWYgKHNldHRpbmdzLnNob3dIZWFkID09PSAnZmlyc3RQYWdlJyB8fFxuICAgICAgICAgICAgc2V0dGluZ3Muc2hvd0hlYWQgPT09ICdldmVyeVBhZ2UnKSB7XG4gICAgICAgICAgICB0YWJsZS5oZWFkLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmludFJvdyhkb2MsIHRhYmxlLCByb3csIGN1cnNvciwgdGFibGUuY29sdW1ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgICAgICB0YWJsZS5ib2R5LmZvckVhY2goZnVuY3Rpb24gKHJvdywgaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBpc0xhc3RSb3cgPSBpbmRleCA9PT0gdGFibGUuYm9keS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgcHJpbnRGdWxsUm93KGRvYywgdGFibGUsIHJvdywgaXNMYXN0Um93LCBzdGFydFBvcywgY3Vyc29yLCB0YWJsZS5jb2x1bW5zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRvYy5hcHBseVN0eWxlcyhkb2MudXNlclN0eWxlcyk7XG4gICAgICAgIGlmIChzZXR0aW5ncy5zaG93Rm9vdCA9PT0gJ2xhc3RQYWdlJyB8fCBzZXR0aW5ncy5zaG93Rm9vdCA9PT0gJ2V2ZXJ5UGFnZScpIHtcbiAgICAgICAgICAgIHRhYmxlLmZvb3QuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCB0YWJsZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZFRhYmxlQm9yZGVyKGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IpO1xuICAgIHRhYmxlLmNhbGxFbmRQYWdlSG9va3MoZG9jLCBjdXJzb3IpO1xuICAgIHRhYmxlLmZpbmFsWSA9IGN1cnNvci55O1xuICAgIGpzUERGRG9jLmxhc3RBdXRvVGFibGUgPSB0YWJsZTtcbiAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xufVxuZnVuY3Rpb24gcHJpbnRUYWJsZVdpdGhIb3Jpem9udGFsUGFnZUJyZWFrKGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IpIHtcbiAgICAvLyBjYWxjdWxhdGUgd2lkdGggb2YgY29sdW1ucyBhbmQgcmVuZGVyIG9ubHkgdGhvc2Ugd2hpY2ggY2FuIGZpdCBpbnRvIHBhZ2VcbiAgICB2YXIgYWxsQ29sdW1uc0NhbkZpdFJlc3VsdCA9IGNhbGN1bGF0ZUFsbENvbHVtbnNDYW5GaXRJblBhZ2UoZG9jLCB0YWJsZSk7XG4gICAgdmFyIHNldHRpbmdzID0gdGFibGUuc2V0dGluZ3M7XG4gICAgaWYgKHNldHRpbmdzLmhvcml6b250YWxQYWdlQnJlYWtCZWhhdmlvdXIgPT09ICdhZnRlckFsbFJvd3MnKSB7XG4gICAgICAgIGFsbENvbHVtbnNDYW5GaXRSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAoY29sc0FuZEluZGV4ZXMsIGluZGV4KSB7XG4gICAgICAgICAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgICAgICAgICAgLy8gYWRkIHBhZ2UgdG8gcHJpbnQgbmV4dCBjb2x1bW5zIGluIG5ldyBwYWdlXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBhZGRpbmcgYSBwYWdlIGhlcmUsIG1ha2Ugc3VyZSBub3QgdG8gcHJpbnQgdGhlIGZvb3RlcnNcbiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgd2VyZSBhbHJlYWR5IHByaW50ZWQgYmVmb3JlIG9uIHRoaXMgc2FtZSBsb29wXG4gICAgICAgICAgICAgICAgYWRkUGFnZShkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yLCBjb2xzQW5kSW5kZXhlcy5jb2x1bW5zLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHByaW50IGhlYWQgZm9yIHNlbGVjdGVkIGNvbHVtbnNcbiAgICAgICAgICAgICAgICBwcmludEhlYWQoZG9jLCB0YWJsZSwgY3Vyc29yLCBjb2xzQW5kSW5kZXhlcy5jb2x1bW5zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHByaW50IGJvZHkgJiBmb290ZXIgZm9yIHNlbGVjdGVkIGNvbHVtbnNcbiAgICAgICAgICAgIHByaW50Qm9keShkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yLCBjb2xzQW5kSW5kZXhlcy5jb2x1bW5zKTtcbiAgICAgICAgICAgIHByaW50Rm9vdChkb2MsIHRhYmxlLCBjdXJzb3IsIGNvbHNBbmRJbmRleGVzLmNvbHVtbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBsYXN0Um93SW5kZXhPZkxhc3RQYWdlXzEgPSAtMTtcbiAgICAgICAgdmFyIGZpcnN0Q29sdW1uc1RvRml0UmVzdWx0ID0gYWxsQ29sdW1uc0NhbkZpdFJlc3VsdFswXTtcbiAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBQcmludCB0aGUgZmlyc3QgY29sdW1ucywgdGFraW5nIG5vdGUgb2YgdGhlIGxhc3Qgcm93IHByaW50ZWRcbiAgICAgICAgICAgIHZhciBsYXN0UHJpbnRlZFJvd0luZGV4ID0gbGFzdFJvd0luZGV4T2ZMYXN0UGFnZV8xO1xuICAgICAgICAgICAgaWYgKGZpcnN0Q29sdW1uc1RvRml0UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgZG9jLmFwcGx5U3R5bGVzKGRvYy51c2VyU3R5bGVzKTtcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RDb2x1bW5zVG9GaXQgPSBmaXJzdENvbHVtbnNUb0ZpdFJlc3VsdC5jb2x1bW5zO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0Um93SW5kZXhPZkxhc3RQYWdlXzEgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGFkZGluZyBhIHBhZ2UgaGVyZSwgbWFrZSBzdXJlIG5vdCB0byBwcmludCB0aGUgZm9vdGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgd2VyZSBhbHJlYWR5IHByaW50ZWQgYmVmb3JlIG9uIHRoaXMgc2FtZSBsb29wXG4gICAgICAgICAgICAgICAgICAgIGFkZFBhZ2UoZG9jLCB0YWJsZSwgc3RhcnRQb3MsIGN1cnNvciwgZmlyc3RDb2x1bW5zVG9GaXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbnRIZWFkKGRvYywgdGFibGUsIGN1cnNvciwgZmlyc3RDb2x1bW5zVG9GaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0UHJpbnRlZFJvd0luZGV4ID0gcHJpbnRCb2R5V2l0aG91dFBhZ2VCcmVha3MoZG9jLCB0YWJsZSwgbGFzdFJvd0luZGV4T2ZMYXN0UGFnZV8xICsgMSwgY3Vyc29yLCBmaXJzdENvbHVtbnNUb0ZpdCk7XG4gICAgICAgICAgICAgICAgcHJpbnRGb290KGRvYywgdGFibGUsIGN1cnNvciwgZmlyc3RDb2x1bW5zVG9GaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgaG93IG1hbnkgcm93cyB3ZXJlIHByaW50ZWQsIHNvIHRoYXQgdGhlIG5leHQgY29sdW1ucyB3b3VsZCBub3QgcHJpbnQgbW9yZSByb3dzIHRoYW4gdGhhdFxuICAgICAgICAgICAgdmFyIG1heE51bWJlck9mUm93cyA9IGxhc3RQcmludGVkUm93SW5kZXggLSBsYXN0Um93SW5kZXhPZkxhc3RQYWdlXzE7XG4gICAgICAgICAgICAvLyBQcmludCB0aGUgbmV4dCBjb2x1bW5zLCBuZXZlciBleGNlZGluZyBtYXhOdW1iZXJPZlJvd3NcbiAgICAgICAgICAgIGFsbENvbHVtbnNDYW5GaXRSZXN1bHQuc2xpY2UoMSkuZm9yRWFjaChmdW5jdGlvbiAoY29sc0FuZEluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYWRkaW5nIGEgcGFnZSBoZXJlLCBtYWtlIHN1cmUgbm90IHRvIHByaW50IHRoZSBmb290ZXJzXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IHdlcmUgYWxyZWFkeSBwcmludGVkIGJlZm9yZSBvbiB0aGlzIHNhbWUgbG9vcFxuICAgICAgICAgICAgICAgIGFkZFBhZ2UoZG9jLCB0YWJsZSwgc3RhcnRQb3MsIGN1cnNvciwgY29sc0FuZEluZGV4ZXMuY29sdW1ucywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcHJpbnRCb2R5V2l0aG91dFBhZ2VCcmVha3MoZG9jLCB0YWJsZSwgbGFzdFJvd0luZGV4T2ZMYXN0UGFnZV8xICsgMSwgY3Vyc29yLCBjb2xzQW5kSW5kZXhlcy5jb2x1bW5zLCBtYXhOdW1iZXJPZlJvd3MpO1xuICAgICAgICAgICAgICAgIHByaW50Rm9vdChkb2MsIHRhYmxlLCBjdXJzb3IsIGNvbHNBbmRJbmRleGVzLmNvbHVtbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsYXN0Um93SW5kZXhPZkxhc3RQYWdlXzEgPSBsYXN0UHJpbnRlZFJvd0luZGV4O1xuICAgICAgICB9O1xuICAgICAgICB3aGlsZSAobGFzdFJvd0luZGV4T2ZMYXN0UGFnZV8xIDwgdGFibGUuYm9keS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBfbG9vcF8xKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwcmludEhlYWQoZG9jLCB0YWJsZSwgY3Vyc29yLCBjb2x1bW5zKSB7XG4gICAgdmFyIHNldHRpbmdzID0gdGFibGUuc2V0dGluZ3M7XG4gICAgZG9jLmFwcGx5U3R5bGVzKGRvYy51c2VyU3R5bGVzKTtcbiAgICBpZiAoc2V0dGluZ3Muc2hvd0hlYWQgPT09ICdmaXJzdFBhZ2UnIHx8IHNldHRpbmdzLnNob3dIZWFkID09PSAnZXZlcnlQYWdlJykge1xuICAgICAgICB0YWJsZS5oZWFkLmZvckVhY2goZnVuY3Rpb24gKHJvdykgeyByZXR1cm4gcHJpbnRSb3coZG9jLCB0YWJsZSwgcm93LCBjdXJzb3IsIGNvbHVtbnMpOyB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBwcmludEJvZHkoZG9jLCB0YWJsZSwgc3RhcnRQb3MsIGN1cnNvciwgY29sdW1ucykge1xuICAgIGRvYy5hcHBseVN0eWxlcyhkb2MudXNlclN0eWxlcyk7XG4gICAgdGFibGUuYm9keS5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGluZGV4KSB7XG4gICAgICAgIHZhciBpc0xhc3RSb3cgPSBpbmRleCA9PT0gdGFibGUuYm9keS5sZW5ndGggLSAxO1xuICAgICAgICBwcmludEZ1bGxSb3coZG9jLCB0YWJsZSwgcm93LCBpc0xhc3RSb3csIHN0YXJ0UG9zLCBjdXJzb3IsIGNvbHVtbnMpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcHJpbnRCb2R5V2l0aG91dFBhZ2VCcmVha3MoZG9jLCB0YWJsZSwgc3RhcnRSb3dJbmRleCwgY3Vyc29yLCBjb2x1bW5zLCBtYXhOdW1iZXJPZlJvd3MpIHtcbiAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgIG1heE51bWJlck9mUm93cyA9IG1heE51bWJlck9mUm93cyAhPT0gbnVsbCAmJiBtYXhOdW1iZXJPZlJvd3MgIT09IHZvaWQgMCA/IG1heE51bWJlck9mUm93cyA6IHRhYmxlLmJvZHkubGVuZ3RoO1xuICAgIHZhciBlbmRSb3dJbmRleCA9IE1hdGgubWluKHN0YXJ0Um93SW5kZXggKyBtYXhOdW1iZXJPZlJvd3MsIHRhYmxlLmJvZHkubGVuZ3RoKTtcbiAgICB2YXIgbGFzdFByaW50ZWRSb3dJbmRleCA9IC0xO1xuICAgIHZhciByb3dzID0gdGFibGUuYm9keS5zbGljZShzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHJvd3MubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciByb3cgPSByb3dzW2luZGV4XTtcbiAgICAgICAgdmFyIGlzTGFzdFJvdyA9IHN0YXJ0Um93SW5kZXggKyBpbmRleCA9PT0gdGFibGUuYm9keS5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgcmVtYWluaW5nU3BhY2UgPSBnZXRSZW1haW5pbmdQYWdlU3BhY2UoZG9jLCB0YWJsZSwgaXNMYXN0Um93LCBjdXJzb3IpO1xuICAgICAgICBpZiAocm93LmNhbkVudGlyZVJvd0ZpdChyZW1haW5pbmdTcGFjZSwgY29sdW1ucykpIHtcbiAgICAgICAgICAgIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCBjb2x1bW5zKTtcbiAgICAgICAgICAgIGxhc3RQcmludGVkUm93SW5kZXggPSBzdGFydFJvd0luZGV4ICsgaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGFzdFByaW50ZWRSb3dJbmRleDtcbn1cbmZ1bmN0aW9uIHByaW50Rm9vdChkb2MsIHRhYmxlLCBjdXJzb3IsIGNvbHVtbnMpIHtcbiAgICB2YXIgc2V0dGluZ3MgPSB0YWJsZS5zZXR0aW5ncztcbiAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgIGlmIChzZXR0aW5ncy5zaG93Rm9vdCA9PT0gJ2xhc3RQYWdlJyB8fCBzZXR0aW5ncy5zaG93Rm9vdCA9PT0gJ2V2ZXJ5UGFnZScpIHtcbiAgICAgICAgdGFibGUuZm9vdC5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCBjb2x1bW5zKTsgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nTGluZUNvdW50KGNlbGwsIHJlbWFpbmluZ1BhZ2VTcGFjZSwgZG9jKSB7XG4gICAgdmFyIGxpbmVIZWlnaHQgPSBkb2MuZ2V0TGluZUhlaWdodChjZWxsLnN0eWxlcy5mb250U2l6ZSk7XG4gICAgdmFyIHZQYWRkaW5nID0gY2VsbC5wYWRkaW5nKCd2ZXJ0aWNhbCcpO1xuICAgIHZhciByZW1haW5pbmdMaW5lcyA9IE1hdGguZmxvb3IoKHJlbWFpbmluZ1BhZ2VTcGFjZSAtIHZQYWRkaW5nKSAvIGxpbmVIZWlnaHQpO1xuICAgIHJldHVybiBNYXRoLm1heCgwLCByZW1haW5pbmdMaW5lcyk7XG59XG5mdW5jdGlvbiBtb2RpZnlSb3dUb0ZpdChyb3csIHJlbWFpbmluZ1BhZ2VTcGFjZSwgdGFibGUsIGRvYykge1xuICAgIHZhciBjZWxscyA9IHt9O1xuICAgIHJvdy5zcGFuc011bHRpcGxlUGFnZXMgPSB0cnVlO1xuICAgIHJvdy5oZWlnaHQgPSAwO1xuICAgIHZhciByb3dIZWlnaHQgPSAwO1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0YWJsZS5jb2x1bW5zOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgY29sdW1uID0gX2FbX2ldO1xuICAgICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICBpZiAoIWNlbGwpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNlbGwudGV4dCkpIHtcbiAgICAgICAgICAgIGNlbGwudGV4dCA9IFtjZWxsLnRleHRdO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZW1haW5kZXJDZWxsID0gbmV3IENlbGwoY2VsbC5yYXcsIGNlbGwuc3R5bGVzLCBjZWxsLnNlY3Rpb24pO1xuICAgICAgICByZW1haW5kZXJDZWxsID0gYXNzaWduKHJlbWFpbmRlckNlbGwsIGNlbGwpO1xuICAgICAgICByZW1haW5kZXJDZWxsLnRleHQgPSBbXTtcbiAgICAgICAgdmFyIHJlbWFpbmluZ0xpbmVDb3VudCA9IGdldFJlbWFpbmluZ0xpbmVDb3VudChjZWxsLCByZW1haW5pbmdQYWdlU3BhY2UsIGRvYyk7XG4gICAgICAgIGlmIChjZWxsLnRleHQubGVuZ3RoID4gcmVtYWluaW5nTGluZUNvdW50KSB7XG4gICAgICAgICAgICByZW1haW5kZXJDZWxsLnRleHQgPSBjZWxsLnRleHQuc3BsaWNlKHJlbWFpbmluZ0xpbmVDb3VudCwgY2VsbC50ZXh0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjYWxlRmFjdG9yID0gZG9jLnNjYWxlRmFjdG9yKCk7XG4gICAgICAgIHZhciBsaW5lSGVpZ2h0RmFjdG9yID0gZG9jLmdldExpbmVIZWlnaHRGYWN0b3IoKTtcbiAgICAgICAgY2VsbC5jb250ZW50SGVpZ2h0ID0gY2VsbC5nZXRDb250ZW50SGVpZ2h0KHNjYWxlRmFjdG9yLCBsaW5lSGVpZ2h0RmFjdG9yKTtcbiAgICAgICAgaWYgKGNlbGwuY29udGVudEhlaWdodCA+PSByZW1haW5pbmdQYWdlU3BhY2UpIHtcbiAgICAgICAgICAgIGNlbGwuY29udGVudEhlaWdodCA9IHJlbWFpbmluZ1BhZ2VTcGFjZTtcbiAgICAgICAgICAgIHJlbWFpbmRlckNlbGwuc3R5bGVzLm1pbkNlbGxIZWlnaHQgLT0gcmVtYWluaW5nUGFnZVNwYWNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjZWxsLmNvbnRlbnRIZWlnaHQgPiByb3cuaGVpZ2h0KSB7XG4gICAgICAgICAgICByb3cuaGVpZ2h0ID0gY2VsbC5jb250ZW50SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJlbWFpbmRlckNlbGwuY29udGVudEhlaWdodCA9IHJlbWFpbmRlckNlbGwuZ2V0Q29udGVudEhlaWdodChzY2FsZUZhY3RvciwgbGluZUhlaWdodEZhY3Rvcik7XG4gICAgICAgIGlmIChyZW1haW5kZXJDZWxsLmNvbnRlbnRIZWlnaHQgPiByb3dIZWlnaHQpIHtcbiAgICAgICAgICAgIHJvd0hlaWdodCA9IHJlbWFpbmRlckNlbGwuY29udGVudEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjZWxsc1tjb2x1bW4uaW5kZXhdID0gcmVtYWluZGVyQ2VsbDtcbiAgICB9XG4gICAgdmFyIHJlbWFpbmRlclJvdyA9IG5ldyBSb3cocm93LnJhdywgLTEsIHJvdy5zZWN0aW9uLCBjZWxscywgdHJ1ZSk7XG4gICAgcmVtYWluZGVyUm93LmhlaWdodCA9IHJvd0hlaWdodDtcbiAgICBmb3IgKHZhciBfYiA9IDAsIF9jID0gdGFibGUuY29sdW1uczsgX2IgPCBfYy5sZW5ndGg7IF9iKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IF9jW19iXTtcbiAgICAgICAgdmFyIHJlbWFpbmRlckNlbGwgPSByZW1haW5kZXJSb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgaWYgKHJlbWFpbmRlckNlbGwpIHtcbiAgICAgICAgICAgIHJlbWFpbmRlckNlbGwuaGVpZ2h0ID0gcmVtYWluZGVyUm93LmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgY2VsbC5oZWlnaHQgPSByb3cuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZW1haW5kZXJSb3c7XG59XG5mdW5jdGlvbiBzaG91bGRQcmludE9uQ3VycmVudFBhZ2UoZG9jLCByb3csIHJlbWFpbmluZ1BhZ2VTcGFjZSwgdGFibGUpIHtcbiAgICB2YXIgcGFnZUhlaWdodCA9IGRvYy5wYWdlU2l6ZSgpLmhlaWdodDtcbiAgICB2YXIgbWFyZ2luID0gdGFibGUuc2V0dGluZ3MubWFyZ2luO1xuICAgIHZhciBtYXJnaW5IZWlnaHQgPSBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbTtcbiAgICB2YXIgbWF4Um93SGVpZ2h0ID0gcGFnZUhlaWdodCAtIG1hcmdpbkhlaWdodDtcbiAgICBpZiAocm93LnNlY3Rpb24gPT09ICdib2R5Jykge1xuICAgICAgICAvLyBTaG91bGQgYWxzbyB0YWtlIGludG8gYWNjb3VudCB0aGF0IGhlYWQgYW5kIGZvb3QgaXMgbm90XG4gICAgICAgIC8vIG9uIGV2ZXJ5IHBhZ2Ugd2l0aCBzb21lIHNldHRpbmdzXG4gICAgICAgIG1heFJvd0hlaWdodCAtPVxuICAgICAgICAgICAgdGFibGUuZ2V0SGVhZEhlaWdodCh0YWJsZS5jb2x1bW5zKSArIHRhYmxlLmdldEZvb3RIZWlnaHQodGFibGUuY29sdW1ucyk7XG4gICAgfVxuICAgIHZhciBtaW5Sb3dIZWlnaHQgPSByb3cuZ2V0TWluaW11bVJvd0hlaWdodCh0YWJsZS5jb2x1bW5zLCBkb2MpO1xuICAgIHZhciBtaW5Sb3dGaXRzID0gbWluUm93SGVpZ2h0IDwgcmVtYWluaW5nUGFnZVNwYWNlO1xuICAgIGlmIChtaW5Sb3dIZWlnaHQgPiBtYXhSb3dIZWlnaHQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJXaWxsIG5vdCBiZSBhYmxlIHRvIHByaW50IHJvdyBcIi5jb25jYXQocm93LmluZGV4LCBcIiBjb3JyZWN0bHkgc2luY2UgaXQncyBtaW5pbXVtIGhlaWdodCBpcyBsYXJnZXIgdGhhbiBwYWdlIGhlaWdodFwiKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW1pblJvd0ZpdHMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgcm93SGFzUm93U3BhbkNlbGwgPSByb3cuaGFzUm93U3Bhbih0YWJsZS5jb2x1bW5zKTtcbiAgICB2YXIgcm93SGlnaGVyVGhhblBhZ2UgPSByb3cuZ2V0TWF4Q2VsbEhlaWdodCh0YWJsZS5jb2x1bW5zKSA+IG1heFJvd0hlaWdodDtcbiAgICBpZiAocm93SGlnaGVyVGhhblBhZ2UpIHtcbiAgICAgICAgaWYgKHJvd0hhc1Jvd1NwYW5DZWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoZSBjb250ZW50IG9mIHJvdyBcIi5jb25jYXQocm93LmluZGV4LCBcIiB3aWxsIG5vdCBiZSBkcmF3biBjb3JyZWN0bHkgc2luY2UgZHJhd2luZyByb3dzIHdpdGggYSBoZWlnaHQgbGFyZ2VyIHRoYW4gdGhlIHBhZ2UgaGVpZ2h0IGFuZCBoYXMgY2VsbHMgd2l0aCByb3dzcGFucyBpcyBub3Qgc3VwcG9ydGVkLlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChyb3dIYXNSb3dTcGFuQ2VsbCkge1xuICAgICAgICAvLyBDdXJyZW50bHkgYSBuZXcgcGFnZSBpcyByZXF1aXJlZCB3aGVuZXZlciBhIHJvd3NwYW4gcm93IGRvbid0IGZpdCBhIHBhZ2UuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRhYmxlLnNldHRpbmdzLnJvd1BhZ2VCcmVhayA9PT0gJ2F2b2lkJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEluIGFsbCBvdGhlciBjYXNlcyBwcmludCB0aGUgcm93IG9uIGN1cnJlbnQgcGFnZVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcHJpbnRGdWxsUm93KGRvYywgdGFibGUsIHJvdywgaXNMYXN0Um93LCBzdGFydFBvcywgY3Vyc29yLCBjb2x1bW5zKSB7XG4gICAgdmFyIHJlbWFpbmluZ1NwYWNlID0gZ2V0UmVtYWluaW5nUGFnZVNwYWNlKGRvYywgdGFibGUsIGlzTGFzdFJvdywgY3Vyc29yKTtcbiAgICBpZiAocm93LmNhbkVudGlyZVJvd0ZpdChyZW1haW5pbmdTcGFjZSwgY29sdW1ucykpIHtcbiAgICAgICAgLy8gVGhlIHJvdyBmaXRzIGluIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgcHJpbnRSb3coZG9jLCB0YWJsZSwgcm93LCBjdXJzb3IsIGNvbHVtbnMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzaG91bGRQcmludE9uQ3VycmVudFBhZ2UoZG9jLCByb3csIHJlbWFpbmluZ1NwYWNlLCB0YWJsZSkpIHtcbiAgICAgICAgLy8gVGhlIHJvdyBnZXRzIHNwbGl0IGluIHR3byBoZXJlLCBlYWNoIHBpZWNlIGluIG9uZSBwYWdlXG4gICAgICAgIHZhciByZW1haW5kZXJSb3cgPSBtb2RpZnlSb3dUb0ZpdChyb3csIHJlbWFpbmluZ1NwYWNlLCB0YWJsZSwgZG9jKTtcbiAgICAgICAgcHJpbnRSb3coZG9jLCB0YWJsZSwgcm93LCBjdXJzb3IsIGNvbHVtbnMpO1xuICAgICAgICBhZGRQYWdlKGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IsIGNvbHVtbnMpO1xuICAgICAgICBwcmludEZ1bGxSb3coZG9jLCB0YWJsZSwgcmVtYWluZGVyUm93LCBpc0xhc3RSb3csIHN0YXJ0UG9zLCBjdXJzb3IsIGNvbHVtbnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gVGhlIHJvdyBnZXQgcHJpbnRlZCBlbnRpcmVsbHkgb24gdGhlIG5leHQgcGFnZVxuICAgICAgICBhZGRQYWdlKGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IsIGNvbHVtbnMpO1xuICAgICAgICBwcmludEZ1bGxSb3coZG9jLCB0YWJsZSwgcm93LCBpc0xhc3RSb3csIHN0YXJ0UG9zLCBjdXJzb3IsIGNvbHVtbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCBjb2x1bW5zKSB7XG4gICAgY3Vyc29yLnggPSB0YWJsZS5zZXR0aW5ncy5tYXJnaW4ubGVmdDtcbiAgICBmb3IgKHZhciBfaSA9IDAsIGNvbHVtbnNfMSA9IGNvbHVtbnM7IF9pIDwgY29sdW1uc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgY29sdW1uID0gY29sdW1uc18xW19pXTtcbiAgICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICBjdXJzb3IueCArPSBjb2x1bW4ud2lkdGg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBkb2MuYXBwbHlTdHlsZXMoY2VsbC5zdHlsZXMpO1xuICAgICAgICBjZWxsLnggPSBjdXJzb3IueDtcbiAgICAgICAgY2VsbC55ID0gY3Vyc29yLnk7XG4gICAgICAgIHZhciByZXN1bHQgPSB0YWJsZS5jYWxsQ2VsbEhvb2tzKGRvYywgdGFibGUuaG9va3Mud2lsbERyYXdDZWxsLCBjZWxsLCByb3csIGNvbHVtbiwgY3Vyc29yKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGN1cnNvci54ICs9IGNvbHVtbi53aWR0aDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRyYXdDZWxsUmVjdChkb2MsIGNlbGwsIGN1cnNvcik7XG4gICAgICAgIHZhciB0ZXh0UG9zID0gY2VsbC5nZXRUZXh0UG9zKCk7XG4gICAgICAgIGF1dG9UYWJsZVRleHQoY2VsbC50ZXh0LCB0ZXh0UG9zLngsIHRleHRQb3MueSwge1xuICAgICAgICAgICAgaGFsaWduOiBjZWxsLnN0eWxlcy5oYWxpZ24sXG4gICAgICAgICAgICB2YWxpZ246IGNlbGwuc3R5bGVzLnZhbGlnbixcbiAgICAgICAgICAgIG1heFdpZHRoOiBNYXRoLmNlaWwoY2VsbC53aWR0aCAtIGNlbGwucGFkZGluZygnbGVmdCcpIC0gY2VsbC5wYWRkaW5nKCdyaWdodCcpKSxcbiAgICAgICAgfSwgZG9jLmdldERvY3VtZW50KCkpO1xuICAgICAgICB0YWJsZS5jYWxsQ2VsbEhvb2tzKGRvYywgdGFibGUuaG9va3MuZGlkRHJhd0NlbGwsIGNlbGwsIHJvdywgY29sdW1uLCBjdXJzb3IpO1xuICAgICAgICBjdXJzb3IueCArPSBjb2x1bW4ud2lkdGg7XG4gICAgfVxuICAgIGN1cnNvci55ICs9IHJvdy5oZWlnaHQ7XG59XG5mdW5jdGlvbiBkcmF3Q2VsbFJlY3QoZG9jLCBjZWxsLCBjdXJzb3IpIHtcbiAgICB2YXIgY2VsbFN0eWxlcyA9IGNlbGwuc3R5bGVzO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1vbmJlbmd0c3Nvbi9qc1BERi1BdXRvVGFibGUvaXNzdWVzLzc3NFxuICAgIC8vIFRPRE8gKHY0KTogYmV0dGVyIHNvbHV0aW9uP1xuICAgIGRvYy5nZXREb2N1bWVudCgpLnNldEZpbGxDb2xvcihkb2MuZ2V0RG9jdW1lbnQoKS5nZXRGaWxsQ29sb3IoKSk7XG4gICAgaWYgKHR5cGVvZiBjZWxsU3R5bGVzLmxpbmVXaWR0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gRHJhdyBjZWxsIGJhY2tncm91bmQgd2l0aCBub3JtYWwgYm9yZGVyc1xuICAgICAgICB2YXIgZmlsbFN0eWxlID0gZ2V0RmlsbFN0eWxlKGNlbGxTdHlsZXMubGluZVdpZHRoLCBjZWxsU3R5bGVzLmZpbGxDb2xvcik7XG4gICAgICAgIGlmIChmaWxsU3R5bGUpIHtcbiAgICAgICAgICAgIGRvYy5yZWN0KGNlbGwueCwgY3Vyc29yLnksIGNlbGwud2lkdGgsIGNlbGwuaGVpZ2h0LCBmaWxsU3R5bGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBjZWxsU3R5bGVzLmxpbmVXaWR0aCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gRHJhdyBjZWxsIGJhY2tncm91bmRcbiAgICAgICAgaWYgKGNlbGxTdHlsZXMuZmlsbENvbG9yKSB7XG4gICAgICAgICAgICBkb2MucmVjdChjZWxsLngsIGN1cnNvci55LCBjZWxsLndpZHRoLCBjZWxsLmhlaWdodCwgJ0YnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEcmF3IGNlbGwgaW5kaXZpZHVhbCBib3JkZXJzXG4gICAgICAgIGRyYXdDZWxsQm9yZGVycyhkb2MsIGNlbGwsIGN1cnNvciwgY2VsbFN0eWxlcy5saW5lV2lkdGgpO1xuICAgIH1cbn1cbi8qKlxuICogRHJhdyBhbGwgc3BlY2lmaWVkIGJvcmRlcnMuIEJvcmRlcnMgYXJlIGNlbnRlcmVkIG9uIGNlbGwncyBlZGdlIGFuZCBsZW5ndGhlbmVkXG4gKiB0byBvdmVybGFwIHdpdGggbmVpZ2hib3VycyB0byBjcmVhdGUgc2hhcnAgY29ybmVycy5cbiAqIEBwYXJhbSBkb2NcbiAqIEBwYXJhbSBjZWxsXG4gKiBAcGFyYW0gY3Vyc29yXG4gKiBAcGFyYW0gZmlsbENvbG9yXG4gKiBAcGFyYW0gbGluZVdpZHRoXG4gKi9cbmZ1bmN0aW9uIGRyYXdDZWxsQm9yZGVycyhkb2MsIGNlbGwsIGN1cnNvciwgbGluZVdpZHRoKSB7XG4gICAgdmFyIHgxLCB5MSwgeDIsIHkyO1xuICAgIGlmIChsaW5lV2lkdGgudG9wKSB7XG4gICAgICAgIHgxID0gY3Vyc29yLng7XG4gICAgICAgIHkxID0gY3Vyc29yLnk7XG4gICAgICAgIHgyID0gY3Vyc29yLnggKyBjZWxsLndpZHRoO1xuICAgICAgICB5MiA9IGN1cnNvci55O1xuICAgICAgICBpZiAobGluZVdpZHRoLnJpZ2h0KSB7XG4gICAgICAgICAgICB4MiArPSAwLjUgKiBsaW5lV2lkdGgucmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmVXaWR0aC5sZWZ0KSB7XG4gICAgICAgICAgICB4MSAtPSAwLjUgKiBsaW5lV2lkdGgubGVmdDtcbiAgICAgICAgfVxuICAgICAgICBkcmF3TGluZShsaW5lV2lkdGgudG9wLCB4MSwgeTEsIHgyLCB5Mik7XG4gICAgfVxuICAgIGlmIChsaW5lV2lkdGguYm90dG9tKSB7XG4gICAgICAgIHgxID0gY3Vyc29yLng7XG4gICAgICAgIHkxID0gY3Vyc29yLnkgKyBjZWxsLmhlaWdodDtcbiAgICAgICAgeDIgPSBjdXJzb3IueCArIGNlbGwud2lkdGg7XG4gICAgICAgIHkyID0gY3Vyc29yLnkgKyBjZWxsLmhlaWdodDtcbiAgICAgICAgaWYgKGxpbmVXaWR0aC5yaWdodCkge1xuICAgICAgICAgICAgeDIgKz0gMC41ICogbGluZVdpZHRoLnJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lV2lkdGgubGVmdCkge1xuICAgICAgICAgICAgeDEgLT0gMC41ICogbGluZVdpZHRoLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgZHJhd0xpbmUobGluZVdpZHRoLmJvdHRvbSwgeDEsIHkxLCB4MiwgeTIpO1xuICAgIH1cbiAgICBpZiAobGluZVdpZHRoLmxlZnQpIHtcbiAgICAgICAgeDEgPSBjdXJzb3IueDtcbiAgICAgICAgeTEgPSBjdXJzb3IueTtcbiAgICAgICAgeDIgPSBjdXJzb3IueDtcbiAgICAgICAgeTIgPSBjdXJzb3IueSArIGNlbGwuaGVpZ2h0O1xuICAgICAgICBpZiAobGluZVdpZHRoLnRvcCkge1xuICAgICAgICAgICAgeTEgLT0gMC41ICogbGluZVdpZHRoLnRvcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZVdpZHRoLmJvdHRvbSkge1xuICAgICAgICAgICAgeTIgKz0gMC41ICogbGluZVdpZHRoLmJvdHRvbTtcbiAgICAgICAgfVxuICAgICAgICBkcmF3TGluZShsaW5lV2lkdGgubGVmdCwgeDEsIHkxLCB4MiwgeTIpO1xuICAgIH1cbiAgICBpZiAobGluZVdpZHRoLnJpZ2h0KSB7XG4gICAgICAgIHgxID0gY3Vyc29yLnggKyBjZWxsLndpZHRoO1xuICAgICAgICB5MSA9IGN1cnNvci55O1xuICAgICAgICB4MiA9IGN1cnNvci54ICsgY2VsbC53aWR0aDtcbiAgICAgICAgeTIgPSBjdXJzb3IueSArIGNlbGwuaGVpZ2h0O1xuICAgICAgICBpZiAobGluZVdpZHRoLnRvcCkge1xuICAgICAgICAgICAgeTEgLT0gMC41ICogbGluZVdpZHRoLnRvcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZVdpZHRoLmJvdHRvbSkge1xuICAgICAgICAgICAgeTIgKz0gMC41ICogbGluZVdpZHRoLmJvdHRvbTtcbiAgICAgICAgfVxuICAgICAgICBkcmF3TGluZShsaW5lV2lkdGgucmlnaHQsIHgxLCB5MSwgeDIsIHkyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhd0xpbmUod2lkdGgsIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICAgIGRvYy5nZXREb2N1bWVudCgpLnNldExpbmVXaWR0aCh3aWR0aCk7XG4gICAgICAgIGRvYy5nZXREb2N1bWVudCgpLmxpbmUoeDEsIHkxLCB4MiwgeTIsICdTJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nUGFnZVNwYWNlKGRvYywgdGFibGUsIGlzTGFzdFJvdywgY3Vyc29yKSB7XG4gICAgdmFyIGJvdHRvbUNvbnRlbnRIZWlnaHQgPSB0YWJsZS5zZXR0aW5ncy5tYXJnaW4uYm90dG9tO1xuICAgIHZhciBzaG93Rm9vdCA9IHRhYmxlLnNldHRpbmdzLnNob3dGb290O1xuICAgIGlmIChzaG93Rm9vdCA9PT0gJ2V2ZXJ5UGFnZScgfHwgKHNob3dGb290ID09PSAnbGFzdFBhZ2UnICYmIGlzTGFzdFJvdykpIHtcbiAgICAgICAgYm90dG9tQ29udGVudEhlaWdodCArPSB0YWJsZS5nZXRGb290SGVpZ2h0KHRhYmxlLmNvbHVtbnMpO1xuICAgIH1cbiAgICByZXR1cm4gZG9jLnBhZ2VTaXplKCkuaGVpZ2h0IC0gY3Vyc29yLnkgLSBib3R0b21Db250ZW50SGVpZ2h0O1xufVxuZnVuY3Rpb24gYWRkUGFnZShkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yLCBjb2x1bW5zLCBzdXBwcmVzc0Zvb3Rlcikge1xuICAgIGlmIChjb2x1bW5zID09PSB2b2lkIDApIHsgY29sdW1ucyA9IFtdOyB9XG4gICAgaWYgKHN1cHByZXNzRm9vdGVyID09PSB2b2lkIDApIHsgc3VwcHJlc3NGb290ZXIgPSBmYWxzZTsgfVxuICAgIGRvYy5hcHBseVN0eWxlcyhkb2MudXNlclN0eWxlcyk7XG4gICAgaWYgKHRhYmxlLnNldHRpbmdzLnNob3dGb290ID09PSAnZXZlcnlQYWdlJyAmJiAhc3VwcHJlc3NGb290ZXIpIHtcbiAgICAgICAgdGFibGUuZm9vdC5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCBjb2x1bW5zKTsgfSk7XG4gICAgfVxuICAgIC8vIEFkZCB1c2VyIGNvbnRlbnQganVzdCBiZWZvcmUgYWRkaW5nIG5ldyBwYWdlIGVuc3VyZSBpdCB3aWxsXG4gICAgLy8gYmUgZHJhd24gYWJvdmUgb3RoZXIgdGhpbmdzIG9uIHRoZSBwYWdlXG4gICAgdGFibGUuY2FsbEVuZFBhZ2VIb29rcyhkb2MsIGN1cnNvcik7XG4gICAgdmFyIG1hcmdpbiA9IHRhYmxlLnNldHRpbmdzLm1hcmdpbjtcbiAgICBhZGRUYWJsZUJvcmRlcihkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yKTtcbiAgICBuZXh0UGFnZShkb2MpO1xuICAgIHRhYmxlLnBhZ2VOdW1iZXIrKztcbiAgICBjdXJzb3IueCA9IG1hcmdpbi5sZWZ0O1xuICAgIGN1cnNvci55ID0gbWFyZ2luLnRvcDtcbiAgICBzdGFydFBvcy55ID0gbWFyZ2luLnRvcDtcbiAgICAvLyBjYWxsIGRpZEFkZFBhZ2UgaG9va3MgYmVmb3JlIGFueSBjb250ZW50IGlzIGFkZGVkIHRvIHRoZSBwYWdlXG4gICAgdGFibGUuY2FsbFdpbGxEcmF3UGFnZUhvb2tzKGRvYywgY3Vyc29yKTtcbiAgICBpZiAodGFibGUuc2V0dGluZ3Muc2hvd0hlYWQgPT09ICdldmVyeVBhZ2UnKSB7XG4gICAgICAgIHRhYmxlLmhlYWQuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7IHJldHVybiBwcmludFJvdyhkb2MsIHRhYmxlLCByb3csIGN1cnNvciwgY29sdW1ucyk7IH0pO1xuICAgICAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5leHRQYWdlKGRvYykge1xuICAgIHZhciBjdXJyZW50ID0gZG9jLnBhZ2VOdW1iZXIoKTtcbiAgICBkb2Muc2V0UGFnZShjdXJyZW50ICsgMSk7XG4gICAgdmFyIG5ld0N1cnJlbnQgPSBkb2MucGFnZU51bWJlcigpO1xuICAgIGlmIChuZXdDdXJyZW50ID09PSBjdXJyZW50KSB7XG4gICAgICAgIGRvYy5hZGRQYWdlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGx1Z2luKGpzUERGKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBqc1BERi5BUEkuYXV0b1RhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvcHRpb25zID0gYXJnc1swXTtcbiAgICAgICAgdmFyIGlucHV0ID0gcGFyc2VJbnB1dCh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgdmFyIHRhYmxlID0gY3JlYXRlVGFibGUodGhpcywgaW5wdXQpO1xuICAgICAgICBkcmF3VGFibGUodGhpcywgdGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8vIEFzc2lnbiBmYWxzZSB0byBlbmFibGUgYGRvYy5sYXN0QXV0b1RhYmxlLmZpbmFsWSB8fCA0MGAgc3VnYXJcbiAgICBqc1BERi5BUEkubGFzdEF1dG9UYWJsZSA9IGZhbHNlO1xuICAgIGpzUERGLkFQSS5hdXRvVGFibGVUZXh0ID0gZnVuY3Rpb24gKHRleHQsIHgsIHksIHN0eWxlcykge1xuICAgICAgICBhdXRvVGFibGVUZXh0KHRleHQsIHgsIHksIHN0eWxlcywgdGhpcyk7XG4gICAgfTtcbiAgICBqc1BERi5BUEkuYXV0b1RhYmxlU2V0RGVmYXVsdHMgPSBmdW5jdGlvbiAoZGVmYXVsdHMpIHtcbiAgICAgICAgRG9jSGFuZGxlci5zZXREZWZhdWx0cyhkZWZhdWx0cywgdGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAganNQREYuYXV0b1RhYmxlU2V0RGVmYXVsdHMgPSBmdW5jdGlvbiAoZGVmYXVsdHMsIGRvYykge1xuICAgICAgICBEb2NIYW5kbGVyLnNldERlZmF1bHRzKGRlZmF1bHRzLCBkb2MpO1xuICAgIH07XG4gICAganNQREYuQVBJLmF1dG9UYWJsZUh0bWxUb0pzb24gPSBmdW5jdGlvbiAodGFibGVFbGVtLCBpbmNsdWRlSGlkZGVuRWxlbWVudHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoaW5jbHVkZUhpZGRlbkVsZW1lbnRzID09PSB2b2lkIDApIHsgaW5jbHVkZUhpZGRlbkVsZW1lbnRzID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcnVuIGF1dG9UYWJsZUh0bWxUb0pzb24gaW4gbm9uIGJyb3dzZXIgZW52aXJvbm1lbnQnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkb2MgPSBuZXcgRG9jSGFuZGxlcih0aGlzKTtcbiAgICAgICAgdmFyIF9iID0gcGFyc2VIdG1sKGRvYywgdGFibGVFbGVtLCB3aW5kb3csIGluY2x1ZGVIaWRkZW5FbGVtZW50cywgZmFsc2UpLCBoZWFkID0gX2IuaGVhZCwgYm9keSA9IF9iLmJvZHk7XG4gICAgICAgIHZhciBjb2x1bW5zID0gKChfYSA9IGhlYWRbMF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMuY29udGVudDsgfSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBjb2x1bW5zLCByb3dzOiBib2R5LCBkYXRhOiBib2R5IH07XG4gICAgfTtcbn1cblxudmFyIF9hO1xuZnVuY3Rpb24gYXV0b1RhYmxlKGQsIG9wdGlvbnMpIHtcbiAgICB2YXIgaW5wdXQgPSBwYXJzZUlucHV0KGQsIG9wdGlvbnMpO1xuICAgIHZhciB0YWJsZSA9IGNyZWF0ZVRhYmxlKGQsIGlucHV0KTtcbiAgICBkcmF3VGFibGUoZCwgdGFibGUpO1xufVxuLy8gRXhwZXJpbWVudGFsIGV4cG9ydFxuZnVuY3Rpb24gX19jcmVhdGVUYWJsZShkLCBvcHRpb25zKSB7XG4gICAgdmFyIGlucHV0ID0gcGFyc2VJbnB1dChkLCBvcHRpb25zKTtcbiAgICByZXR1cm4gY3JlYXRlVGFibGUoZCwgaW5wdXQpO1xufVxuZnVuY3Rpb24gX19kcmF3VGFibGUoZCwgdGFibGUpIHtcbiAgICBkcmF3VGFibGUoZCwgdGFibGUpO1xufVxudHJ5IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHZhciBhbnlXaW5kb3cgPSB3aW5kb3c7XG4gICAgICAgIHZhciBqc1BERiA9IGFueVdpbmRvdy5qc1BERiB8fCAoKF9hID0gYW55V2luZG93LmpzcGRmKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuanNQREYpO1xuICAgICAgICBpZiAoanNQREYpIHtcbiAgICAgICAgICAgIGFwcGx5UGx1Z2luKGpzUERGKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBhcHBseSBhdXRvVGFibGUgcGx1Z2luJywgZXJyb3IpO1xufVxuXG5leHBvcnQgeyBDZWxsLCBDZWxsSG9va0RhdGEsIENvbHVtbiwgSG9va0RhdGEsIFJvdywgVGFibGUsIF9fY3JlYXRlVGFibGUsIF9fZHJhd1RhYmxlLCBhcHBseVBsdWdpbiwgYXV0b1RhYmxlLCBhdXRvVGFibGUgYXMgZGVmYXVsdCB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jspdf-autotable/dist/jspdf.plugin.autotable.mjs\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/pako/dist/pako.esm.mjs":
/*!*********************************************!*\
!*** ./node_modules/pako/dist/pako.esm.mjs ***!
\*********************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Deflate: function() { return /* binding */ Deflate_1; },\n/* harmony export */ Inflate: function() { return /* binding */ Inflate_1; },\n/* harmony export */ constants: function() { return /* binding */ constants_1; },\n/* harmony export */ \"default\": function() { return /* binding */ pako; },\n/* harmony export */ deflate: function() { return /* binding */ deflate_1; },\n/* harmony export */ deflateRaw: function() { return /* binding */ deflateRaw_1; },\n/* harmony export */ gzip: function() { return /* binding */ gzip_1; },\n/* harmony export */ inflate: function() { return /* binding */ inflate_1; },\n/* harmony export */ inflateRaw: function() { return /* binding */ inflateRaw_1; },\n/* harmony export */ ungzip: function() { return /* binding */ ungzip_1; }\n/* harmony export */ });\n\n/*! pako 2.2.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED = 1;\n//const Z_HUFFMAN_ONLY = 2;\n//const Z_RLE = 3;\nconst Z_FIXED$1 = 4;\n//const Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY = 0;\nconst Z_TEXT = 1;\n//const Z_ASCII = 1; // = Z_TEXT\nconst Z_UNKNOWN$1 = 2;\n\n/*============================================================================*/\n\n\nfunction zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH$1 = 3;\nconst MAX_MATCH$1 = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES$1 = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS$1 = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES$1 = 30;\n/* number of distance codes */\n\nconst BL_CODES$1 = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE$1 = 2 * L_CODES$1 + 1;\n/* maximum heap size */\n\nconst MAX_BITS$1 = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK = 256;\n/* end of block literal code */\n\nconst REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits = /* extra bits for each length code */\n new Uint8Array([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]);\n\nconst extra_dbits = /* extra bits for each distance code */\n new Uint8Array([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]);\n\nconst extra_blbits = /* extra bits for each bit length code */\n new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree = new Array((L_CODES$1 + 2) * 2);\nzero$1(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree = new Array(D_CODES$1 * 2);\nzero$1(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code = new Array(DIST_CODE_LEN);\nzero$1(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1);\nzero$1(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length = new Array(LENGTH_CODES$1);\nzero$1(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist = new Array(D_CODES$1);\nzero$1(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n let res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nconst gen_bitlen = (s, desc) => {\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n\n const tree = desc.dyn_tree;\n const max_code = desc.max_code;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const extra = desc.stat_desc.extra_bits;\n const base = desc.stat_desc.extra_base;\n const max_length = desc.stat_desc.max_length;\n let h; /* heap index */\n let n, m; /* iterate over the tree elements */\n let bits; /* bit length */\n let xbits; /* extra bits */\n let f; /* frequency */\n let overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Tracev((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Tracev((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) => {\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n\n const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */\n let code = 0; /* running code value */\n let bits; /* bit index */\n let n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS$1; bits++) {\n code = (code + bl_count[bits - 1]) << 1;\n next_code[bits] = code;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1< {\n\n let n; /* iterates over tree elements */\n let bits; /* bit counter */\n let length; /* length value */\n let code; /* code value */\n let dist; /* distance index */\n const bl_count = new Array(MAX_BITS$1 + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES$1 - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES$1; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS$1; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES$1 + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES$1; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS);\n\n //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n let n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.sym_next = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n const _n2 = n * 2;\n const _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) => {\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n\n const v = s.heap[k];\n let j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) => {\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n\n let dist; /* distance of matched string */\n let lc; /* match length or unmatched char (if dist == 0) */\n let sx = 0; /* running index in sym_buf */\n let code; /* the code to send */\n let extra; /* number of extra bits to send */\n\n if (s.sym_next !== 0) {\n do {\n dist = s.pending_buf[s.sym_buf + sx++] & 0xff;\n dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8;\n lc = s.pending_buf[s.sym_buf + sx++];\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and sym_buf is ok: */\n //Assert(s->pending < s->lit_bufsize + sx, \"pendingBuf overflow\");\n\n } while (sx < s.sym_next);\n }\n\n send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) => {\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n\n const tree = desc.dyn_tree;\n const stree = desc.stat_desc.static_tree;\n const has_stree = desc.stat_desc.has_stree;\n const elems = desc.stat_desc.elems;\n let n, m; /* iterate over heap elements */\n let max_code = -1; /* largest code with non zero frequency */\n let node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE$1;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) => {\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) => {\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n\n let n; /* iterates over all tree elements */\n let prevlen = -1; /* last emitted length */\n let curlen; /* length of current code */\n\n let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n let count = 0; /* repeat count of the current code */\n let max_count = 7; /* max repeat count */\n let min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n let max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) => {\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n\n let rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"block list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"allow list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n /* block_mask is the bit mask of block-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n let block_mask = 0xf3ffc07f;\n let n;\n\n /* Check for non-textual (\"block-listed\") bytes. */\n for (n = 0; n <= 31; n++, block_mask >>>= 1) {\n if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"allow-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS$1; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"block-listed\" or \"allow-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init$1 = (s) =>\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n bi_windup(s); /* align on byte boundary */\n put_short(s, stored_len);\n put_short(s, ~stored_len);\n if (stored_len) {\n s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending);\n }\n s.pending += stored_len;\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align$1 = (s) => {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and write out the encoded block.\n */\nconst _tr_flush_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n\n let opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n let max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN$1) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->sym_next / 3));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block$1(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally$1 = (s, dist, lc) => {\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n\n s.pending_buf[s.sym_buf + s.sym_next++] = dist;\n s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8;\n s.pending_buf[s.sym_buf + s.sym_next++] = lc;\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n return (s.sym_next === s.sym_end);\n};\n\nvar _tr_init_1 = _tr_init$1;\nvar _tr_stored_block_1 = _tr_stored_block$1;\nvar _tr_flush_block_1 = _tr_flush_block$1;\nvar _tr_tally_1 = _tr_tally$1;\nvar _tr_align_1 = _tr_align$1;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants$2 = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,\n Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$2,\n Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n Z_UNKNOWN,\n Z_DEFLATED: Z_DEFLATED$2\n} = constants$2;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES = 30;\n/* number of distance codes */\nconst BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\nconst MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE = 42; /* zlib header -> BUSY_STATE */\n//#ifdef GZIP\nconst GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */\n//#endif\nconst EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */\nconst NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */\nconst COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */\nconst HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */\nconst BUSY_STATE = 113; /* deflate -> FINISH_STATE */\nconst FINISH_STATE = 666; /* stream complete */\n\nconst BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n strm.msg = messages[errorCode];\n return errorCode;\n};\n\nconst rank = (f) => {\n return ((f) * 2) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero = (buf) => {\n let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n/* ===========================================================================\n * Slide the hash table when sliding the window down (could be avoided with 32\n * bit values at the expense of memory usage). We slide even when level == 0 to\n * keep the hash table consistent if we switch back to level > 0 later.\n */\nconst slide_hash = (s) => {\n let n, m;\n let p;\n let wsize = s.w_size;\n\n n = s.hash_size;\n p = n;\n do {\n m = s.head[--p];\n s.head[p] = (m >= wsize ? m - wsize : 0);\n } while (--n);\n n = wsize;\n//#ifndef FASTEST\n p = n;\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= wsize ? m - wsize : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n//#endif\n};\n\n/* eslint-disable new-cap */\nlet HASH = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n\n\n/* ===========================================================================\n * Insert string str in the dictionary and set match_head to the previous head\n * of the hash chain (the most recent string with same hash key). Return\n * the previous length of the hash chain.\n * IN assertion: all calls to INSERT_STRING are made with consecutive input\n * characters and the first MIN_MATCH bytes of str are valid (except for\n * the last MIN_MATCH-1 bytes of the input file).\n */\nconst INSERT_STRING = (s, str) => {\n let h;\n if (s.legacy_hash) {\n /* UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]); */\n h = s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n } else {\n // ANZAC++ hash: reads 4 bytes, matches node.js zlib output (legacyHash\n // restores classic zlib hash). Faster, with fewer collisions.\n const w = s.window;\n // Read 4 bytes little-endian. Math.imul reproduces C uint32 overflow in\n // `(value * 66521 + 66521) >> 16` exactly.\n const value = w[str] | (w[str + 1] << 8) | (w[str + 2] << 16) | (w[str + 3] << 24);\n h = s.ins_h = ((Math.imul(value, 66521) + 66521) >>> 16) & s.hash_mask;\n }\n const hash_head = s.prev[str & s.w_mask] = s.head[h];\n s.head[h] = str;\n return hash_head;\n};\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output, except for\n * some deflate_stored() output, goes through this function so some\n * applications may wish to modify it to avoid allocating a large\n * strm->next_out buffer and copying into it. (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n const s = strm.state;\n\n //_tr_flush_bits(s);\n let len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n};\n\n\nconst flush_block_only = (s, last) => {\n _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n // put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n let len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32_1(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32_1(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n let chain_length = s.max_chain_length; /* max hash chain length */\n let scan = s.strstart; /* current string */\n let match; /* matched string */\n let len; /* length of current match */\n let best_len = s.prev_length; /* best match length so far */\n let nice_match = s.nice_match; /* stop if match long enough */\n const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n const _win = s.window; // shortcut\n\n const wmask = s.w_mask;\n const prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n const strend = s.strstart + MAX_MATCH;\n let scan_end1 = _win[scan + best_len - 1];\n let scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nconst fill_window = (s) => {\n\n const _w_size = s.w_size;\n let n, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n slide_hash(s);\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (!s.legacy_hash) {\n /* The 4-byte hash reads one extra byte, so it needs one more available. */\n if (s.lookahead + s.insert > MIN_MATCH) {\n str = s.strstart - s.insert;\n while (s.insert) {\n INSERT_STRING(s, str);\n str++;\n s.insert--;\n if (s.lookahead + s.insert <= MIN_MATCH) {\n break;\n }\n }\n }\n } else if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n INSERT_STRING(s, str);\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// const curr = s.strstart + s.lookahead;\n// let init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n *\n * In case deflateParams() is used to later switch to a non-zero compression\n * level, s->matches (otherwise unused when storing) keeps track of the number\n * of hash table slides to perform. If s->matches is 1, then one hash table\n * slide will be done when switching. If s->matches is 2, the maximum value\n * allowed here, then the hash table will be cleared, since two or more slides\n * is the same as a clear.\n *\n * deflate_stored() is written to minimize the number of times an input byte is\n * copied. It is most efficient with large input and output buffers, which\n * maximizes the opportunites to have a single copy from next_in to next_out.\n */\nconst deflate_stored = (s, flush) => {\n\n /* Smallest worthy block size when not flushing or finishing. By default\n * this is 32K. This can be as small as 507 bytes for memLevel == 1. For\n * large input and output buffers, the stored block size will be larger.\n */\n let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5;\n\n /* Copy as many min_block or larger stored blocks directly to next_out as\n * possible. If flushing, copy the remaining available input to next_out as\n * stored blocks, if there is enough space.\n */\n let len, left, have, last = 0;\n let used = s.strm.avail_in;\n do {\n /* Set len to the maximum size block that we can copy directly with the\n * available input data and output space. Set left to how much of that\n * would be copied from what's left in the window.\n */\n len = 65535/* MAX_STORED */; /* maximum deflate stored block length */\n have = (s.bi_valid + 42) >> 3; /* number of header bytes */\n if (s.strm.avail_out < have) { /* need room for header */\n break;\n }\n /* maximum stored block length that will fit in avail_out: */\n have = s.strm.avail_out - have;\n left = s.strstart - s.block_start; /* bytes left in window */\n if (len > left + s.strm.avail_in) {\n len = left + s.strm.avail_in; /* limit len to the input */\n }\n if (len > have) {\n len = have; /* limit len to the output */\n }\n\n /* If the stored block would be less than min_block in length, or if\n * unable to copy all of the available input when flushing, then try\n * copying to the window and the pending buffer instead. Also don't\n * write an empty block when flushing -- deflate() does that.\n */\n if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) ||\n flush === Z_NO_FLUSH$2 ||\n len !== left + s.strm.avail_in)) {\n break;\n }\n\n /* Make a dummy stored block in pending to get the header bytes,\n * including any pending bits. This also updates the debugging counts.\n */\n last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0;\n _tr_stored_block(s, 0, 0, last);\n\n /* Replace the lengths in the dummy stored block with len. */\n s.pending_buf[s.pending - 4] = len;\n s.pending_buf[s.pending - 3] = len >> 8;\n s.pending_buf[s.pending - 2] = ~len;\n s.pending_buf[s.pending - 1] = ~len >> 8;\n\n /* Write the stored block header bytes. */\n flush_pending(s.strm);\n\n//#ifdef ZLIB_DEBUG\n// /* Update debugging counts for the data about to be copied. */\n// s->compressed_len += len << 3;\n// s->bits_sent += len << 3;\n//#endif\n\n /* Copy uncompressed bytes from the window to next_out. */\n if (left) {\n if (left > len) {\n left = len;\n }\n //zmemcpy(s->strm->next_out, s->window + s->block_start, left);\n s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out);\n s.strm.next_out += left;\n s.strm.avail_out -= left;\n s.strm.total_out += left;\n s.block_start += left;\n len -= left;\n }\n\n /* Copy uncompressed bytes directly from next_in to next_out, updating\n * the check value.\n */\n if (len) {\n read_buf(s.strm, s.strm.output, s.strm.next_out, len);\n s.strm.next_out += len;\n s.strm.avail_out -= len;\n s.strm.total_out += len;\n }\n } while (last === 0);\n\n /* Update the sliding window with the last s->w_size bytes of the copied\n * data, or append all of the copied data to the existing window if less\n * than s->w_size bytes were copied. Also update the number of bytes to\n * insert in the hash tables, in the event that deflateParams() switches to\n * a non-zero compression level.\n */\n used -= s.strm.avail_in; /* number of input bytes directly copied */\n if (used) {\n /* If any input was used, then no unused input remains in the window,\n * therefore s->block_start == s->strstart.\n */\n if (used >= s.w_size) { /* supplant the previous history */\n s.matches = 2; /* clear hash */\n //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);\n s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0);\n s.strstart = s.w_size;\n s.insert = s.strstart;\n }\n else {\n if (s.window_size - s.strstart <= used) {\n /* Slide the window down. */\n s.strstart -= s.w_size;\n //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n if (s.matches < 2) {\n s.matches++; /* add a pending slide_hash() */\n }\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n }\n //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);\n s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart);\n s.strstart += used;\n s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used;\n }\n s.block_start = s.strstart;\n }\n if (s.high_water < s.strstart) {\n s.high_water = s.strstart;\n }\n\n /* If the last block was written to next_out, then done. */\n if (last) {\n return BS_FINISH_DONE;\n }\n\n /* If flushing and all input has been consumed, then done. */\n if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 &&\n s.strm.avail_in === 0 && s.strstart === s.block_start) {\n return BS_BLOCK_DONE;\n }\n\n /* Fill the window with any remaining input. */\n have = s.window_size - s.strstart;\n if (s.strm.avail_in > have && s.block_start >= s.w_size) {\n /* Slide the window down. */\n s.block_start -= s.w_size;\n s.strstart -= s.w_size;\n //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n if (s.matches < 2) {\n s.matches++; /* add a pending slide_hash() */\n }\n have += s.w_size; /* more space now */\n if (s.insert > s.strstart) {\n s.insert = s.strstart;\n }\n }\n if (have > s.strm.avail_in) {\n have = s.strm.avail_in;\n }\n if (have) {\n read_buf(s.strm, s.window, s.strstart, have);\n s.strstart += have;\n s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have;\n }\n if (s.high_water < s.strstart) {\n s.high_water = s.strstart;\n }\n\n /* There was not enough avail_out to write a complete worthy or flushed\n * stored block to next_out. Write a stored block to pending instead, if we\n * have enough input for a worthy block, or if flushing and there is enough\n * room for the remaining input as a stored block in the pending buffer.\n */\n have = (s.bi_valid + 42) >> 3; /* number of header bytes */\n /* maximum stored block length that will fit in pending: */\n have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have;\n min_block = have > s.w_size ? s.w_size : have;\n left = s.strstart - s.block_start;\n if (left >= min_block ||\n ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 &&\n s.strm.avail_in === 0 && left <= have)) {\n len = left > have ? have : left;\n last = flush === Z_FINISH$3 && s.strm.avail_in === 0 &&\n len === left ? 1 : 0;\n _tr_stored_block(s, s.block_start, len, last);\n s.block_start += len;\n flush_pending(s.strm);\n }\n\n /* We've done all we can with the available input and output. */\n return last ? BS_FINISH_STARTED : BS_NEED_MORE;\n};\n\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n let hash_head; /* head of the hash chain */\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n hash_head = INSERT_STRING(s, s.strstart);\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n hash_head = INSERT_STRING(s, s.strstart);\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n if (s.legacy_hash) {\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n let hash_head; /* head of hash chain */\n let bflush; /* set if current block must be flushed */\n\n let max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n hash_head = INSERT_STRING(s, s.strstart);\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n hash_head = INSERT_STRING(s, s.strstart);\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n let prev; /* byte at distance one to match */\n let scan, strend; /* scan goes up to strend for length of run */\n\n const _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n let bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH$2) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = _tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH$3) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.sym_next) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nconst configuration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED$2; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.legacy_hash = 0; /* use classic zlib hash instead of default ANZAC++ */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2);\n this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2);\n this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new Uint16Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.sym_buf = 0; /* buffer for distances and literals/lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.sym_next = 0; /* running index in sym_buf */\n this.sym_end = 0; /* symbol table full when sym_next reaches this */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\n/* =========================================================================\n * Check for a valid deflate stream state. Return 0 if ok, 1 if not.\n */\nconst deflateStateCheck = (strm) => {\n\n if (!strm) {\n return 1;\n }\n const s = strm.state;\n if (!s || s.strm !== strm || (s.status !== INIT_STATE &&\n//#ifdef GZIP\n s.status !== GZIP_STATE &&\n//#endif\n s.status !== EXTRA_STATE &&\n s.status !== NAME_STATE &&\n s.status !== COMMENT_STATE &&\n s.status !== HCRC_STATE &&\n s.status !== BUSY_STATE &&\n s.status !== FINISH_STATE)) {\n return 1;\n }\n return 0;\n};\n\n\nconst deflateResetKeep = (strm) => {\n\n if (deflateStateCheck(strm)) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n const s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status =\n//#ifdef GZIP\n s.wrap === 2 ? GZIP_STATE :\n//#endif\n s.wrap ? INIT_STATE : BUSY_STATE;\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = -2;\n _tr_init(s);\n return Z_OK$3;\n};\n\n\nconst deflateReset = (strm) => {\n\n const ret = deflateResetKeep(strm);\n if (ret === Z_OK$3) {\n lm_init(strm.state);\n }\n return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n if (deflateStateCheck(strm) || strm.state.wrap !== 2) {\n return Z_STREAM_ERROR$2;\n }\n strm.state.gzhead = head;\n return Z_OK$3;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy, legacyHash) => {\n\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR$2;\n }\n let wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION$1) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) {\n return err(strm, Z_STREAM_ERROR$2);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n const s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n s.status = INIT_STATE; /* to pass state test in deflateReset() */\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.legacy_hash = legacyHash ? 1 : 0;\n\n s.hash_bits = memLevel + 7;\n /* ANZAC++ hash needs >= 15 hash bits to span its 4 read bytes. */\n if (!s.legacy_hash && s.hash_bits < 15) {\n s.hash_bits = 15;\n }\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new Uint8Array(s.w_size * 2);\n s.head = new Uint16Array(s.hash_size);\n s.prev = new Uint16Array(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n /* We overlay pending_buf and sym_buf. This works since the average size\n * for length/distance pairs over any compressed block is assured to be 31\n * bits or less.\n *\n * Analysis: The longest fixed codes are a length code of 8 bits plus 5\n * extra bits, for lengths 131 to 257. The longest fixed distance codes are\n * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest\n * possible fixed-codes length/distance pair is then 31 bits total.\n *\n * sym_buf starts one-fourth of the way into pending_buf. So there are\n * three bytes in sym_buf for every four bytes in pending_buf. Each symbol\n * in sym_buf is three bytes -- two for the distance and one for the\n * literal/length. As each symbol is consumed, the pointer to the next\n * sym_buf value to read moves forward three bytes. From that symbol, up to\n * 31 bits are written to pending_buf. The closest the written pending_buf\n * bits gets to the next sym_buf symbol to read is just before the last\n * code is written. At that time, 31*(n-2) bits have been written, just\n * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at\n * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1\n * symbols are written.) The closest the writing gets to what is unread is\n * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and\n * can range from 128 to 32768.\n *\n * Therefore, at a minimum, there are 142 bits of space between what is\n * written and what is read in the overlain buffers, so the symbols cannot\n * be overwritten by the compressed data. That space is actually 139 bits,\n * due to the three-bit fixed-code block header.\n *\n * That covers the case where either Z_FIXED is specified, forcing fixed\n * codes, or when the use of fixed codes is chosen, because that choice\n * results in a smaller compressed block than dynamic codes. That latter\n * condition then assures that the above analysis also covers all dynamic\n * blocks. A dynamic-code block will only be chosen to be emitted if it has\n * fewer bits than a fixed-code block would for the same set of symbols.\n * Therefore its average symbol length is assured to be less than 31. So\n * the compressed data for a dynamic block also cannot overwrite the\n * symbols from which it is being constructed.\n */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->sym_buf = s->pending_buf + s->lit_bufsize;\n s.sym_buf = s.lit_bufsize;\n\n //s->sym_end = (s->lit_bufsize - 1) * 3;\n s.sym_end = (s.lit_bufsize - 1) * 3;\n /* We avoid equality with lit_bufsize*3 because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1);\n};\n\n\n/* ========================================================================= */\nconst deflate$2 = (strm, flush) => {\n\n if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n\n if (!strm.output ||\n (strm.avail_in !== 0 && !strm.input) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$2 : Z_STREAM_ERROR$2);\n }\n\n const old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK$3;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH$3) {\n return err(strm, Z_BUF_ERROR$2);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR$2);\n }\n\n /* Write the header */\n if (s.status === INIT_STATE && s.wrap === 0) {\n s.status = BUSY_STATE;\n }\n if (s.status === INIT_STATE) {\n /* zlib header */\n let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8;\n let level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n//#ifdef GZIP\n if (s.status === GZIP_STATE) {\n /* gzip header */\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let left = (s.gzhead.extra.length & 0xffff) - s.gzindex;\n while (s.pending + left > s.pending_buf_size) {\n let copy = s.pending_buf_size - s.pending;\n // zmemcpy(s.pending_buf + s.pending,\n // s.gzhead.extra + s.gzindex, copy);\n s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending);\n s.pending = s.pending_buf_size;\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex += copy;\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n left -= copy;\n }\n // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility\n // TypedArray.slice and TypedArray.from don't exist in IE10-IE11\n let gzhead_extra = new Uint8Array(s.gzhead.extra);\n // zmemcpy(s->pending_buf + s->pending,\n // s->gzhead->extra + s->gzindex, left);\n s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending);\n s.pending += left;\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex = 0;\n }\n s.status = NAME_STATE;\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let val;\n do {\n if (s.pending === s.pending_buf_size) {\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n s.gzindex = 0;\n }\n s.status = COMMENT_STATE;\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n let beg = s.pending; /* start of bytes to update crc */\n let val;\n do {\n if (s.pending === s.pending_buf_size) {\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n beg = 0;\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n //--- HCRC_UPDATE(beg) ---//\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n //---//\n }\n s.status = HCRC_STATE;\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n }\n s.status = BUSY_STATE;\n\n /* Compression must start with an empty pending buffer */\n flush_pending(strm);\n if (s.pending !== 0) {\n s.last_flush = -1;\n return Z_OK$3;\n }\n }\n//#endif\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) {\n let bstate = s.level === 0 ? deflate_stored(s, flush) :\n s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :\n s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush);\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK$3;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n _tr_align(s);\n }\n else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */\n\n _tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH$1) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK$3;\n }\n }\n }\n\n if (flush !== Z_FINISH$3) { return Z_OK$3; }\n if (s.wrap <= 0) { return Z_STREAM_END$3; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3;\n};\n\n\nconst deflateEnd = (strm) => {\n\n if (deflateStateCheck(strm)) {\n return Z_STREAM_ERROR$2;\n }\n\n const status = strm.state.status;\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n let dictLength = dictionary.length;\n\n if (deflateStateCheck(strm)) {\n return Z_STREAM_ERROR$2;\n }\n\n const s = strm.state;\n const wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR$2;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n let tmpDict = new Uint8Array(s.w_size);\n tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n const avail = strm.avail_in;\n const next = strm.next_in;\n const input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH) {\n let str = s.strstart;\n let n = s.lookahead - (MIN_MATCH - 1);\n do {\n INSERT_STRING(s, str);\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK$3;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2$1 = deflate$2;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateGetDictionary = deflateGetDictionary;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1$2 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2$1,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[255] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n return new TextEncoder().encode(str);\n }\n\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n const len = max || buf.length;\n\n if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n return new TextDecoder().decode(buf.subarray(0, max));\n }\n\n let i, out;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2,\n Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2,\n Z_DEFAULT_COMPRESSION,\n Z_DEFAULT_STRATEGY,\n Z_DEFLATED: Z_DEFLATED$1\n} = constants$2;\n\n/* ===========================================================================*/\n\nconst defaultOptions$1 = {\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED$1,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY,\n legacyHash: true\n};\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * - `legacyHash` (Boolean) - use the classic zlib hash (default), which matches\n * canonical zlib output byte-for-byte. Set to `false` to use the faster\n * ANZAC++ hash, which matches recent (chromium) node.js output instead.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate$1(options) {\n this.options = common.assign({}, defaultOptions$1, options || {});\n\n let opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = deflate_1$2.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy,\n opt.legacyHash\n );\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n if (opt.header) {\n deflate_1$2.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n let dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = deflate_1$2.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK$2) {\n throw new Error(messages[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n let status, _flush_mode;\n\n if (this.ended) { return false; }\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1;\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString$1.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n // Make sure avail_out > 6 to avoid repeating markers\n if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n status = deflate_1$2.deflate(strm, _flush_mode);\n\n // Ended => flush and finish\n if (status === Z_STREAM_END$2) {\n if (strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n }\n status = deflate_1$2.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK$2;\n }\n\n // Flush if out buffer full\n if (strm.avail_out === 0) {\n this.onData(strm.output);\n continue;\n }\n\n // Flush if requested and has data\n if (_flush_mode > 0 && strm.next_out > 0) {\n this.onData(strm.output.subarray(0, strm.next_out));\n strm.avail_out = 0;\n continue;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK$2) {\n this.result = common.flattenChunks(this.chunks);\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n const deflator = new Deflate$1(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip$1(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate$1(input, options);\n}\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_2 = deflate$1;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar constants$1 = constants$2;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD$1 = 16209; /* got a data error -- remain here until reset */\nconst TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n//#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE$1;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 75\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n// let shoextra; /* extra bits table to use */\n let match; /* use base and extra for symbol >= match */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES$1 || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES$1) {\n base = extra = work; /* dummy value--not used */\n match = 20;\n\n } else if (type === LENS$1) {\n base = lbase;\n extra = lext;\n match = 257;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n match = 0;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] + 1 < match) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] >= match) {\n here_op = extra[work[sym] - match];\n here_val = base[work[sym] - match];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR: Z_BUF_ERROR$1,\n Z_DEFLATED\n} = constants$2;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst HEAD = 16180; /* i: waiting for magic header */\nconst FLAGS = 16181; /* i: waiting for method and flags (gzip) */\nconst TIME = 16182; /* i: waiting for modification time (gzip) */\nconst OS = 16183; /* i: waiting for extra flags and operating system (gzip) */\nconst EXLEN = 16184; /* i: waiting for extra length (gzip) */\nconst EXTRA = 16185; /* i: waiting for extra bytes (gzip) */\nconst NAME = 16186; /* i: waiting for end of file name (gzip) */\nconst COMMENT = 16187; /* i: waiting for end of comment (gzip) */\nconst HCRC = 16188; /* i: waiting for header crc (gzip) */\nconst DICTID = 16189; /* i: waiting for dictionary check value */\nconst DICT = 16190; /* waiting for inflateSetDictionary() call */\nconst TYPE = 16191; /* i: waiting for type bits, including last-flag bit */\nconst TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */\nconst STORED = 16193; /* i: waiting for stored size (length and complement) */\nconst COPY_ = 16194; /* i/o: same as COPY below, but only first time in */\nconst COPY = 16195; /* i/o: waiting for input or output to copy stored block */\nconst TABLE = 16196; /* i: waiting for dynamic block table lengths */\nconst LENLENS = 16197; /* i: waiting for code length code lengths */\nconst CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */\nconst LEN_ = 16199; /* i: same as LEN below, but only first time in */\nconst LEN = 16200; /* i: waiting for length/lit/eob code */\nconst LENEXT = 16201; /* i: waiting for length extra bits */\nconst DIST = 16202; /* i: waiting for distance code */\nconst DISTEXT = 16203; /* i: waiting for distance extra bits */\nconst MATCH = 16204; /* o: waiting for output space to copy string */\nconst LIT = 16205; /* o: waiting for output space to write literal */\nconst CHECK = 16206; /* i: waiting for 32-bit check value */\nconst LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */\nconst DONE = 16208; /* finished check, done -- remain here until reset */\nconst BAD = 16209; /* got a data error -- remain here until reset */\nconst MEM = 16210; /* got an inflate() memory error -- remain here until reset */\nconst SYNC = 16211; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS;\n\n\nconst zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip,\n bit 2 true to validate check value */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib), or\n -1 if raw or no header yet */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\n\nconst inflateStateCheck = (strm) => {\n\n if (!strm) {\n return 1;\n }\n const state = strm.state;\n if (!state || state.strm !== strm ||\n state.mode < HEAD || state.mode > SYNC) {\n return 1;\n }\n return 0;\n};\n\n\nconst inflateResetKeep = (strm) => {\n\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.flags = -1;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$1;\n};\n\n\nconst inflateReset = (strm) => {\n\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 5;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.strm = strm;\n state.window = null/*Z_NULL*/;\n state.mode = HEAD; /* to pass state test in inflateReset2() */\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$1) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.window = new Uint8Array(1 << state.wbits);\n }\n\n /* if window not in use yet, initialize */\n if (state.wsize === 0) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n};\n\n\nconst inflate$2 = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (inflateStateCheck(strm) || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$1;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n if (state.wbits === 0) {\n state.wbits = 15;\n }\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n if (len > 15 || len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n state.flags = 0; /* indicate zlib header */\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if ((state.flags & 0x0200) && (state.wrap & 4)) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 4) && hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT$1;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if ((state.wrap & 4) && _out) {\n strm.adler = state.check =\n /*UPDATE_CHECK(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$1;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR$1;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH$1))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if ((state.wrap & 4) && _out) {\n strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n ret = Z_BUF_ERROR$1;\n }\n return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n if (inflateStateCheck(strm)) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$1;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$1;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR$1;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$1;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2$1 = inflate$2;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCodesUsed = inflateCodesUsed;\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\nmodule.exports.inflateValidate = inflateValidate;\n*/\n\nvar inflate_1$2 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2$1,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n Z_NO_FLUSH, Z_FINISH,\n Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR, Z_BUF_ERROR\n} = constants$2;\n\n/* ===========================================================================*/\n\nconst defaultOptions = {\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n};\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate$1(options) {\n this.options = common.assign({}, defaultOptions, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1$2.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1$2.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate$1.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n // Convert data if needed\n if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1$2.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT && dictionary) {\n status = inflate_1$2.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK) {\n status = inflate_1$2.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR) {\n // Replace code with more verbose\n status = Z_NEED_DICT;\n }\n }\n\n // Only the gzip format defines concatenated members (RFC 1952: a gzip file\n // is \"a series of members\"). A zlib stream (RFC 1950) ends after its\n // ADLER32, and a raw DEFLATE stream (RFC 1951) ends after its final block -\n // neither format allows anything to follow, so bytes after the end are not\n // ours to interpret and must be left in the input. Restart decoding only\n // for a gzip member: `state.flags` is non-zero only once a gzip header has\n // actually been decoded (it stays 0 for a zlib member, even when the format\n // was auto-detected and the gzip bit of `wrap` is set). A trailing zero\n // byte is padding, not the start of a member (no member can begin with 0).\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END &&\n (strm.state.wrap & 2) && strm.state.flags !== 0 &&\n strm.input[strm.next_in] !== 0)\n {\n inflate_1$2.inflateReset(strm);\n status = inflate_1$2.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR:\n case Z_DATA_ERROR:\n case Z_NEED_DICT:\n case Z_MEM_ERROR:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n // Flush output if buffer is full, stream ended, or an explicit flush was\n // requested (e.g. Z_SYNC_FLUSH) - to push out the tail, same as node's zlib.\n if (strm.avail_out === 0 || status === Z_STREAM_END || _flush_mode > 0) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n\n // Force a fresh output buffer on next iteration / next push, so the\n // already emitted tail is not sent again.\n strm.avail_out = 0;\n strm.next_out = 0;\n }\n }\n }\n\n // A full output buffer means there may be more to produce - allocate a new\n // one and call inflate again. The status depends on the flush mode: with\n // Z_NO_FLUSH a full buffer is reported as Z_OK, but with Z_FINISH the same\n // situation is reported as Z_BUF_ERROR (\"could not make progress now\",\n // non-fatal) even though output is still pending. Both must continue; the\n // distinction that matters is purely \"was the output buffer exhausted\".\n if ((status === Z_OK || status === Z_BUF_ERROR) && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END) {\n status = inflate_1$2.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) {\n // Input is exhausted. If the caller declared this the end of the stream\n // (Z_FINISH) but we never saw Z_STREAM_END, the compressed data ended\n // before its terminating marker - i.e. it is truncated/incomplete. That\n // is an error: returning the partial output as success would be\n // indistinguishable from a complete decode, hiding the data loss. Report\n // it via Z_BUF_ERROR. (Reached only when the output buffer still had room\n // - a full buffer is handled by the `continue` above - so this genuinely\n // means \"ran out of input\", not \"ran out of output\".)\n if (_flush_mode === Z_FINISH) {\n status = inflate_1$2.inflateEnd(this.strm);\n this.onEnd(status === Z_OK ? Z_BUF_ERROR : status);\n this.ended = true;\n return false;\n }\n break;\n }\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate$1.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate$1.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err) {\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n const inflator = new Inflate$1(options);\n\n inflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw$1(input, options) {\n options = options || {};\n options.raw = true;\n return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1$1 = Inflate$1;\nvar inflate_2 = inflate$1;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip$1 = inflate$1;\nvar constants = constants$2;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1$1,\n\tinflate: inflate_2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip$1,\n\tconstants: constants\n};\n\nconst { Deflate, deflate, deflateRaw, gzip } = deflate_1$1;\n\nconst { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1;\n\n\n\nvar Deflate_1 = Deflate;\nvar deflate_1 = deflate;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar Inflate_1 = Inflate;\nvar inflate_1 = inflate;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip_1 = ungzip;\nvar constants_1 = constants$2;\n\nvar pako = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tInflate: Inflate_1,\n\tinflate: inflate_1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9wYWtvL2Rpc3QvcGFrby5lc20ubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQzs7QUFFQTs7O0FBR0EsdUJBQXVCLHNCQUFzQixxQkFBcUI7O0FBRWxFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBLG9DQUFvQztBQUNwQyxvQ0FBb0M7QUFDcEMsb0NBQW9DO0FBQ3BDLG9DQUFvQztBQUNwQyxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtB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eUI7O0FBRXpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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TUFBTTtBQUNOO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCLDJCQUEyQjs7QUFFM0I7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsU0FBUztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDs7QUFFQTtB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QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qjs7QUFFdkIsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0I7O0FBRXBCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0IsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QjtBQUNBLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCO0FBQ0EsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUI7OztBQUdBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsV0FBVyxJQUFJO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSwr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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RjtBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFNBQVM7QUFDL0M7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLCtCQUErQjs7QUFFaEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCO0FBQ3hCLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsd0JBQXdCOztBQUV4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRTtBQUMzRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLHFDQUFxQzs7QUFFN0MsUUFBUSx1Q0FBdUM7Ozs7QUFJL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRXlPIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9wYWtvL2Rpc3QvcGFrby5lc20ubWpzPzA0ODEiXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKiEgcGFrbyAyLjIuMCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28gQGxpY2Vuc2UgKE1JVCBBTkQgWmxpYikgKi9cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLyogZXNsaW50LWRpc2FibGUgc3BhY2UtdW5hcnktb3BzICovXG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vY29uc3QgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL2NvbnN0IFpfSFVGRk1BTl9PTkxZICAgICAgPSAyO1xuLy9jb25zdCBaX1JMRSAgICAgICAgICAgICAgID0gMztcbmNvbnN0IFpfRklYRUQkMSAgICAgICAgICAgICAgID0gNDtcbi8vY29uc3QgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbmNvbnN0IFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG5jb25zdCBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy9jb25zdCBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbmNvbnN0IFpfVU5LTk9XTiQxICAgICAgICAgICAgID0gMjtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5mdW5jdGlvbiB6ZXJvJDEoYnVmKSB7IGxldCBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxuY29uc3QgU1RPUkVEX0JMT0NLID0gMDtcbmNvbnN0IFNUQVRJQ19UUkVFUyA9IDE7XG5jb25zdCBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxuY29uc3QgTUlOX01BVENIJDEgICAgPSAzO1xuY29uc3QgTUFYX01BVENIJDEgICAgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbmNvbnN0IExFTkdUSF9DT0RFUyQxICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbmNvbnN0IExJVEVSQUxTJDEgICAgICA9IDI1Njtcbi8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqL1xuXG5jb25zdCBMX0NPREVTJDEgICAgICAgPSBMSVRFUkFMUyQxICsgMSArIExFTkdUSF9DT0RFUyQxO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbmNvbnN0IERfQ09ERVMkMSAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG5cbmNvbnN0IEJMX0NPREVTJDEgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbmNvbnN0IEhFQVBfU0laRSQxICAgICA9IDIgKiBMX0NPREVTJDEgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxuY29uc3QgTUFYX0JJVFMkMSAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxuY29uc3QgQnVmX3NpemUgICAgICA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTUFYX0JMX0JJVFMgPSA3O1xuLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqL1xuXG5jb25zdCBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxuY29uc3QgUkVQXzNfNiAgICAgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuY29uc3QgUkVQWl8zXzEwICAgPSAxNztcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG5jb25zdCBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbmNvbnN0IGV4dHJhX2xiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovXG4gIG5ldyBVaW50OEFycmF5KFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdKTtcblxuY29uc3QgZXh0cmFfZGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqL1xuICBuZXcgVWludDhBcnJheShbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10pO1xuXG5jb25zdCBleHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi9cbiAgbmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddKTtcblxuY29uc3QgYmxfb3JkZXIgPVxuICBuZXcgVWludDhBcnJheShbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxuY29uc3QgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zdGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG5jb25zdCBzdGF0aWNfbHRyZWUgID0gbmV3IEFycmF5KChMX0NPREVTJDEgKyAyKSAqIDIpO1xuemVybyQxKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbmNvbnN0IHN0YXRpY19kdHJlZSAgPSBuZXcgQXJyYXkoRF9DT0RFUyQxICogMik7XG56ZXJvJDEoc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxuY29uc3QgX2Rpc3RfY29kZSAgICA9IG5ldyBBcnJheShESVNUX0NPREVfTEVOKTtcbnplcm8kMShfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbmNvbnN0IF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENIJDEgLSBNSU5fTUFUQ0gkMSArIDEpO1xuemVybyQxKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbmNvbnN0IGJhc2VfbGVuZ3RoICAgPSBuZXcgQXJyYXkoTEVOR1RIX0NPREVTJDEpO1xuemVybyQxKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbmNvbnN0IGJhc2VfZGlzdCAgICAgPSBuZXcgQXJyYXkoRF9DT0RFUyQxKTtcbnplcm8kMShiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59XG5cblxubGV0IHN0YXRpY19sX2Rlc2M7XG5sZXQgc3RhdGljX2RfZGVzYztcbmxldCBzdGF0aWNfYmxfZGVzYztcblxuXG5mdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7XG4gIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5jb25zdCBkX2NvZGUgPSAoZGlzdCkgPT4ge1xuXG4gIHJldHVybiBkaXN0IDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2ICsgKGRpc3QgPj4+IDcpXTtcbn07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuY29uc3QgcHV0X3Nob3J0ID0gKHMsIHcpID0+IHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuY29uc3Qgc2VuZF9iaXRzID0gKHMsIHZhbHVlLCBsZW5ndGgpID0+IHtcblxuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59O1xuXG5cbmNvbnN0IHNlbmRfY29kZSA9IChzLCBjLCB0cmVlKSA9PiB7XG5cbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLyouQ29kZSovLCB0cmVlW2MgKiAyICsgMV0vKi5MZW4qLyk7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuY29uc3QgYmlfcmV2ZXJzZSA9IChjb2RlLCBsZW4pID0+IHtcblxuICBsZXQgcmVzID0gMDtcbiAgZG8ge1xuICAgIHJlcyB8PSBjb2RlICYgMTtcbiAgICBjb2RlID4+Pj0gMTtcbiAgICByZXMgPDw9IDE7XG4gIH0gd2hpbGUgKC0tbGVuID4gMCk7XG4gIHJldHVybiByZXMgPj4+IDE7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmNvbnN0IGJpX2ZsdXNoID0gKHMpID0+IHtcblxuICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gMDtcbiAgICBzLmJpX3ZhbGlkID0gMDtcblxuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkge1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAweGZmO1xuICAgIHMuYmlfYnVmID4+PSA4O1xuICAgIHMuYmlfdmFsaWQgLT0gODtcbiAgfVxufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuY29uc3QgZ2VuX2JpdGxlbiA9IChzLCBkZXNjKSA9PiB7XG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG5cbiAgY29uc3QgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgY29uc3QgbWF4X2NvZGUgICAgICAgID0gZGVzYy5tYXhfY29kZTtcbiAgY29uc3Qgc3RyZWUgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIGNvbnN0IGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgY29uc3QgZXh0cmEgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cztcbiAgY29uc3QgYmFzZSAgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYmFzZTtcbiAgY29uc3QgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgbGV0IGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIGxldCBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIGxldCBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICBsZXQgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgbGV0IGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgbGV0IG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFMkMTsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkUkMTsgaCsrKSB7XG4gICAgbiA9IHMuaGVhcFtoXTtcbiAgICBiaXRzID0gdHJlZVt0cmVlW24gKiAyICsgMV0vKi5EYWQqLyAqIDIgKyAxXS8qLkxlbiovICsgMTtcbiAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIHtcbiAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoO1xuICAgICAgb3ZlcmZsb3crKztcbiAgICB9XG4gICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovXG5cbiAgICBpZiAobiA+IG1heF9jb2RlKSB7IGNvbnRpbnVlOyB9IC8qIG5vdCBhIGxlYWYgbm9kZSAqL1xuXG4gICAgcy5ibF9jb3VudFtiaXRzXSsrO1xuICAgIHhiaXRzID0gMDtcbiAgICBpZiAobiA+PSBiYXNlKSB7XG4gICAgICB4Yml0cyA9IGV4dHJhW24gLSBiYXNlXTtcbiAgICB9XG4gICAgZiA9IHRyZWVbbiAqIDJdLyouRnJlcSovO1xuICAgIHMub3B0X2xlbiArPSBmICogKGJpdHMgKyB4Yml0cyk7XG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuICs9IGYgKiAoc3RyZWVbbiAqIDIgKyAxXS8qLkxlbiovICsgeGJpdHMpO1xuICAgIH1cbiAgfVxuICBpZiAob3ZlcmZsb3cgPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgLy8gVHJhY2V2KChzdGRlcnIsXCJcXG5iaXQgbGVuZ3RoIG92ZXJmbG93XFxuXCIpKTtcbiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi9cblxuICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqL1xuICBkbyB7XG4gICAgYml0cyA9IG1heF9sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7IGJpdHMtLTsgfVxuICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovICE9PSBiaXRzKSB7XG4gICAgICAgIC8vIFRyYWNldigoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZVxuICogb3B0aW1hbCkuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvclxuICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uXG4gKiAgICAgemVybyBjb2RlIGxlbmd0aC5cbiAqL1xuY29uc3QgZ2VuX2NvZGVzID0gKHRyZWUsIG1heF9jb2RlLCBibF9jb3VudCkgPT4ge1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xuXG4gIGNvbnN0IG5leHRfY29kZSA9IG5ldyBBcnJheShNQVhfQklUUyQxICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIGxldCBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICBsZXQgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgbGV0IG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFMkMTsgYml0cysrKSB7XG4gICAgY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGU7XG4gIH1cbiAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZVxuICAgKiBtdXN0IGJlIGFsbCBvbmVzLlxuICAgKi9cbiAgLy9Bc3NlcnQgKGNvZGUgKyBibF9jb3VudFtNQVhfQklUU10tMSA9PSAoMTw8TUFYX0JJVFMpLTEsXG4gIC8vICAgICAgICBcImluY29uc2lzdGVudCBiaXQgY291bnRzXCIpO1xuICAvL1RyYWNldigoc3RkZXJyLFwiXFxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCBcIiwgbWF4X2NvZGUpKTtcblxuICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgbGV0IGxlbiA9IHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovO1xuICAgIGlmIChsZW4gPT09IDApIHsgY29udGludWU7IH1cbiAgICAvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqL1xuICAgIHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pO1xuXG4gICAgLy9UcmFjZWN2KHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLFwiXFxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSBcIixcbiAgICAvLyAgICAgbiwgKGlzZ3JhcGgobikgPyBuIDogJyAnKSwgbGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTtcbiAgfVxufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmNvbnN0IHRyX3N0YXRpY19pbml0ID0gKCkgPT4ge1xuXG4gIGxldCBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG4gIGxldCBiaXRzOyAgICAgLyogYml0IGNvdW50ZXIgKi9cbiAgbGV0IGxlbmd0aDsgICAvKiBsZW5ndGggdmFsdWUgKi9cbiAgbGV0IGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovXG4gIGxldCBkaXN0OyAgICAgLyogZGlzdGFuY2UgaW5kZXggKi9cbiAgY29uc3QgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMkMSArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpXG4gIC8vaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjtcblxuICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovXG4vKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0cztcbiAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7XG4jZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyQxIC0gMTsgY29kZSsrKSB7XG4gICAgYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGxlbmd0aCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGxlbmd0aCAhPSAyNTZcIik7XG4gIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkXG4gICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlXG4gICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzpcbiAgICovXG4gIF9sZW5ndGhfY29kZVtsZW5ndGggLSAxXSA9IGNvZGU7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovXG4gIGRpc3QgPSAwO1xuICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgMTY7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2XCIpO1xuICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi9cbiAgZm9yICg7IGNvZGUgPCBEX0NPREVTJDE7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUyQxOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjU1KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZVxuICAgKiBhbGwgb25lcylcbiAgICovXG4gIGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsIExfQ09ERVMkMSArIDEsIGJsX2NvdW50KTtcblxuICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi9cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVMkMTsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMkMSArIDEsIExfQ09ERVMkMSwgTUFYX0JJVFMkMSk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUyQxLCBNQVhfQklUUyQxKTtcbiAgc3RhdGljX2JsX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2MobmV3IEFycmF5KDApLCBleHRyYV9ibGJpdHMsIDAsICAgICAgICAgQkxfQ09ERVMkMSwgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSBhIG5ldyBibG9jay5cbiAqL1xuY29uc3QgaW5pdF9ibG9jayA9IChzKSA9PiB7XG5cbiAgbGV0IG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUyQxOyAgbisrKSB7IHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVMkMTsgIG4rKykgeyBzLmR5bl9kdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUyQxOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMuc3ltX25leHQgPSBzLm1hdGNoZXMgPSAwO1xufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyIGFuZCBhbGlnbiB0aGUgb3V0cHV0IG9uIGEgYnl0ZSBib3VuZGFyeVxuICovXG5jb25zdCBiaV93aW5kdXAgPSAocykgPT5cbntcbiAgaWYgKHMuYmlfdmFsaWQgPiA4KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID4gMCkge1xuICAgIC8vcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmO1xuICB9XG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG59O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuY29uc3Qgc21hbGxlciA9ICh0cmVlLCBuLCBtLCBkZXB0aCkgPT4ge1xuXG4gIGNvbnN0IF9uMiA9IG4gKiAyO1xuICBjb25zdCBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0vKi5GcmVxKi8gPCB0cmVlW19tMl0vKi5GcmVxKi8gfHxcbiAgICAgICAgICh0cmVlW19uMl0vKi5GcmVxKi8gPT09IHRyZWVbX20yXS8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmNvbnN0IHBxZG93bmhlYXAgPSAocywgdHJlZSwgaykgPT4ge1xuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xuXG4gIGNvbnN0IHYgPSBzLmhlYXBba107XG4gIGxldCBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn07XG5cblxuLy8gaW5saW5lZCBtYW51YWxseVxuLy8gY29uc3QgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5jb25zdCBjb21wcmVzc19ibG9jayA9IChzLCBsdHJlZSwgZHRyZWUpID0+IHtcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjb25zdCBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovXG4vLyAgICBjb25zdCBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuXG4gIGxldCBkaXN0OyAgICAgICAgICAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbiAgbGV0IGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi9cbiAgbGV0IHN4ID0gMDsgICAgICAgICAvKiBydW5uaW5nIGluZGV4IGluIHN5bV9idWYgKi9cbiAgbGV0IGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIGxldCBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLnN5bV9uZXh0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IHMucGVuZGluZ19idWZbcy5zeW1fYnVmICsgc3grK10gJiAweGZmO1xuICAgICAgZGlzdCArPSAocy5wZW5kaW5nX2J1ZltzLnN5bV9idWYgKyBzeCsrXSAmIDB4ZmYpIDw8IDg7XG4gICAgICBsYyA9IHMucGVuZGluZ19idWZbcy5zeW1fYnVmICsgc3grK107XG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMkMSArIDEsIGx0cmVlKTsgLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovXG4gICAgICAgIH1cbiAgICAgICAgZGlzdC0tOyAvKiBkaXN0IGlzIG5vdyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7XG4gICAgICAgIC8vQXNzZXJ0IChjb2RlIDwgRF9DT0RFUywgXCJiYWQgZF9jb2RlXCIpO1xuXG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlLCBkdHJlZSk7ICAgICAgIC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgZGlzdCAtPSBiYXNlX2Rpc3RbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGRpc3QsIGV4dHJhKTsgICAvKiBzZW5kIHRoZSBleHRyYSBkaXN0YW5jZSBiaXRzICovXG4gICAgICAgIH1cbiAgICAgIH0gLyogbGl0ZXJhbCBvciBtYXRjaCBwYWlyID8gKi9cblxuICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgb3ZlcmxheSBiZXR3ZWVuIHBlbmRpbmdfYnVmIGFuZCBzeW1fYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQocy0+cGVuZGluZyA8IHMtPmxpdF9idWZzaXplICsgc3gsIFwicGVuZGluZ0J1ZiBvdmVyZmxvd1wiKTtcblxuICAgIH0gd2hpbGUgKHN4IDwgcy5zeW1fbmV4dCk7XG4gIH1cblxuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5jb25zdCBidWlsZF90cmVlID0gKHMsIGRlc2MpID0+IHtcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB0cmVlX2Rlc2MgKmRlc2M7IC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi9cblxuICBjb25zdCB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIGNvbnN0IHN0cmVlICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIGNvbnN0IGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgY29uc3QgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgbGV0IG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIGxldCBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgbGV0IG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkUkMTtcblxuICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykge1xuICAgIGlmICh0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgICAgcy5oZWFwWysrcy5oZWFwX2xlbl0gPSBtYXhfY29kZSA9IG47XG4gICAgICBzLmRlcHRoW25dID0gMDtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cyxcbiAgICogYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGJpdCBzaG91bGQgYmUgc2VudCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lXG4gICAqIHBvc3NpYmxlIGNvZGUuIFNvIHRvIGF2b2lkIHNwZWNpYWwgY2hlY2tzIGxhdGVyIG9uIHdlIGZvcmNlIGF0IGxlYXN0XG4gICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuXG4gICAqL1xuICB3aGlsZSAocy5oZWFwX2xlbiA8IDIpIHtcbiAgICBub2RlID0gcy5oZWFwWysrcy5oZWFwX2xlbl0gPSAobWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDApO1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gMTtcbiAgICBzLmRlcHRoW25vZGVdID0gMDtcbiAgICBzLm9wdF9sZW4tLTtcblxuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiAtPSBzdHJlZVtub2RlICogMiArIDFdLyouTGVuKi87XG4gICAgfVxuICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqL1xuICB9XG4gIGRlc2MubWF4X2NvZGUgPSBtYXhfY29kZTtcblxuICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsXG4gICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOlxuICAgKi9cbiAgZm9yIChuID0gKHMuaGVhcF9sZW4gPj4gMS8qaW50IC8yKi8pOyBuID49IDE7IG4tLSkgeyBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOyB9XG5cbiAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3b1xuICAgKiBmcmVxdWVudCBub2Rlcy5cbiAgICovXG4gIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqL1xuICBkbyB7XG4gICAgLy9wcXJlbW92ZShzLCB0cmVlLCBuKTsgIC8qIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeSAqL1xuICAgIC8qKiogcHFyZW1vdmUgKioqL1xuICAgIG4gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG4gICAgcy5oZWFwWzEvKlNNQUxMRVNUKi9dID0gcy5oZWFwW3MuaGVhcF9sZW4tLV07XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcbiAgICAvKioqL1xuXG4gICAgbSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTsgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi9cblxuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqL1xuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbTtcblxuICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovXG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSB0cmVlW24gKiAyXS8qLkZyZXEqLyArIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAocy5kZXB0aFtuXSA+PSBzLmRlcHRoW21dID8gcy5kZXB0aFtuXSA6IHMuZGVwdGhbbV0pICsgMTtcbiAgICB0cmVlW24gKiAyICsgMV0vKi5EYWQqLyA9IHRyZWVbbSAqIDIgKyAxXS8qLkRhZCovID0gbm9kZTtcblxuICAgIC8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovXG4gICAgcy5oZWFwWzEvKlNNQUxMRVNUKi9dID0gbm9kZSsrO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG5cbiAgfSB3aGlsZSAocy5oZWFwX2xlbiA+PSAyKTtcblxuICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcblxuICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LiBXZSBjYW4gbm93XG4gICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy5cbiAgICovXG4gIGdlbl9iaXRsZW4ocywgZGVzYyk7XG5cbiAgLyogVGhlIGZpZWxkIGxlbiBpcyBub3cgc2V0LCB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGJpdCBjb2RlcyAqL1xuICBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIHMuYmxfY291bnQpO1xufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmNvbnN0IHNjYW5fdHJlZSA9IChzLCB0cmVlLCBtYXhfY29kZSkgPT4ge1xuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cblxuICBsZXQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIGxldCBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgbGV0IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIGxldCBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICBsZXQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICBsZXQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIGxldCBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSBpbiBjb21wcmVzc2VkIGZvcm0sIHVzaW5nIHRoZSBjb2RlcyBpblxuICogYmxfdHJlZS5cbiAqL1xuY29uc3Qgc2VuZF90cmVlID0gKHMsIHRyZWUsIG1heF9jb2RlKSA9PiB7XG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cblxuICBsZXQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIGxldCBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgbGV0IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIGxldCBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICBsZXQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICBsZXQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIGxldCBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmNvbnN0IGJ1aWxkX2JsX3RyZWUgPSAocykgPT4ge1xuXG4gIGxldCBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyQxIC0gMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkge1xuICAgIGlmIChzLmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdICogMiArIDFdLyouTGVuKi8gIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqL1xuICBzLm9wdF9sZW4gKz0gMyAqIChtYXhfYmxpbmRleCArIDEpICsgNSArIDUgKyA0O1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGRcIixcbiAgLy8gICAgICAgIHMtPm9wdF9sZW4sIHMtPnN0YXRpY19sZW4pKTtcblxuICByZXR1cm4gbWF4X2JsaW5kZXg7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuY29uc3Qgc2VuZF9hbGxfdHJlZXMgPSAocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpID0+IHtcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovXG5cbiAgbGV0IHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENoZWNrIGlmIHRoZSBkYXRhIHR5cGUgaXMgVEVYVCBvciBCSU5BUlksIHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOlxuICogLSBURVhUIGlmIHRoZSB0d28gY29uZGl0aW9ucyBiZWxvdyBhcmUgc2F0aXNmaWVkOlxuICogICAgYSkgVGhlcmUgYXJlIG5vIG5vbi1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJibG9jayBsaXN0XCIgKDAuLjYsIDE0Li4yNSwgMjguLjMxKS5cbiAqICAgIGIpIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwcmludGFibGUgY2hhcmFjdGVyIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYWxsb3cgbGlzdFwiICg5IHtUQUJ9LCAxMCB7TEZ9LCAxMyB7Q1J9LCAzMi4uMjU1KS5cbiAqIC0gQklOQVJZIG90aGVyd2lzZS5cbiAqIC0gVGhlIGZvbGxvd2luZyBwYXJ0aWFsbHktcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGZvcm0gYVxuICogICBcImdyYXkgbGlzdFwiIHRoYXQgaXMgaWdub3JlZCBpbiB0aGlzIGRldGVjdGlvbiBhbGdvcml0aG06XG4gKiAgICg3IHtCRUx9LCA4IHtCU30sIDExIHtWVH0sIDEyIHtGRn0sIDI2IHtTVUJ9LCAyNyB7RVNDfSkuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgRnJlcSBvZiBkeW5fbHRyZWUgYXJlIHNldC5cbiAqL1xuY29uc3QgZGV0ZWN0X2RhdGFfdHlwZSA9IChzKSA9PiB7XG4gIC8qIGJsb2NrX21hc2sgaXMgdGhlIGJpdCBtYXNrIG9mIGJsb2NrLWxpc3RlZCBieXRlc1xuICAgKiBzZXQgYml0cyAwLi42LCAxNC4uMjUsIGFuZCAyOC4uMzFcbiAgICogMHhmM2ZmYzA3ZiA9IGJpbmFyeSAxMTExMDAxMTExMTExMTExMTEwMDAwMDAwMTExMTExMVxuICAgKi9cbiAgbGV0IGJsb2NrX21hc2sgPSAweGYzZmZjMDdmO1xuICBsZXQgbjtcblxuICAvKiBDaGVjayBmb3Igbm9uLXRleHR1YWwgKFwiYmxvY2stbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDw9IDMxOyBuKyssIGJsb2NrX21hc2sgPj4+PSAxKSB7XG4gICAgaWYgKChibG9ja19tYXNrICYgMSkgJiYgKHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkpIHtcbiAgICAgIHJldHVybiBaX0JJTkFSWTtcbiAgICB9XG4gIH1cblxuICAvKiBDaGVjayBmb3IgdGV4dHVhbCAoXCJhbGxvdy1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGlmIChzLmR5bl9sdHJlZVs5ICogMl0vKi5GcmVxKi8gIT09IDAgfHwgcy5keW5fbHRyZWVbMTAgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fFxuICAgICAgcy5keW5fbHRyZWVbMTMgKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgIHJldHVybiBaX1RFWFQ7XG4gIH1cbiAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUyQxOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsb2NrLWxpc3RlZFwiIG9yIFwiYWxsb3ctbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59O1xuXG5cbmxldCBzdGF0aWNfaW5pdF9kb25lID0gZmFsc2U7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtLlxuICovXG5jb25zdCBfdHJfaW5pdCQxID0gKHMpID0+XG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBzdG9yZWQgYmxvY2tcbiAqL1xuY29uc3QgX3RyX3N0b3JlZF9ibG9jayQxID0gKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCkgPT4ge1xuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG5cbiAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0sgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7ICAgIC8qIHNlbmQgYmxvY2sgdHlwZSAqL1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG4gIHB1dF9zaG9ydChzLCBzdG9yZWRfbGVuKTtcbiAgcHV0X3Nob3J0KHMsIH5zdG9yZWRfbGVuKTtcbiAgaWYgKHN0b3JlZF9sZW4pIHtcbiAgICBzLnBlbmRpbmdfYnVmLnNldChzLndpbmRvdy5zdWJhcnJheShidWYsIGJ1ZiArIHN0b3JlZF9sZW4pLCBzLnBlbmRpbmcpO1xuICB9XG4gIHMucGVuZGluZyArPSBzdG9yZWRfbGVuO1xufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuY29uc3QgX3RyX2FsaWduJDEgPSAocykgPT4ge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTIDw8IDEsIDMpO1xuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpO1xuICBiaV9mbHVzaChzKTtcbn07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgd3JpdGUgb3V0IHRoZSBlbmNvZGVkIGJsb2NrLlxuICovXG5jb25zdCBfdHJfZmx1c2hfYmxvY2skMSA9IChzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpID0+IHtcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG5cbiAgbGV0IG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgbGV0IG1heF9ibGluZGV4ID0gMDsgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOJDEpIHtcbiAgICAgIHMuc3RybS5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpO1xuICAgIH1cblxuICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi9cbiAgICBidWlsZF90cmVlKHMsIHMubF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuXG4gICAgYnVpbGRfdHJlZShzLCBzLmRfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG4gICAgLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mXG4gICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKi9cblxuICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWUgZm9yIHRoZSBhYm92ZSB0d28gdHJlZXMsIGFuZCBnZXQgdGhlIGluZGV4XG4gICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gICAgICovXG4gICAgbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKHMpO1xuXG4gICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqL1xuICAgIG9wdF9sZW5iID0gKHMub3B0X2xlbiArIDMgKyA3KSA+Pj4gMztcbiAgICBzdGF0aWNfbGVuYiA9IChzLnN0YXRpY19sZW4gKyAzICsgNykgPj4+IDM7XG5cbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSBcIixcbiAgICAvLyAgICAgICAgb3B0X2xlbmIsIHMtPm9wdF9sZW4sIHN0YXRpY19sZW5iLCBzLT5zdGF0aWNfbGVuLCBzdG9yZWRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zeW1fbmV4dCAvIDMpKTtcblxuICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCBcImxvc3QgYnVmXCIpO1xuICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi9cbiAgfVxuXG4gIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayQxKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCk7XG5cbiAgfSBlbHNlIGlmIChzLnN0cmF0ZWd5ID09PSBaX0ZJWEVEJDEgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZlxuICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLlxuICovXG5jb25zdCBfdHJfdGFsbHkkMSA9IChzLCBkaXN0LCBsYykgPT4ge1xuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG5cbiAgcy5wZW5kaW5nX2J1ZltzLnN5bV9idWYgKyBzLnN5bV9uZXh0KytdID0gZGlzdDtcbiAgcy5wZW5kaW5nX2J1ZltzLnN5bV9idWYgKyBzLnN5bV9uZXh0KytdID0gZGlzdCA+PiA4O1xuICBzLnBlbmRpbmdfYnVmW3Muc3ltX2J1ZiArIHMuc3ltX25leHQrK10gPSBsYztcbiAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi9cbiAgICBzLmR5bl9sdHJlZVtsYyAqIDJdLyouRnJlcSovKys7XG4gIH0gZWxzZSB7XG4gICAgcy5tYXRjaGVzKys7XG4gICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqL1xuICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgIC8vQXNzZXJ0KCh1c2gpZGlzdCA8ICh1c2gpTUFYX0RJU1QocykgJiZcbiAgICAvLyAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFUQ0gpICYmXG4gICAgLy8gICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICBcIl90cl90YWxseTogYmFkIG1hdGNoXCIpO1xuXG4gICAgcy5keW5fbHRyZWVbKF9sZW5ndGhfY29kZVtsY10gKyBMSVRFUkFMUyQxICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuICByZXR1cm4gKHMuc3ltX25leHQgPT09IHMuc3ltX2VuZCk7XG59O1xuXG52YXIgX3RyX2luaXRfMSAgPSBfdHJfaW5pdCQxO1xudmFyIF90cl9zdG9yZWRfYmxvY2tfMSA9IF90cl9zdG9yZWRfYmxvY2skMTtcbnZhciBfdHJfZmx1c2hfYmxvY2tfMSAgPSBfdHJfZmx1c2hfYmxvY2skMTtcbnZhciBfdHJfdGFsbHlfMSA9IF90cl90YWxseSQxO1xudmFyIF90cl9hbGlnbl8xID0gX3RyX2FsaWduJDE7XG5cbnZhciB0cmVlcyA9IHtcblx0X3RyX2luaXQ6IF90cl9pbml0XzEsXG5cdF90cl9zdG9yZWRfYmxvY2s6IF90cl9zdG9yZWRfYmxvY2tfMSxcblx0X3RyX2ZsdXNoX2Jsb2NrOiBfdHJfZmx1c2hfYmxvY2tfMSxcblx0X3RyX3RhbGx5OiBfdHJfdGFsbHlfMSxcblx0X3RyX2FsaWduOiBfdHJfYWxpZ25fMVxufTtcblxuLy8gTm90ZTogYWRsZXIzMiB0YWtlcyAxMiUgZm9yIGxldmVsIDAgYW5kIDIlIGZvciBsZXZlbCA2LlxuLy8gSXQgaXNuJ3Qgd29ydGggaXQgdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuY29uc3QgYWRsZXIzMiA9IChhZGxlciwgYnVmLCBsZW4sIHBvcykgPT4ge1xuICBsZXQgczEgPSAoYWRsZXIgJiAweGZmZmYpIHwwLFxuICAgICAgczIgPSAoKGFkbGVyID4+PiAxNikgJiAweGZmZmYpIHwwLFxuICAgICAgbiA9IDA7XG5cbiAgd2hpbGUgKGxlbiAhPT0gMCkge1xuICAgIC8vIFNldCBsaW1pdCB+IHR3aWNlIGxlc3MgdGhhbiA1NTUyLCB0byBrZWVwXG4gICAgLy8gczIgaW4gMzEtYml0cywgYmVjYXVzZSB3ZSBmb3JjZSBzaWduZWQgaW50cy5cbiAgICAvLyBpbiBvdGhlciBjYXNlICU9IHdpbGwgZmFpbC5cbiAgICBuID0gbGVuID4gMjAwMCA/IDIwMDAgOiBsZW47XG4gICAgbGVuIC09IG47XG5cbiAgICBkbyB7XG4gICAgICBzMSA9IChzMSArIGJ1Zltwb3MrK10pIHwwO1xuICAgICAgczIgPSAoczIgKyBzMSkgfDA7XG4gICAgfSB3aGlsZSAoLS1uKTtcblxuICAgIHMxICU9IDY1NTIxO1xuICAgIHMyICU9IDY1NTIxO1xuICB9XG5cbiAgcmV0dXJuIChzMSB8IChzMiA8PCAxNikpIHwwO1xufTtcblxuXG52YXIgYWRsZXIzMl8xID0gYWRsZXIzMjtcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5jb25zdCBtYWtlVGFibGUgPSAoKSA9PiB7XG4gIGxldCBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufTtcblxuLy8gQ3JlYXRlIHRhYmxlIG9uIGxvYWQuIEp1c3QgMjU1IHNpZ25lZCBsb25ncy4gTm90IGEgcHJvYmxlbS5cbmNvbnN0IGNyY1RhYmxlID0gbmV3IFVpbnQzMkFycmF5KG1ha2VUYWJsZSgpKTtcblxuXG5jb25zdCBjcmMzMiA9IChjcmMsIGJ1ZiwgbGVuLCBwb3MpID0+IHtcbiAgY29uc3QgdCA9IGNyY1RhYmxlO1xuICBjb25zdCBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAobGV0IGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59O1xuXG5cbnZhciBjcmMzMl8xID0gY3JjMzI7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIG1lc3NhZ2VzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgY29uc3RhbnRzJDIgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgWl9NRU1fRVJST1I6ICAgICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmNvbnN0IHsgX3RyX2luaXQsIF90cl9zdG9yZWRfYmxvY2ssIF90cl9mbHVzaF9ibG9jaywgX3RyX3RhbGx5LCBfdHJfYWxpZ24gfSA9IHRyZWVzO1xuXG5cblxuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuY29uc3Qge1xuICBaX05PX0ZMVVNIOiBaX05PX0ZMVVNIJDIsIFpfUEFSVElBTF9GTFVTSCwgWl9GVUxMX0ZMVVNIOiBaX0ZVTExfRkxVU0gkMSwgWl9GSU5JU0g6IFpfRklOSVNIJDMsIFpfQkxPQ0s6IFpfQkxPQ0skMSxcbiAgWl9PSzogWl9PSyQzLCBaX1NUUkVBTV9FTkQ6IFpfU1RSRUFNX0VORCQzLCBaX1NUUkVBTV9FUlJPUjogWl9TVFJFQU1fRVJST1IkMiwgWl9EQVRBX0VSUk9SOiBaX0RBVEFfRVJST1IkMiwgWl9CVUZfRVJST1I6IFpfQlVGX0VSUk9SJDIsXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogWl9ERUZBVUxUX0NPTVBSRVNTSU9OJDEsXG4gIFpfRklMVEVSRUQsIFpfSFVGRk1BTl9PTkxZLCBaX1JMRSwgWl9GSVhFRCwgWl9ERUZBVUxUX1NUUkFURUdZOiBaX0RFRkFVTFRfU1RSQVRFR1kkMSxcbiAgWl9VTktOT1dOLFxuICBaX0RFRkxBVEVEOiBaX0RFRkxBVEVEJDJcbn0gPSBjb25zdGFudHMkMjtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5jb25zdCBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xuY29uc3QgTUFYX1dCSVRTJDEgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xuY29uc3QgREVGX01FTV9MRVZFTCA9IDg7XG5cblxuY29uc3QgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5jb25zdCBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5jb25zdCBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5jb25zdCBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cbmNvbnN0IEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuY29uc3QgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5jb25zdCBNQVhfQklUUyAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG5jb25zdCBNSU5fTUFUQ0ggPSAzO1xuY29uc3QgTUFYX01BVENIID0gMjU4O1xuY29uc3QgTUlOX0xPT0tBSEVBRCA9IChNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKTtcblxuY29uc3QgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG5jb25zdCBJTklUX1NUQVRFICAgID0gIDQyOyAgICAvKiB6bGliIGhlYWRlciAtPiBCVVNZX1NUQVRFICovXG4vLyNpZmRlZiBHWklQXG5jb25zdCBHWklQX1NUQVRFICAgID0gIDU3OyAgICAvKiBnemlwIGhlYWRlciAtPiBCVVNZX1NUQVRFIHwgRVhUUkFfU1RBVEUgKi9cbi8vI2VuZGlmXG5jb25zdCBFWFRSQV9TVEFURSAgID0gIDY5OyAgICAvKiBnemlwIGV4dHJhIGJsb2NrIC0+IE5BTUVfU1RBVEUgKi9cbmNvbnN0IE5BTUVfU1RBVEUgICAgPSAgNzM7ICAgIC8qIGd6aXAgZmlsZSBuYW1lIC0+IENPTU1FTlRfU1RBVEUgKi9cbmNvbnN0IENPTU1FTlRfU1RBVEUgPSAgOTE7ICAgIC8qIGd6aXAgY29tbWVudCAtPiBIQ1JDX1NUQVRFICovXG5jb25zdCBIQ1JDX1NUQVRFICAgID0gMTAzOyAgICAvKiBnemlwIGhlYWRlciBDUkMgLT4gQlVTWV9TVEFURSAqL1xuY29uc3QgQlVTWV9TVEFURSAgICA9IDExMzsgICAgLyogZGVmbGF0ZSAtPiBGSU5JU0hfU1RBVEUgKi9cbmNvbnN0IEZJTklTSF9TVEFURSAgPSA2NjY7ICAgIC8qIHN0cmVhbSBjb21wbGV0ZSAqL1xuXG5jb25zdCBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xuY29uc3QgQlNfQkxPQ0tfRE9ORSAgICAgPSAyOyAvKiBibG9jayBmbHVzaCBwZXJmb3JtZWQgKi9cbmNvbnN0IEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbmNvbnN0IEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG5jb25zdCBPU19DT0RFID0gMHgwMzsgLy8gVW5peCA6KSAuIERvbid0IGRldGVjdCwgdXNlIHRoaXMgZGVmYXVsdC5cblxuY29uc3QgZXJyID0gKHN0cm0sIGVycm9yQ29kZSkgPT4ge1xuICBzdHJtLm1zZyA9IG1lc3NhZ2VzW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59O1xuXG5jb25zdCByYW5rID0gKGYpID0+IHtcbiAgcmV0dXJuICgoZikgKiAyKSAtICgoZikgPiA0ID8gOSA6IDApO1xufTtcblxuY29uc3QgemVybyA9IChidWYpID0+IHtcbiAgbGV0IGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfVxufTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSB3aGVuIHNsaWRpbmcgdGhlIHdpbmRvdyBkb3duIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzJcbiAqIGJpdCB2YWx1ZXMgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDAgdG9cbiAqIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDAgbGF0ZXIuXG4gKi9cbmNvbnN0IHNsaWRlX2hhc2ggPSAocykgPT4ge1xuICBsZXQgbiwgbTtcbiAgbGV0IHA7XG4gIGxldCB3c2l6ZSA9IHMud19zaXplO1xuXG4gIG4gPSBzLmhhc2hfc2l6ZTtcbiAgcCA9IG47XG4gIGRvIHtcbiAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgcy5oZWFkW3BdID0gKG0gPj0gd3NpemUgPyBtIC0gd3NpemUgOiAwKTtcbiAgfSB3aGlsZSAoLS1uKTtcbiAgbiA9IHdzaXplO1xuLy8jaWZuZGVmIEZBU1RFU1RcbiAgcCA9IG47XG4gIGRvIHtcbiAgICBtID0gcy5wcmV2Wy0tcF07XG4gICAgcy5wcmV2W3BdID0gKG0gPj0gd3NpemUgPyBtIC0gd3NpemUgOiAwKTtcbiAgICAvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dFxuICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICovXG4gIH0gd2hpbGUgKC0tbik7XG4vLyNlbmRpZlxufTtcblxuLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xubGV0IEhBU0ggPSAocywgcHJldiwgZGF0YSkgPT4gKChwcmV2IDw8IHMuaGFzaF9zaGlmdCkgXiBkYXRhKSAmIHMuaGFzaF9tYXNrO1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5zZXJ0IHN0cmluZyBzdHIgaW4gdGhlIGRpY3Rpb25hcnkgYW5kIHNldCBtYXRjaF9oZWFkIHRvIHRoZSBwcmV2aW91cyBoZWFkXG4gKiBvZiB0aGUgaGFzaCBjaGFpbiAodGhlIG1vc3QgcmVjZW50IHN0cmluZyB3aXRoIHNhbWUgaGFzaCBrZXkpLiBSZXR1cm5cbiAqIHRoZSBwcmV2aW91cyBsZW5ndGggb2YgdGhlIGhhc2ggY2hhaW4uXG4gKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlIGlucHV0XG4gKiAgICBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHN0ciBhcmUgdmFsaWQgKGV4Y2VwdCBmb3JcbiAqICAgIHRoZSBsYXN0IE1JTl9NQVRDSC0xIGJ5dGVzIG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAqL1xuY29uc3QgSU5TRVJUX1NUUklORyA9IChzLCBzdHIpID0+IHtcbiAgbGV0IGg7XG4gIGlmIChzLmxlZ2FjeV9oYXNoKSB7XG4gICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1soc3RyKSArIChNSU5fTUFUQ0gtMSldKTsgKi9cbiAgICBoID0gcy5pbnNfaCA9IEhBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pO1xuICB9IGVsc2Uge1xuICAgIC8vIEFOWkFDKysgaGFzaDogcmVhZHMgNCBieXRlcywgbWF0Y2hlcyBub2RlLmpzIHpsaWIgb3V0cHV0IChsZWdhY3lIYXNoXG4gICAgLy8gcmVzdG9yZXMgY2xhc3NpYyB6bGliIGhhc2gpLiBGYXN0ZXIsIHdpdGggZmV3ZXIgY29sbGlzaW9ucy5cbiAgICBjb25zdCB3ID0gcy53aW5kb3c7XG4gICAgLy8gUmVhZCA0IGJ5dGVzIGxpdHRsZS1lbmRpYW4uIE1hdGguaW11bCByZXByb2R1Y2VzIEMgdWludDMyIG92ZXJmbG93IGluXG4gICAgLy8gYCh2YWx1ZSAqIDY2NTIxICsgNjY1MjEpID4+IDE2YCBleGFjdGx5LlxuICAgIGNvbnN0IHZhbHVlID0gd1tzdHJdIHwgKHdbc3RyICsgMV0gPDwgOCkgfCAod1tzdHIgKyAyXSA8PCAxNikgfCAod1tzdHIgKyAzXSA8PCAyNCk7XG4gICAgaCA9IHMuaW5zX2ggPSAoKE1hdGguaW11bCh2YWx1ZSwgNjY1MjEpICsgNjY1MjEpID4+PiAxNikgJiBzLmhhc2hfbWFzaztcbiAgfVxuICBjb25zdCBoYXNoX2hlYWQgPSBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW2hdO1xuICBzLmhlYWRbaF0gPSBzdHI7XG4gIHJldHVybiBoYXNoX2hlYWQ7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0LCBleGNlcHQgZm9yXG4gKiBzb21lIGRlZmxhdGVfc3RvcmVkKCkgb3V0cHV0LCBnb2VzIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lXG4gKiBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZVxuICogc3RybS0+bmV4dF9vdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuIChTZWUgYWxzbyByZWFkX2J1ZigpKS5cbiAqL1xuY29uc3QgZmx1c2hfcGVuZGluZyA9IChzdHJtKSA9PiB7XG4gIGNvbnN0IHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIGxldCBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgc3RybS5vdXRwdXQuc2V0KHMucGVuZGluZ19idWYuc3ViYXJyYXkocy5wZW5kaW5nX291dCwgcy5wZW5kaW5nX291dCArIGxlbiksIHN0cm0ubmV4dF9vdXQpO1xuICBzdHJtLm5leHRfb3V0ICArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAgICAgIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59O1xuXG5cbmNvbnN0IGZsdXNoX2Jsb2NrX29ubHkgPSAocywgbGFzdCkgPT4ge1xuICBfdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn07XG5cblxuY29uc3QgcHV0X2J5dGUgPSAocywgYikgPT4ge1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGI7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuY29uc3QgcHV0U2hvcnRNU0IgPSAocywgYikgPT4ge1xuXG4gIC8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyXG4gKiBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaFxuICogdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQgdG8gYXZvaWRcbiAqIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5pbnB1dCBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC5cbiAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLlxuICovXG5jb25zdCByZWFkX2J1ZiA9IChzdHJtLCBidWYsIHN0YXJ0LCBzaXplKSA9PiB7XG5cbiAgbGV0IGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIGJ1Zi5zZXQoc3RybS5pbnB1dC5zdWJhcnJheShzdHJtLm5leHRfaW4sIHN0cm0ubmV4dF9pbiArIGxlbiksIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyXzEoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMl8xKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gKz0gbGVuO1xuICBzdHJtLnRvdGFsX2luICs9IGxlbjtcblxuICByZXR1cm4gbGVuO1xufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmNvbnN0IGxvbmdlc3RfbWF0Y2ggPSAocywgY3VyX21hdGNoKSA9PiB7XG5cbiAgbGV0IGNoYWluX2xlbmd0aCA9IHMubWF4X2NoYWluX2xlbmd0aDsgICAgICAvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi9cbiAgbGV0IHNjYW4gPSBzLnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqL1xuICBsZXQgbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqL1xuICBsZXQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovXG4gIGxldCBiZXN0X2xlbiA9IHMucHJldl9sZW5ndGg7ICAgICAgICAgICAgICAvKiBiZXN0IG1hdGNoIGxlbmd0aCBzbyBmYXIgKi9cbiAgbGV0IG5pY2VfbWF0Y2ggPSBzLm5pY2VfbWF0Y2g7ICAgICAgICAgICAgIC8qIHN0b3AgaWYgbWF0Y2ggbG9uZyBlbm91Z2ggKi9cbiAgY29uc3QgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICBjb25zdCBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgY29uc3Qgd21hc2sgPSBzLndfbWFzaztcbiAgY29uc3QgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgY29uc3Qgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgbGV0IHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICBsZXQgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuY29uc3QgZmlsbF93aW5kb3cgPSAocykgPT4ge1xuXG4gIGNvbnN0IF93X3NpemUgPSBzLndfc2l6ZTtcbiAgbGV0IG4sIG1vcmUsIHN0cjtcblxuICAvL0Fzc2VydChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFELCBcImFscmVhZHkgZW5vdWdoIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgbW9yZSA9IHMud2luZG93X3NpemUgLSBzLmxvb2thaGVhZCAtIHMuc3Ryc3RhcnQ7XG5cbiAgICAvLyBKUyBpbnRzIGhhdmUgMzIgYml0LCBibG9jayBiZWxvdyBub3QgbmVlZGVkXG4gICAgLyogRGVhbCB3aXRoICFAIyQlIDY0SyBsaW1pdDogKi9cbiAgICAvL2lmIChzaXplb2YoaW50KSA8PSAyKSB7XG4gICAgLy8gICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7XG4gICAgLy8gICAgICAgIG1vcmUgPSB3c2l6ZTtcbiAgICAvL1xuICAgIC8vICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHtcbiAgICAvLyAgICAgICAgLyogVmVyeSB1bmxpa2VseSwgYnV0IHBvc3NpYmxlIG9uIDE2IGJpdCBtYWNoaW5lIGlmXG4gICAgLy8gICAgICAgICAqIHN0cnN0YXJ0ID09IDAgJiYgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgYSBieXRlIGF0IHRpbWUpXG4gICAgLy8gICAgICAgICAqL1xuICAgIC8vICAgICAgICBtb3JlLS07XG4gICAgLy8gICAgfVxuICAgIC8vfVxuXG5cbiAgICAvKiBJZiB0aGUgd2luZG93IGlzIGFsbW9zdCBmdWxsIGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLFxuICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgPj0gX3dfc2l6ZSArIChfd19zaXplIC0gTUlOX0xPT0tBSEVBRCkpIHtcblxuICAgICAgcy53aW5kb3cuc2V0KHMud2luZG93LnN1YmFycmF5KF93X3NpemUsIF93X3NpemUgKyBfd19zaXplIC0gbW9yZSksIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcbiAgICAgIGlmIChzLmluc2VydCA+IHMuc3Ryc3RhcnQpIHtcbiAgICAgICAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0O1xuICAgICAgfVxuICAgICAgc2xpZGVfaGFzaChzKTtcbiAgICAgIG1vcmUgKz0gX3dfc2l6ZTtcbiAgICB9XG4gICAgaWYgKHMuc3RybS5hdmFpbF9pbiA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyogSWYgdGhlcmUgd2FzIG5vIHNsaWRpbmc6XG4gICAgICogICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiZcbiAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnRcbiAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gKE1JTl9MT09LQUhFQUQtMSArIFdTSVpFICsgTUFYX0RJU1QtMSlcbiAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gMipXU0laRSArIDJcbiAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSxcbiAgICAgKiAgIHdpbmRvd19zaXplID09IGlucHV0X3NpemUgKyBNSU5fTE9PS0FIRUFEICAmJlxuICAgICAqICAgc3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgPD0gaW5wdXRfc2l6ZSA9PiBtb3JlID49IE1JTl9MT09LQUhFQUQuXG4gICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi5cbiAgICAgKiBJZiB0aGVyZSB3YXMgc2xpZGluZywgbW9yZSA+PSBXU0laRS4gU28gaW4gYWxsIGNhc2VzLCBtb3JlID49IDIuXG4gICAgICovXG4gICAgLy9Bc3NlcnQobW9yZSA+PSAyLCBcIm1vcmUgPCAyXCIpO1xuICAgIG4gPSByZWFkX2J1ZihzLnN0cm0sIHMud2luZG93LCBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQsIG1vcmUpO1xuICAgIHMubG9va2FoZWFkICs9IG47XG5cbiAgICAvKiBJbml0aWFsaXplIHRoZSBoYXNoIHZhbHVlIG5vdyB0aGF0IHdlIGhhdmUgc29tZSBpbnB1dDogKi9cbiAgICBpZiAoIXMubGVnYWN5X2hhc2gpIHtcbiAgICAgIC8qIFRoZSA0LWJ5dGUgaGFzaCByZWFkcyBvbmUgZXh0cmEgYnl0ZSwgc28gaXQgbmVlZHMgb25lIG1vcmUgYXZhaWxhYmxlLiAqL1xuICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPiBNSU5fTUFUQ0gpIHtcbiAgICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHN0cik7XG4gICAgICAgICAgc3RyKys7XG4gICAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIHN0ciA9IHMuc3Ryc3RhcnQgLSBzLmluc2VydDtcbiAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzdHJdO1xuXG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIDFdKTsgKi9cbiAgICAgIHMuaW5zX2ggPSBIQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3N0ciArIDFdKTtcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzdHIpO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICBjb25zdCBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgbGV0IGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqXG4gKiBJbiBjYXNlIGRlZmxhdGVQYXJhbXMoKSBpcyB1c2VkIHRvIGxhdGVyIHN3aXRjaCB0byBhIG5vbi16ZXJvIGNvbXByZXNzaW9uXG4gKiBsZXZlbCwgcy0+bWF0Y2hlcyAob3RoZXJ3aXNlIHVudXNlZCB3aGVuIHN0b3JpbmcpIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXJcbiAqIG9mIGhhc2ggdGFibGUgc2xpZGVzIHRvIHBlcmZvcm0uIElmIHMtPm1hdGNoZXMgaXMgMSwgdGhlbiBvbmUgaGFzaCB0YWJsZVxuICogc2xpZGUgd2lsbCBiZSBkb25lIHdoZW4gc3dpdGNoaW5nLiBJZiBzLT5tYXRjaGVzIGlzIDIsIHRoZSBtYXhpbXVtIHZhbHVlXG4gKiBhbGxvd2VkIGhlcmUsIHRoZW4gdGhlIGhhc2ggdGFibGUgd2lsbCBiZSBjbGVhcmVkLCBzaW5jZSB0d28gb3IgbW9yZSBzbGlkZXNcbiAqIGlzIHRoZSBzYW1lIGFzIGEgY2xlYXIuXG4gKlxuICogZGVmbGF0ZV9zdG9yZWQoKSBpcyB3cml0dGVuIHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgdGltZXMgYW4gaW5wdXQgYnl0ZSBpc1xuICogY29waWVkLiBJdCBpcyBtb3N0IGVmZmljaWVudCB3aXRoIGxhcmdlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycywgd2hpY2hcbiAqIG1heGltaXplcyB0aGUgb3Bwb3J0dW5pdGVzIHRvIGhhdmUgYSBzaW5nbGUgY29weSBmcm9tIG5leHRfaW4gdG8gbmV4dF9vdXQuXG4gKi9cbmNvbnN0IGRlZmxhdGVfc3RvcmVkID0gKHMsIGZsdXNoKSA9PiB7XG5cbiAgLyogU21hbGxlc3Qgd29ydGh5IGJsb2NrIHNpemUgd2hlbiBub3QgZmx1c2hpbmcgb3IgZmluaXNoaW5nLiBCeSBkZWZhdWx0XG4gICAqIHRoaXMgaXMgMzJLLiBUaGlzIGNhbiBiZSBhcyBzbWFsbCBhcyA1MDcgYnl0ZXMgZm9yIG1lbUxldmVsID09IDEuIEZvclxuICAgKiBsYXJnZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMsIHRoZSBzdG9yZWQgYmxvY2sgc2l6ZSB3aWxsIGJlIGxhcmdlci5cbiAgICovXG4gIGxldCBtaW5fYmxvY2sgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1ID4gcy53X3NpemUgPyBzLndfc2l6ZSA6IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG5cbiAgLyogQ29weSBhcyBtYW55IG1pbl9ibG9jayBvciBsYXJnZXIgc3RvcmVkIGJsb2NrcyBkaXJlY3RseSB0byBuZXh0X291dCBhc1xuICAgKiBwb3NzaWJsZS4gSWYgZmx1c2hpbmcsIGNvcHkgdGhlIHJlbWFpbmluZyBhdmFpbGFibGUgaW5wdXQgdG8gbmV4dF9vdXQgYXNcbiAgICogc3RvcmVkIGJsb2NrcywgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlLlxuICAgKi9cbiAgbGV0IGxlbiwgbGVmdCwgaGF2ZSwgbGFzdCA9IDA7XG4gIGxldCB1c2VkID0gcy5zdHJtLmF2YWlsX2luO1xuICBkbyB7XG4gICAgLyogU2V0IGxlbiB0byB0aGUgbWF4aW11bSBzaXplIGJsb2NrIHRoYXQgd2UgY2FuIGNvcHkgZGlyZWN0bHkgd2l0aCB0aGVcbiAgICAgKiBhdmFpbGFibGUgaW5wdXQgZGF0YSBhbmQgb3V0cHV0IHNwYWNlLiBTZXQgbGVmdCB0byBob3cgbXVjaCBvZiB0aGF0XG4gICAgICogd291bGQgYmUgY29waWVkIGZyb20gd2hhdCdzIGxlZnQgaW4gdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBsZW4gPSA2NTUzNS8qIE1BWF9TVE9SRUQgKi87ICAgICAvKiBtYXhpbXVtIGRlZmxhdGUgc3RvcmVkIGJsb2NrIGxlbmd0aCAqL1xuICAgIGhhdmUgPSAocy5iaV92YWxpZCArIDQyKSA+PiAzOyAgICAgLyogbnVtYmVyIG9mIGhlYWRlciBieXRlcyAqL1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0IDwgaGF2ZSkgeyAgICAgICAgIC8qIG5lZWQgcm9vbSBmb3IgaGVhZGVyICovXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgICAvKiBtYXhpbXVtIHN0b3JlZCBibG9jayBsZW5ndGggdGhhdCB3aWxsIGZpdCBpbiBhdmFpbF9vdXQ6ICovXG4gICAgaGF2ZSA9IHMuc3RybS5hdmFpbF9vdXQgLSBoYXZlO1xuICAgIGxlZnQgPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDsgIC8qIGJ5dGVzIGxlZnQgaW4gd2luZG93ICovXG4gICAgaWYgKGxlbiA+IGxlZnQgKyBzLnN0cm0uYXZhaWxfaW4pIHtcbiAgICAgIGxlbiA9IGxlZnQgKyBzLnN0cm0uYXZhaWxfaW47ICAgLyogbGltaXQgbGVuIHRvIHRoZSBpbnB1dCAqL1xuICAgIH1cbiAgICBpZiAobGVuID4gaGF2ZSkge1xuICAgICAgbGVuID0gaGF2ZTsgICAgICAgICAgICAgLyogbGltaXQgbGVuIHRvIHRoZSBvdXRwdXQgKi9cbiAgICB9XG5cbiAgICAvKiBJZiB0aGUgc3RvcmVkIGJsb2NrIHdvdWxkIGJlIGxlc3MgdGhhbiBtaW5fYmxvY2sgaW4gbGVuZ3RoLCBvciBpZlxuICAgICAqIHVuYWJsZSB0byBjb3B5IGFsbCBvZiB0aGUgYXZhaWxhYmxlIGlucHV0IHdoZW4gZmx1c2hpbmcsIHRoZW4gdHJ5XG4gICAgICogY29weWluZyB0byB0aGUgd2luZG93IGFuZCB0aGUgcGVuZGluZyBidWZmZXIgaW5zdGVhZC4gQWxzbyBkb24ndFxuICAgICAqIHdyaXRlIGFuIGVtcHR5IGJsb2NrIHdoZW4gZmx1c2hpbmcgLS0gZGVmbGF0ZSgpIGRvZXMgdGhhdC5cbiAgICAgKi9cbiAgICBpZiAobGVuIDwgbWluX2Jsb2NrICYmICgobGVuID09PSAwICYmIGZsdXNoICE9PSBaX0ZJTklTSCQzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2ggPT09IFpfTk9fRkxVU0gkMiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuICE9PSBsZWZ0ICsgcy5zdHJtLmF2YWlsX2luKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyogTWFrZSBhIGR1bW15IHN0b3JlZCBibG9jayBpbiBwZW5kaW5nIHRvIGdldCB0aGUgaGVhZGVyIGJ5dGVzLFxuICAgICAqIGluY2x1ZGluZyBhbnkgcGVuZGluZyBiaXRzLiBUaGlzIGFsc28gdXBkYXRlcyB0aGUgZGVidWdnaW5nIGNvdW50cy5cbiAgICAgKi9cbiAgICBsYXN0ID0gZmx1c2ggPT09IFpfRklOSVNIJDMgJiYgbGVuID09PSBsZWZ0ICsgcy5zdHJtLmF2YWlsX2luID8gMSA6IDA7XG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCAwLCAwLCBsYXN0KTtcblxuICAgIC8qIFJlcGxhY2UgdGhlIGxlbmd0aHMgaW4gdGhlIGR1bW15IHN0b3JlZCBibG9jayB3aXRoIGxlbi4gKi9cbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZyAtIDRdID0gbGVuO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nIC0gM10gPSBsZW4gPj4gODtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZyAtIDJdID0gfmxlbjtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZyAtIDFdID0gfmxlbiA+PiA4O1xuXG4gICAgLyogV3JpdGUgdGhlIHN0b3JlZCBibG9jayBoZWFkZXIgYnl0ZXMuICovXG4gICAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xuXG4vLyNpZmRlZiBaTElCX0RFQlVHXG4vLyAgICAvKiBVcGRhdGUgZGVidWdnaW5nIGNvdW50cyBmb3IgdGhlIGRhdGEgYWJvdXQgdG8gYmUgY29waWVkLiAqL1xuLy8gICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gbGVuIDw8IDM7XG4vLyAgICBzLT5iaXRzX3NlbnQgKz0gbGVuIDw8IDM7XG4vLyNlbmRpZlxuXG4gICAgLyogQ29weSB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgd2luZG93IHRvIG5leHRfb3V0LiAqL1xuICAgIGlmIChsZWZ0KSB7XG4gICAgICBpZiAobGVmdCA+IGxlbikge1xuICAgICAgICBsZWZ0ID0gbGVuO1xuICAgICAgfVxuICAgICAgLy96bWVtY3B5KHMtPnN0cm0tPm5leHRfb3V0LCBzLT53aW5kb3cgKyBzLT5ibG9ja19zdGFydCwgbGVmdCk7XG4gICAgICBzLnN0cm0ub3V0cHV0LnNldChzLndpbmRvdy5zdWJhcnJheShzLmJsb2NrX3N0YXJ0LCBzLmJsb2NrX3N0YXJ0ICsgbGVmdCksIHMuc3RybS5uZXh0X291dCk7XG4gICAgICBzLnN0cm0ubmV4dF9vdXQgKz0gbGVmdDtcbiAgICAgIHMuc3RybS5hdmFpbF9vdXQgLT0gbGVmdDtcbiAgICAgIHMuc3RybS50b3RhbF9vdXQgKz0gbGVmdDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgKz0gbGVmdDtcbiAgICAgIGxlbiAtPSBsZWZ0O1xuICAgIH1cblxuICAgIC8qIENvcHkgdW5jb21wcmVzc2VkIGJ5dGVzIGRpcmVjdGx5IGZyb20gbmV4dF9pbiB0byBuZXh0X291dCwgdXBkYXRpbmdcbiAgICAgKiB0aGUgY2hlY2sgdmFsdWUuXG4gICAgICovXG4gICAgaWYgKGxlbikge1xuICAgICAgcmVhZF9idWYocy5zdHJtLCBzLnN0cm0ub3V0cHV0LCBzLnN0cm0ubmV4dF9vdXQsIGxlbik7XG4gICAgICBzLnN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICAgICAgcy5zdHJtLmF2YWlsX291dCAtPSBsZW47XG4gICAgICBzLnN0cm0udG90YWxfb3V0ICs9IGxlbjtcbiAgICB9XG4gIH0gd2hpbGUgKGxhc3QgPT09IDApO1xuXG4gIC8qIFVwZGF0ZSB0aGUgc2xpZGluZyB3aW5kb3cgd2l0aCB0aGUgbGFzdCBzLT53X3NpemUgYnl0ZXMgb2YgdGhlIGNvcGllZFxuICAgKiBkYXRhLCBvciBhcHBlbmQgYWxsIG9mIHRoZSBjb3BpZWQgZGF0YSB0byB0aGUgZXhpc3Rpbmcgd2luZG93IGlmIGxlc3NcbiAgICogdGhhbiBzLT53X3NpemUgYnl0ZXMgd2VyZSBjb3BpZWQuIEFsc28gdXBkYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG9cbiAgICogaW5zZXJ0IGluIHRoZSBoYXNoIHRhYmxlcywgaW4gdGhlIGV2ZW50IHRoYXQgZGVmbGF0ZVBhcmFtcygpIHN3aXRjaGVzIHRvXG4gICAqIGEgbm9uLXplcm8gY29tcHJlc3Npb24gbGV2ZWwuXG4gICAqL1xuICB1c2VkIC09IHMuc3RybS5hdmFpbF9pbjsgICAgLyogbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGRpcmVjdGx5IGNvcGllZCAqL1xuICBpZiAodXNlZCkge1xuICAgIC8qIElmIGFueSBpbnB1dCB3YXMgdXNlZCwgdGhlbiBubyB1bnVzZWQgaW5wdXQgcmVtYWlucyBpbiB0aGUgd2luZG93LFxuICAgICAqIHRoZXJlZm9yZSBzLT5ibG9ja19zdGFydCA9PSBzLT5zdHJzdGFydC5cbiAgICAgKi9cbiAgICBpZiAodXNlZCA+PSBzLndfc2l6ZSkgeyAgLyogc3VwcGxhbnQgdGhlIHByZXZpb3VzIGhpc3RvcnkgKi9cbiAgICAgIHMubWF0Y2hlcyA9IDI7ICAgICAvKiBjbGVhciBoYXNoICovXG4gICAgICAvL3ptZW1jcHkocy0+d2luZG93LCBzLT5zdHJtLT5uZXh0X2luIC0gcy0+d19zaXplLCBzLT53X3NpemUpO1xuICAgICAgcy53aW5kb3cuc2V0KHMuc3RybS5pbnB1dC5zdWJhcnJheShzLnN0cm0ubmV4dF9pbiAtIHMud19zaXplLCBzLnN0cm0ubmV4dF9pbiksIDApO1xuICAgICAgcy5zdHJzdGFydCA9IHMud19zaXplO1xuICAgICAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChzLndpbmRvd19zaXplIC0gcy5zdHJzdGFydCA8PSB1c2VkKSB7XG4gICAgICAgIC8qIFNsaWRlIHRoZSB3aW5kb3cgZG93bi4gKi9cbiAgICAgICAgcy5zdHJzdGFydCAtPSBzLndfc2l6ZTtcbiAgICAgICAgLy96bWVtY3B5KHMtPndpbmRvdywgcy0+d2luZG93ICsgcy0+d19zaXplLCBzLT5zdHJzdGFydCk7XG4gICAgICAgIHMud2luZG93LnNldChzLndpbmRvdy5zdWJhcnJheShzLndfc2l6ZSwgcy53X3NpemUgKyBzLnN0cnN0YXJ0KSwgMCk7XG4gICAgICAgIGlmIChzLm1hdGNoZXMgPCAyKSB7XG4gICAgICAgICAgcy5tYXRjaGVzKys7ICAgLyogYWRkIGEgcGVuZGluZyBzbGlkZV9oYXNoKCkgKi9cbiAgICAgICAgfVxuICAgICAgICBpZiAocy5pbnNlcnQgPiBzLnN0cnN0YXJ0KSB7XG4gICAgICAgICAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL3ptZW1jcHkocy0+d2luZG93ICsgcy0+c3Ryc3RhcnQsIHMtPnN0cm0tPm5leHRfaW4gLSB1c2VkLCB1c2VkKTtcbiAgICAgIHMud2luZG93LnNldChzLnN0cm0uaW5wdXQuc3ViYXJyYXkocy5zdHJtLm5leHRfaW4gLSB1c2VkLCBzLnN0cm0ubmV4dF9pbiksIHMuc3Ryc3RhcnQpO1xuICAgICAgcy5zdHJzdGFydCArPSB1c2VkO1xuICAgICAgcy5pbnNlcnQgKz0gdXNlZCA+IHMud19zaXplIC0gcy5pbnNlcnQgPyBzLndfc2l6ZSAtIHMuaW5zZXJ0IDogdXNlZDtcbiAgICB9XG4gICAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIH1cbiAgaWYgKHMuaGlnaF93YXRlciA8IHMuc3Ryc3RhcnQpIHtcbiAgICBzLmhpZ2hfd2F0ZXIgPSBzLnN0cnN0YXJ0O1xuICB9XG5cbiAgLyogSWYgdGhlIGxhc3QgYmxvY2sgd2FzIHdyaXR0ZW4gdG8gbmV4dF9vdXQsIHRoZW4gZG9uZS4gKi9cbiAgaWYgKGxhc3QpIHtcbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICAvKiBJZiBmbHVzaGluZyBhbmQgYWxsIGlucHV0IGhhcyBiZWVuIGNvbnN1bWVkLCB0aGVuIGRvbmUuICovXG4gIGlmIChmbHVzaCAhPT0gWl9OT19GTFVTSCQyICYmIGZsdXNoICE9PSBaX0ZJTklTSCQzICYmXG4gICAgcy5zdHJtLmF2YWlsX2luID09PSAwICYmIHMuc3Ryc3RhcnQgPT09IHMuYmxvY2tfc3RhcnQpIHtcbiAgICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbiAgfVxuXG4gIC8qIEZpbGwgdGhlIHdpbmRvdyB3aXRoIGFueSByZW1haW5pbmcgaW5wdXQuICovXG4gIGhhdmUgPSBzLndpbmRvd19zaXplIC0gcy5zdHJzdGFydDtcbiAgaWYgKHMuc3RybS5hdmFpbF9pbiA+IGhhdmUgJiYgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkge1xuICAgIC8qIFNsaWRlIHRoZSB3aW5kb3cgZG93bi4gKi9cbiAgICBzLmJsb2NrX3N0YXJ0IC09IHMud19zaXplO1xuICAgIHMuc3Ryc3RhcnQgLT0gcy53X3NpemU7XG4gICAgLy96bWVtY3B5KHMtPndpbmRvdywgcy0+d2luZG93ICsgcy0+d19zaXplLCBzLT5zdHJzdGFydCk7XG4gICAgcy53aW5kb3cuc2V0KHMud2luZG93LnN1YmFycmF5KHMud19zaXplLCBzLndfc2l6ZSArIHMuc3Ryc3RhcnQpLCAwKTtcbiAgICBpZiAocy5tYXRjaGVzIDwgMikge1xuICAgICAgcy5tYXRjaGVzKys7ICAgICAgIC8qIGFkZCBhIHBlbmRpbmcgc2xpZGVfaGFzaCgpICovXG4gICAgfVxuICAgIGhhdmUgKz0gcy53X3NpemU7ICAgICAgLyogbW9yZSBzcGFjZSBub3cgKi9cbiAgICBpZiAocy5pbnNlcnQgPiBzLnN0cnN0YXJ0KSB7XG4gICAgICBzLmluc2VydCA9IHMuc3Ryc3RhcnQ7XG4gICAgfVxuICB9XG4gIGlmIChoYXZlID4gcy5zdHJtLmF2YWlsX2luKSB7XG4gICAgaGF2ZSA9IHMuc3RybS5hdmFpbF9pbjtcbiAgfVxuICBpZiAoaGF2ZSkge1xuICAgIHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQsIGhhdmUpO1xuICAgIHMuc3Ryc3RhcnQgKz0gaGF2ZTtcbiAgICBzLmluc2VydCArPSBoYXZlID4gcy53X3NpemUgLSBzLmluc2VydCA/IHMud19zaXplIC0gcy5pbnNlcnQgOiBoYXZlO1xuICB9XG4gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLnN0cnN0YXJ0KSB7XG4gICAgcy5oaWdoX3dhdGVyID0gcy5zdHJzdGFydDtcbiAgfVxuXG4gIC8qIFRoZXJlIHdhcyBub3QgZW5vdWdoIGF2YWlsX291dCB0byB3cml0ZSBhIGNvbXBsZXRlIHdvcnRoeSBvciBmbHVzaGVkXG4gICAqIHN0b3JlZCBibG9jayB0byBuZXh0X291dC4gV3JpdGUgYSBzdG9yZWQgYmxvY2sgdG8gcGVuZGluZyBpbnN0ZWFkLCBpZiB3ZVxuICAgKiBoYXZlIGVub3VnaCBpbnB1dCBmb3IgYSB3b3J0aHkgYmxvY2ssIG9yIGlmIGZsdXNoaW5nIGFuZCB0aGVyZSBpcyBlbm91Z2hcbiAgICogcm9vbSBmb3IgdGhlIHJlbWFpbmluZyBpbnB1dCBhcyBhIHN0b3JlZCBibG9jayBpbiB0aGUgcGVuZGluZyBidWZmZXIuXG4gICAqL1xuICBoYXZlID0gKHMuYmlfdmFsaWQgKyA0MikgPj4gMzsgICAgIC8qIG51bWJlciBvZiBoZWFkZXIgYnl0ZXMgKi9cbiAgICAvKiBtYXhpbXVtIHN0b3JlZCBibG9jayBsZW5ndGggdGhhdCB3aWxsIGZpdCBpbiBwZW5kaW5nOiAqL1xuICBoYXZlID0gcy5wZW5kaW5nX2J1Zl9zaXplIC0gaGF2ZSA+IDY1NTM1LyogTUFYX1NUT1JFRCAqLyA/IDY1NTM1LyogTUFYX1NUT1JFRCAqLyA6IHMucGVuZGluZ19idWZfc2l6ZSAtIGhhdmU7XG4gIG1pbl9ibG9jayA9IGhhdmUgPiBzLndfc2l6ZSA/IHMud19zaXplIDogaGF2ZTtcbiAgbGVmdCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuICBpZiAobGVmdCA+PSBtaW5fYmxvY2sgfHxcbiAgICAgKChsZWZ0IHx8IGZsdXNoID09PSBaX0ZJTklTSCQzKSAmJiBmbHVzaCAhPT0gWl9OT19GTFVTSCQyICYmXG4gICAgIHMuc3RybS5hdmFpbF9pbiA9PT0gMCAmJiBsZWZ0IDw9IGhhdmUpKSB7XG4gICAgbGVuID0gbGVmdCA+IGhhdmUgPyBoYXZlIDogbGVmdDtcbiAgICBsYXN0ID0gZmx1c2ggPT09IFpfRklOSVNIJDMgJiYgcy5zdHJtLmF2YWlsX2luID09PSAwICYmXG4gICAgICAgICBsZW4gPT09IGxlZnQgPyAxIDogMDtcbiAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIHMuYmxvY2tfc3RhcnQsIGxlbiwgbGFzdCk7XG4gICAgcy5ibG9ja19zdGFydCArPSBsZW47XG4gICAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xuICB9XG5cbiAgLyogV2UndmUgZG9uZSBhbGwgd2UgY2FuIHdpdGggdGhlIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0LiAqL1xuICByZXR1cm4gbGFzdCA/IEJTX0ZJTklTSF9TVEFSVEVEIDogQlNfTkVFRF9NT1JFO1xufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuY29uc3QgZGVmbGF0ZV9mYXN0ID0gKHMsIGZsdXNoKSA9PiB7XG5cbiAgbGV0IGhhc2hfaGVhZDsgICAgICAgIC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi9cbiAgbGV0IGJmbHVzaDsgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIJDIpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgaGFzaF9oZWFkID0gSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0KTtcbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQpO1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgaWYgKHMubGVnYWN5X2hhc2gpIHtcbiAgICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbcy5zdHJzdGFydCsxXSk7ICovXG4gICAgICAgICAgcy5pbnNfaCA9IEhBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKTtcblxuLy8jaWYgTUlOX01BVENIICE9IDNcbi8vICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCQzKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMuc3ltX25leHQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmNvbnN0IGRlZmxhdGVfc2xvdyA9IChzLCBmbHVzaCkgPT4ge1xuXG4gIGxldCBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICBsZXQgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgbGV0IG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIJDIpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgeyBicmVhazsgfSAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICBoYXNoX2hlYWQgPSBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQpO1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgaGFzaF9oZWFkID0gSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoLS1zLnByZXZfbGVuZ3RoICE9PSAwKTtcbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqKi9cbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhXG4gICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoXG4gICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLlxuICAgICAgICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0tfT05MWShzLCAwKSAqKiovXG4gICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgICAvKioqL1xuICAgICAgfVxuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3JcbiAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgXCJubyBmbHVzaD9cIik7XG4gIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi9cbiAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgfVxuICBzLmluc2VydCA9IHMuc3Ryc3RhcnQgPCBNSU5fTUFUQ0ggLSAxID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDE7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMykge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLnN5bV9uZXh0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfUkxFLCBzaW1wbHkgbG9vayBmb3IgcnVucyBvZiBieXRlcywgZ2VuZXJhdGUgbWF0Y2hlcyBvbmx5IG9mIGRpc3RhbmNlXG4gKiBvbmUuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLiAgKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2ZcbiAqIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIFpfUkxFLilcbiAqL1xuY29uc3QgZGVmbGF0ZV9ybGUgPSAocywgZmx1c2gpID0+IHtcblxuICBsZXQgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICBsZXQgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIGxldCBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIGNvbnN0IF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIJDIpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgeyBicmVhazsgfSAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cblxuICAgIC8qIFNlZSBob3cgbWFueSB0aW1lcyB0aGUgcHJldmlvdXMgYnl0ZSByZXBlYXRzICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy5zdHJzdGFydCA+IDApIHtcbiAgICAgIHNjYW4gPSBzLnN0cnN0YXJ0IC0gMTtcbiAgICAgIHByZXYgPSBfd2luW3NjYW5dO1xuICAgICAgaWYgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dKSB7XG4gICAgICAgIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICAgICAgfSB3aGlsZSAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+IHMubG9va2FoZWFkKSB7XG4gICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBzLmxvb2thaGVhZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVJbnQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcbiAgICB9XG5cbiAgICAvKiBFbWl0IG1hdGNoIGlmIGhhdmUgcnVuIG9mIE1JTl9NQVRDSCBvciBsb25nZXIsIGVsc2UgZW1pdCBsaXRlcmFsICovXG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLnN0cnN0YXJ0IC0gMSwgcy5tYXRjaF9sZW5ndGgpO1xuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuXG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgIH1cbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMykge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLnN5bV9uZXh0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9IVUZGTUFOX09OTFksIGRvIG5vdCBsb29rIGZvciBtYXRjaGVzLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS5cbiAqIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIEh1ZmZtYW4uKVxuICovXG5jb25zdCBkZWZsYXRlX2h1ZmYgPSAocywgZmx1c2gpID0+IHtcblxuICBsZXQgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gkMikge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMykge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLnN5bV9uZXh0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufTtcblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG5cbiAgdGhpcy5nb29kX2xlbmd0aCA9IGdvb2RfbGVuZ3RoO1xuICB0aGlzLm1heF9sYXp5ID0gbWF4X2xhenk7XG4gIHRoaXMubmljZV9sZW5ndGggPSBuaWNlX2xlbmd0aDtcbiAgdGhpcy5tYXhfY2hhaW4gPSBtYXhfY2hhaW47XG4gIHRoaXMuZnVuYyA9IGZ1bmM7XG59XG5cbmNvbnN0IGNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuY29uc3QgbG1faW5pdCA9IChzKSA9PiB7XG5cbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn07XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEJDI7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMubGVnYWN5X2hhc2ggPSAwOyAvKiB1c2UgY2xhc3NpYyB6bGliIGhhc2ggaW5zdGVhZCBvZiBkZWZhdWx0IEFOWkFDKysgKi9cbiAgdGhpcy5oYXNoX3NpemUgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBoYXNoIHRhYmxlICovXG4gIHRoaXMuaGFzaF9iaXRzID0gMDsgICAvKiBsb2cyKGhhc2hfc2l6ZSkgKi9cbiAgdGhpcy5oYXNoX21hc2sgPSAwOyAgIC8qIGhhc2hfc2l6ZS0xICovXG5cbiAgdGhpcy5oYXNoX3NoaWZ0ID0gMDtcbiAgLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggbXVzdCBiZSBzaGlmdGVkIGF0IGVhY2ggaW5wdXRcbiAgICogc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0XG4gICAqIGJ5dGUgbm8gbG9uZ2VyIHRha2VzIHBhcnQgaW4gdGhlIGhhc2gga2V5LCB0aGF0IGlzOlxuICAgKiAgIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzXG4gICAqL1xuXG4gIHRoaXMuYmxvY2tfc3RhcnQgPSAwO1xuICAvKiBXaW5kb3cgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBvdXRwdXQgYmxvY2suIEdldHNcbiAgICogbmVnYXRpdmUgd2hlbiB0aGUgd2luZG93IGlzIG1vdmVkIGJhY2t3YXJkcy5cbiAgICovXG5cbiAgdGhpcy5tYXRjaF9sZW5ndGggPSAwOyAgICAgIC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovXG4gIHRoaXMucHJldl9tYXRjaCA9IDA7ICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqL1xuICB0aGlzLm1hdGNoX2F2YWlsYWJsZSA9IDA7ICAgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqL1xuICB0aGlzLnN0cnN0YXJ0ID0gMDsgICAgICAgICAgLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqL1xuICB0aGlzLm1hdGNoX3N0YXJ0ID0gMDsgICAgICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovXG4gIHRoaXMubG9va2FoZWFkID0gMDsgICAgICAgICAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovXG5cbiAgdGhpcy5wcmV2X2xlbmd0aCA9IDA7XG4gIC8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpc1xuICAgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi5cbiAgICovXG5cbiAgdGhpcy5tYXhfY2hhaW5fbGVuZ3RoID0gMDtcbiAgLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlucyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXNcbiAgICogbGVuZ3RoLiAgQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZVxuICAgKiBzcGVlZC5cbiAgICovXG5cbiAgdGhpcy5tYXhfbGF6eV9tYXRjaCA9IDA7XG4gIC8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHlcbiAgICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb25cbiAgICogbGV2ZWxzID49IDQuXG4gICAqL1xuICAvLyBUaGF0J3MgYWxpYXMgdG8gbWF4X2xhenlfbWF0Y2gsIGRvbid0IHVzZSBkaXJlY3RseVxuICAvL3RoaXMubWF4X2luc2VydF9sZW5ndGggPSAwO1xuICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdFxuICAgKiBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uXG4gICAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuXG4gICAqL1xuXG4gIHRoaXMubGV2ZWwgPSAwOyAgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovXG4gIHRoaXMuc3RyYXRlZ3kgPSAwOyAgLyogZmF2b3Igb3IgZm9yY2UgSHVmZm1hbiBjb2RpbmcqL1xuXG4gIHRoaXMuZ29vZF9tYXRjaCA9IDA7XG4gIC8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqL1xuXG4gIHRoaXMubmljZV9tYXRjaCA9IDA7IC8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi9cblxuICAgICAgICAgICAgICAvKiB1c2VkIGJ5IHRyZWVzLmM6ICovXG5cbiAgLyogRGlkbid0IHVzZSBjdF9kYXRhIHR5cGVkZWYgYmVsb3cgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZyAqL1xuXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgYmxfdHJlZVsyKkJMX0NPREVTKzFdOyAgLyogSHVmZm1hbiB0cmVlIGZvciBiaXQgbGVuZ3RocyAqL1xuXG4gIC8vIFVzZSBmbGF0IGFycmF5IG9mIERPVUJMRSBzaXplLCB3aXRoIGludGVybGVhdmVkIGZhdGEsXG4gIC8vIGJlY2F1c2UgSlMgZG9lcyBub3Qgc3VwcG9ydCBlZmZlY3RpdmVcbiAgdGhpcy5keW5fbHRyZWUgID0gbmV3IFVpbnQxNkFycmF5KEhFQVBfU0laRSAqIDIpO1xuICB0aGlzLmR5bl9kdHJlZSAgPSBuZXcgVWludDE2QXJyYXkoKDIgKiBEX0NPREVTICsgMSkgKiAyKTtcbiAgdGhpcy5ibF90cmVlICAgID0gbmV3IFVpbnQxNkFycmF5KCgyICogQkxfQ09ERVMgKyAxKSAqIDIpO1xuICB6ZXJvKHRoaXMuZHluX2x0cmVlKTtcbiAgemVybyh0aGlzLmR5bl9kdHJlZSk7XG4gIHplcm8odGhpcy5ibF90cmVlKTtcblxuICB0aGlzLmxfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgbGl0ZXJhbCB0cmVlICovXG4gIHRoaXMuZF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBkaXN0YW5jZSB0cmVlICovXG4gIHRoaXMuYmxfZGVzYyAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi9cblxuICAvL3VzaCBibF9jb3VudFtNQVhfQklUUysxXTtcbiAgdGhpcy5ibF9jb3VudCA9IG5ldyBVaW50MTZBcnJheShNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvL2ludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi9cbiAgdGhpcy5oZWFwID0gbmV3IFVpbnQxNkFycmF5KDIgKiBMX0NPREVTICsgMSk7ICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi9cbiAgemVybyh0aGlzLmhlYXApO1xuXG4gIHRoaXMuaGVhcF9sZW4gPSAwOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqL1xuICB0aGlzLmhlYXBfbWF4ID0gMDsgICAgICAgICAgICAgICAvKiBlbGVtZW50IG9mIGxhcmdlc3QgZnJlcXVlbmN5ICovXG4gIC8qIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uIGhlYXBbMF0gaXMgbm90IHVzZWQuXG4gICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuXG4gICAqL1xuXG4gIHRoaXMuZGVwdGggPSBuZXcgVWludDE2QXJyYXkoMiAqIExfQ09ERVMgKyAxKTsgLy91Y2ggZGVwdGhbMipMX0NPREVTKzFdO1xuICB6ZXJvKHRoaXMuZGVwdGgpO1xuICAvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5XG4gICAqL1xuXG4gIHRoaXMuc3ltX2J1ZiA9IDA7ICAgICAgICAvKiBidWZmZXIgZm9yIGRpc3RhbmNlcyBhbmQgbGl0ZXJhbHMvbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLnN5bV9uZXh0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIHN5bV9idWYgKi9cbiAgdGhpcy5zeW1fZW5kID0gMDsgICAgICAgLyogc3ltYm9sIHRhYmxlIGZ1bGwgd2hlbiBzeW1fbmV4dCByZWFjaGVzIHRoaXMgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgZm9yIGEgdmFsaWQgZGVmbGF0ZSBzdHJlYW0gc3RhdGUuIFJldHVybiAwIGlmIG9rLCAxIGlmIG5vdC5cbiAqL1xuY29uc3QgZGVmbGF0ZVN0YXRlQ2hlY2sgPSAoc3RybSkgPT4ge1xuXG4gIGlmICghc3RybSkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIGNvbnN0IHMgPSBzdHJtLnN0YXRlO1xuICBpZiAoIXMgfHwgcy5zdHJtICE9PSBzdHJtIHx8IChzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSAmJlxuLy8jaWZkZWYgR1pJUFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN0YXR1cyAhPT0gR1pJUF9TVEFURSAmJlxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3RhdHVzICE9PSBGSU5JU0hfU1RBVEUpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5cbmNvbnN0IGRlZmxhdGVSZXNldEtlZXAgPSAoc3RybSkgPT4ge1xuXG4gIGlmIChkZWZsYXRlU3RhdGVDaGVjayhzdHJtKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IkMik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBjb25zdCBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPVxuLy8jaWZkZWYgR1pJUFxuICAgIHMud3JhcCA9PT0gMiA/IEdaSVBfU1RBVEUgOlxuLy8jZW5kaWZcbiAgICBzLndyYXAgPyBJTklUX1NUQVRFIDogQlVTWV9TVEFURTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gLTI7XG4gIF90cl9pbml0KHMpO1xuICByZXR1cm4gWl9PSyQzO1xufTtcblxuXG5jb25zdCBkZWZsYXRlUmVzZXQgPSAoc3RybSkgPT4ge1xuXG4gIGNvbnN0IHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0skMykge1xuICAgIGxtX2luaXQoc3RybS5zdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cblxuY29uc3QgZGVmbGF0ZVNldEhlYWRlciA9IChzdHJtLCBoZWFkKSA9PiB7XG5cbiAgaWYgKGRlZmxhdGVTdGF0ZUNoZWNrKHN0cm0pIHx8IHN0cm0uc3RhdGUud3JhcCAhPT0gMikge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQyO1xuICB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0skMztcbn07XG5cblxuY29uc3QgZGVmbGF0ZUluaXQyID0gKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwgbGVnYWN5SGFzaCkgPT4ge1xuXG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDI7XG4gIH1cbiAgbGV0IHdyYXAgPSAxO1xuXG4gIGlmIChsZXZlbCA9PT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OJDEpIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCQyIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEIHx8ICh3aW5kb3dCaXRzID09PSA4ICYmIHdyYXAgIT09IDEpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUiQyKTtcbiAgfVxuXG5cbiAgaWYgKHdpbmRvd0JpdHMgPT09IDgpIHtcbiAgICB3aW5kb3dCaXRzID0gOTtcbiAgfVxuICAvKiB1bnRpbCAyNTYtYnl0ZSB3aW5kb3cgYnVnIGZpeGVkICovXG5cbiAgY29uc3QgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcbiAgcy5zdGF0dXMgPSBJTklUX1NUQVRFOyAgICAgLyogdG8gcGFzcyBzdGF0ZSB0ZXN0IGluIGRlZmxhdGVSZXNldCgpICovXG5cbiAgcy53cmFwID0gd3JhcDtcbiAgcy5nemhlYWQgPSBudWxsO1xuICBzLndfYml0cyA9IHdpbmRvd0JpdHM7XG4gIHMud19zaXplID0gMSA8PCBzLndfYml0cztcbiAgcy53X21hc2sgPSBzLndfc2l6ZSAtIDE7XG5cbiAgcy5sZWdhY3lfaGFzaCA9IGxlZ2FjeUhhc2ggPyAxIDogMDtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgLyogQU5aQUMrKyBoYXNoIG5lZWRzID49IDE1IGhhc2ggYml0cyB0byBzcGFuIGl0cyA0IHJlYWQgYnl0ZXMuICovXG4gIGlmICghcy5sZWdhY3lfaGFzaCAmJiBzLmhhc2hfYml0cyA8IDE1KSB7XG4gICAgcy5oYXNoX2JpdHMgPSAxNTtcbiAgfVxuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgVWludDhBcnJheShzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgVWludDE2QXJyYXkocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgVWludDE2QXJyYXkocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIC8qIFdlIG92ZXJsYXkgcGVuZGluZ19idWYgYW5kIHN5bV9idWYuIFRoaXMgd29ya3Mgc2luY2UgdGhlIGF2ZXJhZ2Ugc2l6ZVxuICAgKiBmb3IgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzIG92ZXIgYW55IGNvbXByZXNzZWQgYmxvY2sgaXMgYXNzdXJlZCB0byBiZSAzMVxuICAgKiBiaXRzIG9yIGxlc3MuXG4gICAqXG4gICAqIEFuYWx5c2lzOiBUaGUgbG9uZ2VzdCBmaXhlZCBjb2RlcyBhcmUgYSBsZW5ndGggY29kZSBvZiA4IGJpdHMgcGx1cyA1XG4gICAqIGV4dHJhIGJpdHMsIGZvciBsZW5ndGhzIDEzMSB0byAyNTcuIFRoZSBsb25nZXN0IGZpeGVkIGRpc3RhbmNlIGNvZGVzIGFyZVxuICAgKiA1IGJpdHMgcGx1cyAxMyBleHRyYSBiaXRzLCBmb3IgZGlzdGFuY2VzIDE2Mzg1IHRvIDMyNzY4LiBUaGUgbG9uZ2VzdFxuICAgKiBwb3NzaWJsZSBmaXhlZC1jb2RlcyBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyB0aGVuIDMxIGJpdHMgdG90YWwuXG4gICAqXG4gICAqIHN5bV9idWYgc3RhcnRzIG9uZS1mb3VydGggb2YgdGhlIHdheSBpbnRvIHBlbmRpbmdfYnVmLiBTbyB0aGVyZSBhcmVcbiAgICogdGhyZWUgYnl0ZXMgaW4gc3ltX2J1ZiBmb3IgZXZlcnkgZm91ciBieXRlcyBpbiBwZW5kaW5nX2J1Zi4gRWFjaCBzeW1ib2xcbiAgICogaW4gc3ltX2J1ZiBpcyB0aHJlZSBieXRlcyAtLSB0d28gZm9yIHRoZSBkaXN0YW5jZSBhbmQgb25lIGZvciB0aGVcbiAgICogbGl0ZXJhbC9sZW5ndGguIEFzIGVhY2ggc3ltYm9sIGlzIGNvbnN1bWVkLCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dFxuICAgKiBzeW1fYnVmIHZhbHVlIHRvIHJlYWQgbW92ZXMgZm9yd2FyZCB0aHJlZSBieXRlcy4gRnJvbSB0aGF0IHN5bWJvbCwgdXAgdG9cbiAgICogMzEgYml0cyBhcmUgd3JpdHRlbiB0byBwZW5kaW5nX2J1Zi4gVGhlIGNsb3Nlc3QgdGhlIHdyaXR0ZW4gcGVuZGluZ19idWZcbiAgICogYml0cyBnZXRzIHRvIHRoZSBuZXh0IHN5bV9idWYgc3ltYm9sIHRvIHJlYWQgaXMganVzdCBiZWZvcmUgdGhlIGxhc3RcbiAgICogY29kZSBpcyB3cml0dGVuLiBBdCB0aGF0IHRpbWUsIDMxKihuLTIpIGJpdHMgaGF2ZSBiZWVuIHdyaXR0ZW4sIGp1c3RcbiAgICogYWZ0ZXIgMjQqKG4tMikgYml0cyBoYXZlIGJlZW4gY29uc3VtZWQgZnJvbSBzeW1fYnVmLiBzeW1fYnVmIHN0YXJ0cyBhdFxuICAgKiA4Km4gYml0cyBpbnRvIHBlbmRpbmdfYnVmLiAoTm90ZSB0aGF0IHRoZSBzeW1ib2wgYnVmZmVyIGZpbGxzIHdoZW4gbi0xXG4gICAqIHN5bWJvbHMgYXJlIHdyaXR0ZW4uKSBUaGUgY2xvc2VzdCB0aGUgd3JpdGluZyBnZXRzIHRvIHdoYXQgaXMgdW5yZWFkIGlzXG4gICAqIHRoZW4gbisxNCBiaXRzLiBIZXJlIG4gaXMgbGl0X2J1ZnNpemUsIHdoaWNoIGlzIDE2Mzg0IGJ5IGRlZmF1bHQsIGFuZFxuICAgKiBjYW4gcmFuZ2UgZnJvbSAxMjggdG8gMzI3NjguXG4gICAqXG4gICAqIFRoZXJlZm9yZSwgYXQgYSBtaW5pbXVtLCB0aGVyZSBhcmUgMTQyIGJpdHMgb2Ygc3BhY2UgYmV0d2VlbiB3aGF0IGlzXG4gICAqIHdyaXR0ZW4gYW5kIHdoYXQgaXMgcmVhZCBpbiB0aGUgb3ZlcmxhaW4gYnVmZmVycywgc28gdGhlIHN5bWJvbHMgY2Fubm90XG4gICAqIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjb21wcmVzc2VkIGRhdGEuIFRoYXQgc3BhY2UgaXMgYWN0dWFsbHkgMTM5IGJpdHMsXG4gICAqIGR1ZSB0byB0aGUgdGhyZWUtYml0IGZpeGVkLWNvZGUgYmxvY2sgaGVhZGVyLlxuICAgKlxuICAgKiBUaGF0IGNvdmVycyB0aGUgY2FzZSB3aGVyZSBlaXRoZXIgWl9GSVhFRCBpcyBzcGVjaWZpZWQsIGZvcmNpbmcgZml4ZWRcbiAgICogY29kZXMsIG9yIHdoZW4gdGhlIHVzZSBvZiBmaXhlZCBjb2RlcyBpcyBjaG9zZW4sIGJlY2F1c2UgdGhhdCBjaG9pY2VcbiAgICogcmVzdWx0cyBpbiBhIHNtYWxsZXIgY29tcHJlc3NlZCBibG9jayB0aGFuIGR5bmFtaWMgY29kZXMuIFRoYXQgbGF0dGVyXG4gICAqIGNvbmRpdGlvbiB0aGVuIGFzc3VyZXMgdGhhdCB0aGUgYWJvdmUgYW5hbHlzaXMgYWxzbyBjb3ZlcnMgYWxsIGR5bmFtaWNcbiAgICogYmxvY2tzLiBBIGR5bmFtaWMtY29kZSBibG9jayB3aWxsIG9ubHkgYmUgY2hvc2VuIHRvIGJlIGVtaXR0ZWQgaWYgaXQgaGFzXG4gICAqIGZld2VyIGJpdHMgdGhhbiBhIGZpeGVkLWNvZGUgYmxvY2sgd291bGQgZm9yIHRoZSBzYW1lIHNldCBvZiBzeW1ib2xzLlxuICAgKiBUaGVyZWZvcmUgaXRzIGF2ZXJhZ2Ugc3ltYm9sIGxlbmd0aCBpcyBhc3N1cmVkIHRvIGJlIGxlc3MgdGhhbiAzMS4gU29cbiAgICogdGhlIGNvbXByZXNzZWQgZGF0YSBmb3IgYSBkeW5hbWljIGJsb2NrIGFsc28gY2Fubm90IG92ZXJ3cml0ZSB0aGVcbiAgICogc3ltYm9scyBmcm9tIHdoaWNoIGl0IGlzIGJlaW5nIGNvbnN0cnVjdGVkLlxuICAgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyBVaW50OEFycmF5KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+c3ltX2J1ZiA9IHMtPnBlbmRpbmdfYnVmICsgcy0+bGl0X2J1ZnNpemU7XG4gIHMuc3ltX2J1ZiA9IHMubGl0X2J1ZnNpemU7XG5cbiAgLy9zLT5zeW1fZW5kID0gKHMtPmxpdF9idWZzaXplIC0gMSkgKiAzO1xuICBzLnN5bV9lbmQgPSAocy5saXRfYnVmc2l6ZSAtIDEpICogMztcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSozIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufTtcblxuY29uc3QgZGVmbGF0ZUluaXQgPSAoc3RybSwgbGV2ZWwpID0+IHtcblxuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVEJDIsIE1BWF9XQklUUyQxLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kkMSk7XG59O1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbmNvbnN0IGRlZmxhdGUkMiA9IChzdHJtLCBmbHVzaCkgPT4ge1xuXG4gIGlmIChkZWZsYXRlU3RhdGVDaGVjayhzdHJtKSB8fCBmbHVzaCA+IFpfQkxPQ0skMSB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUiQyKSA6IFpfU1RSRUFNX0VSUk9SJDI7XG4gIH1cblxuICBjb25zdCBzID0gc3RybS5zdGF0ZTtcblxuICBpZiAoIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoc3RybS5hdmFpbF9pbiAhPT0gMCAmJiAhc3RybS5pbnB1dCkgfHxcbiAgICAgIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIGZsdXNoICE9PSBaX0ZJTklTSCQzKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SJDIgOiBaX1NUUkVBTV9FUlJPUiQyKTtcbiAgfVxuXG4gIGNvbnN0IG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZSAqL1xuICBpZiAocy5wZW5kaW5nICE9PSAwKSB7XG4gICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGhcbiAgICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kXG4gICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbyxcbiAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlXG4gICAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6XG4gICAgICAgKi9cbiAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgcmV0dXJuIFpfT0skMztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCQzKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUiQyKTtcbiAgfVxuXG4gIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovXG4gIGlmIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SJDIpO1xuICB9XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUgJiYgcy53cmFwID09PSAwKSB7XG4gICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuICAgIC8qIHpsaWIgaGVhZGVyICovXG4gICAgbGV0IGhlYWRlciA9IChaX0RFRkxBVEVEJDIgKyAoKHMud19iaXRzIC0gOCkgPDwgNCkpIDw8IDg7XG4gICAgbGV0IGxldmVsX2ZsYWdzID0gLTE7XG5cbiAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgbGV2ZWxfZmxhZ3MgPSAwO1xuICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPT09IDYpIHtcbiAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV2ZWxfZmxhZ3MgPSAzO1xuICAgIH1cbiAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7IGhlYWRlciB8PSBQUkVTRVRfRElDVDsgfVxuICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7XG5cbiAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICAgIH1cbiAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG5cbiAgICAvKiBDb21wcmVzc2lvbiBtdXN0IHN0YXJ0IHdpdGggYW4gZW1wdHkgcGVuZGluZyBidWZmZXIgKi9cbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgcmV0dXJuIFpfT0skMztcbiAgICB9XG4gIH1cbi8vI2lmZGVmIEdaSVBcbiAgaWYgKHMuc3RhdHVzID09PSBHWklQX1NUQVRFKSB7XG4gICAgLyogZ3ppcCBoZWFkZXIgKi9cbiAgICBzdHJtLmFkbGVyID0gMDsgIC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgcHV0X2J5dGUocywgMzEpO1xuICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgcHV0X2J5dGUocywgOCk7XG4gICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcblxuICAgICAgLyogQ29tcHJlc3Npb24gbXVzdCBzdGFydCB3aXRoIGFuIGVtcHR5IHBlbmRpbmcgYnVmZmVyICovXG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgcmV0dXJuIFpfT0skMztcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAocy5nemhlYWQuaGNyYyA/IDIgOiAwKSArXG4gICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmNvbW1lbnQgPyAwIDogMTYpXG4gICAgICApO1xuICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQudGltZSAmIDB4ZmYpO1xuICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMjQpICYgMHhmZik7XG4gICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLm9zICYgMHhmZik7XG4gICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7XG4gICAgICB9XG4gICAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzJfMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcsIDApO1xuICAgICAgfVxuICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgIHMuc3RhdHVzID0gRVhUUkFfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEvKiAhPSBaX05VTEwqLykge1xuICAgICAgbGV0IGJlZyA9IHMucGVuZGluZzsgICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICBsZXQgbGVmdCA9IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpIC0gcy5nemluZGV4O1xuICAgICAgd2hpbGUgKHMucGVuZGluZyArIGxlZnQgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgbGV0IGNvcHkgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSBzLnBlbmRpbmc7XG4gICAgICAgIC8vIHptZW1jcHkocy5wZW5kaW5nX2J1ZiArIHMucGVuZGluZyxcbiAgICAgICAgLy8gICAgcy5nemhlYWQuZXh0cmEgKyBzLmd6aW5kZXgsIGNvcHkpO1xuICAgICAgICBzLnBlbmRpbmdfYnVmLnNldChzLmd6aGVhZC5leHRyYS5zdWJhcnJheShzLmd6aW5kZXgsIHMuZ3ppbmRleCArIGNvcHkpLCBzLnBlbmRpbmcpO1xuICAgICAgICBzLnBlbmRpbmcgPSBzLnBlbmRpbmdfYnVmX3NpemU7XG4gICAgICAgIC8vLS0tIEhDUkNfVVBEQVRFKGJlZykgLS0tLy9cbiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyXzEoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgcy5nemluZGV4ICs9IGNvcHk7XG4gICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgICByZXR1cm4gWl9PSyQzO1xuICAgICAgICB9XG4gICAgICAgIGJlZyA9IDA7XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgIH1cbiAgICAgIC8vIEpTIHNwZWNpZmljOiBzLmd6aGVhZC5leHRyYSBtYXkgYmUgVHlwZWRBcnJheSBvciBBcnJheSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gICAgICAgICAgICAgIFR5cGVkQXJyYXkuc2xpY2UgYW5kIFR5cGVkQXJyYXkuZnJvbSBkb24ndCBleGlzdCBpbiBJRTEwLUlFMTFcbiAgICAgIGxldCBnemhlYWRfZXh0cmEgPSBuZXcgVWludDhBcnJheShzLmd6aGVhZC5leHRyYSk7XG4gICAgICAvLyB6bWVtY3B5KHMtPnBlbmRpbmdfYnVmICsgcy0+cGVuZGluZyxcbiAgICAgIC8vICAgICBzLT5nemhlYWQtPmV4dHJhICsgcy0+Z3ppbmRleCwgbGVmdCk7XG4gICAgICBzLnBlbmRpbmdfYnVmLnNldChnemhlYWRfZXh0cmEuc3ViYXJyYXkocy5nemluZGV4LCBzLmd6aW5kZXggKyBsZWZ0KSwgcy5wZW5kaW5nKTtcbiAgICAgIHMucGVuZGluZyArPSBsZWZ0O1xuICAgICAgLy8tLS0gSENSQ19VUERBVEUoYmVnKSAtLS0vL1xuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMl8xKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIC8vLS0tLy9cbiAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgfVxuICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IE5BTUVfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQubmFtZS8qICE9IFpfTlVMTCovKSB7XG4gICAgICBsZXQgYmVnID0gcy5wZW5kaW5nOyAgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIGxldCB2YWw7XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIC8vLS0tIEhDUkNfVVBEQVRFKGJlZykgLS0tLy9cbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMl8xKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgICAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICAgICAgICByZXR1cm4gWl9PSyQzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiZWcgPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG4gICAgICAvLy0tLSBIQ1JDX1VQREFURShiZWcpIC0tLS8vXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyXzEoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgLy8tLS0vL1xuICAgICAgcy5nemluZGV4ID0gMDtcbiAgICB9XG4gICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gQ09NTUVOVF9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5jb21tZW50LyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGxldCBiZWcgPSBzLnBlbmRpbmc7ICAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgbGV0IHZhbDtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgLy8tLS0gSENSQ19VUERBVEUoYmVnKSAtLS0vL1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyXzEoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBpZiAocy5wZW5kaW5nICE9PSAwKSB7XG4gICAgICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgICAgIHJldHVybiBaX09LJDM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJlZyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcbiAgICAgIC8vLS0tIEhDUkNfVVBEQVRFKGJlZykgLS0tLy9cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzJfMShzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICAvLy0tLS8vXG4gICAgfVxuICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAgIHJldHVybiBaX09LJDM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICBzdHJtLmFkbGVyID0gMDsgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuXG4gICAgLyogQ29tcHJlc3Npb24gbXVzdCBzdGFydCB3aXRoIGFuIGVtcHR5IHBlbmRpbmcgYnVmZmVyICovXG4gICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICBpZiAocy5wZW5kaW5nICE9PSAwKSB7XG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LJDM7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIFN0YXJ0IGEgbmV3IGJsb2NrIG9yIGNvbnRpbnVlIHRoZSBjdXJyZW50IG9uZS5cbiAgICovXG4gIGlmIChzdHJtLmF2YWlsX2luICE9PSAwIHx8IHMubG9va2FoZWFkICE9PSAwIHx8XG4gICAgKGZsdXNoICE9PSBaX05PX0ZMVVNIJDIgJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICBsZXQgYnN0YXRlID0gcy5sZXZlbCA9PT0gMCA/IGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSA6XG4gICAgICAgICAgICAgICAgIHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAgICAgICAgICAgIHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LJDM7XG4gICAgICAvKiBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsXG4gICAgICAgKiBvZiBkZWZsYXRlIHNob3VsZCB1c2UgdGhlIHNhbWUgZmx1c2ggcGFyYW1ldGVyIHRvIG1ha2Ugc3VyZVxuICAgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuXG4gICAgICAgKiBlbXB0eSBibG9jayBoZXJlLCB0aGlzIHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzb1xuICAgICAgICogZW5zdXJlcyB0aGF0IGZvciBhIHZlcnkgc21hbGwgb3V0cHV0IGJ1ZmZlciwgd2UgZW1pdCBhdCBtb3N0XG4gICAgICAgKiBvbmUgZW1wdHkgYmxvY2suXG4gICAgICAgKi9cbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfQkxPQ0tfRE9ORSkge1xuICAgICAgaWYgKGZsdXNoID09PSBaX1BBUlRJQUxfRkxVU0gpIHtcbiAgICAgICAgX3RyX2FsaWduKHMpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0skMSkgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIJDEpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0skMztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIJDMpIHsgcmV0dXJuIFpfT0skMzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORCQzOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0skMyA6IFpfU1RSRUFNX0VORCQzO1xufTtcblxuXG5jb25zdCBkZWZsYXRlRW5kID0gKHN0cm0pID0+IHtcblxuICBpZiAoZGVmbGF0ZVN0YXRlQ2hlY2soc3RybSkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMjtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuXG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuXG4gIHJldHVybiBzdGF0dXMgPT09IEJVU1lfU1RBVEUgPyBlcnIoc3RybSwgWl9EQVRBX0VSUk9SJDIpIDogWl9PSyQzO1xufTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmNvbnN0IGRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gKHN0cm0sIGRpY3Rpb25hcnkpID0+IHtcblxuICBsZXQgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIGlmIChkZWZsYXRlU3RhdGVDaGVjayhzdHJtKSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQyO1xuICB9XG5cbiAgY29uc3QgcyA9IHN0cm0uc3RhdGU7XG4gIGNvbnN0IHdyYXAgPSBzLndyYXA7XG5cbiAgaWYgKHdyYXAgPT09IDIgfHwgKHdyYXAgPT09IDEgJiYgcy5zdGF0dXMgIT09IElOSVRfU1RBVEUpIHx8IHMubG9va2FoZWFkKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDI7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMl8xKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICB9XG5cbiAgcy53cmFwID0gMDsgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi9cblxuICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi9cbiAgaWYgKGRpY3RMZW5ndGggPj0gcy53X3NpemUpIHtcbiAgICBpZiAod3JhcCA9PT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovXG4gICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcbiAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICBzLmluc2VydCA9IDA7XG4gICAgfVxuICAgIC8qIHVzZSB0aGUgdGFpbCAqL1xuICAgIC8vIGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5LnNsaWNlKGRpY3RMZW5ndGggLSBzLndfc2l6ZSk7XG4gICAgbGV0IHRtcERpY3QgPSBuZXcgVWludDhBcnJheShzLndfc2l6ZSk7XG4gICAgdG1wRGljdC5zZXQoZGljdGlvbmFyeS5zdWJhcnJheShkaWN0TGVuZ3RoIC0gcy53X3NpemUsIGRpY3RMZW5ndGgpLCAwKTtcbiAgICBkaWN0aW9uYXJ5ID0gdG1wRGljdDtcbiAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7XG4gIH1cbiAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi9cbiAgY29uc3QgYXZhaWwgPSBzdHJtLmF2YWlsX2luO1xuICBjb25zdCBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBjb25zdCBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBkaWN0TGVuZ3RoO1xuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmlucHV0ID0gZGljdGlvbmFyeTtcbiAgZmlsbF93aW5kb3cocyk7XG4gIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICBsZXQgc3RyID0gcy5zdHJzdGFydDtcbiAgICBsZXQgbiA9IHMubG9va2FoZWFkIC0gKE1JTl9NQVRDSCAtIDEpO1xuICAgIGRvIHtcbiAgICAgIElOU0VSVF9TVFJJTkcocywgc3RyKTtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0skMztcbn07XG5cblxudmFyIGRlZmxhdGVJbml0XzEgPSBkZWZsYXRlSW5pdDtcbnZhciBkZWZsYXRlSW5pdDJfMSA9IGRlZmxhdGVJbml0MjtcbnZhciBkZWZsYXRlUmVzZXRfMSA9IGRlZmxhdGVSZXNldDtcbnZhciBkZWZsYXRlUmVzZXRLZWVwXzEgPSBkZWZsYXRlUmVzZXRLZWVwO1xudmFyIGRlZmxhdGVTZXRIZWFkZXJfMSA9IGRlZmxhdGVTZXRIZWFkZXI7XG52YXIgZGVmbGF0ZV8yJDEgPSBkZWZsYXRlJDI7XG52YXIgZGVmbGF0ZUVuZF8xID0gZGVmbGF0ZUVuZDtcbnZhciBkZWZsYXRlU2V0RGljdGlvbmFyeV8xID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG52YXIgZGVmbGF0ZUluZm8gPSAncGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxubW9kdWxlLmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xubW9kdWxlLmV4cG9ydHMuZGVmbGF0ZUNvcHkgPSBkZWZsYXRlQ29weTtcbm1vZHVsZS5leHBvcnRzLmRlZmxhdGVHZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZUdldERpY3Rpb25hcnk7XG5tb2R1bGUuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbm1vZHVsZS5leHBvcnRzLmRlZmxhdGVQZW5kaW5nID0gZGVmbGF0ZVBlbmRpbmc7XG5tb2R1bGUuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5tb2R1bGUuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cblxudmFyIGRlZmxhdGVfMSQyID0ge1xuXHRkZWZsYXRlSW5pdDogZGVmbGF0ZUluaXRfMSxcblx0ZGVmbGF0ZUluaXQyOiBkZWZsYXRlSW5pdDJfMSxcblx0ZGVmbGF0ZVJlc2V0OiBkZWZsYXRlUmVzZXRfMSxcblx0ZGVmbGF0ZVJlc2V0S2VlcDogZGVmbGF0ZVJlc2V0S2VlcF8xLFxuXHRkZWZsYXRlU2V0SGVhZGVyOiBkZWZsYXRlU2V0SGVhZGVyXzEsXG5cdGRlZmxhdGU6IGRlZmxhdGVfMiQxLFxuXHRkZWZsYXRlRW5kOiBkZWZsYXRlRW5kXzEsXG5cdGRlZmxhdGVTZXREaWN0aW9uYXJ5OiBkZWZsYXRlU2V0RGljdGlvbmFyeV8xLFxuXHRkZWZsYXRlSW5mbzogZGVmbGF0ZUluZm9cbn07XG5cbmNvbnN0IF9oYXMgPSAob2JqLCBrZXkpID0+IHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB3aGlsZSAoc291cmNlcy5sZW5ndGgpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG4gICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKF9oYXMoc291cmNlLCBwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxudmFyIGZsYXR0ZW5DaHVua3MgPSAoY2h1bmtzKSA9PiB7XG4gIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICBsZXQgbGVuID0gMDtcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBsZW4gKz0gY2h1bmtzW2ldLmxlbmd0aDtcbiAgfVxuXG4gIC8vIGpvaW4gY2h1bmtzXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbik7XG5cbiAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgbGV0IGNodW5rID0gY2h1bmtzW2ldO1xuICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgcG9zICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgY29tbW9uID0ge1xuXHRhc3NpZ246IGFzc2lnbixcblx0ZmxhdHRlbkNodW5rczogZmxhdHRlbkNodW5rc1xufTtcblxuLy8gU3RyaW5nIGVuY29kZS9kZWNvZGUgaGVscGVyc1xuXG5cbi8vIFF1aWNrIGNoZWNrIGlmIHdlIGNhbiB1c2UgZmFzdCBhcnJheSB0byBiaW4gc3RyaW5nIGNvbnZlcnNpb25cbi8vXG4vLyAtIGFwcGx5KEFycmF5KSBjYW4gZmFpbCBvbiBBbmRyb2lkIDIuMlxuLy8gLSBhcHBseShVaW50OEFycmF5KSBjYW4gZmFpbCBvbiBpT1MgNS4xIFNhZmFyaVxuLy9cbmxldCBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTtcblxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9VSUFfT0sgPSBmYWxzZTsgfVxuXG5cbi8vIFRhYmxlIHdpdGggdXRmOCBsZW5ndGhzIChjYWxjdWxhdGVkIGJ5IGZpcnN0IGJ5dGUgb2Ygc2VxdWVuY2UpXG4vLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBKUyxcbi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZlxuY29uc3QgX3V0ZjhsZW4gPSBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yIChsZXQgcSA9IDA7IHEgPCAyNTY7IHErKykge1xuICBfdXRmOGxlbltxXSA9IChxID49IDI1MiA/IDYgOiBxID49IDI0OCA/IDUgOiBxID49IDI0MCA/IDQgOiBxID49IDIyNCA/IDMgOiBxID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF0gPSBfdXRmOGxlblsyNTVdID0gMTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbnZhciBzdHJpbmcyYnVmID0gKHN0cikgPT4ge1xuICBpZiAodHlwZW9mIFRleHRFbmNvZGVyID09PSAnZnVuY3Rpb24nICYmIFRleHRFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUpIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7XG4gIH1cblxuICBsZXQgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zl9sZW4pO1xuXG4gIC8vIGNvbnZlcnRcbiAgZm9yIChpID0gMCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYnVmW2krK10gPSBjO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIEhlbHBlclxuY29uc3QgYnVmMmJpbnN0cmluZyA9IChidWYsIGxlbikgPT4ge1xuICAvLyBPbiBDaHJvbWUsIHRoZSBhcmd1bWVudHMgaW4gYSBmdW5jdGlvbiBjYWxsIHRoYXQgYXJlIGFsbG93ZWQgaXMgYDY1NTM0YC5cbiAgLy8gSWYgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiB0aGF0LCB3ZSBjYW4gdXNlIHRoaXMgb3B0aW1pemF0aW9uLFxuICAvLyBvdGhlcndpc2Ugd2Ugd2lsbCB0YWtlIGEgc2xvd2VyIHBhdGguXG4gIGlmIChsZW4gPCA2NTUzNCkge1xuICAgIGlmIChidWYuc3ViYXJyYXkgJiYgU1RSX0FQUExZX1VJQV9PSykge1xuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnVmLmxlbmd0aCA9PT0gbGVuID8gYnVmIDogYnVmLnN1YmFycmF5KDAsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbnZhciBidWYyc3RyaW5nID0gKGJ1ZiwgbWF4KSA9PiB7XG4gIGNvbnN0IGxlbiA9IG1heCB8fCBidWYubGVuZ3RoO1xuXG4gIGlmICh0eXBlb2YgVGV4dERlY29kZXIgPT09ICdmdW5jdGlvbicgJiYgVGV4dERlY29kZXIucHJvdG90eXBlLmRlY29kZSkge1xuICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYnVmLnN1YmFycmF5KDAsIG1heCkpO1xuICB9XG5cbiAgbGV0IGksIG91dDtcblxuICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gIC8vIE5COiBieSB1bmtub3duIHJlYXNvbnMsIEFycmF5IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGZvclxuICAvLyAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSB0aGFuIFVpbnQxNkFycmF5LlxuICBjb25zdCB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4gKiAyKTtcblxuICBmb3IgKG91dCA9IDAsIGkgPSAwOyBpIDwgbGVuOykge1xuICAgIGxldCBjID0gYnVmW2krK107XG4gICAgLy8gcXVpY2sgcHJvY2VzcyBhc2NpaVxuICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfVxuXG4gICAgbGV0IGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbnZhciB1dGY4Ym9yZGVyID0gKGJ1ZiwgbWF4KSA9PiB7XG5cbiAgbWF4ID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG4gIGlmIChtYXggPiBidWYubGVuZ3RoKSB7IG1heCA9IGJ1Zi5sZW5ndGg7IH1cblxuICAvLyBnbyBiYWNrIGZyb20gbGFzdCBwb3NpdGlvbiwgdW50aWwgc3RhcnQgb2Ygc2VxdWVuY2UgZm91bmRcbiAgbGV0IHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIFZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgYnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG5cbnZhciBzdHJpbmdzID0ge1xuXHRzdHJpbmcyYnVmOiBzdHJpbmcyYnVmLFxuXHRidWYyc3RyaW5nOiBidWYyc3RyaW5nLFxuXHR1dGY4Ym9yZGVyOiB1dGY4Ym9yZGVyXG59O1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbnZhciB6c3RyZWFtID0gWlN0cmVhbTtcblxuY29uc3QgdG9TdHJpbmckMSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5jb25zdCB7XG4gIFpfTk9fRkxVU0g6IFpfTk9fRkxVU0gkMSwgWl9TWU5DX0ZMVVNILCBaX0ZVTExfRkxVU0gsIFpfRklOSVNIOiBaX0ZJTklTSCQyLFxuICBaX09LOiBaX09LJDIsIFpfU1RSRUFNX0VORDogWl9TVFJFQU1fRU5EJDIsXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTixcbiAgWl9ERUZBVUxUX1NUUkFURUdZLFxuICBaX0RFRkxBVEVEOiBaX0RFRkxBVEVEJDFcbn0gPSBjb25zdGFudHMkMjtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuY29uc3QgZGVmYXVsdE9wdGlvbnMkMSA9IHtcbiAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTixcbiAgbWV0aG9kOiBaX0RFRkxBVEVEJDEsXG4gIGNodW5rU2l6ZTogMTYzODQsXG4gIHdpbmRvd0JpdHM6IDE1LFxuICBtZW1MZXZlbDogOCxcbiAgc3RyYXRlZ3k6IFpfREVGQVVMVF9TVFJBVEVHWSxcbiAgbGVnYWN5SGFzaDogdHJ1ZVxufTtcblxuLyoqXG4gKiBjbGFzcyBEZWZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbZGVmbGF0ZV1dLFxuICogW1tkZWZsYXRlUmF3XV0gYW5kIFtbZ3ppcF1dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogRGVmbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbRGVmbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGRlbi5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5XG4gKlxuICogQ29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbRGVmbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbRGVmbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgZGVmbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFlvdSB3aWxsIG5vdCBuZWVkIGl0IGluIHJlYWwgbGlmZSwgYmVjYXVzZSBkZWZsYXRlIGVycm9yc1xuICogYXJlIHBvc3NpYmxlIG9ubHkgb24gd3Jvbmcgb3B0aW9ucyBvciBiYWQgYG9uRGF0YWAgLyBgb25FbmRgXG4gKiBjdXN0b20gaGFuZGxlcnMuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tEZWZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBEZWZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGRlZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgbGV2ZWxgXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgbWVtTGV2ZWxgXG4gKiAtIGBzdHJhdGVneWBcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogLSBgbGVnYWN5SGFzaGAgKEJvb2xlYW4pIC0gdXNlIHRoZSBjbGFzc2ljIHpsaWIgaGFzaCAoZGVmYXVsdCksIHdoaWNoIG1hdGNoZXNcbiAqICAgY2Fub25pY2FsIHpsaWIgb3V0cHV0IGJ5dGUtZm9yLWJ5dGUuIFNldCB0byBgZmFsc2VgIHRvIHVzZSB0aGUgZmFzdGVyXG4gKiAgIEFOWkFDKysgaGFzaCwgd2hpY2ggbWF0Y2hlcyByZWNlbnQgKGNocm9taXVtKSBub2RlLmpzIG91dHB1dCBpbnN0ZWFkLlxuICpcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucywgZm9yIGludGVybmFsIG5lZWRzOlxuICpcbiAqIC0gYGNodW5rU2l6ZWAgLSBzaXplIG9mIGdlbmVyYXRlZCBkYXRhIGNodW5rcyAoMTZLIGJ5IGRlZmF1bHQpXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIGRvIHJhdyBkZWZsYXRlXG4gKiAtIGBnemlwYCAoQm9vbGVhbikgLSBjcmVhdGUgZ3ppcCB3cmFwcGVyXG4gKiAtIGBoZWFkZXJgIChPYmplY3QpIC0gY3VzdG9tIGhlYWRlciBmb3IgZ3ppcFxuICogICAtIGB0ZXh0YCAoQm9vbGVhbikgLSB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0XG4gKiAgIC0gYHRpbWVgIChOdW1iZXIpIC0gbW9kaWZpY2F0aW9uIHRpbWUsIHVuaXggdGltZXN0YW1wXG4gKiAgIC0gYG9zYCAoTnVtYmVyKSAtIG9wZXJhdGlvbiBzeXN0ZW0gY29kZVxuICogICAtIGBleHRyYWAgKEFycmF5KSAtIGFycmF5IG9mIGJ5dGVzIHdpdGggZXh0cmEgZGF0YSAobWF4IDY1NTM2KVxuICogICAtIGBuYW1lYCAoU3RyaW5nKSAtIGZpbGUgbmFtZSAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgY29tbWVudGAgKFN0cmluZykgLSBjb21tZW50IChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBoY3JjYCAoQm9vbGVhbikgLSB0cnVlIGlmIGhlYWRlciBjcmMgc2hvdWxkIGJlIGFkZGVkXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25zdCBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gbmV3IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBjaHVuazIgPSBuZXcgVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiBjb25zdCBkZWZsYXRlID0gbmV3IHBha28uRGVmbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogZGVmbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogZGVmbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoZGVmbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGRlZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGRlZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gRGVmbGF0ZSQxKG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gY29tbW9uLmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMkMSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgbGV0IG9wdCA9IHRoaXMub3B0aW9ucztcblxuICBpZiAob3B0LnJhdyAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAob3B0Lmd6aXAgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMTY7XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gPSBuZXcgenN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICBsZXQgc3RhdHVzID0gZGVmbGF0ZV8xJDIuZGVmbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQubGV2ZWwsXG4gICAgb3B0Lm1ldGhvZCxcbiAgICBvcHQud2luZG93Qml0cyxcbiAgICBvcHQubWVtTGV2ZWwsXG4gICAgb3B0LnN0cmF0ZWd5LFxuICAgIG9wdC5sZWdhY3lIYXNoXG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9PSyQyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2VzW3N0YXR1c10pO1xuICB9XG5cbiAgaWYgKG9wdC5oZWFkZXIpIHtcbiAgICBkZWZsYXRlXzEkMi5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7XG4gIH1cblxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICBsZXQgZGljdDtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nJDEuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSBkZWZsYXRlXzEkMi5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3QpO1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9PSyQyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZXNbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBmbHVzaF9tb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBmbHVzaF9tb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gZGVmbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbRGVmbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgY29tcHJlc3NlZCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdFxuICogaGF2ZSBgZmx1c2hfbW9kZWAgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nXG4gKiBidWZmZXJzIGFuZCBjYWxsIFtbRGVmbGF0ZSNvbkVuZF1dLlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0RlZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5EZWZsYXRlJDEucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgZmx1c2hfbW9kZSkge1xuICBjb25zdCBzdHJtID0gdGhpcy5zdHJtO1xuICBjb25zdCBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICBsZXQgc3RhdHVzLCBfZmx1c2hfbW9kZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBpZiAoZmx1c2hfbW9kZSA9PT0gfn5mbHVzaF9tb2RlKSBfZmx1c2hfbW9kZSA9IGZsdXNoX21vZGU7XG4gIGVsc2UgX2ZsdXNoX21vZGUgPSBmbHVzaF9tb2RlID09PSB0cnVlID8gWl9GSU5JU0gkMiA6IFpfTk9fRkxVU0gkMTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmckMS5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGZvciAoOzspIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIGF2YWlsX291dCA+IDYgdG8gYXZvaWQgcmVwZWF0aW5nIG1hcmtlcnNcbiAgICBpZiAoKF9mbHVzaF9tb2RlID09PSBaX1NZTkNfRkxVU0ggfHwgX2ZsdXNoX21vZGUgPT09IFpfRlVMTF9GTFVTSCkgJiYgc3RybS5hdmFpbF9vdXQgPD0gNikge1xuICAgICAgdGhpcy5vbkRhdGEoc3RybS5vdXRwdXQuc3ViYXJyYXkoMCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gZGVmbGF0ZV8xJDIuZGVmbGF0ZShzdHJtLCBfZmx1c2hfbW9kZSk7XG5cbiAgICAvLyBFbmRlZCA9PiBmbHVzaCBhbmQgZmluaXNoXG4gICAgaWYgKHN0YXR1cyA9PT0gWl9TVFJFQU1fRU5EJDIpIHtcbiAgICAgIGlmIChzdHJtLm5leHRfb3V0ID4gMCkge1xuICAgICAgICB0aGlzLm9uRGF0YShzdHJtLm91dHB1dC5zdWJhcnJheSgwLCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICB9XG4gICAgICBzdGF0dXMgPSBkZWZsYXRlXzEkMi5kZWZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBzdGF0dXMgPT09IFpfT0skMjtcbiAgICB9XG5cbiAgICAvLyBGbHVzaCBpZiBvdXQgYnVmZmVyIGZ1bGxcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHRoaXMub25EYXRhKHN0cm0ub3V0cHV0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEZsdXNoIGlmIHJlcXVlc3RlZCBhbmQgaGFzIGRhdGFcbiAgICBpZiAoX2ZsdXNoX21vZGUgPiAwICYmIHN0cm0ubmV4dF9vdXQgPiAwKSB7XG4gICAgICB0aGlzLm9uRGF0YShzdHJtLm91dHB1dC5zdWJhcnJheSgwLCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheSk6IG91dHB1dCBkYXRhLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuRGVmbGF0ZSQxLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBkZWZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBvbmNlIGFmdGVyIHlvdSB0ZWxsIGRlZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUkMS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IFpfT0skMikge1xuICAgIHRoaXMucmVzdWx0ID0gY29tbW9uLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXlcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDb21wcmVzcyBgZGF0YWAgd2l0aCBkZWZsYXRlIGFsZ29yaXRobSBhbmQgYG9wdGlvbnNgLlxuICpcbiAqIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAqXG4gKiAtIGxldmVsXG4gKiAtIHdpbmRvd0JpdHNcbiAqIC0gbWVtTGV2ZWxcbiAqIC0gc3RyYXRlZ3lcbiAqIC0gZGljdGlvbmFyeVxuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlJDEoaW5wdXQsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZSQxKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnIHx8IG1lc3NhZ2VzW2RlZmxhdG9yLmVycl07IH1cblxuICByZXR1cm4gZGVmbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogZGVmbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXlcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZVJhdyQxKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlJDEoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogZ3ppcChkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXlcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCBvZlxuICogZGVmbGF0ZSBvbmUuXG4gKiovXG5mdW5jdGlvbiBnemlwJDEoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlJDEoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbnZhciBEZWZsYXRlXzEkMSA9IERlZmxhdGUkMTtcbnZhciBkZWZsYXRlXzIgPSBkZWZsYXRlJDE7XG52YXIgZGVmbGF0ZVJhd18xJDEgPSBkZWZsYXRlUmF3JDE7XG52YXIgZ3ppcF8xJDEgPSBnemlwJDE7XG52YXIgY29uc3RhbnRzJDEgPSBjb25zdGFudHMkMjtcblxudmFyIGRlZmxhdGVfMSQxID0ge1xuXHREZWZsYXRlOiBEZWZsYXRlXzEkMSxcblx0ZGVmbGF0ZTogZGVmbGF0ZV8yLFxuXHRkZWZsYXRlUmF3OiBkZWZsYXRlUmF3XzEkMSxcblx0Z3ppcDogZ3ppcF8xJDEsXG5cdGNvbnN0YW50czogY29uc3RhbnRzJDFcbn07XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG5jb25zdCBCQUQkMSA9IDE2MjA5OyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG5jb25zdCBUWVBFJDEgPSAxNjE5MTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbnZhciBpbmZmYXN0ID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7XG4gIGxldCBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIGxldCBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgbGV0IF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIGxldCBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIGxldCBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIGxldCBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIGxldCB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgbGV0IHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgbGV0IHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICBsZXQgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIGxldCBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgbGV0IGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICBsZXQgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIGxldCBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIGxldCBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgbGV0IGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIGxldCBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgbGV0IG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgbGV0IGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIGxldCBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICBsZXQgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIGxldCBmcm9tX3NvdXJjZTtcblxuXG4gIGxldCBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgY29uc3Qgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQkMTtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEJDE7XG4gICAgICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICAgICAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTtcbi8vICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCA+IHdoYXZlKTtcbi8vICAgICAgICAgICAgICAgIGlmIChvcCA9PT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnJvbSA9IDA7IC8vIHdpbmRvdyBpbmRleFxuICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93O1xuICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gMDtcbiAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0O1xuICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi9cbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICAgICAgY29udGludWUgZG9kaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEJDE7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFJDE7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEJDE7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICB9XG4gIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7XG5cbiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovXG4gIGxlbiA9IGJpdHMgPj4gMztcbiAgX2luIC09IGxlbjtcbiAgYml0cyAtPSBsZW4gPDwgMztcbiAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi9cbiAgc3RybS5uZXh0X2luID0gX2luO1xuICBzdHJtLm5leHRfb3V0ID0gX291dDtcbiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpO1xuICBzdHJtLmF2YWlsX291dCA9IChfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpKTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICByZXR1cm47XG59O1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmNvbnN0IE1BWEJJVFMgPSAxNTtcbmNvbnN0IEVOT1VHSF9MRU5TJDEgPSA4NTI7XG5jb25zdCBFTk9VR0hfRElTVFMkMSA9IDU5Mjtcbi8vY29uc3QgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbmNvbnN0IENPREVTJDEgPSAwO1xuY29uc3QgTEVOUyQxID0gMTtcbmNvbnN0IERJU1RTJDEgPSAyO1xuXG5jb25zdCBsYmFzZSA9IG5ldyBVaW50MTZBcnJheShbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dKTtcblxuY29uc3QgbGV4dCA9IG5ldyBVaW50OEFycmF5KFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgMTk5LCA3NVxuXSk7XG5cbmNvbnN0IGRiYXNlID0gbmV3IFVpbnQxNkFycmF5KFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqL1xuICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsXG4gIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSxcbiAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMFxuXSk7XG5cbmNvbnN0IGRleHQgPSBuZXcgVWludDhBcnJheShbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsIDIyLFxuICAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNyxcbiAgMjgsIDI4LCAyOSwgMjksIDY0LCA2NFxuXSk7XG5cbmNvbnN0IGluZmxhdGVfdGFibGUgPSAodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cykgPT5cbntcbiAgY29uc3QgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgbGV0IGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgbGV0IHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIGxldCBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICBsZXQgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICBsZXQgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICBsZXQgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIGxldCBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgbGV0IHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgbGV0IGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIGxldCBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICBsZXQgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIGxldCBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICBsZXQgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgbGV0IG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIGxldCBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4vLyAgbGV0IHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICBsZXQgbWF0Y2g7ICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPj0gbWF0Y2ggKi9cbiAgY29uc3QgY291bnQgPSBuZXcgVWludDE2QXJyYXkoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgY29uc3Qgb2ZmcyA9IG5ldyBVaW50MTZBcnJheShNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqL1xuICBsZXQgZXh0cmEgPSBudWxsO1xuXG4gIGxldCBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsO1xuXG4gIC8qXG4gICBQcm9jZXNzIGEgc2V0IG9mIGNvZGUgbGVuZ3RocyB0byBjcmVhdGUgYSBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLiAgVGhlXG4gICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGVcbiAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlXG4gICBzeW1ib2xzIGJ5IGxlbmd0aCBmcm9tIHNob3J0IHRvIGxvbmcsIGFuZCByZXRhaW5pbmcgdGhlIHN5bWJvbCBvcmRlclxuICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0c1xuICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXJcbiAgIGluY3JlbWVudHMgZm9yIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHplcm9zIGFyZSBhcHBlbmRlZCBhcyB0aGUgbGVuZ3RoXG4gICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzXG4gICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlXG4gICBkZWNvZGluZyB0YWJsZXMgYXJlIGJ1aWx0IGluIHRoZSBsYXJnZSBsb29wIGJlbG93LCB0aGUgaW50ZWdlciBjb2Rlc1xuICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy5cblxuICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW5cbiAgIGxlbnNbXSBhcmUgaW4gdGhlIHJhbmdlIDAuLk1BWEJJVFMuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoaXMuXG4gICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdFxuICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS5cblxuICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLFxuICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlXG4gICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWRcbiAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieVxuICAgdGhlIGNhbGxlci5cblxuICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZ1xuICAgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoIGNvZGVzLCBkZXRlcm1pbmluZyBpZiB0aGVyZSBhcmUgYW55XG4gICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZFxuICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlXG4gICBkZWNvZGluZyB0YWJsZXMuXG4gICAqL1xuXG4gIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqL1xuICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGNvdW50W2xlbl0gPSAwO1xuICB9XG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgY291bnRbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rKztcbiAgfVxuXG4gIC8qIGJvdW5kIGNvZGUgbGVuZ3RocywgZm9yY2Ugcm9vdCB0byBiZSB3aXRoaW4gY29kZSBsZW5ndGhzICovXG4gIHJvb3QgPSBiaXRzO1xuICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkge1xuICAgIGlmIChjb3VudFttYXhdICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPiBtYXgpIHtcbiAgICByb290ID0gbWF4O1xuICB9XG4gIGlmIChtYXggPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBubyBzeW1ib2xzIHRvIGNvZGUgYXQgYWxsICovXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0OyAgLy9oZXJlLm9wID0gKHZhciBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTsgICAvL2hlcmUuYml0cyA9ICh2YXIgY2hhcikxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwOyAgIC8vaGVyZS52YWwgPSAodmFyIHNob3J0KTA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0O1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuICAgIG9wdHMuYml0cyA9IDE7XG4gICAgcmV0dXJuIDA7ICAgICAvKiBubyBzeW1ib2xzLCBidXQgd2FpdCBmb3IgZGVjb2RpbmcgdG8gcmVwb3J0IGVycm9yICovXG4gIH1cbiAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKSB7XG4gICAgaWYgKGNvdW50W21pbl0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA8IG1pbikge1xuICAgIHJvb3QgPSBtaW47XG4gIH1cblxuICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi9cbiAgbGVmdCA9IDE7XG4gIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgbGVmdCA8PD0gMTtcbiAgICBsZWZ0IC09IGNvdW50W2xlbl07XG4gICAgaWYgKGxlZnQgPCAwKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovXG4gIH1cbiAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyQxIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUyQxKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgbWF0Y2ggPSAyMDtcblxuICB9IGVsc2UgaWYgKHR5cGUgPT09IExFTlMkMSkge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgbWF0Y2ggPSAyNTc7XG5cbiAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIERJU1RTICovXG4gICAgYmFzZSA9IGRiYXNlO1xuICAgIGV4dHJhID0gZGV4dDtcbiAgICBtYXRjaCA9IDA7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyQxICYmIHVzZWQgPiBFTk9VR0hfTEVOUyQxKSB8fFxuICAgICh0eXBlID09PSBESVNUUyQxICYmIHVzZWQgPiBFTk9VR0hfRElTVFMkMSkpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqL1xuICAgIGhlcmVfYml0cyA9IGxlbiAtIGRyb3A7XG4gICAgaWYgKHdvcmtbc3ltXSArIDEgPCBtYXRjaCkge1xuICAgICAgaGVyZV9vcCA9IDA7XG4gICAgICBoZXJlX3ZhbCA9IHdvcmtbc3ltXTtcbiAgICB9XG4gICAgZWxzZSBpZiAod29ya1tzeW1dID49IG1hdGNoKSB7XG4gICAgICBoZXJlX29wID0gZXh0cmFbd29ya1tzeW1dIC0gbWF0Y2hdO1xuICAgICAgaGVyZV92YWwgPSBiYXNlW3dvcmtbc3ltXSAtIG1hdGNoXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMkMSAmJiB1c2VkID4gRU5PVUdIX0xFTlMkMSkgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTJDEgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUyQxKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi9cbiAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrO1xuICAgICAgLyp0YWJsZS5vcFtsb3ddID0gY3VycjtcbiAgICAgIHRhYmxlLmJpdHNbbG93XSA9IHJvb3Q7XG4gICAgICB0YWJsZS52YWxbbG93XSA9IG5leHQgLSBvcHRzLnRhYmxlX2luZGV4OyovXG4gICAgICB0YWJsZVtsb3ddID0gKHJvb3QgPDwgMjQpIHwgKGN1cnIgPDwgMTYpIHwgKG5leHQgLSB0YWJsZV9pbmRleCkgfDA7XG4gICAgfVxuICB9XG5cbiAgLyogZmlsbCBpbiByZW1haW5pbmcgdGFibGUgZW50cnkgaWYgY29kZSBpcyBpbmNvbXBsZXRlIChndWFyYW50ZWVkIHRvIGhhdmVcbiAgIGF0IG1vc3Qgb25lIHJlbWFpbmluZyBlbnRyeSwgc2luY2UgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlXG4gICBtYXhpbXVtIGNvZGUgbGVuZ3RoIHRoYXQgd2FzIGFsbG93ZWQgdG8gZ2V0IHRoaXMgZmFyIGlzIG9uZSBiaXQpICovXG4gIGlmIChodWZmICE9PSAwKSB7XG4gICAgLy90YWJsZS5vcFtuZXh0ICsgaHVmZl0gPSA2NDsgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW25leHQgKyBodWZmXSA9IGxlbiAtIGRyb3A7XG4gICAgLy90YWJsZS52YWxbbmV4dCArIGh1ZmZdID0gMDtcbiAgICB0YWJsZVtuZXh0ICsgaHVmZl0gPSAoKGxlbiAtIGRyb3ApIDw8IDI0KSB8ICg2NCA8PCAxNikgfDA7XG4gIH1cblxuICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi9cbiAgLy9vcHRzLnRhYmxlX2luZGV4ICs9IHVzZWQ7XG4gIG9wdHMuYml0cyA9IHJvb3Q7XG4gIHJldHVybiAwO1xufTtcblxuXG52YXIgaW5mdHJlZXMgPSBpbmZsYXRlX3RhYmxlO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cblxuXG5cblxuXG5jb25zdCBDT0RFUyA9IDA7XG5jb25zdCBMRU5TID0gMTtcbmNvbnN0IERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbmNvbnN0IHtcbiAgWl9GSU5JU0g6IFpfRklOSVNIJDEsIFpfQkxPQ0ssIFpfVFJFRVMsXG4gIFpfT0s6IFpfT0skMSwgWl9TVFJFQU1fRU5EOiBaX1NUUkVBTV9FTkQkMSwgWl9ORUVEX0RJQ1Q6IFpfTkVFRF9ESUNUJDEsIFpfU1RSRUFNX0VSUk9SOiBaX1NUUkVBTV9FUlJPUiQxLCBaX0RBVEFfRVJST1I6IFpfREFUQV9FUlJPUiQxLCBaX01FTV9FUlJPUjogWl9NRU1fRVJST1IkMSwgWl9CVUZfRVJST1I6IFpfQlVGX0VSUk9SJDEsXG4gIFpfREVGTEFURURcbn0gPSBjb25zdGFudHMkMjtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5jb25zdCAgICBIRUFEID0gMTYxODA7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xuY29uc3QgICAgRkxBR1MgPSAxNjE4MTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xuY29uc3QgICAgVElNRSA9IDE2MTgyOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbmNvbnN0ICAgIE9TID0gMTYxODM7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG5jb25zdCAgICBFWExFTiA9IDE2MTg0OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbmNvbnN0ICAgIEVYVFJBID0gMTYxODU7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG5jb25zdCAgICBOQU1FID0gMTYxODY7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG5jb25zdCAgICBDT01NRU5UID0gMTYxODc7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xuY29uc3QgICAgSENSQyA9IDE2MTg4OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xuY29uc3QgICAgRElDVElEID0gMTYxODk7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpY3Rpb25hcnkgY2hlY2sgdmFsdWUgKi9cbmNvbnN0ICAgIERJQ1QgPSAxNjE5MDsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbmNvbnN0ICAgICAgICBUWVBFID0gMTYxOTE7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuY29uc3QgICAgICAgIFRZUEVETyA9IDE2MTkyOyAgICAvKiBpOiBzYW1lLCBidXQgc2tpcCBjaGVjayB0byBleGl0IGluZmxhdGUgb24gbmV3IGJsb2NrICovXG5jb25zdCAgICAgICAgU1RPUkVEID0gMTYxOTM7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG5jb25zdCAgICAgICAgQ09QWV8gPSAxNjE5NDsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG5jb25zdCAgICAgICAgQ09QWSA9IDE2MTk1OyAgICAgIC8qIGkvbzogd2FpdGluZyBmb3IgaW5wdXQgb3Igb3V0cHV0IHRvIGNvcHkgc3RvcmVkIGJsb2NrICovXG5jb25zdCAgICAgICAgVEFCTEUgPSAxNjE5NjsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xuY29uc3QgICAgICAgIExFTkxFTlMgPSAxNjE5NzsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbmNvbnN0ICAgICAgICBDT0RFTEVOUyA9IDE2MTk4OyAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG5jb25zdCAgICAgICAgICAgIExFTl8gPSAxNjE5OTsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xuY29uc3QgICAgICAgICAgICBMRU4gPSAxNjIwMDsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xuY29uc3QgICAgICAgICAgICBMRU5FWFQgPSAxNjIwMTsgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi9cbmNvbnN0ICAgICAgICAgICAgRElTVCA9IDE2MjAyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbmNvbnN0ICAgICAgICAgICAgRElTVEVYVCA9IDE2MjAzOyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbmNvbnN0ICAgICAgICAgICAgTUFUQ0ggPSAxNjIwNDsgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqL1xuY29uc3QgICAgICAgICAgICBMSVQgPSAxNjIwNTsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbmNvbnN0ICAgIENIRUNLID0gMTYyMDY7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbmNvbnN0ICAgIExFTkdUSCA9IDE2MjA3OyAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqL1xuY29uc3QgICAgRE9ORSA9IDE2MjA4OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG5jb25zdCAgICBCQUQgPSAxNjIwOTsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xuY29uc3QgICAgTUVNID0gMTYyMTA7ICAgICAgIC8qIGdvdCBhbiBpbmZsYXRlKCkgbWVtb3J5IGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG5jb25zdCAgICBTWU5DID0gMTYyMTE7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG5jb25zdCBFTk9VR0hfTEVOUyA9IDg1MjtcbmNvbnN0IEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vY29uc3QgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG5jb25zdCBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xuY29uc3QgREVGX1dCSVRTID0gTUFYX1dCSVRTO1xuXG5cbmNvbnN0IHpzd2FwMzIgPSAocSkgPT4ge1xuXG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufTtcblxuXG5mdW5jdGlvbiBJbmZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAvKiBwb2ludGVyIGJhY2sgdG8gdGhpcyB6bGliIHN0cmVhbSAqL1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDIgdHJ1ZSB0byB2YWxpZGF0ZSBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLmhhdmVkaWN0ID0gZmFsc2U7ICAgICAgLyogdHJ1ZSBpZiBkaWN0aW9uYXJ5IHByb3ZpZGVkICovXG4gIHRoaXMuZmxhZ3MgPSAwOyAgICAgICAgICAgICAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpLCBvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgaWYgcmF3IG9yIG5vIGhlYWRlciB5ZXQgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyBVaW50MTZBcnJheSgzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyBVaW50MTZBcnJheSgyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgSW50MzJBcnJheShFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5cbmNvbnN0IGluZmxhdGVTdGF0ZUNoZWNrID0gKHN0cm0pID0+IHtcblxuICBpZiAoIXN0cm0pIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBjb25zdCBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICghc3RhdGUgfHwgc3RhdGUuc3RybSAhPT0gc3RybSB8fFxuICAgIHN0YXRlLm1vZGUgPCBIRUFEIHx8IHN0YXRlLm1vZGUgPiBTWU5DKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5cbmNvbnN0IGluZmxhdGVSZXNldEtlZXAgPSAoc3RybSkgPT4ge1xuXG4gIGlmIChpbmZsYXRlU3RhdGVDaGVjayhzdHJtKSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTsgfVxuICBjb25zdCBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IHN0YXRlLnRvdGFsID0gMDtcbiAgc3RybS5tc2cgPSAnJzsgLypaX05VTEwqL1xuICBpZiAoc3RhdGUud3JhcCkgeyAgICAgICAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovXG4gICAgc3RybS5hZGxlciA9IHN0YXRlLndyYXAgJiAxO1xuICB9XG4gIHN0YXRlLm1vZGUgPSBIRUFEO1xuICBzdGF0ZS5sYXN0ID0gMDtcbiAgc3RhdGUuaGF2ZWRpY3QgPSAwO1xuICBzdGF0ZS5mbGFncyA9IC0xO1xuICBzdGF0ZS5kbWF4ID0gMzI3Njg7XG4gIHN0YXRlLmhlYWQgPSBudWxsLypaX05VTEwqLztcbiAgc3RhdGUuaG9sZCA9IDA7XG4gIHN0YXRlLmJpdHMgPSAwO1xuICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5biA9IG5ldyBJbnQzMkFycmF5KEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IEludDMyQXJyYXkoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0skMTtcbn07XG5cblxuY29uc3QgaW5mbGF0ZVJlc2V0ID0gKHN0cm0pID0+IHtcblxuICBpZiAoaW5mbGF0ZVN0YXRlQ2hlY2soc3RybSkpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7IH1cbiAgY29uc3Qgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdGF0ZS53c2l6ZSA9IDA7XG4gIHN0YXRlLndoYXZlID0gMDtcbiAgc3RhdGUud25leHQgPSAwO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKTtcblxufTtcblxuXG5jb25zdCBpbmZsYXRlUmVzZXQyID0gKHN0cm0sIHdpbmRvd0JpdHMpID0+IHtcbiAgbGV0IHdyYXA7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoaW5mbGF0ZVN0YXRlQ2hlY2soc3RybSkpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7IH1cbiAgY29uc3Qgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIC8qIGV4dHJhY3Qgd3JhcCByZXF1ZXN0IGZyb20gd2luZG93Qml0cyBwYXJhbWV0ZXIgKi9cbiAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7XG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG4gIGVsc2Uge1xuICAgIHdyYXAgPSAod2luZG93Qml0cyA+PiA0KSArIDU7XG4gICAgaWYgKHdpbmRvd0JpdHMgPCA0OCkge1xuICAgICAgd2luZG93Qml0cyAmPSAxNTtcbiAgICB9XG4gIH1cblxuICAvKiBzZXQgbnVtYmVyIG9mIHdpbmRvdyBiaXRzLCBmcmVlIHdpbmRvdyBpZiBkaWZmZXJlbnQgKi9cbiAgaWYgKHdpbmRvd0JpdHMgJiYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn07XG5cblxuY29uc3QgaW5mbGF0ZUluaXQyID0gKHN0cm0sIHdpbmRvd0JpdHMpID0+IHtcblxuICBpZiAoIXN0cm0pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgY29uc3Qgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUuc3RybSA9IHN0cm07XG4gIHN0YXRlLndpbmRvdyA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5tb2RlID0gSEVBRDsgICAgIC8qIHRvIHBhc3Mgc3RhdGUgdGVzdCBpbiBpbmZsYXRlUmVzZXQyKCkgKi9cbiAgY29uc3QgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSyQxKSB7XG4gICAgc3RybS5zdGF0ZSA9IG51bGwvKlpfTlVMTCovO1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuXG5cbmNvbnN0IGluZmxhdGVJbml0ID0gKHN0cm0pID0+IHtcblxuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59O1xuXG5cbi8qXG4gUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0b1xuIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC5cbiBJZiBCVUlMREZJWEVEIGlzIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGlzIHJvdXRpbmUgYnVpbGRzIHRoZSB0YWJsZXMgdGhlXG4gZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZFxuIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluXG4gZXhjaGFuZ2UgZm9yIGEgbGl0dGxlIGV4ZWN1dGlvbiB0aW1lLiAgSG93ZXZlciwgQlVJTERGSVhFRCBzaG91bGQgbm90IGJlXG4gdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpblxuIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuXG4gKi9cbmxldCB2aXJnaW4gPSB0cnVlO1xuXG5sZXQgbGVuZml4LCBkaXN0Zml4OyAvLyBXZSBoYXZlIG5vIHBvaW50ZXJzIGluIEpTLCBzbyBrZWVwIHRhYmxlcyBzZXBhcmF0ZVxuXG5cbmNvbnN0IGZpeGVkdGFibGVzID0gKHN0YXRlKSA9PiB7XG5cbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIGxlbmZpeCA9IG5ldyBJbnQzMkFycmF5KDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyBJbnQzMkFycmF5KDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgbGV0IHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZnRyZWVzKExFTlMsICBzdGF0ZS5sZW5zLCAwLCAyODgsIGxlbmZpeCwgICAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDkgfSk7XG5cbiAgICAvKiBkaXN0YW5jZSB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDMyKSB7IHN0YXRlLmxlbnNbc3ltKytdID0gNTsgfVxuXG4gICAgaW5mdHJlZXMoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59O1xuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5jb25zdCB1cGRhdGV3aW5kb3cgPSAoc3RybSwgc3JjLCBlbmQsIGNvcHkpID0+IHtcblxuICBsZXQgZGlzdDtcbiAgY29uc3Qgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIC8qIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3aW5kb3cgKi9cbiAgaWYgKHN0YXRlLndpbmRvdyA9PT0gbnVsbCkge1xuICAgIHN0YXRlLndpbmRvdyA9IG5ldyBVaW50OEFycmF5KDEgPDwgc3RhdGUud2JpdHMpO1xuICB9XG5cbiAgLyogaWYgd2luZG93IG5vdCBpbiB1c2UgeWV0LCBpbml0aWFsaXplICovXG4gIGlmIChzdGF0ZS53c2l6ZSA9PT0gMCkge1xuICAgIHN0YXRlLndzaXplID0gMSA8PCBzdGF0ZS53Yml0cztcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSAwO1xuICB9XG5cbiAgLyogY29weSBzdGF0ZS0+d3NpemUgb3IgbGVzcyBvdXRwdXQgYnl0ZXMgaW50byB0aGUgY2lyY3VsYXIgd2luZG93ICovXG4gIGlmIChjb3B5ID49IHN0YXRlLndzaXplKSB7XG4gICAgc3RhdGUud2luZG93LnNldChzcmMuc3ViYXJyYXkoZW5kIC0gc3RhdGUud3NpemUsIGVuZCksIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICBzdGF0ZS53aW5kb3cuc2V0KHNyYy5zdWJhcnJheShlbmQgLSBjb3B5LCBlbmQgLSBjb3B5ICsgZGlzdCksIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHN0YXRlLndpbmRvdy5zZXQoc3JjLnN1YmFycmF5KGVuZCAtIGNvcHksIGVuZCksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5cbmNvbnN0IGluZmxhdGUkMiA9IChzdHJtLCBmbHVzaCkgPT4ge1xuXG4gIGxldCBzdGF0ZTtcbiAgbGV0IGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIGxldCBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIGxldCBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICBsZXQgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgbGV0IGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgbGV0IGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICBsZXQgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICBsZXQgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIGxldCBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgbGV0IGZyb21fc291cmNlO1xuICBsZXQgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICBsZXQgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy9sZXQgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIGxldCBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICBsZXQgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICBsZXQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgY29uc3QgaGJ1ZiA9IG5ldyBVaW50OEFycmF5KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICBsZXQgb3B0cztcblxuICBsZXQgbjsgLy8gdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBORUVEX0JJVFNcblxuICBjb25zdCBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIG5ldyBVaW50OEFycmF5KFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdKTtcblxuXG4gIGlmIChpbmZsYXRlU3RhdGVDaGVjayhzdHJtKSB8fCAhc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQxO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LJDE7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgICBjYXNlIEhFQUQ6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICAgIGlmIChzdGF0ZS53Yml0cyA9PT0gMCkge1xuICAgICAgICAgICAgc3RhdGUud2JpdHMgPSAxNTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSAwLypjcmMzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyXzEoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cblxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGhlYWRlciBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS53Yml0cyA9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVuID4gMTUgfHwgbGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gISEhIHBha28gcGF0Y2guIEZvcmNlIHVzZSBgb3B0aW9ucy53aW5kb3dCaXRzYCBpZiBwYXNzZWQuXG4gICAgICAgIC8vIFJlcXVpcmVkIHRvIGFsd2F5cyB1c2UgbWF4IHdpbmRvdyBzaXplIGJ5IGRlZmF1bHQuXG4gICAgICAgIHN0YXRlLmRtYXggPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgICAgICAvL3N0YXRlLmRtYXggPSAxIDw8IGxlbjtcblxuICAgICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgemxpYiBoZWFkZXIgKi9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGTEFHUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmZsYWdzID0gaG9sZDtcbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHhlMDAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50ZXh0ID0gKChob2xkID4+IDgpICYgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4MDIwMCkgJiYgKHN0YXRlLndyYXAgJiA0KSkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyXzEoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVElNRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHgwMjAwKSAmJiAoc3RhdGUud3JhcCAmIDQpKSB7XG4gICAgICAgICAgLy89PT0gQ1JDNChzdGF0ZS5jaGVjaywgaG9sZClcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsyXSA9IChob2xkID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyXzEoc3RhdGUuY2hlY2ssIGhidWYsIDQsIDApO1xuICAgICAgICAgIC8vPT09XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBPUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHgwMjAwKSAmJiAoc3RhdGUud3JhcCAmIDQpKSB7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzJfMShzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRVhMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhMRU46XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZDtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHgwMjAwKSAmJiAoc3RhdGUud3JhcCAmIDQpKSB7XG4gICAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMl8xKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhUUkE6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW50IHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbmV3IFVpbnQ4QXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEuc2V0KFxuICAgICAgICAgICAgICAgIGlucHV0LnN1YmFycmF5KFxuICAgICAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXNcbiAgICAgICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgICAgICBuZXh0ICsgY29weVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgLypsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gPyBzdGF0ZS5oZWFkLmV4dHJhX21heCA6IGNvcHksKi9cbiAgICAgICAgICAgICAgICBsZW5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy96bWVtY3B5KHN0YXRlLmhlYWQuZXh0cmEgKyBsZW4sIG5leHQsXG4gICAgICAgICAgICAgIC8vICAgICAgICBsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggP1xuICAgICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgJiAweDAyMDApICYmIChzdGF0ZS53cmFwICYgNCkpIHtcbiAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMl8xKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBOQU1FOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBjb3B5ID0gMDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAvLyBUT0RPOiAyIG9yIDEgYnl0ZXM/XG4gICAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLm5hbWVfbWF4Ki8pKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcblxuICAgICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgJiAweDAyMDApICYmIChzdGF0ZS53cmFwICYgNCkpIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzJfMShzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGlmIChsZW4pIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IENPTU1FTlQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgxMDAwKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgY29weSA9IDA7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4MDIwMCkgJiYgKHN0YXRlLndyYXAgJiA0KSkge1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMl8xKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gSENSQztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBIQ1JDOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIGlmICgoc3RhdGUud3JhcCAmIDQpICYmIGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuaGNyYyA9ICgoc3RhdGUuZmxhZ3MgPj4gOSkgJiAxKTtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElDVElEOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0genN3YXAzMihob2xkKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJQ1Q6XG4gICAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUJDE7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUWVBFOlxuICAgICAgICBpZiAoZmx1c2ggPT09IFpfQkxPQ0sgfHwgZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRURPOlxuICAgICAgICBpZiAoc3RhdGUubGFzdCkge1xuICAgICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDE7XG4gICAgICAgIGJpdHMgLT0gMTtcbiAgICAgICAgLy8tLS0vL1xuXG4gICAgICAgIHN3aXRjaCAoKGhvbGQgJiAweDAzKS8qQklUUygyKSovKSB7XG4gICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqL1xuICAgICAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNUT1JFRDpcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vLyAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovXG4gICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPT0gKChob2xkID4+PiAxNikgXiAweGZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcXG5cIixcbiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IENPUFlfO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09QWV86XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFk6XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgLy8tLS0gem1lbWNweShwdXQsIG5leHQsIGNvcHkpOyAtLS1cbiAgICAgICAgICBvdXRwdXQuc2V0KGlucHV0LnN1YmFycmF5KG5leHQsIG5leHQgKyBjb3B5KSwgcHV0KTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUQUJMRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAyNTc7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNTtcbiAgICAgICAgYml0cyAtPSA1O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICAgIGlmIChzdGF0ZS5ubGVuID4gMjg2IHx8IHN0YXRlLm5kaXN0ID4gMzApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5MRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAgIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gNztcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZnRyZWVzKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09ERUxFTlM6XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsvKkJJVFMoc3RhdGUubGVuYml0cykqL1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGVyZV92YWwgPCAxNikge1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAyKTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUgLSAxXTtcbiAgICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDMpOy8vQklUUygyKTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMztcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgNztcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAweDdmKTsvL0JJVFMoNyk7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSA3O1xuICAgICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY29weS0tKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBCQUQpIHsgYnJlYWs7IH1cblxuICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi9cbiAgICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHNcbiAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgICBjb25jZXJuaW5nIHRoZSBFTk9VR0ggY29uc3RhbnRzLCB3aGljaCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzICovXG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSA5O1xuXG4gICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mdHJlZXMoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSA2O1xuICAgICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgICAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluO1xuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgICByZXQgPSBpbmZ0cmVlcyhESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOXzpcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU46XG4gICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgICAvLy0tLVxuICAgICAgICAgIGluZmZhc3Qoc3RybSwgX291dCk7XG4gICAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgICAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gICAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgICAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICAgICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICAgIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAgICAgICAgIC8vLS0tXG5cbiAgICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07ICAvKkJJVFMoc3RhdGUubGVuYml0cykqL1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiYgKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgICBpZiAoaGVyZV9vcCA9PT0gMCkge1xuICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5leHRyYSA9IGhlcmVfb3AgJiAxNTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5FWFQ6XG4gICAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElTVDpcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDEpXTsvKkJJVFMoc3RhdGUuZGlzdGJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgICAgc3RhdGUubW9kZSA9IERJU1RFWFQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElTVEVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5vZmZzZXQgKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBzdGF0ZS5vZmZzZXQpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IE1BVENIO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE1BVENIOlxuICAgICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IF9vdXQgLSBsZWZ0O1xuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICBjb3B5ID0gc3RhdGUub2Zmc2V0IC0gY29weTtcbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLndoYXZlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgVHJhY2UoKHN0ZGVyciwgXCJpbmZsYXRlLmMgdG9vIGZhclxcblwiKSk7XG4vLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlO1xuLy8gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuLy8gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4vLyAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4vLyAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbi8vICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IDA7XG4vLyAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuLy8gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4vLyAgICAgICAgICBicmVhaztcbi8vI2VuZGlmXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHtcbiAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7XG4gICAgICAgICAgICBmcm9tID0gc3RhdGUud3NpemUgLSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53bmV4dCAtIGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgICBmcm9tX3NvdXJjZSA9IHN0YXRlLndpbmRvdztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4gICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTElUOlxuICAgICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgbGVmdC0tO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ0hFQ0s6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgLy8gVXNlICd8JyBpbnN0ZWFkIG9mICcrJyB0byBtYWtlIHN1cmUgdGhhdCByZXN1bHQgaXMgc2lnbmVkXG4gICAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIF9vdXQgLT0gbGVmdDtcbiAgICAgICAgICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICAgICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gICAgICAgICAgaWYgKChzdGF0ZS53cmFwICYgNCkgJiYgX291dCkge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgICAvKlVQREFURV9DSEVDSyhzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMl8xKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMl8xKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICAgIH1cbiAgICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICAgIGlmICgoc3RhdGUud3JhcCAmIDQpICYmIChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkdUSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5HVEg6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwICYmIHN0YXRlLmZsYWdzKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoKHN0YXRlLndyYXAgJiA0KSAmJiBob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRE9ORTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBET05FOlxuICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQkMTtcbiAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgY2FzZSBCQUQ6XG4gICAgICAgIHJldCA9IFpfREFUQV9FUlJPUiQxO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIE1FTTpcbiAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SJDE7XG4gICAgICBjYXNlIFNZTkM6XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQxO1xuICAgIH1cbiAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCQxKSkpIHtcbiAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0LCBfb3V0IC0gc3RybS5hdmFpbF9vdXQpKSA7XG4gIH1cbiAgX2luIC09IHN0cm0uYXZhaWxfaW47XG4gIF9vdXQgLT0gc3RybS5hdmFpbF9vdXQ7XG4gIHN0cm0udG90YWxfaW4gKz0gX2luO1xuICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICBpZiAoKHN0YXRlLndyYXAgJiA0KSAmJiBfb3V0KSB7XG4gICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEVfQ0hFQ0soc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzJfMShzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyXzEoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCQxKSAmJiByZXQgPT09IFpfT0skMSkge1xuICAgIHJldCA9IFpfQlVGX0VSUk9SJDE7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cblxuY29uc3QgaW5mbGF0ZUVuZCA9IChzdHJtKSA9PiB7XG5cbiAgaWYgKGluZmxhdGVTdGF0ZUNoZWNrKHN0cm0pKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7XG4gIH1cblxuICBsZXQgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0skMTtcbn07XG5cblxuY29uc3QgaW5mbGF0ZUdldEhlYWRlciA9IChzdHJtLCBoZWFkKSA9PiB7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKGluZmxhdGVTdGF0ZUNoZWNrKHN0cm0pKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUiQxOyB9XG4gIGNvbnN0IHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7IH1cblxuICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi9cbiAgc3RhdGUuaGVhZCA9IGhlYWQ7XG4gIGhlYWQuZG9uZSA9IGZhbHNlO1xuICByZXR1cm4gWl9PSyQxO1xufTtcblxuXG5jb25zdCBpbmZsYXRlU2V0RGljdGlvbmFyeSA9IChzdHJtLCBkaWN0aW9uYXJ5KSA9PiB7XG4gIGNvbnN0IGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICBsZXQgc3RhdGU7XG4gIGxldCBkaWN0aWQ7XG4gIGxldCByZXQ7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKGluZmxhdGVTdGF0ZUNoZWNrKHN0cm0pKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUiQxOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7XG4gIH1cblxuICAvKiBjaGVjayBmb3IgY29ycmVjdCBkaWN0aW9uYXJ5IGlkZW50aWZpZXIgKi9cbiAgaWYgKHN0YXRlLm1vZGUgPT09IERJQ1QpIHtcbiAgICBkaWN0aWQgPSAxOyAvKiBhZGxlcjMyKDAsIG51bGwsIDApKi9cbiAgICAvKiBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgZGljdGlkID0gYWRsZXIzMl8xKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1IkMTtcbiAgICB9XG4gIH1cbiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGVcbiAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi9cbiAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpO1xuICBpZiAocmV0KSB7XG4gICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICByZXR1cm4gWl9NRU1fRVJST1IkMTtcbiAgfVxuICBzdGF0ZS5oYXZlZGljdCA9IDE7XG4gIC8vIFRyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgZGljdGlvbmFyeSBzZXRcXG5cIikpO1xuICByZXR1cm4gWl9PSyQxO1xufTtcblxuXG52YXIgaW5mbGF0ZVJlc2V0XzEgPSBpbmZsYXRlUmVzZXQ7XG52YXIgaW5mbGF0ZVJlc2V0Ml8xID0gaW5mbGF0ZVJlc2V0MjtcbnZhciBpbmZsYXRlUmVzZXRLZWVwXzEgPSBpbmZsYXRlUmVzZXRLZWVwO1xudmFyIGluZmxhdGVJbml0XzEgPSBpbmZsYXRlSW5pdDtcbnZhciBpbmZsYXRlSW5pdDJfMSA9IGluZmxhdGVJbml0MjtcbnZhciBpbmZsYXRlXzIkMSA9IGluZmxhdGUkMjtcbnZhciBpbmZsYXRlRW5kXzEgPSBpbmZsYXRlRW5kO1xudmFyIGluZmxhdGVHZXRIZWFkZXJfMSA9IGluZmxhdGVHZXRIZWFkZXI7XG52YXIgaW5mbGF0ZVNldERpY3Rpb25hcnlfMSA9IGluZmxhdGVTZXREaWN0aW9uYXJ5O1xudmFyIGluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbm1vZHVsZS5leHBvcnRzLmluZmxhdGVDb2Rlc1VzZWQgPSBpbmZsYXRlQ29kZXNVc2VkO1xubW9kdWxlLmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbm1vZHVsZS5leHBvcnRzLmluZmxhdGVHZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZUdldERpY3Rpb25hcnk7XG5tb2R1bGUuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xubW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xubW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVN5bmMgPSBpbmZsYXRlU3luYztcbm1vZHVsZS5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xubW9kdWxlLmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG5tb2R1bGUuZXhwb3J0cy5pbmZsYXRlVmFsaWRhdGUgPSBpbmZsYXRlVmFsaWRhdGU7XG4qL1xuXG52YXIgaW5mbGF0ZV8xJDIgPSB7XG5cdGluZmxhdGVSZXNldDogaW5mbGF0ZVJlc2V0XzEsXG5cdGluZmxhdGVSZXNldDI6IGluZmxhdGVSZXNldDJfMSxcblx0aW5mbGF0ZVJlc2V0S2VlcDogaW5mbGF0ZVJlc2V0S2VlcF8xLFxuXHRpbmZsYXRlSW5pdDogaW5mbGF0ZUluaXRfMSxcblx0aW5mbGF0ZUluaXQyOiBpbmZsYXRlSW5pdDJfMSxcblx0aW5mbGF0ZTogaW5mbGF0ZV8yJDEsXG5cdGluZmxhdGVFbmQ6IGluZmxhdGVFbmRfMSxcblx0aW5mbGF0ZUdldEhlYWRlcjogaW5mbGF0ZUdldEhlYWRlcl8xLFxuXHRpbmZsYXRlU2V0RGljdGlvbmFyeTogaW5mbGF0ZVNldERpY3Rpb25hcnlfMSxcblx0aW5mbGF0ZUluZm86IGluZmxhdGVJbmZvXG59O1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIEdaaGVhZGVyKCkge1xuICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovXG4gIHRoaXMudGV4dCAgICAgICA9IDA7XG4gIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovXG4gIHRoaXMudGltZSAgICAgICA9IDA7XG4gIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMueGZsYWdzICAgICA9IDA7XG4gIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi9cbiAgdGhpcy5vcyAgICAgICAgID0gMDtcbiAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqL1xuICB0aGlzLmV4dHJhICAgICAgPSBudWxsO1xuICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi9cbiAgdGhpcy5leHRyYV9sZW4gID0gMDsgLy8gQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgaXQgaW4gSlMsXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBmb3IgZmV3IGNvZGUgbW9kaWZpY2F0aW9uc1xuXG4gIC8vXG4gIC8vIFNldHVwIGxpbWl0cyBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnlcbiAgLy8gZm9yIGluZmxhdGUgdXNlIGNvbnN0YW50IGxpbWl0IGluIDY1NTM2IGJ5dGVzXG4gIC8vXG5cbiAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5leHRyYV9tYXggID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqL1xuICB0aGlzLm5hbWUgICAgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLm5hbWVfbWF4ICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqL1xuICB0aGlzLmNvbW1lbnQgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmNvbW1fbWF4ICAgPSAwO1xuICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqL1xuICB0aGlzLmhjcmMgICAgICAgPSAwO1xuICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMuZG9uZSAgICAgICA9IGZhbHNlO1xufVxuXG52YXIgZ3poZWFkZXIgPSBHWmhlYWRlcjtcblxuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuY29uc3Qge1xuICBaX05PX0ZMVVNILCBaX0ZJTklTSCxcbiAgWl9PSywgWl9TVFJFQU1fRU5ELCBaX05FRURfRElDVCwgWl9TVFJFQU1fRVJST1IsIFpfREFUQV9FUlJPUiwgWl9NRU1fRVJST1IsIFpfQlVGX0VSUk9SXG59ID0gY29uc3RhbnRzJDI7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBjaHVua1NpemU6IDEwMjQgKiA2NCxcbiAgd2luZG93Qml0czogMTUsXG4gIHRvOiAnJ1xufTtcblxuLyoqXG4gKiBjbGFzcyBJbmZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbaW5mbGF0ZV1dXG4gKiBhbmQgW1tpbmZsYXRlUmF3XV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBpbmZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tJbmZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGluZmxhdGVcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgd2hlbiBubyBvcHRpb25zIHNldCwgYXV0b2RldGVjdCBkZWZsYXRlL2d6aXAgZGF0YSBmb3JtYXQgdmlhXG4gKiB3cmFwcGVyIGhlYWRlci5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqIGNvbnN0IGNodW5rMSA9IG5ldyBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiBjb25zdCBjaHVuazIgPSBuZXcgVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiBjb25zdCBpbmZsYXRlID0gbmV3IHBha28uSW5mbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogaW5mbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogaW5mbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoaW5mbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGluZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGluZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gSW5mbGF0ZSQxKG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gY29tbW9uLmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMgfHwge30pO1xuXG4gIGNvbnN0IG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyB6c3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIGxldCBzdGF0dXMgID0gaW5mbGF0ZV8xJDIuaW5mbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQud2luZG93Qml0c1xuICApO1xuXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZXNbc3RhdHVzXSk7XG4gIH1cblxuICB0aGlzLmhlYWRlciA9IG5ldyBnemhlYWRlcigpO1xuXG4gIGluZmxhdGVfMSQyLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7XG5cbiAgLy8gU2V0dXAgZGljdGlvbmFyeVxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdC5kaWN0aW9uYXJ5ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBvcHQuZGljdGlvbmFyeSA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9XG4gICAgaWYgKG9wdC5yYXcpIHsgLy9JbiByYXcgbW9kZSB3ZSBuZWVkIHRvIHNldCB0aGUgZGljdGlvbmFyeSBlYXJseVxuICAgICAgc3RhdHVzID0gaW5mbGF0ZV8xJDIuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBvcHQuZGljdGlvbmFyeSk7XG4gICAgICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlc1tzdGF0dXNdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIGZsdXNoX21vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXIpOiBpbnB1dCBkYXRhXG4gKiAtIGZsdXNoX21vZGUgKE51bWJlcnxCb29sZWFuKTogMC4uNiBmb3IgY29ycmVzcG9uZGluZyBaX05PX0ZMVVNILi5aX1RSRUVcbiAqICAgZmx1c2ggbW9kZXMuIFNlZSBjb25zdGFudHMuIFNraXBwZWQgb3IgYGZhbHNlYCBtZWFucyBaX05PX0ZMVVNILFxuICogICBgdHJ1ZWAgbWVhbnMgWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBpbmZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tJbmZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBvdXRwdXQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBJZiBlbmQgb2Ygc3RyZWFtIGRldGVjdGVkLFxuICogW1tJbmZsYXRlI29uRW5kXV0gd2lsbCBiZSBjYWxsZWQuXG4gKlxuICogYGZsdXNoX21vZGVgIGlzIG5vdCBuZWVkZWQgZm9yIG5vcm1hbCBvcGVyYXRpb24sIGJlY2F1c2UgZW5kIG9mIHN0cmVhbVxuICogZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4gWW91IG1heSB0cnkgdG8gdXNlIGl0IGZvciBhZHZhbmNlZCB0aGluZ3MsIGJ1dFxuICogdGhpcyBmdW5jdGlvbmFsaXR5IHdhcyBub3QgdGVzdGVkLlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0luZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5JbmZsYXRlJDEucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgZmx1c2hfbW9kZSkge1xuICBjb25zdCBzdHJtID0gdGhpcy5zdHJtO1xuICBjb25zdCBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICBjb25zdCBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7XG4gIGxldCBzdGF0dXMsIF9mbHVzaF9tb2RlLCBsYXN0X2F2YWlsX291dDtcblxuICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChmbHVzaF9tb2RlID09PSB+fmZsdXNoX21vZGUpIF9mbHVzaF9tb2RlID0gZmx1c2hfbW9kZTtcbiAgZWxzZSBfZmx1c2hfbW9kZSA9IGZsdXNoX21vZGUgPT09IHRydWUgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0g7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBmb3IgKDs7KSB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyBVaW50OEFycmF5KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cblxuICAgIHN0YXR1cyA9IGluZmxhdGVfMSQyLmluZmxhdGUoc3RybSwgX2ZsdXNoX21vZGUpO1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkge1xuICAgICAgc3RhdHVzID0gaW5mbGF0ZV8xJDIuaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSk7XG5cbiAgICAgIGlmIChzdGF0dXMgPT09IFpfT0spIHtcbiAgICAgICAgc3RhdHVzID0gaW5mbGF0ZV8xJDIuaW5mbGF0ZShzdHJtLCBfZmx1c2hfbW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gWl9EQVRBX0VSUk9SKSB7XG4gICAgICAgIC8vIFJlcGxhY2UgY29kZSB3aXRoIG1vcmUgdmVyYm9zZVxuICAgICAgICBzdGF0dXMgPSBaX05FRURfRElDVDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbmx5IHRoZSBnemlwIGZvcm1hdCBkZWZpbmVzIGNvbmNhdGVuYXRlZCBtZW1iZXJzIChSRkMgMTk1MjogYSBnemlwIGZpbGVcbiAgICAvLyBpcyBcImEgc2VyaWVzIG9mIG1lbWJlcnNcIikuIEEgemxpYiBzdHJlYW0gKFJGQyAxOTUwKSBlbmRzIGFmdGVyIGl0c1xuICAgIC8vIEFETEVSMzIsIGFuZCBhIHJhdyBERUZMQVRFIHN0cmVhbSAoUkZDIDE5NTEpIGVuZHMgYWZ0ZXIgaXRzIGZpbmFsIGJsb2NrIC1cbiAgICAvLyBuZWl0aGVyIGZvcm1hdCBhbGxvd3MgYW55dGhpbmcgdG8gZm9sbG93LCBzbyBieXRlcyBhZnRlciB0aGUgZW5kIGFyZSBub3RcbiAgICAvLyBvdXJzIHRvIGludGVycHJldCBhbmQgbXVzdCBiZSBsZWZ0IGluIHRoZSBpbnB1dC4gUmVzdGFydCBkZWNvZGluZyBvbmx5XG4gICAgLy8gZm9yIGEgZ3ppcCBtZW1iZXI6IGBzdGF0ZS5mbGFnc2AgaXMgbm9uLXplcm8gb25seSBvbmNlIGEgZ3ppcCBoZWFkZXIgaGFzXG4gICAgLy8gYWN0dWFsbHkgYmVlbiBkZWNvZGVkIChpdCBzdGF5cyAwIGZvciBhIHpsaWIgbWVtYmVyLCBldmVuIHdoZW4gdGhlIGZvcm1hdFxuICAgIC8vIHdhcyBhdXRvLWRldGVjdGVkIGFuZCB0aGUgZ3ppcCBiaXQgb2YgYHdyYXBgIGlzIHNldCkuIEEgdHJhaWxpbmcgemVyb1xuICAgIC8vIGJ5dGUgaXMgcGFkZGluZywgbm90IHRoZSBzdGFydCBvZiBhIG1lbWJlciAobm8gbWVtYmVyIGNhbiBiZWdpbiB3aXRoIDApLlxuICAgIHdoaWxlIChzdHJtLmF2YWlsX2luID4gMCAmJlxuICAgICAgICAgICBzdGF0dXMgPT09IFpfU1RSRUFNX0VORCAmJlxuICAgICAgICAgICAoc3RybS5zdGF0ZS53cmFwICYgMikgJiYgc3RybS5zdGF0ZS5mbGFncyAhPT0gMCAmJlxuICAgICAgICAgICBzdHJtLmlucHV0W3N0cm0ubmV4dF9pbl0gIT09IDApXG4gICAge1xuICAgICAgaW5mbGF0ZV8xJDIuaW5mbGF0ZVJlc2V0KHN0cm0pO1xuICAgICAgc3RhdHVzID0gaW5mbGF0ZV8xJDIuaW5mbGF0ZShzdHJtLCBfZmx1c2hfbW9kZSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6XG4gICAgICBjYXNlIFpfREFUQV9FUlJPUjpcbiAgICAgIGNhc2UgWl9ORUVEX0RJQ1Q6XG4gICAgICBjYXNlIFpfTUVNX0VSUk9SOlxuICAgICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmVtZW1iZXIgcmVhbCBgYXZhaWxfb3V0YCB2YWx1ZSwgYmVjYXVzZSB3ZSBtYXkgcGF0Y2ggb3V0IGJ1ZmZlciBjb250ZW50XG4gICAgLy8gdG8gYWxpZ24gdXRmOCBzdHJpbmdzIGJvdW5kYXJpZXMuXG4gICAgbGFzdF9hdmFpbF9vdXQgPSBzdHJtLmF2YWlsX291dDtcblxuICAgIGlmIChzdHJtLm5leHRfb3V0KSB7XG4gICAgICAvLyBGbHVzaCBvdXRwdXQgaWYgYnVmZmVyIGlzIGZ1bGwsIHN0cmVhbSBlbmRlZCwgb3IgYW4gZXhwbGljaXQgZmx1c2ggd2FzXG4gICAgICAvLyByZXF1ZXN0ZWQgKGUuZy4gWl9TWU5DX0ZMVVNIKSAtIHRvIHB1c2ggb3V0IHRoZSB0YWlsLCBzYW1lIGFzIG5vZGUncyB6bGliLlxuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gWl9TVFJFQU1fRU5EIHx8IF9mbHVzaF9tb2RlID4gMCkge1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgICAgICBsZXQgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7XG5cbiAgICAgICAgICBsZXQgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4O1xuICAgICAgICAgIGxldCB1dGY4c3RyID0gc3RyaW5ncy5idWYyc3RyaW5nKHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4KTtcblxuICAgICAgICAgIC8vIG1vdmUgdGFpbCAmIHJlYWxpZ24gY291bnRlcnNcbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7XG4gICAgICAgICAgaWYgKHRhaWwpIHN0cm0ub3V0cHV0LnNldChzdHJtLm91dHB1dC5zdWJhcnJheShuZXh0X291dF91dGY4LCBuZXh0X291dF91dGY4ICsgdGFpbCksIDApO1xuXG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRGF0YShzdHJtLm91dHB1dC5sZW5ndGggPT09IHN0cm0ubmV4dF9vdXQgPyBzdHJtLm91dHB1dCA6IHN0cm0ub3V0cHV0LnN1YmFycmF5KDAsIHN0cm0ubmV4dF9vdXQpKTtcblxuICAgICAgICAgIC8vIEZvcmNlIGEgZnJlc2ggb3V0cHV0IGJ1ZmZlciBvbiBuZXh0IGl0ZXJhdGlvbiAvIG5leHQgcHVzaCwgc28gdGhlXG4gICAgICAgICAgLy8gYWxyZWFkeSBlbWl0dGVkIHRhaWwgaXMgbm90IHNlbnQgYWdhaW4uXG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQSBmdWxsIG91dHB1dCBidWZmZXIgbWVhbnMgdGhlcmUgbWF5IGJlIG1vcmUgdG8gcHJvZHVjZSAtIGFsbG9jYXRlIGEgbmV3XG4gICAgLy8gb25lIGFuZCBjYWxsIGluZmxhdGUgYWdhaW4uIFRoZSBzdGF0dXMgZGVwZW5kcyBvbiB0aGUgZmx1c2ggbW9kZTogd2l0aFxuICAgIC8vIFpfTk9fRkxVU0ggYSBmdWxsIGJ1ZmZlciBpcyByZXBvcnRlZCBhcyBaX09LLCBidXQgd2l0aCBaX0ZJTklTSCB0aGUgc2FtZVxuICAgIC8vIHNpdHVhdGlvbiBpcyByZXBvcnRlZCBhcyBaX0JVRl9FUlJPUiAoXCJjb3VsZCBub3QgbWFrZSBwcm9ncmVzcyBub3dcIixcbiAgICAvLyBub24tZmF0YWwpIGV2ZW4gdGhvdWdoIG91dHB1dCBpcyBzdGlsbCBwZW5kaW5nLiBCb3RoIG11c3QgY29udGludWU7IHRoZVxuICAgIC8vIGRpc3RpbmN0aW9uIHRoYXQgbWF0dGVycyBpcyBwdXJlbHkgXCJ3YXMgdGhlIG91dHB1dCBidWZmZXIgZXhoYXVzdGVkXCIuXG4gICAgaWYgKChzdGF0dXMgPT09IFpfT0sgfHwgc3RhdHVzID09PSBaX0JVRl9FUlJPUikgJiYgbGFzdF9hdmFpbF9vdXQgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgLy8gRmluYWxpemUgaWYgZW5kIG9mIHN0cmVhbSByZWFjaGVkLlxuICAgIGlmIChzdGF0dXMgPT09IFpfU1RSRUFNX0VORCkge1xuICAgICAgc3RhdHVzID0gaW5mbGF0ZV8xJDIuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCkge1xuICAgICAgLy8gSW5wdXQgaXMgZXhoYXVzdGVkLiBJZiB0aGUgY2FsbGVyIGRlY2xhcmVkIHRoaXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtXG4gICAgICAvLyAoWl9GSU5JU0gpIGJ1dCB3ZSBuZXZlciBzYXcgWl9TVFJFQU1fRU5ELCB0aGUgY29tcHJlc3NlZCBkYXRhIGVuZGVkXG4gICAgICAvLyBiZWZvcmUgaXRzIHRlcm1pbmF0aW5nIG1hcmtlciAtIGkuZS4gaXQgaXMgdHJ1bmNhdGVkL2luY29tcGxldGUuIFRoYXRcbiAgICAgIC8vIGlzIGFuIGVycm9yOiByZXR1cm5pbmcgdGhlIHBhcnRpYWwgb3V0cHV0IGFzIHN1Y2Nlc3Mgd291bGQgYmVcbiAgICAgIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBjb21wbGV0ZSBkZWNvZGUsIGhpZGluZyB0aGUgZGF0YSBsb3NzLiBSZXBvcnRcbiAgICAgIC8vIGl0IHZpYSBaX0JVRl9FUlJPUi4gKFJlYWNoZWQgb25seSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIHN0aWxsIGhhZCByb29tXG4gICAgICAvLyAtIGEgZnVsbCBidWZmZXIgaXMgaGFuZGxlZCBieSB0aGUgYGNvbnRpbnVlYCBhYm92ZSAtIHNvIHRoaXMgZ2VudWluZWx5XG4gICAgICAvLyBtZWFucyBcInJhbiBvdXQgb2YgaW5wdXRcIiwgbm90IFwicmFuIG91dCBvZiBvdXRwdXRcIi4pXG4gICAgICBpZiAoX2ZsdXNoX21vZGUgPT09IFpfRklOSVNIKSB7XG4gICAgICAgIHN0YXR1cyA9IGluZmxhdGVfMSQyLmluZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICAgICAgdGhpcy5vbkVuZChzdGF0dXMgPT09IFpfT0sgPyBaX0JVRl9FUlJPUiA6IHN0YXR1cyk7XG4gICAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxTdHJpbmcpOiBvdXRwdXQgZGF0YS4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgZWFjaCBjaHVuayB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkluZmxhdGUkMS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogaW5mbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgZWl0aGVyIGFmdGVyIHlvdSB0ZWxsIGluZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkluZmxhdGUkMS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IFpfT0spIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSBjb21tb24uZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXIpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIERlY29tcHJlc3MgYGRhdGFgIHdpdGggaW5mbGF0ZS91bmd6aXAgYW5kIGBvcHRpb25zYC4gQXV0b2RldGVjdFxuICogZm9ybWF0IHZpYSB3cmFwcGVyIGhlYWRlciBieSBkZWZhdWx0LiBUaGF0J3Mgd2h5IHdlIGRvbid0IHByb3ZpZGVcbiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSB3aW5kb3dCaXRzXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25zdCBwYWtvID0gcmVxdWlyZSgncGFrbycpO1xuICogY29uc3QgaW5wdXQgPSBwYWtvLmRlZmxhdGUobmV3IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSkpO1xuICogbGV0IG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAgIGNvbnNvbGUubG9nKGVycik7XG4gKiB9XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGUkMShpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBpbmZsYXRvciA9IG5ldyBJbmZsYXRlJDEob3B0aW9ucyk7XG5cbiAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGluZmxhdG9yLmVycikgdGhyb3cgaW5mbGF0b3IubXNnIHx8IG1lc3NhZ2VzW2luZmxhdG9yLmVycl07XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5QnVmZmVyKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2luZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZVJhdyQxKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBpbmZsYXRlJDEoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheUJ1ZmZlcik6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogSnVzdCBzaG9ydGN1dCB0byBbW2luZmxhdGVdXSwgYmVjYXVzZSBpdCBhdXRvZGV0ZWN0cyBmb3JtYXRcbiAqIGJ5IGhlYWRlci5jb250ZW50LiBEb25lIGZvciBjb252ZW5pZW5jZS5cbiAqKi9cblxuXG52YXIgSW5mbGF0ZV8xJDEgPSBJbmZsYXRlJDE7XG52YXIgaW5mbGF0ZV8yID0gaW5mbGF0ZSQxO1xudmFyIGluZmxhdGVSYXdfMSQxID0gaW5mbGF0ZVJhdyQxO1xudmFyIHVuZ3ppcCQxID0gaW5mbGF0ZSQxO1xudmFyIGNvbnN0YW50cyA9IGNvbnN0YW50cyQyO1xuXG52YXIgaW5mbGF0ZV8xJDEgPSB7XG5cdEluZmxhdGU6IEluZmxhdGVfMSQxLFxuXHRpbmZsYXRlOiBpbmZsYXRlXzIsXG5cdGluZmxhdGVSYXc6IGluZmxhdGVSYXdfMSQxLFxuXHR1bmd6aXA6IHVuZ3ppcCQxLFxuXHRjb25zdGFudHM6IGNvbnN0YW50c1xufTtcblxuY29uc3QgeyBEZWZsYXRlLCBkZWZsYXRlLCBkZWZsYXRlUmF3LCBnemlwIH0gPSBkZWZsYXRlXzEkMTtcblxuY29uc3QgeyBJbmZsYXRlLCBpbmZsYXRlLCBpbmZsYXRlUmF3LCB1bmd6aXAgfSA9IGluZmxhdGVfMSQxO1xuXG5cblxudmFyIERlZmxhdGVfMSA9IERlZmxhdGU7XG52YXIgZGVmbGF0ZV8xID0gZGVmbGF0ZTtcbnZhciBkZWZsYXRlUmF3XzEgPSBkZWZsYXRlUmF3O1xudmFyIGd6aXBfMSA9IGd6aXA7XG52YXIgSW5mbGF0ZV8xID0gSW5mbGF0ZTtcbnZhciBpbmZsYXRlXzEgPSBpbmZsYXRlO1xudmFyIGluZmxhdGVSYXdfMSA9IGluZmxhdGVSYXc7XG52YXIgdW5nemlwXzEgPSB1bmd6aXA7XG52YXIgY29uc3RhbnRzXzEgPSBjb25zdGFudHMkMjtcblxudmFyIHBha28gPSB7XG5cdERlZmxhdGU6IERlZmxhdGVfMSxcblx0ZGVmbGF0ZTogZGVmbGF0ZV8xLFxuXHRkZWZsYXRlUmF3OiBkZWZsYXRlUmF3XzEsXG5cdGd6aXA6IGd6aXBfMSxcblx0SW5mbGF0ZTogSW5mbGF0ZV8xLFxuXHRpbmZsYXRlOiBpbmZsYXRlXzEsXG5cdGluZmxhdGVSYXc6IGluZmxhdGVSYXdfMSxcblx0dW5nemlwOiB1bmd6aXBfMSxcblx0Y29uc3RhbnRzOiBjb25zdGFudHNfMVxufTtcblxuZXhwb3J0IHsgRGVmbGF0ZV8xIGFzIERlZmxhdGUsIEluZmxhdGVfMSBhcyBJbmZsYXRlLCBjb25zdGFudHNfMSBhcyBjb25zdGFudHMsIHBha28gYXMgZGVmYXVsdCwgZGVmbGF0ZV8xIGFzIGRlZmxhdGUsIGRlZmxhdGVSYXdfMSBhcyBkZWZsYXRlUmF3LCBnemlwXzEgYXMgZ3ppcCwgaW5mbGF0ZV8xIGFzIGluZmxhdGUsIGluZmxhdGVSYXdfMSBhcyBpbmZsYXRlUmF3LCB1bmd6aXBfMSBhcyB1bmd6aXAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/pako/dist/pako.esm.mjs\n"));
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["main-app"], function() { return __webpack_exec__("(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22C%3A%5C%5Ccompany_projects%5C%5Cverify%20pack%5C%5Cfrontend%5C%5Capp%5C%5Cdashboard%5C%5Ccompliance%5C%5Cpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
/******/ }
]);