Skip to content

Instantly share code, notes, and snippets.

@realazthat
Last active September 19, 2016 22:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save realazthat/bc253c3e0a6c34b9f610de0857118a81 to your computer and use it in GitHub Desktop.
Save realazthat/bc253c3e0a6c34b9f610de0857118a81 to your computer and use it in GitHub Desktop.
requirebin sketch
const regl = require('regl')();
const resl = require('resl');
const quad = require('glsl-quad');
const createKDTree = require('static-kdtree');
let c = 16;
let url = 'https://github.com/youtube/api-samples/raw/master/java/src/main/resources/sample-video.mp4'
window.texture = null;
resl({
manifest: {
video: {
type: 'video',
stream: true, // setting the streaming flag specifies that
// the done() callback will fire as soon as the
// asset has started loading
src: url
}
},
onDone: ({video}) => {
window.texture = regl.texture(video);
let fbo = regl.framebuffer({
color: regl.texture({
width: window.texture.width,
height: window.texture.height,
format: 'rgba',
type: 'uint8',
min: 'nearest',
mag: 'nearest'
}),
depth: false,
stencil: false
});
window.framebuffer = fbo;
}
});
let draw = regl({
vert: quad.shader.vert,
frag: quad.shader.frag,
attributes: {
a_position: quad.verts,
a_uv: quad.uvs
},
elements: quad.indices,
uniforms: {
u_clip_y: 1,
u_texture: regl.prop('texture')
},
framebuffer: regl.prop('framebuffer')
});
regl.frame(function(){
if (window.texture !== null) {
draw({texture: window.texture, framebuffer: null});
regl({framebuffer: window.framebuffer})(function(){
let bytes = regl.read();
console.log(bytes.length);
});
}
});
This file has been truncated, but you can view the full file.
setTimeout(function(){
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"regl":[function(require,module,exports){
(function (global){
(function(Oa){"object"===typeof exports&&"undefined"!==typeof module?module.exports=Oa():"function"===typeof define&&define.amd?define([],Oa):("undefined"!==typeof window?window:"undefined"!==typeof global?global:"undefined"!==typeof self?self:this).createREGL=Oa()})(function(){return function f(p,u,l){function k(c,a){if(!u[c]){if(!p[c]){var b="function"==typeof require&&require;if(!a&&b)return b(c,!0);if(x)return x(c,!0);b=Error("Cannot find module '"+c+"'");throw b.code="MODULE_NOT_FOUND",b;}b=
u[c]={exports:{}};p[c][0].call(b.exports,function(a){var b=p[c][1][a];return k(b?b:a)},b,b.exports,f,p,u,l)}return u[c].exports}for(var x="function"==typeof require&&require,r=0;r<l.length;r++)k(l[r]);return k}({1:[function(f,p,u){function l(){this.w=this.z=this.y=this.x=this.state=0;this.buffer=null;this.size=0;this.normalized=!1;this.type=5126;this.divisor=this.stride=this.offset=0}p.exports=function(k,x,r,c,a){k=r.maxAttributes;x=Array(k);for(r=0;r<k;++r)x[r]=new l;return{Record:l,scope:{},state:x}}},
{}],2:[function(f,p,u){function l(c){return t[Object.prototype.toString.call(c)]|0}function k(c,a){for(var b=0;b<a.length;++b)c[b]=a[b]}function x(c,a,b,k,l,r,x){for(var g=0,h=0;h<b;++h)for(var f=0;f<k;++f)c[g++]=a[l*h+r*f+x]}var r=f("./util/is-typed-array"),c=f("./util/is-ndarray"),a=f("./util/values"),b=f("./util/pool");u=f("./util/flatten");var F=u.flatten,M=u.shape,t=f("./constants/arraytypes.json"),y=f("./constants/dtypes.json"),g=f("./constants/usage.json"),E=[];E[5120]=1;E[5122]=2;E[5124]=
4;E[5121]=1;E[5123]=2;E[5125]=4;E[5126]=4;p.exports=function(f,t,n){function m(c){this.id=H++;this.buffer=f.createBuffer();this.type=c;this.usage=35044;this.byteLength=0;this.dimension=1;this.dtype=5121;this.persistentData=null;n.profile&&(this.stats={size:0})}function B(c,a,b){c.byteLength=a.byteLength;f.bufferData(c.type,a,b)}function p(a,h,m,f,g,n){a.usage=m;if(Array.isArray(h)){if(a.dtype=f||5126,0<h.length)if(Array.isArray(h[0])){g=M(h);for(var K=f=1;K<g.length;++K)f*=g[K];a.dimension=f;h=F(h,
g,a.dtype);B(a,h,m);n?a.persistentData=h:b.freeType(h)}else"number"===typeof h[0]?(a.dimension=g,g=b.allocType(a.dtype,h.length),k(g,h),B(a,g,m),n?a.persistentData=g:b.freeType(g)):r(h[0])&&(a.dimension=h[0].length,a.dtype=f||l(h[0])||5126,h=F(h,[h.length,h[0].length],a.dtype),B(a,h,m),n?a.persistentData=h:b.freeType(h))}else if(r(h))a.dtype=f||l(h),a.dimension=g,B(a,h,m),n&&(a.persistentData=new Uint8Array(new Uint8Array(h.buffer)));else if(c(h)){g=h.shape;var C=h.stride,K=h.offset,y=0,q=0,S=0,t=
0;1===g.length?(y=g[0],q=1,S=C[0],t=0):2===g.length&&(y=g[0],q=g[1],S=C[0],t=C[1]);a.dtype=f||l(h.data)||5126;a.dimension=q;g=b.allocType(a.dtype,y*q);x(g,h.data,y,q,S,t,K);B(a,g,m);n?a.persistentData=g:b.freeType(g)}}function L(c){t.bufferCount--;f.deleteBuffer(c.buffer);c.buffer=null;delete h[c.id]}var H=0,h={};m.prototype.bind=function(){f.bindBuffer(this.type,this.buffer)};m.prototype.destroy=function(){L(this)};var fa=[];n.profile&&(t.getTotalBufferSize=function(){var c=0;Object.keys(h).forEach(function(a){c+=
h[a].stats.size});return c});return{create:function(a,B,H,fa){function u(a){var h=35044,b=null,q=0,k=0,m=1;Array.isArray(a)||r(a)||c(a)?b=a:"number"===typeof a?q=a|0:a&&("data"in a&&(b=a.data),"usage"in a&&(h=g[a.usage]),"type"in a&&(k=y[a.type]),"dimension"in a&&(m=a.dimension|0),"length"in a&&(q=a.length|0));D.bind();b?p(D,b,h,k,m,fa):(f.bufferData(D.type,q,h),D.dtype=k||5121,D.usage=h,D.dimension=m,D.byteLength=q);n.profile&&(D.stats.size=D.byteLength*E[D.dtype]);return u}t.bufferCount++;var D=
new m(B);h[D.id]=D;H||u(a);u._reglType="buffer";u._buffer=D;u.subdata=function(a,h){var m=(h||0)|0,q;D.bind();if(Array.isArray(a)){if(0<a.length)if("number"===typeof a[0]){var g=b.allocType(D.dtype,a.length);k(g,a);f.bufferSubData(D.type,m,g);b.freeType(g)}else if(Array.isArray(a[0])||r(a[0]))q=M(a),g=F(a,q,D.dtype),f.bufferSubData(D.type,m,g),b.freeType(g)}else if(r(a))f.bufferSubData(D.type,m,a);else if(c(a)){q=a.shape;var n=a.stride,B=g=0,y=0,t=0;1===q.length?(g=q[0],B=1,y=n[0],t=0):2===q.length&&
(g=q[0],B=q[1],y=n[0],t=n[1]);q=Array.isArray(a.data)?D.dtype:l(a.data);q=b.allocType(q,g*B);x(q,a.data,g,B,y,t,a.offset);f.bufferSubData(D.type,m,q);b.freeType(q)}return u};n.profile&&(u.stats=D.stats);u.destroy=function(){L(D)};return u},createStream:function(a,c){var h=fa.pop();h||(h=new m(a));h.bind();p(h,c,35040,0,1,!1);return h},destroyStream:function(a){fa.push(a)},clear:function(){a(h).forEach(L);fa.forEach(L)},getBuffer:function(a){return a&&a._buffer instanceof m?a._buffer:null},restore:function(){a(h).forEach(function(a){a.buffer=
f.createBuffer();f.bindBuffer(a.type,a.buffer);f.bufferData(a.type,a.persistentData||a.byteLength,a.usage)})},_initBuffer:p}}},{"./constants/arraytypes.json":3,"./constants/dtypes.json":4,"./constants/usage.json":6,"./util/flatten":23,"./util/is-ndarray":25,"./util/is-typed-array":26,"./util/pool":28,"./util/values":31}],3:[function(f,p,u){p.exports={"[object Int8Array]":5120,"[object Int16Array]":5122,"[object Int32Array]":5124,"[object Uint8Array]":5121,"[object Uint8ClampedArray]":5121,"[object Uint16Array]":5123,
"[object Uint32Array]":5125,"[object Float32Array]":5126,"[object Float64Array]":5121,"[object ArrayBuffer]":5121}},{}],4:[function(f,p,u){p.exports={int8:5120,int16:5122,int32:5124,uint8:5121,uint16:5123,uint32:5125,"float":5126,float32:5126}},{}],5:[function(f,p,u){p.exports={points:0,point:0,lines:1,line:1,"line loop":2,"line strip":3,triangles:4,triangle:4,"triangle strip":5,"triangle fan":6}},{}],6:[function(f,p,u){p.exports={"static":35044,dynamic:35048,stream:35040}},{}],7:[function(f,p,u){function l(a){return Array.isArray(a)||
M(a)||t(a)}function k(a){return a.sort(function(a,c){return"viewport"===a?-1:"viewport"===c?1:a<c?-1:1})}function x(a,c,b,k){this.thisDep=a;this.contextDep=c;this.propDep=b;this.append=k}function r(a){return a&&!(a.thisDep||a.contextDep||a.propDep)}function c(a){return new x(!1,!1,!1,a)}function a(a,c){var b=a.type;return 0===b?(b=a.data.length,new x(!0,1<=b,2<=b,c)):4===b?(b=a.data,new x(b.thisDep,b.contextDep,b.propDep,c)):new x(3===b,2===b,1===b,c)}var b=f("./util/codegen"),F=f("./util/loop"),
M=f("./util/is-typed-array"),t=f("./util/is-ndarray"),y=f("./util/is-array-like"),g=f("./dynamic"),E=f("./constants/primitives.json"),C=f("./constants/dtypes.json"),N=["x","y","z","w"],n="blend.func blend.equation stencil.func stencil.opFront stencil.opBack sample.coverage viewport scissor.box polygonOffset.offset".split(" "),m={0:0,1:1,zero:0,one:1,"src color":768,"one minus src color":769,"src alpha":770,"one minus src alpha":771,"dst color":774,"one minus dst color":775,"dst alpha":772,"one minus dst alpha":773,
"constant color":32769,"one minus constant color":32770,"constant alpha":32771,"one minus constant alpha":32772,"src alpha saturate":776},B={never:512,less:513,"<":513,equal:514,"=":514,"==":514,"===":514,lequal:515,"<=":515,greater:516,">":516,notequal:517,"!=":517,"!==":517,gequal:518,">=":518,always:519},Y={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,"increment wrap":34055,"decrement wrap":34056,invert:5386},L={cw:2304,ccw:2305},H=new x(!1,!1,!1,function(){});p.exports=function(h,
f,t,p,M,u,Z,D,K,Aa,va,q,S,ma,ga){function W(d){return d.replace(".","_")}function R(d,a,c){var b=W(d);w.push(d);z[b]=e[b]=!!c;wa[b]=a}function G(d,a,c){var b=W(d);w.push(d);Array.isArray(c)?(e[b]=c.slice(),z[b]=c.slice()):e[b]=z[b]=c;xa[b]=a}function ba(){var d=b(),a=d.link,c=d.global;d.id=Ra++;d.batchId="0";var h=a(Qa),A=d.shared={props:"a0"};Object.keys(Qa).forEach(function(d){A[d]=c.def(h,".",d)});var J=d.next={},P=d.current={};Object.keys(xa).forEach(function(d){Array.isArray(e[d])&&(J[d]=c.def(A.next,
".",d),P[d]=c.def(A.current,".",d))});var Sa=d.constants={};Object.keys(Ma).forEach(function(d){Sa[d]=c.def(JSON.stringify(Ma[d]))});d.invoke=function(e,I){switch(I.type){case 0:var c=["this",A.context,A.props,d.batchId];return e.def(a(I.data),".call(",c.slice(0,Math.max(I.data.length+1,4)),")");case 1:return e.def(A.props,I.data);case 2:return e.def(A.context,I.data);case 3:return e.def("this",I.data);case 4:return I.data.append(d,e),I.data.ref}};d.attribCache={};var I={};d.scopeAttrib=function(d){d=
f.id(d);if(d in I)return I[d];var e=Aa.scope[d];e||(e=Aa.scope[d]=new Ba);return I[d]=a(e)};return d}function na(d){var e=d["static"];d=d.dynamic;var b;if("profile"in e){var h=!!e.profile;b=c(function(d,e){return h});b.enable=h}else if("profile"in d){var A=d.profile;b=a(A,function(d,e){return d.invoke(e,A)})}return b}function ya(d,e){var b=d["static"],h=d.dynamic;if("framebuffer"in b){var A=b.framebuffer;return A?(A=D.getFramebuffer(A),c(function(d,e){var a=d.link(A),v=d.shared;e.set(v.framebuffer,
".next",a);v=v.context;e.set(v,".framebufferWidth",a+".width");e.set(v,".framebufferHeight",a+".height");return a})):c(function(d,e){var a=d.shared;e.set(a.framebuffer,".next","null");a=a.context;e.set(a,".framebufferWidth",a+".drawingBufferWidth");e.set(a,".framebufferHeight",a+".drawingBufferHeight");return"null"})}if("framebuffer"in h){var J=h.framebuffer;return a(J,function(d,e){var a=d.invoke(e,J),v=d.shared,c=v.framebuffer,a=e.def(c,".getFramebuffer(",a,")");e.set(c,".next",a);v=v.context;e.set(v,
".framebufferWidth",a+"?"+a+".width:"+v+".drawingBufferWidth");e.set(v,".framebufferHeight",a+"?"+a+".height:"+v+".drawingBufferHeight");return a})}return null}function U(d,e,c){function b(d){if(d in h){var I=h[d];d=!0;var c=I.x|0,qa=I.y|0,P,aa;"width"in I?P=I.width|0:d=!1;"height"in I?aa=I.height|0:d=!1;return new x(!d&&e&&e.thisDep,!d&&e&&e.contextDep,!d&&e&&e.propDep,function(d,e){var a=d.shared.context,v=P;"width"in I||(v=e.def(a,".","framebufferWidth","-",c));var b=aa;"height"in I||(b=e.def(a,
".","framebufferHeight","-",qa));return[c,qa,v,b]})}if(d in J){var w=J[d];d=a(w,function(d,e){var a=d.invoke(e,w),I=d.shared.context,c=e.def(a,".x|0"),v=e.def(a,".y|0"),qa=e.def('"width" in ',a,"?",a,".width|0:","(",I,".","framebufferWidth","-",c,")"),a=e.def('"height" in ',a,"?",a,".height|0:","(",I,".","framebufferHeight","-",v,")");return[c,v,qa,a]});e&&(d.thisDep=d.thisDep||e.thisDep,d.contextDep=d.contextDep||e.contextDep,d.propDep=d.propDep||e.propDep);return d}return e?new x(e.thisDep,e.contextDep,
e.propDep,function(d,e){var a=d.shared.context;return[0,0,e.def(a,".","framebufferWidth"),e.def(a,".","framebufferHeight")]}):null}var h=d["static"],J=d.dynamic;if(d=b("viewport")){var P=d;d=new x(d.thisDep,d.contextDep,d.propDep,function(d,e){var a=P.append(d,e),c=d.shared.context;e.set(c,".viewportWidth",a[2]);e.set(c,".viewportHeight",a[3]);return a})}return{viewport:d,scissor_box:b("scissor.box")}}function ia(d){function e(d){if(d in b){var I=f.id(b[d]);d=c(function(){return I});d.id=I;return d}if(d in
h){var v=h[d];return a(v,function(d,e){var a=d.invoke(e,v);return e.def(d.shared.strings,".id(",a,")")})}return null}var b=d["static"],h=d.dynamic,A=e("frag"),J=e("vert"),P=null;r(A)&&r(J)?(P=va.program(J.id,A.id),d=c(function(d,e){return d.link(P)})):d=new x(A&&A.thisDep||J&&J.thisDep,A&&A.contextDep||J&&J.contextDep,A&&A.propDep||J&&J.propDep,function(d,e){var a=d.shared.shader,c;c=A?A.append(d,e):e.def(a,".","frag");var v;v=J?J.append(d,e):e.def(a,".","vert");return e.def(a+".program("+v+","+c+
")")});return{frag:A,vert:J,progVar:d,program:P}}function ka(d,e){function b(d,e){if(d in h){var v=h[d]|0;return c(function(d,a){e&&(d.OFFSET=v);return v})}if(d in A){var qa=A[d];return a(qa,function(d,a){var c=d.invoke(a,qa);e&&(d.OFFSET=c);return c})}return e&&J?c(function(d,e){d.OFFSET="0";return 0}):null}var h=d["static"],A=d.dynamic,J=function(){if("elements"in h){var d=h.elements;l(d)?d=u.getElements(u.create(d,!0)):d&&(d=u.getElements(d));var e=c(function(e,a){if(d){var c=e.link(d);return e.ELEMENTS=
c}return e.ELEMENTS=null});e.value=d;return e}if("elements"in A){var v=A.elements;return a(v,function(d,e){var a=d.shared,c=a.isBufferArgs,a=a.elements,I=d.invoke(e,v),b=e.def("null"),c=e.def(c,"(",I,")"),I=d.cond(c).then(b,"=",a,".createStream(",I,");")["else"](b,"=",a,".getElements(",I,");");e.entry(I);e.exit(d.cond(c).then(a,".destroyStream(",b,");"));return d.ELEMENTS=b})}return null}(),P=b("offset",!0);return{elements:J,primitive:function(){if("primitive"in h){var d=h.primitive;return c(function(e,
a){return E[d]})}if("primitive"in A){var e=A.primitive;return a(e,function(d,a){var c=d.constants.primTypes,v=d.invoke(a,e);return a.def(c,"[",v,"]")})}return J?r(J)?J.value?c(function(d,e){return e.def(d.ELEMENTS,".primType")}):c(function(){return 4}):new x(J.thisDep,J.contextDep,J.propDep,function(d,e){var a=d.ELEMENTS;return e.def(a,"?",a,".primType:",4)}):null}(),count:function(){if("count"in h){var d=h.count|0;return c(function(){return d})}if("count"in A){var e=A.count;return a(e,function(d,
a){return d.invoke(a,e)})}return J?r(J)?J?P?new x(P.thisDep,P.contextDep,P.propDep,function(d,e){return e.def(d.ELEMENTS,".vertCount-",d.OFFSET)}):c(function(d,e){return e.def(d.ELEMENTS,".vertCount")}):c(function(){return-1}):new x(J.thisDep||P.thisDep,J.contextDep||P.contextDep,J.propDep||P.propDep,function(d,e){var a=d.ELEMENTS;return d.OFFSET?e.def(a,"?",a,".vertCount-",d.OFFSET,":-1"):e.def(a,"?",a,".vertCount:-1")}):null}(),instances:b("instances",!1),offset:P}}function ra(d,e){var b=d["static"],
h=d.dynamic,A={};w.forEach(function(d){function e(I,w){if(d in b){var qa=I(b[d]);A[v]=c(function(){return qa})}else if(d in h){var P=h[d];A[v]=a(P,function(d,e){return w(d,e,d.invoke(e,P))})}}var v=W(d);switch(d){case "cull.enable":case "blend.enable":case "dither":case "stencil.enable":case "depth.enable":case "scissor.enable":case "polygonOffset.enable":case "sample.alpha":case "sample.enable":case "depth.mask":return e(function(d){return d},function(d,e,a){return a});case "depth.func":return e(function(d){return B[d]},
function(d,e,a){return e.def(d.constants.compareFuncs,"[",a,"]")});case "depth.range":return e(function(d){return d},function(d,e,a){d=e.def("+",a,"[0]");e=e.def("+",a,"[1]");return[d,e]});case "blend.func":return e(function(d){return[m["srcRGB"in d?d.srcRGB:d.src],m["dstRGB"in d?d.dstRGB:d.dst],m["srcAlpha"in d?d.srcAlpha:d.src],m["dstAlpha"in d?d.dstAlpha:d.dst]]},function(d,e,a){function c(d,v){return e.def('"',d,v,'" in ',a,"?",a,".",d,v,":",a,".",d)}d=d.constants.blendFuncs;var v=c("src","RGB"),
b=c("dst","RGB"),v=e.def(d,"[",v,"]"),h=e.def(d,"[",c("src","Alpha"),"]"),b=e.def(d,"[",b,"]");d=e.def(d,"[",c("dst","Alpha"),"]");return[v,b,h,d]});case "blend.equation":return e(function(d){if("string"===typeof d)return[ca[d],ca[d]];if("object"===typeof d)return[ca[d.rgb],ca[d.alpha]]},function(d,e,a){var c=d.constants.blendEquations,v=e.def(),b=e.def();d=d.cond("typeof ",a,'==="string"');d.then(v,"=",b,"=",c,"[",a,"];");d["else"](v,"=",c,"[",a,".rgb];",b,"=",c,"[",a,".alpha];");e(d);return[v,b]});
case "blend.color":return e(function(d){return F(4,function(e){return+d[e]})},function(d,e,a){return F(4,function(d){return e.def("+",a,"[",d,"]")})});case "stencil.mask":return e(function(d){return d|0},function(d,e,a){return e.def(a,"|0")});case "stencil.func":return e(function(d){return[B[d.cmp||"keep"],d.ref||0,"mask"in d?d.mask:-1]},function(d,e,a){d=e.def('"cmp" in ',a,"?",d.constants.compareFuncs,"[",a,".cmp]",":",7680);var c=e.def(a,".ref|0");e=e.def('"mask" in ',a,"?",a,".mask|0:-1");return[d,
c,e]});case "stencil.opFront":case "stencil.opBack":return e(function(e){return["stencil.opBack"===d?1029:1028,Y[e.fail||"keep"],Y[e.zfail||"keep"],Y[e.zpass||"keep"]]},function(e,a,c){function v(d){return a.def('"',d,'" in ',c,"?",b,"[",c,".",d,"]:",7680)}var b=e.constants.stencilOps;return["stencil.opBack"===d?1029:1028,v("fail"),v("zfail"),v("zpass")]});case "polygonOffset.offset":return e(function(d){return[d.factor|0,d.units|0]},function(d,e,a){d=e.def(a,".factor|0");e=e.def(a,".units|0");return[d,
e]});case "cull.face":return e(function(d){var e=0;"front"===d?e=1028:"back"===d&&(e=1029);return e},function(d,e,a){return e.def(a,'==="front"?',1028,":",1029)});case "lineWidth":return e(function(d){return d},function(d,e,a){return a});case "frontFace":return e(function(d){return L[d]},function(d,e,a){return e.def(a+'==="cw"?2304:2305')});case "colorMask":return e(function(d){return d.map(function(d){return!!d})},function(d,e,a){return F(4,function(d){return"!!"+a+"["+d+"]"})});case "sample.coverage":return e(function(d){return["value"in
d?d.value:1,!!d.invert]},function(d,e,a){d=e.def('"value" in ',a,"?+",a,".value:1");e=e.def("!!",a,".invert");return[d,e]})}});return A}function sa(d,e){var b=d["static"],h=d.dynamic,A={};Object.keys(b).forEach(function(d){var e=b[d],a;if("number"===typeof e||"boolean"===typeof e)a=c(function(){return e});else if("function"===typeof e){var v=e._reglType;if("texture2d"===v||"textureCube"===v)a=c(function(d){return d.link(e)});else if("framebuffer"===v||"framebufferCube"===v)a=c(function(d){return d.link(e.color[0])})}else y(e)&&
(a=c(function(d){return d.global.def("[",F(e.length,function(d){return e[d]}),"]")}));a.value=e;A[d]=a});Object.keys(h).forEach(function(d){var e=h[d];A[d]=a(e,function(d,a){return d.invoke(a,e)})});return A}function da(d,e){var b=d["static"],h=d.dynamic,A={};Object.keys(b).forEach(function(d){var e=b[d],a=f.id(d),v=new Ba;if(l(e))v.state=1,v.buffer=M.getBuffer(M.create(e,34962,!1,!0)),v.type=0;else{var h=M.getBuffer(e);if(h)v.state=1,v.buffer=h,v.type=0;else if(e.constant){var w=e.constant;v.buffer=
"null";v.state=2;"number"===typeof w?v.x=w:N.forEach(function(d,e){e<w.length&&(v[d]=w[e])})}else{var h=l(e.buffer)?M.getBuffer(M.create(e.buffer,34962,!1,!0)):M.getBuffer(e.buffer),z=e.offset|0,q=e.stride|0,k=e.size|0,g=!!e.normalized,m=0;"type"in e&&(m=C[e.type]);e=e.divisor|0;v.buffer=h;v.state=1;v.size=k;v.normalized=g;v.type=m||h.dtype;v.offset=z;v.stride=q;v.divisor=e}}A[d]=c(function(d,e){var c=d.attribCache;if(a in c)return c[a];var b={isStream:!1};Object.keys(v).forEach(function(d){b[d]=
v[d]});v.buffer&&(b.buffer=d.link(v.buffer),b.type=b.type||b.buffer+".dtype");return c[a]=b})});Object.keys(h).forEach(function(d){var e=h[d];A[d]=a(e,function(d,a){function v(d){a(A[d],"=",c,".",d,"|0;")}var c=d.invoke(a,e),b=d.shared,h=b.isBufferArgs,w=b.buffer,A={isStream:a.def(!1)},z=new Ba;z.state=1;Object.keys(z).forEach(function(d){A[d]=a.def(""+z[d])});var aa=A.buffer,q=A.type;a("if(",h,"(",c,")){",A.isStream,"=true;",aa,"=",w,".createStream(",34962,",",c,");",q,"=",aa,".dtype;","}else{",
aa,"=",w,".getBuffer(",c,");","if(",aa,"){",q,"=",aa,".dtype;",'}else if("constant" in ',c,"){",A.state,"=",2,";","if(typeof "+c+'.constant === "number"){',A[N[0]],"=",c,".constant;",N.slice(1).map(function(d){return A[d]}).join("="),"=0;","}else{",N.map(function(d,e){return A[d]+"="+c+".constant.length>="+e+"?"+c+".constant["+e+"]:0;"}).join(""),"}}else{","if(",h,"(",c,".buffer)){",aa,"=",w,".createStream(",34962,",",c,".buffer);","}else{",aa,"=",w,".getBuffer(",c,".buffer);","}",q,'="type" in ',
c,"?",b.glTypes,"[",c,".type]:",aa,".dtype;",A.normalized,"=!!",c,".normalized;");v("size");v("offset");v("stride");v("divisor");a("}}");a.exit("if(",A.isStream,"){",w,".destroyStream(",aa,");","}");return A})});return A}function ja(d){var e=d["static"],b=d.dynamic,h={};Object.keys(e).forEach(function(d){var a=e[d];h[d]=c(function(d,e){return"number"===typeof a||"boolean"===typeof a?""+a:d.link(a)})});Object.keys(b).forEach(function(d){var e=b[d];h[d]=a(e,function(d,a){return d.invoke(a,e)})});return h}
function la(d,e,a,c,b){var h=ya(d,b),w=U(d,h,b),z=ka(d,b),q=ra(d,b),k=ia(d,b),g=w.viewport;g&&(q.viewport=g);g=W("scissor.box");(w=w[g])&&(q[g]=w);w=0<Object.keys(q).length;h={framebuffer:h,draw:z,shader:k,state:q,dirty:w};h.profile=na(d,b);h.uniforms=sa(a,b);h.attributes=da(e,b);h.context=ja(c,b);return h}function ea(d,e,a){var c=d.shared.context,b=d.scope();Object.keys(a).forEach(function(h){e.save(c,"."+h);b(c,".",h,"=",a[h].append(d,e),";")});e(b)}function O(d,e,a,c){var b=d.shared,h=b.gl,w=b.framebuffer,
z;oa&&(z=e.def(b.extensions,".webgl_draw_buffers"));var q=d.constants,b=q.drawBuffer,q=q.backBuffer;d=a?a.append(d,e):e.def(w,".next");c||e("if(",d,"!==",w,".cur){");e("if(",d,"){",h,".bindFramebuffer(",36160,",",d,".framebuffer);");oa&&e(z,".drawBuffersWEBGL(",b,"[",d,".colorAttachments.length]);");e("}else{",h,".bindFramebuffer(",36160,",null);");oa&&e(z,".drawBuffersWEBGL(",q,");");e("}",w,".cur=",d,";");c||e("}")}function ha(d,a,c){var b=d.shared,h=b.gl,z=d.current,q=d.next,g=b.current,k=b.next,
m=d.cond(g,".dirty");w.forEach(function(a){a=W(a);if(!(a in c.state)){var v,b;if(a in q){v=q[a];b=z[a];var w=F(e[a].length,function(d){return m.def(v,"[",d,"]")});m(d.cond(w.map(function(d,e){return d+"!=="+b+"["+e+"]"}).join("||")).then(h,".",xa[a],"(",w,");",w.map(function(d,e){return b+"["+e+"]="+d}).join(";"),";"))}else v=m.def(k,".",a),w=d.cond(v,"!==",g,".",a),m(w),a in wa?w(d.cond(v).then(h,".enable(",wa[a],");")["else"](h,".disable(",wa[a],");"),g,".",a,"=",v,";"):w(h,".",xa[a],"(",v,");",
g,".",a,"=",v,";")}});0===Object.keys(c.state).length&&m(g,".dirty=false;");a(m)}function Q(d,e,a,c){var b=d.shared,h=d.current,w=b.current,q=b.gl;k(Object.keys(a)).forEach(function(b){var z=a[b];if(!c||c(z)){var g=z.append(d,e);if(wa[b]){var k=wa[b];r(z)?g?e(q,".enable(",k,");"):e(q,".disable(",k,");"):e(d.cond(g).then(q,".enable(",k,");")["else"](q,".disable(",k,");"));e(w,".",b,"=",g,";")}else if(y(g)){var m=h[b];e(q,".",xa[b],"(",g,");",g.map(function(d,e){return m+"["+e+"]="+d}).join(";"),";")}else e(q,
".",xa[b],"(",g,");",w,".",b,"=",g,";")}})}function pa(d,e){ta&&(d.instancing=e.def(d.shared.extensions,".angle_instanced_arrays"))}function V(d,e,a,c,b){function h(){return"undefined"===typeof performance?"Date.now()":"performance.now()"}function w(d){l=e.def();d(l,"=",h(),";");"string"===typeof b?d(k,".count+=",b,";"):d(k,".count++;");ma&&(c?(n=e.def(),d(n,"=",f,".getNumPendingQueries();")):d(f,".beginQuery(",k,");"))}function q(d){d(k,".cpuTime+=",h(),"-",l,";");ma&&(c?d(f,".pushScopeStats(",n,
",",f,".getNumPendingQueries(),",k,");"):d(f,".endQuery();"))}function z(d){var a=e.def(m,".profile");e(m,".profile=",d,";");e.exit(m,".profile=",a,";")}var g=d.shared,k=d.stats,m=g.current,f=g.timer;a=a.profile;var l,n;if(a){if(r(a)){a.enable?(w(e),q(e.exit),z("true")):z("false");return}a=a.append(d,e);z(a)}else a=e.def(m,".profile");g=d.block();w(g);e("if(",a,"){",g,"}");d=d.block();q(d);e.exit("if(",a,"){",d,"}")}function X(d,e,a,c,b){function h(d){switch(d){case 35664:case 35667:case 35671:return 2;
case 35665:case 35668:case 35672:return 3;case 35666:case 35669:case 35673:return 4;default:return 1}}function w(a,c,b){function h(){e("if(!",m,".buffer){",g,".enableVertexAttribArray(",k,");}");var a=b.type,w;w=b.size?e.def(b.size,"||",c):c;e("if(",m,".type!==",a,"||",m,".size!==",w,"||",aa.map(function(d){return m+"."+d+"!=="+b[d]}).join("||"),"){",g,".bindBuffer(",34962,",",f,".buffer);",g,".vertexAttribPointer(",[k,w,a,b.normalized,b.stride,b.offset],");",m,".type=",a,";",m,".size=",w,";",aa.map(function(d){return m+
"."+d+"="+b[d]+";"}).join(""),"}");ta&&(a=b.divisor,e("if(",m,".divisor!==",a,"){",d.instancing,".vertexAttribDivisorANGLE(",[k,a],");",m,".divisor=",a,";}"))}function z(){e("if(",m,".buffer){",g,".disableVertexAttribArray(",k,");","}if(",N.map(function(d,e){return m+"."+d+"!=="+A[e]}).join("||"),"){",g,".vertexAttrib4f(",k,",",A,");",N.map(function(d,e){return m+"."+d+"="+A[e]+";"}).join(""),"}")}var g=q.gl,k=e.def(a,".location"),m=e.def(q.attributes,"[",k,"]");a=b.state;var f=b.buffer,A=[b.x,b.y,
b.z,b.w],aa=["buffer","normalized","offset","stride"];1===a?h():2===a?z():(e("if(",a,"===",1,"){"),h(),e("}else{"),z(),e("}"))}var q=d.shared;c.forEach(function(c){var q=c.name,g=a.attributes[q],z;if(g){if(!b(g))return;z=g.append(d,e)}else{if(!b(H))return;var m=d.scopeAttrib(q);z={};Object.keys(new Ba).forEach(function(d){z[d]=e.def(m,".",d)})}w(d.link(c),h(c.info.type),z)})}function T(d,e,a,c,b){for(var h=d.shared,w=h.gl,g,q=0;q<c.length;++q){var z=c[q],m=z.name,k=z.info.type,l=a.uniforms[m],z=d.link(z)+
".location",n;if(l){if(!b(l))continue;if(r(l)){m=l.value;if(35678===k||35680===k)k=d.link(m._texture||m.color[0]._texture),e(w,".uniform1i(",z,",",k+".bind());"),e.exit(k,".unbind();");else if(35674===k||35675===k||35676===k)m=d.global.def("new Float32Array(["+Array.prototype.slice.call(m)+"])"),l=2,35675===k?l=3:35676===k&&(l=4),e(w,".uniformMatrix",l,"fv(",z,",false,",m,");");else{switch(k){case 5126:g="1f";break;case 35664:g="2f";break;case 35665:g="3f";break;case 35666:g="4f";break;case 35670:g=
"1i";break;case 5124:g="1i";break;case 35671:g="2i";break;case 35667:g="2i";break;case 35672:g="3i";break;case 35668:g="3i";break;case 35673:g="4i";break;case 35669:g="4i"}e(w,".uniform",g,"(",z,",",y(m)?Array.prototype.slice.call(m):m,");")}continue}else n=l.append(d,e)}else{if(!b(H))continue;n=e.def(h.uniforms,"[",f.id(m),"]")}35678===k?e("if(",n,"&&",n,'._reglType==="framebuffer"){',n,"=",n,".color[0];","}"):35680===k&&e("if(",n,"&&",n,'._reglType==="framebufferCube"){',n,"=",n,".color[0];","}");
m=1;switch(k){case 35678:case 35680:k=e.def(n,"._texture");e(w,".uniform1i(",z,",",k,".bind());");e.exit(k,".unbind();");continue;case 5124:case 35670:g="1i";break;case 35667:case 35671:g="2i";m=2;break;case 35668:case 35672:g="3i";m=3;break;case 35669:case 35673:g="4i";m=4;break;case 5126:g="1f";break;case 35664:g="2f";m=2;break;case 35665:g="3f";m=3;break;case 35666:g="4f";m=4;break;case 35674:g="Matrix2fv";break;case 35675:g="Matrix3fv";break;case 35676:g="Matrix4fv"}e(w,".uniform",g,"(",z,",");
if("M"===g.charAt(0)){var z=Math.pow(k-35674+2,2),B=d.global.def("new Float32Array(",z,")");e("false,(Array.isArray(",n,")||",n," instanceof Float32Array)?",n,":(",F(z,function(d){return B+"["+d+"]="+n+"["+d+"]"}),",",B,")")}else 1<m?e(F(m,function(d){return n+"["+d+"]"})):e(n);e(");")}}function ua(d,e,a,c){function b(h){var g=k[h];return g?g.contextDep&&c.contextDynamic||g.propDep?g.append(d,a):g.append(d,e):e.def(m,".",h)}function h(){function d(){a(x,".drawElementsInstancedANGLE(",[f,n,K,l+"<<(("+
K+"-5121)>>1)",B],");")}function e(){a(x,".drawArraysInstancedANGLE(",[f,l,n,B],");")}q?S?d():(a("if(",q,"){"),d(),a("}else{"),e(),a("}")):e()}function g(){function d(){a(z+".drawElements("+[f,n,K,l+"<<(("+K+"-5121)>>1)"]+");")}function e(){a(z+".drawArrays("+[f,l,n]+");")}q?S?d():(a("if(",q,"){"),d(),a("}else{"),e(),a("}")):e()}var w=d.shared,z=w.gl,m=w.draw,k=c.draw,q=function(){var b=k.elements,h=e;if(b){if(b.contextDep&&c.contextDynamic||b.propDep)h=a;b=b.append(d,h)}else b=h.def(m,".","elements");
b&&h("if("+b+")"+z+".bindBuffer(34963,"+b+".buffer.buffer);");return b}(),f=b("primitive"),l=b("offset"),n=function(){var b=k.count,h=e;if(b){if(b.contextDep&&c.contextDynamic||b.propDep)h=a;b=b.append(d,h)}else b=h.def(m,".","count");return b}();if("number"===typeof n){if(0===n)return}else a("if(",n,"){"),a.exit("}");var B,x;ta&&(B=b("instances"),x=d.instancing);var K=q+".type",S=k.elements&&r(k.elements);ta&&("number"!==typeof B||0<=B)?"string"===typeof B?(a("if(",B,">0){"),h(),a("}else if(",B,
"<0){"),g(),a("}")):h():g()}function Ea(d,e,a,b,c){e=ba();c=e.proc("body",c);ta&&(e.instancing=c.def(e.shared.extensions,".angle_instanced_arrays"));d(e,c,a,b);return e.compile().body}function Fa(d,e,a,b){pa(d,e);X(d,e,a,b.attributes,function(){return!0});T(d,e,a,b.uniforms,function(){return!0});ua(d,e,e,a)}function Ha(d,e){var a=d.proc("draw",1);pa(d,a);ea(d,a,e.context);O(d,a,e.framebuffer);ha(d,a,e);Q(d,a,e.state);V(d,a,e,!1,!0);var b=e.shader.progVar.append(d,a);a(d.shared.gl,".useProgram(",b,
".program);");if(e.shader.program)Fa(d,a,e,e.shader.program);else{var c=d.global.def("{}"),h=a.def(b,".id"),g=a.def(c,"[",h,"]");a(d.cond(g).then(g,".call(this,a0);")["else"](g,"=",c,"[",h,"]=",d.link(function(a){return Ea(Fa,d,e,a,1)}),"(",b,");",g,".call(this,a0);"))}0<Object.keys(e.state).length&&a(d.shared.current,".dirty=true;")}function Ia(d,e,a,b){function c(){return!0}d.batchId="a1";pa(d,e);X(d,e,a,b.attributes,c);T(d,e,a,b.uniforms,c);ua(d,e,e,a)}function Ca(e,a,b,c){function h(e){return e.contextDep&&
w||e.propDep}function g(e){return!h(e)}pa(e,a);var w=b.contextDep,z=a.def(),m=a.def();e.shared.props=m;e.batchId=z;var k=e.scope(),q=e.scope();a(k.entry,"for(",z,"=0;",z,"<","a1",";++",z,"){",m,"=","a0","[",z,"];",q,"}",k.exit);b.needsContext&&ea(e,q,b.context);b.needsFramebuffer&&O(e,q,b.framebuffer);Q(e,q,b.state,h);b.profile&&h(b.profile)&&V(e,q,b,!1,!0);c?(X(e,k,b,c.attributes,g),X(e,q,b,c.attributes,h),T(e,k,b,c.uniforms,g),T(e,q,b,c.uniforms,h),ua(e,k,q,b)):(a=e.global.def("{}"),c=b.shader.progVar.append(e,
q),m=q.def(c,".id"),k=q.def(a,"[",m,"]"),q(e.shared.gl,".useProgram(",c,".program);","if(!",k,"){",k,"=",a,"[",m,"]=",e.link(function(a){return Ea(Ia,e,b,a,2)}),"(",c,");}",k,".call(this,a0[",z,"],",z,");"))}function Da(e,a){function b(e){return e.contextDep&&h||e.propDep}var c=e.proc("batch",2);e.batchId="0";pa(e,c);var h=!1,g=!0;Object.keys(a.context).forEach(function(e){h=h||a.context[e].propDep});h||(ea(e,c,a.context),g=!1);var w=a.framebuffer,z=!1;w?(w.propDep?h=z=!0:w.contextDep&&h&&(z=!0),
z||O(e,c,w)):O(e,c,null);a.state.viewport&&a.state.viewport.propDep&&(h=!0);ha(e,c,a);Q(e,c,a.state,function(e){return!b(e)});a.profile&&b(a.profile)||V(e,c,a,!1,"a1");a.contextDep=h;a.needsContext=g;a.needsFramebuffer=z;g=a.shader.progVar;if(g.contextDep&&h||g.propDep)Ca(e,c,a,null);else if(g=g.append(e,c),c(e.shared.gl,".useProgram(",g,".program);"),a.shader.program)Ca(e,c,a,a.shader.program);else{var w=e.global.def("{}"),z=c.def(g,".id"),q=c.def(w,"[",z,"]");c(e.cond(q).then(q,".call(this,a0,a1);")["else"](q,
"=",w,"[",z,"]=",e.link(function(b){return Ea(Ca,e,a,b,2)}),"(",g,");",q,".call(this,a0,a1);"))}0<Object.keys(a.state).length&&c(e.shared.current,".dirty=true;")}function Pa(e,a){function b(g){var w=a.shader[g];w&&c.set(h.shader,"."+g,w.append(e,c))}var c=e.proc("scope",3);e.batchId="a2";var h=e.shared,g=h.current;ea(e,c,a.context);a.framebuffer&&a.framebuffer.append(e,c);k(Object.keys(a.state)).forEach(function(b){var g=a.state[b].append(e,c);y(g)?g.forEach(function(a,h){c.set(e.next[b],"["+h+"]",
a)}):c.set(h.next,"."+b,g)});V(e,c,a,!0,!0);["elements","offset","count","instances","primitive"].forEach(function(b){var g=a.draw[b];g&&c.set(h.draw,"."+b,""+g.append(e,c))});Object.keys(a.uniforms).forEach(function(b){c.set(h.uniforms,"["+f.id(b)+"]",a.uniforms[b].append(e,c))});Object.keys(a.attributes).forEach(function(b){var h=a.attributes[b].append(e,c),g=e.scopeAttrib(b);Object.keys(new Ba).forEach(function(e){c.set(g,"."+e,h[e])})});b("vert");b("frag");0<Object.keys(a.state).length&&(c(g,
".dirty=true;"),c.exit(g,".dirty=true;"));c("a1(",e.shared.context,",a0,",e.batchId,");")}function Na(e){if("object"===typeof e&&!y(e)){for(var a=Object.keys(e),b=0;b<a.length;++b)if(g.isDynamic(e[a[b]]))return!0;return!1}}function Ja(e,b,c){function h(e,a){q.forEach(function(d){var b=w[d];g.isDynamic(b)&&(b=e.invoke(a,b),a(n,".",d,"=",b,";"))})}var w=b["static"][c];if(w&&Na(w)){var z=e.global,q=Object.keys(w),k=!1,m=!1,f=!1,n=e.global.def("{}");q.forEach(function(b){var c=w[b];if(g.isDynamic(c))"function"===
typeof c&&(c=w[b]=g.unbox(c)),b=a(c,null),k=k||b.thisDep,f=f||b.propDep,m=m||b.contextDep;else{z(n,".",b,"=");switch(typeof c){case "number":z(c);break;case "string":z('"',c,'"');break;case "object":Array.isArray(c)&&z("[",c.join(),"]");break;default:z(e.link(c))}z(";")}});b.dynamic[c]=new g.DynamicVariable(4,{thisDep:k,contextDep:m,propDep:f,ref:n,append:h});delete b["static"][c]}}var Ba=Aa.Record,ca={add:32774,subtract:32778,"reverse subtract":32779};t.ext_blend_minmax&&(ca.min=32775,ca.max=32776);
var ta=t.angle_instanced_arrays,oa=t.webgl_draw_buffers,e={dirty:!0,profile:ga.profile},z={},w=[],wa={},xa={};R("dither",3024);R("blend.enable",3042);G("blend.color","blendColor",[0,0,0,0]);G("blend.equation","blendEquationSeparate",[32774,32774]);G("blend.func","blendFuncSeparate",[1,0,1,0]);R("depth.enable",2929,!0);G("depth.func","depthFunc",513);G("depth.range","depthRange",[0,1]);G("depth.mask","depthMask",!0);G("colorMask","colorMask",[!0,!0,!0,!0]);R("cull.enable",2884);G("cull.face","cullFace",
1029);G("frontFace","frontFace",2305);G("lineWidth","lineWidth",1);R("polygonOffset.enable",32823);G("polygonOffset.offset","polygonOffset",[0,0]);R("sample.alpha",32926);R("sample.enable",32928);G("sample.coverage","sampleCoverage",[1,!1]);R("stencil.enable",2960);G("stencil.mask","stencilMask",-1);G("stencil.func","stencilFunc",[519,0,-1]);G("stencil.opFront","stencilOpSeparate",[1028,7680,7680,7680]);G("stencil.opBack","stencilOpSeparate",[1029,7680,7680,7680]);R("scissor.enable",3089);G("scissor.box",
"scissor",[0,0,h.drawingBufferWidth,h.drawingBufferHeight]);G("viewport","viewport",[0,0,h.drawingBufferWidth,h.drawingBufferHeight]);var Qa={gl:h,context:S,strings:f,next:z,current:e,draw:q,elements:u,buffer:M,shader:va,attributes:Aa.state,uniforms:K,framebuffer:D,extensions:t,timer:ma,isBufferArgs:l},Ma={primTypes:E,compareFuncs:B,blendFuncs:m,blendEquations:ca,stencilOps:Y,glTypes:C,orientationType:L};oa&&(Ma.backBuffer=[1029],Ma.drawBuffer=F(p.maxDrawbuffers,function(e){return 0===e?[0]:F(e,function(e){return 36064+
e})}));var Ra=0;return{next:z,current:e,procs:function(){var a=ba(),b=a.proc("poll"),c=a.proc("refresh"),g=a.block();b(g);c(g);var w=a.shared,z=w.gl,q=w.next,k=w.current;g(k,".dirty=false;");O(a,b);O(a,c,null,!0);var m=h.getExtension("angle_instanced_arrays"),f;m&&(f=a.link(m));for(var n=0;n<p.maxAttributes;++n){var l=c.def(w.attributes,"[",n,"]"),B=a.cond(l,".buffer");B.then(z,".enableVertexAttribArray(",n,");",z,".bindBuffer(",34962,",",l,".buffer.buffer);",z,".vertexAttribPointer(",n,",",l,".size,",
l,".type,",l,".normalized,",l,".stride,",l,".offset);")["else"](z,".disableVertexAttribArray(",n,");",z,".vertexAttrib4f(",n,",",l,".x,",l,".y,",l,".z,",l,".w);",l,".buffer=null;");c(B);m&&c(f,".vertexAttribDivisorANGLE(",n,",",l,".divisor);")}Object.keys(wa).forEach(function(e){var h=wa[e],w=g.def(q,".",e),m=a.block();m("if(",w,"){",z,".enable(",h,")}else{",z,".disable(",h,")}",k,".",e,"=",w,";");c(m);b("if(",w,"!==",k,".",e,"){",m,"}")});Object.keys(xa).forEach(function(h){var w=xa[h],m=e[h],f,
n,l=a.block();l(z,".",w,"(");y(m)?(w=m.length,f=a.global.def(q,".",h),n=a.global.def(k,".",h),l(F(w,function(e){return f+"["+e+"]"}),");",F(w,function(e){return n+"["+e+"]="+f+"["+e+"];"}).join("")),b("if(",F(w,function(e){return f+"["+e+"]!=="+n+"["+e+"]"}).join("||"),"){",l,"}")):(f=g.def(q,".",h),n=g.def(k,".",h),l(f,");",k,".",h,"=",f,";"),b("if(",f,"!==",n,"){",l,"}"));c(l)});return a.compile()}(),compile:function(e,a,b,c,h){var g=ba();g.stats=g.link(h);Object.keys(a["static"]).forEach(function(e){Ja(g,
a,e)});n.forEach(function(a){Ja(g,e,a)});b=la(e,a,b,c,g);Ha(g,b);Pa(g,b);Da(g,b);return g.compile()}}}},{"./constants/dtypes.json":4,"./constants/primitives.json":5,"./dynamic":8,"./util/codegen":21,"./util/is-array-like":24,"./util/is-ndarray":25,"./util/is-typed-array":26,"./util/loop":27}],8:[function(f,p,u){function l(c,a){this.id=r++;this.type=c;this.data=a}function k(c){if(0===c.length)return[];var a=c.charAt(0),b=c.charAt(c.length-1);if(1<c.length&&a===b&&('"'===a||"'"===a))return['"'+c.substr(1,
c.length-2).replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'];if(a=/\[(false|true|null|\d+|'[^']*'|"[^"]*")\]/.exec(c))return k(c.substr(0,a.index)).concat(k(a[1])).concat(k(c.substr(a.index+a[0].length)));a=c.split(".");if(1===a.length)return['"'+c.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'];c=[];for(b=0;b<a.length;++b)c=c.concat(k(a[b]));return c}function x(c){return"["+k(c).join("][")+"]"}var r=0;p.exports={DynamicVariable:l,define:function(c,a){return new l(c,x(a+""))},isDynamic:function(c){return"function"===
typeof c&&!c._reglType||c instanceof l},unbox:function(c,a){return"function"===typeof c?new l(0,c):c},accessor:x}},{}],9:[function(f,p,u){var l=f("./util/is-typed-array"),k=f("./util/is-ndarray"),x=f("./util/values"),r=f("./constants/primitives.json"),c=f("./constants/usage.json");p.exports=function(a,b,f,p){function t(a){this.id=C++;E[this.id]=this;this.buffer=a;this.primType=4;this.type=this.vertCount=0}function y(c,g,n,r,x,h,t){c.buffer.bind();if(g){var y=t;t||l(g)&&(!k(g)||l(g.data))||(y=b.oes_element_index_uint?
5125:5123);f._initBuffer(c.buffer,g,n,y,3)}else a.bufferData(34963,h,n),c.buffer.dtype=y||5121,c.buffer.usage=n,c.buffer.dimension=3,c.buffer.byteLength=h;y=t;if(!t){switch(c.buffer.dtype){case 5121:case 5120:y=5121;break;case 5123:case 5122:y=5123;break;case 5125:case 5124:y=5125}c.buffer.dtype=y}c.type=y;g=x;0>g&&(g=c.buffer.byteLength,5123===y?g>>=1:5125===y&&(g>>=2));c.vertCount=g;g=r;0>r&&(g=4,r=c.buffer.dimension,1===r&&(g=0),2===r&&(g=1),3===r&&(g=4));c.primType=g}function g(a){p.elementsCount--;
delete E[a.id];a.buffer.destroy();a.buffer=null}var E={},C=0,N={uint8:5121,uint16:5123};b.oes_element_index_uint&&(N.uint32=5125);t.prototype.bind=function(){this.buffer.bind()};var n=[];return{create:function(a,b){function n(a){if(a)if("number"===typeof a)x(a),C.primType=4,C.vertCount=a|0,C.type=5121;else{var b=null,g=35044,m=-1,f=-1,t=0,B=0;if(Array.isArray(a)||l(a)||k(a))b=a;else if("data"in a&&(b=a.data),"usage"in a&&(g=c[a.usage]),"primitive"in a&&(m=r[a.primitive]),"count"in a&&(f=a.count|0),
"type"in a&&(B=N[a.type]),"length"in a)t=a.length|0;else if(t=f,5123===B||5122===B)t*=2;else if(5125===B||5124===B)t*=4;y(C,b,g,m,f,t,B)}else x(),C.primType=4,C.vertCount=0,C.type=5121;return n}var x=f.create(null,34963,!0),C=new t(x._buffer);p.elementsCount++;n(a);n._reglType="elements";n._elements=C;n.subdata=function(a,b){x.subdata(a,b);return n};n.destroy=function(){g(C)};return n},createStream:function(a){var b=n.pop();b||(b=new t(f.create(null,34963,!0,!1)._buffer));y(b,a,35040,-1,-1,0,0);return b},
destroyStream:function(a){n.push(a)},getElements:function(a){return"function"===typeof a&&a._elements instanceof t?a._elements:null},clear:function(){x(E).forEach(g)}}}},{"./constants/primitives.json":5,"./constants/usage.json":6,"./util/is-ndarray":25,"./util/is-typed-array":26,"./util/values":31}],10:[function(f,p,u){p.exports=function(f,k){function x(a){a=a.toLowerCase();var c;try{c=r[a]=f.getExtension(a)}catch(k){}return!!c}for(var r={},c=0;c<k.extensions.length;++c){var a=k.extensions[c];if(!x(a))return k.onDestroy(),
k.onDone('"'+a+'" extension is not supported by the current WebGL context, try upgrading your system or a different browser'),null}k.optionalExtensions.forEach(x);return{extensions:r,restore:function(){Object.keys(r).forEach(function(a){if(!x(a))throw Error("(regl): error restoring extension "+a);})}}}},{}],11:[function(f,p,u){var l=f("./util/values"),k=f("./util/extend"),x=[];x[6408]=4;var r=[];r[5121]=1;r[5126]=4;r[36193]=2;p.exports=function(c,a,b,f,p,t){function y(a,c,b){this.target=a;this.texture=
c;this.renderbuffer=b;var h=a=0;c?(a=c.width,h=c.height):b&&(a=b.width,h=b.height);this.width=a;this.height=h}function g(a){a&&(a.texture&&a.texture._texture.decRef(),a.renderbuffer&&a.renderbuffer._renderbuffer.decRef())}function E(a,c,b){a&&(a.texture?a.texture._texture.refCount+=1:a.renderbuffer._renderbuffer.refCount+=1)}function C(a,b){b&&(b.texture?c.framebufferTexture2D(36160,a,b.target,b.texture._texture.texture,0):c.framebufferRenderbuffer(36160,a,36161,b.renderbuffer._renderbuffer.renderbuffer))}
function N(a){var b=3553,c=null,h=null,g=a;"object"===typeof a&&(g=a.data,"target"in a&&(b=a.target|0));a=g._reglType;"texture2d"===a?c=g:"textureCube"===a?c=g:"renderbuffer"===a&&(h=g,b=36161);return new y(b,c,h)}function n(a,b,c,h,g){if(c)return a=f.create2D({width:a,height:b,format:h,type:g}),a._texture.refCount=0,new y(3553,a,null);a=p.create({width:a,height:b,format:h});a._renderbuffer.refCount=0;return new y(36161,null,a)}function m(a){return a&&(a.texture||a.renderbuffer)}function B(a,b,c){a&&
(a.texture?a.texture.resize(b,c):a.renderbuffer&&a.renderbuffer.resize(b,c))}function u(){this.id=Z++;D[this.id]=this;this.framebuffer=c.createFramebuffer();this.height=this.width=0;this.colorAttachments=[];this.depthStencilAttachment=this.stencilAttachment=this.depthAttachment=null}function L(a){a.colorAttachments.forEach(g);g(a.depthAttachment);g(a.stencilAttachment);g(a.depthStencilAttachment)}function H(a){c.deleteFramebuffer(a.framebuffer);a.framebuffer=null;t.framebufferCount--;delete D[a.id]}
function h(a){var h;c.bindFramebuffer(36160,a.framebuffer);var g=a.colorAttachments;for(h=0;h<g.length;++h)C(36064+h,g[h]);for(h=g.length;h<b.maxColorAttachments;++h)c.framebufferTexture2D(36160,36064+h,3553,null,0);c.framebufferTexture2D(36160,33306,3553,null,0);c.framebufferTexture2D(36160,36096,3553,null,0);c.framebufferTexture2D(36160,36128,3553,null,0);C(36096,a.depthAttachment);C(36128,a.stencilAttachment);C(33306,a.depthStencilAttachment);c.checkFramebufferStatus(36160);c.bindFramebuffer(36160,
Ka.next);Ka.cur=Ka.next;c.getError()}function fa(a,b){function c(a,b){var k,f=0,l=0,t=!0,y=!0;k=null;var B=!0,C="rgba",F="uint8",p=1,M=null,H=null,u=null,Y=!1;if("number"===typeof a)f=a|0,l=b|0||f;else if(a){"shape"in a?(l=a.shape,f=l[0],l=l[1]):("radius"in a&&(f=l=a.radius),"width"in a&&(f=a.width),"height"in a&&(l=a.height));if("color"in a||"colors"in a)k=a.color||a.colors,Array.isArray(k);if(!k){"colorCount"in a&&(p=a.colorCount|0);"colorTexture"in a&&(B=!!a.colorTexture,C="rgba4");if("colorType"in
a&&(F=a.colorType,!B))if("half float"===F||"float16"===F)C="rgba16f";else if("float"===F||"float32"===F)C="rgba32f";"colorFormat"in a&&(C=a.colorFormat,0<=La.indexOf(C)?B=!0:0<=za.indexOf(C)&&(B=!1))}if("depthTexture"in a||"depthStencilTexture"in a)Y=!(!a.depthTexture&&!a.depthStencilTexture);"depth"in a&&("boolean"===typeof a.depth?t=a.depth:(M=a.depth,y=!1));"stencil"in a&&("boolean"===typeof a.stencil?y=a.stencil:(H=a.stencil,t=!1));"depthStencil"in a&&("boolean"===typeof a.depthStencil?t=y=a.depthStencil:
(u=a.depthStencil,y=t=!1))}else f=l=1;var D=null,fa=null,K=null,O=null;if(Array.isArray(k))D=k.map(N);else if(k)D=[N(k)];else for(D=Array(p),k=0;k<p;++k)D[k]=n(f,l,B,C,F);f=f||D[0].width;l=l||D[0].height;M?fa=N(M):t&&!y&&(fa=n(f,l,Y,"depth","uint32"));H?K=N(H):y&&!t&&(K=n(f,l,!1,"stencil","uint8"));u?O=N(u):!M&&!H&&y&&t&&(O=n(f,l,Y,"depth stencil","depth stencil"));t=null;for(k=0;k<D.length;++k)E(D[k],f,l),D[k]&&D[k].texture&&(y=x[D[k].texture._texture.format]*r[D[k].texture._texture.type],null===
t&&(t=y));E(fa,f,l);E(K,f,l);E(O,f,l);L(g);g.width=f;g.height=l;g.colorAttachments=D;g.depthAttachment=fa;g.stencilAttachment=K;g.depthStencilAttachment=O;c.color=D.map(m);c.depth=m(fa);c.stencil=m(K);c.depthStencil=m(O);c.width=g.width;c.height=g.height;h(g);return c}var g=new u;t.framebufferCount++;c(a,b);return k(c,{resize:function(a,b){var k=a|0,f=b|0||k;if(k===g.width&&f===g.height)return c;for(var m=g.colorAttachments,l=0;l<m.length;++l)B(m[l],k,f);B(g.depthAttachment,k,f);B(g.stencilAttachment,
k,f);B(g.depthStencilAttachment,k,f);g.width=c.width=k;g.height=c.height=f;h(g);return c},_reglType:"framebuffer",_framebuffer:g,destroy:function(){H(g);L(g)}})}var Ka={cur:null,next:null,dirty:!1},La=["rgba"],za=["rgba4","rgb565","rgb5 a1"];a.ext_srgb&&za.push("srgba");a.ext_color_buffer_half_float&&za.push("rgba16f","rgb16f");a.webgl_color_buffer_float&&za.push("rgba32f");var Ga=["uint8"];a.oes_texture_half_float&&Ga.push("half float","float16");a.oes_texture_float&&Ga.push("float","float32");var Z=
0,D={};return k(Ka,{getFramebuffer:function(a){return"function"===typeof a&&"framebuffer"===a._reglType&&(a=a._framebuffer,a instanceof u)?a:null},create:fa,createCube:function(a){function c(a){var g,h={color:null},m=0,l=null;g="rgba";var n="uint8",r=1;if("number"===typeof a)m=a|0;else if(a){"shape"in a?m=a.shape[0]:("radius"in a&&(m=a.radius|0),"width"in a?m=a.width|0:"height"in a&&(m=a.height|0));if("color"in a||"colors"in a)l=a.color||a.colors,Array.isArray(l);l||("colorCount"in a&&(r=a.colorCount|
0),"colorType"in a&&(n=a.colorType),"colorFormat"in a&&(g=a.colorFormat));"depth"in a&&(h.depth=a.depth);"stencil"in a&&(h.stencil=a.stencil);"depthStencil"in a&&(h.depthStencil=a.depthStencil)}else m=1;if(l)if(Array.isArray(l))for(a=[],g=0;g<l.length;++g)a[g]=l[g];else a=[l];else for(a=Array(r),l={radius:m,format:g,type:n},g=0;g<r;++g)a[g]=f.createCube(l);h.color=Array(a.length);for(g=0;g<a.length;++g)r=a[g],m=m||r.width,h.color[g]={target:34069,data:a[g]};for(g=0;6>g;++g){for(r=0;r<a.length;++r)h.color[r].target=
34069+g;0<g&&(h.depth=b[0].depth,h.stencil=b[0].stencil,h.depthStencil=b[0].depthStencil);if(b[g])b[g](h);else b[g]=fa(h)}return k(c,{width:m,height:m,color:a})}var b=Array(6);c(a);return k(c,{faces:b,resize:function(a){var g=a|0;if(g===c.width)return c;var h=c.color;for(a=0;a<h.length;++a)h[a].resize(g);for(a=0;6>a;++a)b[a].resize(g);c.width=c.height=g;return c},_reglType:"framebufferCube",destroy:function(){b.forEach(function(a){a.destroy()})}})},clear:function(){l(D).forEach(H)},restore:function(){l(D).forEach(function(a){a.framebuffer=
c.createFramebuffer();h(a)})}})}},{"./util/extend":22,"./util/values":31}],12:[function(f,p,u){p.exports=function(f,k){var x=1;k.ext_texture_filter_anisotropic&&(x=f.getParameter(34047));var r=1,c=1;k.webgl_draw_buffers&&(r=f.getParameter(34852),c=f.getParameter(36063));return{colorBits:[f.getParameter(3410),f.getParameter(3411),f.getParameter(3412),f.getParameter(3413)],depthBits:f.getParameter(3414),stencilBits:f.getParameter(3415),subpixelBits:f.getParameter(3408),extensions:Object.keys(k).filter(function(a){return!!k[a]}),
maxAnisotropic:x,maxDrawbuffers:r,maxColorAttachments:c,pointSizeDims:f.getParameter(33901),lineWidthDims:f.getParameter(33902),maxViewportDims:f.getParameter(3386),maxCombinedTextureUnits:f.getParameter(35661),maxCubeMapSize:f.getParameter(34076),maxRenderbufferSize:f.getParameter(34024),maxTextureUnits:f.getParameter(34930),maxTextureSize:f.getParameter(3379),maxAttributes:f.getParameter(34921),maxVertexUniforms:f.getParameter(36347),maxVertexTextureUnits:f.getParameter(35660),maxVaryingVectors:f.getParameter(36348),
maxFragmentUniforms:f.getParameter(36349),glsl:f.getParameter(35724),renderer:f.getParameter(7937),vendor:f.getParameter(7936),version:f.getParameter(7938)}}},{}],13:[function(f,p,u){var l=f("./util/is-typed-array");p.exports=function(k,f,r,c,a,b){return function(a){var b;b=null===f.next?5121:f.next.colorAttachments[0].texture._texture.type;var t=0,y=0,g=c.framebufferWidth,p=c.framebufferHeight,C=null;l(a)?C=a:a&&(t=a.x|0,y=a.y|0,g=(a.width||c.framebufferWidth-t)|0,p=(a.height||c.framebufferHeight-
y)|0,C=a.data||null);r();a=g*p*4;C||(5121===b?C=new Uint8Array(a):5126===b&&(C=C||new Float32Array(a)));k.pixelStorei(3333,4);k.readPixels(t,y,g,p,6408,b,C);return C}}},{"./util/is-typed-array":26}],14:[function(f,p,u){var l=f("./util/values"),k=[];k[32854]=2;k[32855]=2;k[36194]=2;k[33189]=2;k[36168]=1;k[34041]=4;k[35907]=4;k[34836]=16;k[34842]=8;k[34843]=6;p.exports=function(f,r,c,a,b){function p(a){this.id=g++;this.refCount=1;this.renderbuffer=a;this.format=32854;this.height=this.width=0;b.profile&&
(this.stats={size:0})}function M(b){var c=b.renderbuffer;f.bindRenderbuffer(36161,null);f.deleteRenderbuffer(c);b.renderbuffer=null;b.refCount=0;delete E[b.id];a.renderbufferCount--}var t={rgba4:32854,rgb565:36194,"rgb5 a1":32855,depth:33189,stencil:36168,"depth stencil":34041};r.ext_srgb&&(t.srgba=35907);r.ext_color_buffer_half_float&&(t.rgba16f=34842,t.rgb16f=34843);r.webgl_color_buffer_float&&(t.rgba32f=34836);var y=[];Object.keys(t).forEach(function(a){y[t[a]]=a});var g=0,E={};p.prototype.decRef=
function(){0>=--this.refCount&&M(this)};b.profile&&(a.getTotalRenderbufferSize=function(){var a=0;Object.keys(E).forEach(function(b){a+=E[b].stats.size});return a});return{create:function(c,g){function n(a,c){var g=0,l=0,h=32854;"object"===typeof a&&a?("shape"in a?(l=a.shape,g=l[0]|0,l=l[1]|0):("radius"in a&&(g=l=a.radius|0),"width"in a&&(g=a.width|0),"height"in a&&(l=a.height|0)),"format"in a&&(h=t[a.format])):"number"===typeof a?(g=a|0,l="number"===typeof c?c|0:g):a||(g=l=1);if(g!==m.width||l!==
m.height||h!==m.format)return n.width=m.width=g,n.height=m.height=l,m.format=h,f.bindRenderbuffer(36161,m.renderbuffer),f.renderbufferStorage(36161,h,g,l),b.profile&&(m.stats.size=k[m.format]*m.width*m.height),n.format=y[m.format],n}var m=new p(f.createRenderbuffer());E[m.id]=m;a.renderbufferCount++;n(c,g);n.resize=function(a,c){var g=a|0,l=c|0||g;if(g===m.width&&l===m.height)return n;n.width=m.width=g;n.height=m.height=l;f.bindRenderbuffer(36161,m.renderbuffer);f.renderbufferStorage(36161,m.format,
g,l);b.profile&&(m.stats.size=k[m.format]*m.width*m.height);return n};n._reglType="renderbuffer";n._renderbuffer=m;b.profile&&(n.stats=m.stats);n.destroy=function(){m.decRef()};return n},clear:function(){l(E).forEach(M)},restore:function(){l(E).forEach(function(a){a.renderbuffer=f.createRenderbuffer();f.bindRenderbuffer(36161,a.renderbuffer);f.renderbufferStorage(36161,a.format,a.width,a.height)});f.bindRenderbuffer(36161,null)}}}},{"./util/values":31}],15:[function(f,p,u){var l=f("./util/values");
p.exports=function(f,x,r,c){function a(a,c,b,g){this.name=a;this.id=c;this.location=b;this.info=g}function b(a,c){for(var b=0;b<a.length;++b)if(a[b].id===c.id){a[b].location=c.location;return}a.push(c)}function p(a,c,b){b=35632===a?y:g;var l=b[c];if(!l){var r=x.str(c),l=f.createShader(a);f.shaderSource(l,r);f.compileShader(l);b[c]=l}return l}function M(a,b){this.id=u++;this.fragId=a;this.vertId=b;this.program=null;this.uniforms=[];this.attributes=[];c.profile&&(this.stats={uniformsCount:0,attributesCount:0})}
function t(g,m){var l,r;l=p(35632,g.fragId);r=p(35633,g.vertId);var t=g.program=f.createProgram();f.attachShader(t,l);f.attachShader(t,r);f.linkProgram(t);var y=f.getProgramParameter(t,35718);c.profile&&(g.stats.uniformsCount=y);var h=g.uniforms;for(l=0;l<y;++l)if(r=f.getActiveUniform(t,l))if(1<r.size)for(var C=0;C<r.size;++C){var E=r.name.replace("[0]","["+C+"]");b(h,new a(E,x.id(E),f.getUniformLocation(t,E),r))}else b(h,new a(r.name,x.id(r.name),f.getUniformLocation(t,r.name),r));y=f.getProgramParameter(t,
35721);c.profile&&(g.stats.attributesCount=y);h=g.attributes;for(l=0;l<y;++l)(r=f.getActiveAttrib(t,l))&&b(h,new a(r.name,x.id(r.name),f.getAttribLocation(t,r.name),r))}var y={},g={},E={},C=[],u=0;c.profile&&(r.getMaxUniformsCount=function(){var a=0;C.forEach(function(b){b.stats.uniformsCount>a&&(a=b.stats.uniformsCount)});return a},r.getMaxAttributesCount=function(){var a=0;C.forEach(function(b){b.stats.attributesCount>a&&(a=b.stats.attributesCount)});return a});return{clear:function(){var a=f.deleteShader.bind(f);
l(y).forEach(a);y={};l(g).forEach(a);g={};C.forEach(function(a){f.deleteProgram(a.program)});C.length=0;E={};r.shaderCount=0},program:function(a,b,c){r.shaderCount++;var g=E[b];g||(g=E[b]={});var f=g[a];f||(f=new M(b,a),t(f,c),g[a]=f,C.push(f));return f},restore:function(){y={};g={};for(var a=0;a<C.length;++a)t(C[a])},shader:p,frag:-1,vert:-1}}},{"./util/values":31}],16:[function(f,p,u){p.exports=function(){return{bufferCount:0,elementsCount:0,framebufferCount:0,shaderCount:0,textureCount:0,cubeCount:0,
renderbufferCount:0,maxTextureUnits:0}}},{}],17:[function(f,p,u){p.exports=function(){var f={"":0},k=[""];return{id:function(x){var r=f[x];if(r)return r;r=f[x]=k.length;k.push(x);return r},str:function(f){return k[f]}}}},{}],18:[function(f,p,u){function l(a){return Array.isArray(a)&&(0===a.length||"number"===typeof a[0])}function k(a){return Array.isArray(a)&&0!==a.length&&E(a[0])?!0:!1}function x(a){return Object.prototype.toString.call(a)}function r(a){if(!a)return!1;var b=x(a);return 0<=Y.indexOf(b)?
!0:l(a)||k(a)||t(a)}function c(a,b){36193===a.type?(a.data=g(b),y.freeType(b)):a.data=b}function a(a,b,c,g,f,k){a="undefined"!==typeof H[a]?H[a]:B[a]*L[b];k&&(a*=6);if(f){for(g=0;1<=c;)g+=a*c*c,c/=2;return g}return a*c*g}var b=f("./util/extend"),F=f("./util/values"),M=f("./util/is-typed-array"),t=f("./util/is-ndarray"),y=f("./util/pool"),g=f("./util/to-half-float"),E=f("./util/is-array-like"),C=f("./util/flatten");u=f("./constants/arraytypes.json");var N=f("./constants/arraytypes.json"),n=[9984,9986,
9985,9987],m=[0,6409,6410,6407,6408],B={};B[6409]=B[6406]=B[6402]=1;B[34041]=B[6410]=2;B[6407]=B[35904]=3;B[6408]=B[35906]=4;var Y=Object.keys(u).concat(["[object HTMLCanvasElement]","[object CanvasRenderingContext2D]","[object HTMLImageElement]","[object HTMLVideoElement]"]),L=[];L[5121]=1;L[5126]=4;L[36193]=2;L[5123]=2;L[5125]=4;var H=[];H[32854]=2;H[32855]=2;H[36194]=2;H[34041]=4;H[33776]=.5;H[33777]=.5;H[33778]=1;H[33779]=1;H[35986]=.5;H[35987]=1;H[34798]=1;H[35840]=.5;H[35841]=.25;H[35842]=.5;
H[35843]=.25;H[36196]=.5;p.exports=function(h,f,p,u,H,L,Z){function D(){this.format=this.internalformat=6408;this.type=5121;this.flipY=this.premultiplyAlpha=this.compressed=!1;this.unpackAlignment=1;this.channels=this.height=this.width=this.colorSpace=0}function K(a,b){a.internalformat=b.internalformat;a.format=b.format;a.type=b.type;a.compressed=b.compressed;a.premultiplyAlpha=b.premultiplyAlpha;a.flipY=b.flipY;a.unpackAlignment=b.unpackAlignment;a.colorSpace=b.colorSpace;a.width=b.width;a.height=
b.height;a.channels=b.channels}function Y(a,b){if("object"===typeof b&&b){"premultiplyAlpha"in b&&(a.premultiplyAlpha=b.premultiplyAlpha);"flipY"in b&&(a.flipY=b.flipY);"alignment"in b&&(a.unpackAlignment=b.alignment);"colorSpace"in b&&(a.colorSpace=pa[b.colorSpace]);"type"in b&&(a.type=V[b.type]);var c=a.width,g=a.height,h=a.channels,f=!1;"shape"in b?(c=b.shape[0],g=b.shape[1],3===b.shape.length&&(h=b.shape[2],f=!0)):("radius"in b&&(c=g=b.radius),"width"in b&&(c=b.width),"height"in b&&(g=b.height),
"channels"in b&&(h=b.channels,f=!0));a.width=c|0;a.height=g|0;a.channels=h|0;c=!1;"format"in b&&(c=b.format,g=a.internalformat=X[c],a.format=Pa[g],c in V&&!("type"in b)&&(a.type=V[c]),c in T&&(a.compressed=!0),c=!0);!f&&c?a.channels=B[a.format]:f&&!c&&a.channels!==m[a.format]&&(a.format=a.internalformat=m[a.channels])}}function va(a){h.pixelStorei(37440,a.flipY);h.pixelStorei(37441,a.premultiplyAlpha);h.pixelStorei(37443,a.colorSpace);h.pixelStorei(3317,a.unpackAlignment)}function q(){D.call(this);
this.yOffset=this.xOffset=0;this.data=null;this.needsFree=!1;this.element=null;this.needsCopy=!1}function S(a,b){var h=null;r(b)?h=b:b&&(Y(a,b),"x"in b&&(a.xOffset=b.x|0),"y"in b&&(a.yOffset=b.y|0),r(b.data)&&(h=b.data));if(b.copy){var f=H.viewportWidth,n=H.viewportHeight;a.width=a.width||f-a.xOffset;a.height=a.height||n-a.yOffset;a.needsCopy=!0}else if(!h)a.width=a.width||1,a.height=a.height||1,a.channels=a.channels||4;else if(M(h))a.channels=a.channels||4,a.data=h,"type"in b||5121!==a.type||(a.type=
N[Object.prototype.toString.call(h)]|0);else if(l(h)){a.channels=a.channels||4;f=h;n=f.length;switch(a.type){case 5121:case 5123:case 5125:case 5126:n=y.allocType(a.type,n);n.set(f);a.data=n;break;case 36193:a.data=g(f)}a.alignment=1;a.needsFree=!0}else if(t(h)){f=h.data;Array.isArray(f)||5121!==a.type||(a.type=N[Object.prototype.toString.call(f)]|0);var n=h.shape,q=h.stride,p,F,d,v;3===n.length?(d=n[2],v=q[2]):v=d=1;p=n[0];F=n[1];n=q[0];q=q[1];a.alignment=1;a.width=p;a.height=F;a.channels=d;a.format=
a.internalformat=m[d];a.needsFree=!0;p=v;h=h.offset;d=a.width;v=a.height;F=a.channels;for(var u=y.allocType(36193===a.type?5126:a.type,d*v*F),B=0,A=0;A<v;++A)for(var D=0;D<d;++D)for(var ua=0;ua<F;++ua)u[B++]=f[n*D+q*A+p*ua+h];c(a,u)}else if("[object HTMLCanvasElement]"===x(h)||"[object CanvasRenderingContext2D]"===x(h))"[object HTMLCanvasElement]"===x(h)?a.element=h:a.element=h.canvas,a.width=a.element.width,a.height=a.element.height,a.channels=4;else if("[object HTMLImageElement]"===x(h))a.element=
h,a.width=h.naturalWidth,a.height=h.naturalHeight,a.channels=4;else if("[object HTMLVideoElement]"===x(h))a.element=h,a.width=h.videoWidth,a.height=h.videoHeight,a.channels=4;else if(k(h)){f=a.width||h[0].length;n=a.height||h.length;q=a.channels;q=E(h[0][0])?q||h[0][0].length:q||1;p=C.shape(h);d=1;for(v=0;v<p.length;++v)d*=p[v];d=y.allocType(36193===a.type?5126:a.type,d);C.flatten(h,p,"",d);c(a,d);a.alignment=1;a.width=f;a.height=n;a.channels=q;a.format=a.internalformat=m[q];a.needsFree=!0}}function ma(a,
b,c,g,f){var k=a.element,l=a.data,m=a.internalformat,d=a.format,r=a.type,n=a.width,q=a.height;va(a);k?h.texSubImage2D(b,f,c,g,d,r,k):a.compressed?h.compressedTexSubImage2D(b,f,c,g,m,n,q,l):a.needsCopy?(u(),h.copyTexSubImage2D(b,f,c,g,a.xOffset,a.yOffset,n,q)):h.texSubImage2D(b,f,c,g,n,q,d,r,l)}function ga(){return Na.pop()||new q}function W(a){a.needsFree&&y.freeType(a.data);q.call(a);Na.push(a)}function R(){D.call(this);this.genMipmaps=!1;this.mipmapHint=4352;this.mipmask=0;this.images=Array(16)}
function G(a,b,c){var g=a.images[0]=ga();a.mipmask=1;g.width=a.width=b;g.height=a.height=c;g.channels=a.channels=4}function ba(a,b){var c=null;if(r(b))c=a.images[0]=ga(),K(c,a),S(c,b),a.mipmask=1;else if(Y(a,b),Array.isArray(b.mipmap))for(var g=b.mipmap,h=0;h<g.length;++h)c=a.images[h]=ga(),K(c,a),c.width>>=h,c.height>>=h,S(c,g[h]),a.mipmask|=1<<h;else c=a.images[0]=ga(),K(c,a),S(c,b),a.mipmask=1;K(a,a.images[0])}function na(a,b){for(var c=a.images,g=0;g<c.length&&c[g];++g){var f=c[g],k=b,l=g,m=f.element,
d=f.data,r=f.internalformat,n=f.format,q=f.type,t=f.width,y=f.height;va(f);m?h.texImage2D(k,l,n,n,q,m):f.compressed?h.compressedTexImage2D(k,l,r,t,y,0,d):f.needsCopy?(u(),h.copyTexImage2D(k,l,n,f.xOffset,f.yOffset,t,y,0)):h.texImage2D(k,l,n,t,y,0,n,q,d)}}function ya(){var a=Ja.pop()||new R;D.call(a);for(var b=a.mipmask=0;16>b;++b)a.images[b]=null;return a}function U(a){for(var b=a.images,c=0;c<b.length;++c)b[c]&&W(b[c]),b[c]=null;Ja.push(a)}function ia(){this.magFilter=this.minFilter=9728;this.wrapT=
this.wrapS=33071;this.anisotropic=1;this.genMipmaps=!1;this.mipmapHint=4352}function ka(a,b){"min"in b&&(a.minFilter=Q[b.min],0<=n.indexOf(a.minFilter)&&(a.genMipmaps=!0));"mag"in b&&(a.magFilter=ha[b.mag]);var c=a.wrapS,g=a.wrapT;if("wrap"in b){var h=b.wrap;"string"===typeof h?c=g=O[h]:Array.isArray(h)&&(c=O[h[0]],g=O[h[1]])}else"wrapS"in b&&(c=O[b.wrapS]),"wrapT"in b&&(g=O[b.wrapT]);a.wrapS=c;a.wrapT=g;"anisotropic"in b&&(a.anisotropic=b.anisotropic);if("mipmap"in b){c=!1;switch(typeof b.mipmap){case "string":a.mipmapHint=
ea[b.mipmap];c=a.genMipmaps=!0;break;case "boolean":c=a.genMipmaps=b.mipmap;break;case "object":a.genMipmaps=!1,c=!0}!c||"min"in b||(a.minFilter=9984)}}function ra(a,b){h.texParameteri(b,10241,a.minFilter);h.texParameteri(b,10240,a.magFilter);h.texParameteri(b,10242,a.wrapS);h.texParameteri(b,10243,a.wrapT);f.ext_texture_filter_anisotropic&&h.texParameteri(b,34046,a.anisotropic);a.genMipmaps&&(h.hint(33170,a.mipmapHint),h.generateMipmap(b))}function sa(a){D.call(this);this.mipmask=0;this.internalformat=
6408;this.id=Ba++;this.refCount=1;this.target=a;this.texture=h.createTexture();this.unit=-1;this.bindCount=0;this.texInfo=new ia;Z.profile&&(this.stats={size:0})}function da(a){h.activeTexture(33984);h.bindTexture(a.target,a.texture)}function ja(){var a=oa[0];a?h.bindTexture(a.target,a.texture):h.bindTexture(3553,null)}function la(a){var b=a.texture,c=a.unit,g=a.target;0<=c&&(h.activeTexture(33984+c),h.bindTexture(g,null),oa[c]=null);h.deleteTexture(b);a.texture=null;a.params=null;a.pixels=null;a.refCount=
0;delete ca[a.id];L.textureCount--}var ea={"don't care":4352,"dont care":4352,nice:4354,fast:4353},O={repeat:10497,clamp:33071,mirror:33648},ha={nearest:9728,linear:9729},Q=b({mipmap:9987,"nearest mipmap nearest":9984,"linear mipmap nearest":9985,"nearest mipmap linear":9986,"linear mipmap linear":9987},ha),pa={none:0,browser:37444},V={uint8:5121,rgba4:32819,rgb565:33635,"rgb5 a1":32820},X={alpha:6406,luminance:6409,"luminance alpha":6410,rgb:6407,rgba:6408,rgba4:32854,"rgb5 a1":32855,rgb565:36194},
T={};f.ext_srgb&&(X.srgb=35904,X.srgba=35906);f.oes_texture_float&&(V.float32=V["float"]=5126);f.oes_texture_half_float&&(V.float16=V["half float"]=36193);f.webgl_depth_texture&&(b(X,{depth:6402,"depth stencil":34041}),b(V,{uint16:5123,uint32:5125,"depth stencil":34042}));f.webgl_compressed_texture_s3tc&&b(T,{"rgb s3tc dxt1":33776,"rgba s3tc dxt1":33777,"rgba s3tc dxt3":33778,"rgba s3tc dxt5":33779});f.webgl_compressed_texture_atc&&b(T,{"rgb atc":35986,"rgba atc explicit alpha":35987,"rgba atc interpolated alpha":34798});
f.webgl_compressed_texture_pvrtc&&b(T,{"rgb pvrtc 4bppv1":35840,"rgb pvrtc 2bppv1":35841,"rgba pvrtc 4bppv1":35842,"rgba pvrtc 2bppv1":35843});f.webgl_compressed_texture_etc1&&(T["rgb etc1"]=36196);var ua=Array.prototype.slice.call(h.getParameter(34467));Object.keys(T).forEach(function(a){var b=T[a];0<=ua.indexOf(b)&&(X[a]=b)});var Ea=Object.keys(X);p.textureFormats=Ea;var Fa=[];Object.keys(X).forEach(function(a){Fa[X[a]]=a});var Ha=[];Object.keys(V).forEach(function(a){Ha[V[a]]=a});var Ia=[];Object.keys(ha).forEach(function(a){Ia[ha[a]]=
a});var Ca=[];Object.keys(Q).forEach(function(a){Ca[Q[a]]=a});var Da=[];Object.keys(O).forEach(function(a){Da[O[a]]=a});var Pa=Ea.reduce(function(a,b){var c=X[b];6409===c||6406===c||6409===c||6410===c||6402===c||34041===c?a[c]=c:32855===c||0<=b.indexOf("rgba")?a[c]=6408:a[c]=6407;return a},{}),Na=[],Ja=[],Ba=0,ca={},ta=p.maxTextureUnits,oa=Array(ta).map(function(){return null});b(sa.prototype,{bind:function(){this.bindCount+=1;var a=this.unit;if(0>a){for(var b=0;b<ta;++b){var c=oa[b];if(c){if(0<c.bindCount)continue;
c.unit=-1}oa[b]=this;a=b;break}Z.profile&&L.maxTextureUnits<a+1&&(L.maxTextureUnits=a+1);this.unit=a;h.activeTexture(33984+a);h.bindTexture(this.target,this.texture)}return a},unbind:function(){--this.bindCount},decRef:function(){0>=--this.refCount&&la(this)}});Z.profile&&(L.getTotalTextureSize=function(){var a=0;Object.keys(ca).forEach(function(b){a+=ca[b].stats.size});return a});return{create2D:function(b,c){function g(b,c){var e=f.texInfo;ia.call(e);var h=ya();"number"===typeof b?"number"===typeof c?
G(h,b|0,c|0):G(h,b|0,b|0):b?(ka(e,b),ba(h,b)):G(h,1,1);e.genMipmaps&&(h.mipmask=(h.width<<1)-1);f.mipmask=h.mipmask;K(f,h);f.internalformat=h.internalformat;g.width=h.width;g.height=h.height;da(f);na(h,3553);ra(e,3553);ja();U(h);Z.profile&&(f.stats.size=a(f.internalformat,f.type,h.width,h.height,e.genMipmaps,!1));g.format=Fa[f.internalformat];g.type=Ha[f.type];g.mag=Ia[e.magFilter];g.min=Ca[e.minFilter];g.wrapS=Da[e.wrapS];g.wrapT=Da[e.wrapT];return g}var f=new sa(3553);ca[f.id]=f;L.textureCount++;
g(b,c);g.subimage=function(a,b,c,e){b|=0;c|=0;e|=0;var d=ga();K(d,f);d.width=0;d.height=0;S(d,a);d.width=d.width||(f.width>>e)-b;d.height=d.height||(f.height>>e)-c;da(f);ma(d,3553,b,c,e);ja();W(d);return g};g.resize=function(b,c){var e=b|0,k=c|0||e;if(e===f.width&&k===f.height)return g;g.width=f.width=e;g.height=f.height=k;da(f);for(var d=0;f.mipmask>>d;++d)h.texImage2D(3553,d,f.format,e>>d,k>>d,0,f.format,f.type,null);ja();Z.profile&&(f.stats.size=a(f.internalformat,f.type,e,k,!1,!1));return g};
g._reglType="texture2d";g._texture=f;Z.profile&&(g.stats=f.stats);g.destroy=function(){f.decRef()};return g},createCube:function(b,c,g,f,k,l){function m(b,c,e,g,h,f){var k,l=n.texInfo;ia.call(l);for(k=0;6>k;++k)d[k]=ya();if("number"===typeof b||!b)for(b=b|0||1,k=0;6>k;++k)G(d[k],b,b);else if("object"===typeof b)if(c)ba(d[0],b),ba(d[1],c),ba(d[2],e),ba(d[3],g),ba(d[4],h),ba(d[5],f);else if(ka(l,b),Y(n,b),"faces"in b)for(b=b.faces,k=0;6>k;++k)K(d[k],n),ba(d[k],b[k]);else for(k=0;6>k;++k)ba(d[k],b);
K(n,d[0]);n.mipmask=l.genMipmaps?(d[0].width<<1)-1:d[0].mipmask;n.internalformat=d[0].internalformat;m.width=d[0].width;m.height=d[0].height;da(n);for(k=0;6>k;++k)na(d[k],34069+k);ra(l,34067);ja();Z.profile&&(n.stats.size=a(n.internalformat,n.type,m.width,m.height,l.genMipmaps,!0));m.format=Fa[n.internalformat];m.type=Ha[n.type];m.mag=Ia[l.magFilter];m.min=Ca[l.minFilter];m.wrapS=Da[l.wrapS];m.wrapT=Da[l.wrapT];for(k=0;6>k;++k)U(d[k]);return m}var n=new sa(34067);ca[n.id]=n;L.cubeCount++;var d=Array(6);
m(b,c,g,f,k,l);m.subimage=function(a,b,c,d,e){c|=0;d|=0;e|=0;var g=ga();K(g,n);g.width=0;g.height=0;S(g,b);g.width=g.width||(n.width>>e)-c;g.height=g.height||(n.height>>e)-d;da(n);ma(g,34069+a,c,d,e);ja();W(g);return m};m.resize=function(b){b|=0;if(b!==n.width){m.width=n.width=b;m.height=n.height=b;da(n);for(var c=0;6>c;++c)for(var d=0;n.mipmask>>d;++d)h.texImage2D(34069+c,d,n.format,b>>d,b>>d,0,n.format,n.type,null);ja();Z.profile&&(n.stats.size=a(n.internalformat,n.type,m.width,m.height,!1,!0));
return m}};m._reglType="textureCube";m._texture=n;Z.profile&&(m.stats=n.stats);m.destroy=function(){n.decRef()};return m},clear:function(){for(var a=0;a<ta;++a)h.activeTexture(33984+a),h.bindTexture(3553,null),oa[a]=null;F(ca).forEach(la);L.cubeCount=0;L.textureCount=0},getTexture:function(a){return null},restore:function(){F(ca).forEach(function(a){a.texture=h.createTexture();h.bindTexture(a.target,a.texture);for(var b=0;32>b;++b)if(0!==(a.mipmask&1<<b))if(3553===a.target)h.texImage2D(3553,b,a.internalformat,
a.width>>b,a.height>>b,0,a.internalformat,a.type,null);else for(var c=0;6>c;++c)h.texImage2D(34069+c,b,a.internalformat,a.width>>b,a.height>>b,0,a.internalformat,a.type,null);ra(a.texInfo,a.target)})}}}},{"./constants/arraytypes.json":3,"./util/extend":22,"./util/flatten":23,"./util/is-array-like":24,"./util/is-ndarray":25,"./util/is-typed-array":26,"./util/pool":28,"./util/to-half-float":30,"./util/values":31}],19:[function(f,p,u){p.exports=function(f,k){function p(){this.endQueryIndex=this.startQueryIndex=
-1;this.sum=0;this.stats=null}function r(a,b,c){var f=F.pop()||new p;f.startQueryIndex=a;f.endQueryIndex=b;f.sum=0;f.stats=c;u.push(f)}var c=k.ext_disjoint_timer_query;if(!c)return null;var a=[],b=[],F=[],u=[],t=[],y=[];return{beginQuery:function(g){var f=a.pop()||c.createQueryEXT();c.beginQueryEXT(35007,f);b.push(f);r(b.length-1,b.length,g)},endQuery:function(){c.endQueryEXT(35007)},pushScopeStats:r,update:function(){var g,f;g=b.length;if(0!==g){y.length=Math.max(y.length,g+1);t.length=Math.max(t.length,
g+1);t[0]=0;var k=y[0]=0;for(f=g=0;f<b.length;++f){var l=b[f];c.getQueryObjectEXT(l,34919)?(k+=c.getQueryObjectEXT(l,34918),a.push(l)):b[g++]=l;t[f+1]=k;y[f+1]=g}b.length=g;for(f=g=0;f<u.length;++f){var k=u[f],n=k.startQueryIndex,l=k.endQueryIndex;k.sum+=t[l]-t[n];n=y[n];l=y[l];l===n?(k.stats.gpuTime+=k.sum/1E6,F.push(k)):(k.startQueryIndex=n,k.endQueryIndex=l,u[g++]=k)}u.length=g}},getNumPendingQueries:function(){return b.length},clear:function(){a.push.apply(a,b);for(var g=0;g<a.length;g++)c.deleteQueryEXT(a[g]);
b.length=0;a.length=0},restore:function(){b.length=0;a.length=0}}}},{}],20:[function(f,p,u){p.exports="undefined"!==typeof performance&&performance.now?function(){return performance.now()}:function(){return+new Date}},{}],21:[function(f,p,u){function l(f){return Array.prototype.slice.call(f)}function k(f){return l(f).join("")}var x=f("./extend");p.exports=function(){function f(){var b=[],c=[];return x(function(){b.push.apply(b,l(arguments))},{def:function(){var f="v"+a++;c.push(f);0<arguments.length&&
(b.push(f,"="),b.push.apply(b,l(arguments)),b.push(";"));return f},toString:function(){return k([0<c.length?"var "+c+";":"",k(b)])}})}function c(){function a(f,k){c(f,k,"=",b.def(f,k),";")}var b=f(),c=f(),k=b.toString,t=c.toString;return x(function(){b.apply(b,l(arguments))},{def:b.def,entry:b,exit:c,save:a,set:function(c,f,k){a(c,f);b(c,f,"=",k,";")},toString:function(){return k()+t()}})}var a=0,b=[],p=[],u=f(),t={};return{global:u,link:function(c){for(var g=0;g<p.length;++g)if(p[g]===c)return b[g];
g="g"+a++;b.push(g);p.push(c);return g},block:f,proc:function(a,b){function f(){var a="a"+l.length;l.push(a);return a}var l=[];b=b||0;for(var r=0;r<b;++r)f();var r=c(),n=r.toString;return t[a]=x(r,{arg:f,toString:function(){return k(["function(",l.join(),"){",n(),"}"])}})},scope:c,cond:function(){var a=k(arguments),b=c(),f=c(),r=b.toString,t=f.toString;return x(b,{then:function(){b.apply(b,l(arguments));return this},"else":function(){f.apply(f,l(arguments));return this},toString:function(){var b=
t();b&&(b="else{"+b+"}");return k(["if(",a,"){",r(),"}",b])}})},compile:function(){var a=['"use strict";',u,"return {"];Object.keys(t).forEach(function(b){a.push('"',b,'":',t[b].toString(),",")});a.push("}");var c=k(a).replace(/;/g,";\n").replace(/}/g,"}\n").replace(/{/g,"{\n");return Function.apply(null,b.concat(c)).apply(null,p)}}}},{"./extend":22}],22:[function(f,p,u){p.exports=function(f,k){for(var p=Object.keys(k),r=0;r<p.length;++r)f[p[r]]=k[p[r]];return f}},{}],23:[function(f,p,u){function l(f,
c,a,b,k,l){for(var t=0;t<c;++t)for(var p=f[t],g=0;g<a;++g)for(var x=p[g],u=0;u<b;++u)k[l++]=x[u]}function k(f,c,a,b,p){for(var x=1,t=a+1;t<c.length;++t)x*=c[t];var y=c[a];if(4===c.length-a){var g=c[a+1],u=c[a+2];c=c[a+3];for(t=0;t<y;++t)l(f[t],g,u,c,b,p),p+=x}else for(t=0;t<y;++t)k(f[t],c,a+1,b,p),p+=x}var x=f("./pool");p.exports={shape:function(f){for(var c=[];f.length;f=f[0])c.push(f.length);return c},flatten:function(f,c,a,b){var p=1;if(c.length)for(var u=0;u<c.length;++u)p*=c[u];else p=0;a=b||
x.allocType(a,p);switch(c.length){case 0:break;case 1:b=c[0];for(c=0;c<b;++c)a[c]=f[c];break;case 2:b=c[0];c=c[1];for(u=p=0;u<b;++u)for(var t=f[u],y=0;y<c;++y)a[p++]=t[y];break;case 3:l(f,c[0],c[1],c[2],a,0);break;default:k(f,c,0,a,0)}return a}}},{"./pool":28}],24:[function(f,p,u){var l=f("./is-typed-array");p.exports=function(f){return Array.isArray(f)||l(f)}},{"./is-typed-array":26}],25:[function(f,p,u){var l=f("./is-typed-array");p.exports=function(f){return!!f&&"object"===typeof f&&Array.isArray(f.shape)&&
Array.isArray(f.stride)&&"number"===typeof f.offset&&f.shape.length===f.stride.length&&(Array.isArray(f.data)||l(f.data))}},{"./is-typed-array":26}],26:[function(f,p,u){var l=f("../constants/arraytypes.json");p.exports=function(f){return Object.prototype.toString.call(f)in l}},{"../constants/arraytypes.json":3}],27:[function(f,p,u){p.exports=function(f,k){for(var p=Array(f),r=0;r<f;++r)p[r]=k(r);return p}},{}],28:[function(f,p,u){function l(c){var a,b;a=(65535<c)<<4;c>>>=a;b=(255<c)<<3;c>>>=b;a|=
b;b=(15<c)<<2;c>>>=b;a|=b;b=(3<c)<<1;return a|b|c>>>b>>1}function k(c){a:{for(var a=16;268435456>=a;a*=16)if(c<=a){c=a;break a}c=0}a=r[l(c)>>2];return 0<a.length?a.pop():new ArrayBuffer(c)}function x(c){r[l(c.byteLength)>>2].push(c)}var r=f("./loop")(8,function(){return[]});p.exports={alloc:k,free:x,allocType:function(c,a){var b=null;switch(c){case 5120:b=new Int8Array(k(a),0,a);break;case 5121:b=new Uint8Array(k(a),0,a);break;case 5122:b=new Int16Array(k(2*a),0,a);break;case 5123:b=new Uint16Array(k(2*
a),0,a);break;case 5124:b=new Int32Array(k(4*a),0,a);break;case 5125:b=new Uint32Array(k(4*a),0,a);break;case 5126:b=new Float32Array(k(4*a),0,a);break;default:return null}return b.length!==a?b.subarray(0,a):b},freeType:function(c){x(c.buffer)}}},{"./loop":27}],29:[function(f,p,u){p.exports="function"===typeof requestAnimationFrame&&"function"===typeof cancelAnimationFrame?{next:function(f){return requestAnimationFrame(f)},cancel:function(f){return cancelAnimationFrame(f)}}:{next:function(f){return setTimeout(f,
16)},cancel:clearTimeout}},{}],30:[function(f,p,u){var l=f("./pool"),k=new Float32Array(1),x=new Uint32Array(k.buffer);p.exports=function(f){for(var c=l.allocType(5123,f.length),a=0;a<f.length;++a)if(isNaN(f[a]))c[a]=65535;else if(Infinity===f[a])c[a]=31744;else if(-Infinity===f[a])c[a]=64512;else{k[0]=f[a];var b=x[0],p=b>>>31<<15,u=(b<<1>>>24)-127,b=b>>13&1023;c[a]=-24>u?p:-14>u?p+(b+1024>>-14-u):15<u?p+31744:p+(u+15<<10)+b}return c}},{"./pool":28}],31:[function(f,p,u){p.exports=function(f){return Object.keys(f).map(function(k){return f[k]})}},
{}],32:[function(f,p,u){function l(a,b,f){function k(){var b=window.innerWidth,g=window.innerHeight;a!==document.body&&(g=a.getBoundingClientRect(),b=g.right-g.left,g=g.top-g.bottom);l.width=f*b;l.height=f*g;c(l.style,{width:b+"px",height:g+"px"})}var l=document.createElement("canvas");c(l.style,{border:0,margin:0,padding:0,top:0,left:0});a.appendChild(l);a===document.body&&(l.style.position="absolute",c(a.style,{margin:0,padding:0}));window.addEventListener("resize",k,!1);k();return{canvas:l,onDestroy:function(){window.removeEventListener("resize",
k);a.removeChild(l)}}}function k(a,b){function c(f){try{return a.getContext(f,b)}catch(k){return null}}return c("webgl")||c("experimental-webgl")||c("webgl-experimental")}function x(a){return"string"===typeof a?a.split():a}function r(a){return"string"===typeof a?document.querySelector(a):a}var c=f("./util/extend");p.exports=function(a){var b=a||{},c,f,p,u;a={};var g=[],E=[],C="undefined"===typeof window?1:window.devicePixelRatio,N=!1,n=function(a){},m=function(){};"string"===typeof b?c=document.querySelector(b):
"object"===typeof b&&("string"===typeof b.nodeName&&"function"===typeof b.appendChild&&"function"===typeof b.getBoundingClientRect?c=b:"function"===typeof b.drawArrays||"function"===typeof b.drawElements?(u=b,p=u.canvas):("gl"in b?u=b.gl:"canvas"in b?p=r(b.canvas):"container"in b&&(f=r(b.container)),"attributes"in b&&(a=b.attributes),"extensions"in b&&(g=x(b.extensions)),"optionalExtensions"in b&&(E=x(b.optionalExtensions)),"onDone"in b&&(n=b.onDone),"profile"in b&&(N=!!b.profile),"pixelRatio"in b&&
(C=+b.pixelRatio)));c&&("canvas"===c.nodeName.toLowerCase()?p=c:f=c);if(!u){if(!p){c=l(f||document.body,n,C);if(!c)return null;p=c.canvas;m=c.onDestroy}u=k(p,a)}return u?{gl:u,canvas:p,container:f,extensions:g,optionalExtensions:E,pixelRatio:C,profile:N,onDone:n,onDestroy:m}:(m(),n("webgl not supported, try upgrading your browser or graphics drivers http://get.webgl.org"),null)}},{"./util/extend":22}],33:[function(f,p,u){function l(a,b){for(var c=0;c<a.length;++c)if(a[c]===b)return c;return-1}var k=
f("./lib/util/extend"),x=f("./lib/dynamic"),r=f("./lib/util/raf"),c=f("./lib/util/clock"),a=f("./lib/strings"),b=f("./lib/webgl"),F=f("./lib/extension"),M=f("./lib/limits"),t=f("./lib/buffer"),y=f("./lib/elements"),g=f("./lib/texture"),E=f("./lib/renderbuffer"),C=f("./lib/framebuffer"),N=f("./lib/attribute"),n=f("./lib/shader"),m=f("./lib/read"),B=f("./lib/core"),Y=f("./lib/stats"),L=f("./lib/timer");p.exports=function(f){function h(){if(0===Q.length)G&&G.update(),T=null;else{T=r.next(h);K();for(var a=
Q.length-1;0<=a;--a){var b=Q[a];b&&b(U,null,0)}q.flush();G&&G.update()}}function p(){!T&&0<Q.length&&(T=r.next(h))}function u(){T&&(r.cancel(h),T=null)}function La(a){a.preventDefault();u();pa.forEach(function(a){a()})}function za(a){q.getError();ma.restore();sa.restore();ka.restore();da.restore();ja.restore();la.restore();G&&G.restore();ea.procs.refresh();p();V.forEach(function(a){a()})}function Ga(a){function b(a){var c={},f={};Object.keys(a).forEach(function(b){var g=a[b];x.isDynamic(g)?f[b]=x.unbox(g,
b):c[b]=g});return{dynamic:f,"static":c}}function c(a){for(;q.length<a;)q.push(null);return q}var f=b(a.context||{}),g=b(a.uniforms||{}),h=b(a.attributes||{}),l=b(function(a){function b(a){if(a in c){var f=c[a];delete c[a];Object.keys(f).forEach(function(b){c[a+"."+b]=f[b]})}}var c=k({},a);delete c.uniforms;delete c.attributes;delete c.context;"stencil"in c&&c.stencil.op&&(c.stencil.opBack=c.stencil.opFront=c.stencil.op,delete c.stencil.op);b("blend");b("depth");b("cull");b("stencil");b("polygonOffset");
b("scissor");b("sample");return c}(a));a={gpuTime:0,cpuTime:0,count:0};var f=ea.compile(l,h,g,f,a),m=f.draw,n=f.batch,p=f.scope,q=[];return k(function(a,b){var f;if("function"===typeof a)return p.call(this,null,a,0);if("function"===typeof b)if("number"===typeof a)for(f=0;f<a;++f)p.call(this,null,b,f);else if(Array.isArray(a))for(f=0;f<a.length;++f)p.call(this,a[f],b,f);else return p.call(this,a,b,0);else if("number"===typeof a){if(0<a)return n.call(this,c(a|0),a|0)}else if(Array.isArray(a)){if(a.length)return n.call(this,
a,a.length)}else return m.call(this,a)},{stats:a})}function Z(a){Q.push(a);p();return{cancel:function(){function b(){var a=l(Q,b);Q[a]=Q[Q.length-1];--Q.length;0>=Q.length&&u()}var c=l(Q,a);Q[c]=b}}}function D(){var a=O.viewport,b=O.scissor_box;a[0]=a[1]=b[0]=b[1]=0;U.viewportWidth=U.framebufferWidth=U.drawingBufferWidth=a[2]=b[2]=q.drawingBufferWidth;U.viewportHeight=U.framebufferHeight=U.drawingBufferHeight=a[3]=b[3]=q.drawingBufferHeight}function K(){U.tick+=1;U.time=va();D();ea.procs.poll()}function Aa(){D();
ea.procs.refresh();G&&G.update()}function va(){return(c()-ba)/1E3}f=b(f);if(!f)return null;var q=f.gl,S=q.getContextAttributes();q.isContextLost();var ma=F(q,f);if(!ma)return null;var ga=a(),W=Y(),R=ma.extensions,G=L(q,R),ba=c(),na=q.drawingBufferWidth,ya=q.drawingBufferHeight,U={tick:0,time:0,viewportWidth:na,viewportHeight:ya,framebufferWidth:na,framebufferHeight:ya,drawingBufferWidth:na,drawingBufferHeight:ya,pixelRatio:f.pixelRatio},ia=M(q,R),ka=t(q,W,f),ra=y(q,R,ka,W),na=N(q,R,ia,ka,ga),sa=n(q,
ga,W,f),da=g(q,R,ia,function(){ea.procs.poll()},U,W,f),ja=E(q,R,ia,W,f),la=C(q,R,ia,da,ja,W),ea=B(q,ga,R,ia,ka,ra,da,la,{},na,sa,{elements:null,primitive:4,count:-1,offset:0,instances:-1},U,G,f),ga=m(q,la,ea.procs.poll,U,S,R),O=ea.next,ha=q.canvas,Q=[],pa=[],V=[],X=[f.onDestroy],T=null;ha&&(ha.addEventListener("webglcontextlost",La,!1),ha.addEventListener("webglcontextrestored",za,!1));Aa();S=k(Ga,{clear:function(a){var b=0;ea.procs.poll();var c=a.color;c&&(q.clearColor(+c[0]||0,+c[1]||0,+c[2]||0,
+c[3]||0),b|=16384);"depth"in a&&(q.clearDepth(+a.depth),b|=256);"stencil"in a&&(q.clearStencil(a.stencil|0),b|=1024);q.clear(b)},prop:x.define.bind(null,1),context:x.define.bind(null,2),"this":x.define.bind(null,3),draw:Ga({}),buffer:function(a){return ka.create(a,34962,!1,!1)},elements:function(a){return ra.create(a,!1)},texture:da.create2D,cube:da.createCube,renderbuffer:ja.create,framebuffer:la.create,framebufferCube:la.createCube,attributes:S,frame:Z,on:function(a,b){var c;switch(a){case "frame":return Z(b);
case "lost":c=pa;break;case "restore":c=V;break;case "destroy":c=X}c.push(b);return{cancel:function(){for(var a=0;a<c.length;++a)if(c[a]===b){c[a]=c[c.length-1];c.pop();break}}}},limits:ia,hasExtension:function(a){return 0<=ia.extensions.indexOf(a.toLowerCase())},read:ga,destroy:function(){Q.length=0;u();ha&&(ha.removeEventListener("webglcontextlost",La),ha.removeEventListener("webglcontextrestored",za));sa.clear();la.clear();ja.clear();da.clear();ra.clear();ka.clear();G&&G.clear();X.forEach(function(a){a()})},
_gl:q,_refresh:Aa,poll:function(){K();G&&G.update()},now:va,stats:W});f.onDone(null,S);return S}},{"./lib/attribute":1,"./lib/buffer":2,"./lib/core":7,"./lib/dynamic":8,"./lib/elements":9,"./lib/extension":10,"./lib/framebuffer":11,"./lib/limits":12,"./lib/read":13,"./lib/renderbuffer":14,"./lib/shader":15,"./lib/stats":16,"./lib/strings":17,"./lib/texture":18,"./lib/timer":19,"./lib/util/clock":20,"./lib/util/extend":22,"./lib/util/raf":29,"./lib/webgl":32}]},{},[33])(33)});
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlZ2wuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbihPYSl7XCJvYmplY3RcIj09PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1PYSgpOlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLE9hKTooXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93OlwidW5kZWZpbmVkXCIhPT10eXBlb2YgZ2xvYmFsP2dsb2JhbDpcInVuZGVmaW5lZFwiIT09dHlwZW9mIHNlbGY/c2VsZjp0aGlzKS5jcmVhdGVSRUdMPU9hKCl9KShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBmKHAsdSxsKXtmdW5jdGlvbiBrKGMsYSl7aWYoIXVbY10pe2lmKCFwW2NdKXt2YXIgYj1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFhJiZiKXJldHVybiBiKGMsITApO2lmKHgpcmV0dXJuIHgoYywhMCk7Yj1FcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrYytcIidcIik7dGhyb3cgYi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGI7fWI9XG51W2NdPXtleHBvcnRzOnt9fTtwW2NdWzBdLmNhbGwoYi5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBiPXBbY11bMV1bYV07cmV0dXJuIGsoYj9iOmEpfSxiLGIuZXhwb3J0cyxmLHAsdSxsKX1yZXR1cm4gdVtjXS5leHBvcnRzfWZvcih2YXIgeD1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLHI9MDtyPGwubGVuZ3RoO3IrKylrKGxbcl0pO3JldHVybiBrfSh7MTpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoKXt0aGlzLnc9dGhpcy56PXRoaXMueT10aGlzLng9dGhpcy5zdGF0ZT0wO3RoaXMuYnVmZmVyPW51bGw7dGhpcy5zaXplPTA7dGhpcy5ub3JtYWxpemVkPSExO3RoaXMudHlwZT01MTI2O3RoaXMuZGl2aXNvcj10aGlzLnN0cmlkZT10aGlzLm9mZnNldD0wfXAuZXhwb3J0cz1mdW5jdGlvbihrLHgscixjLGEpe2s9ci5tYXhBdHRyaWJ1dGVzO3g9QXJyYXkoayk7Zm9yKHI9MDtyPGs7KytyKXhbcl09bmV3IGw7cmV0dXJue1JlY29yZDpsLHNjb3BlOnt9LHN0YXRlOnh9fX0sXG57fV0sMjpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoYyl7cmV0dXJuIHRbT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGMpXXwwfWZ1bmN0aW9uIGsoYyxhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoOysrYiljW2JdPWFbYl19ZnVuY3Rpb24geChjLGEsYixrLGwscix4KXtmb3IodmFyIGc9MCxoPTA7aDxiOysraClmb3IodmFyIGY9MDtmPGs7KytmKWNbZysrXT1hW2wqaCtyKmYreF19dmFyIHI9ZihcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiKSxjPWYoXCIuL3V0aWwvaXMtbmRhcnJheVwiKSxhPWYoXCIuL3V0aWwvdmFsdWVzXCIpLGI9ZihcIi4vdXRpbC9wb29sXCIpO3U9ZihcIi4vdXRpbC9mbGF0dGVuXCIpO3ZhciBGPXUuZmxhdHRlbixNPXUuc2hhcGUsdD1mKFwiLi9jb25zdGFudHMvYXJyYXl0eXBlcy5qc29uXCIpLHk9ZihcIi4vY29uc3RhbnRzL2R0eXBlcy5qc29uXCIpLGc9ZihcIi4vY29uc3RhbnRzL3VzYWdlLmpzb25cIiksRT1bXTtFWzUxMjBdPTE7RVs1MTIyXT0yO0VbNTEyNF09XG40O0VbNTEyMV09MTtFWzUxMjNdPTI7RVs1MTI1XT00O0VbNTEyNl09NDtwLmV4cG9ydHM9ZnVuY3Rpb24oZix0LG4pe2Z1bmN0aW9uIG0oYyl7dGhpcy5pZD1IKys7dGhpcy5idWZmZXI9Zi5jcmVhdGVCdWZmZXIoKTt0aGlzLnR5cGU9Yzt0aGlzLnVzYWdlPTM1MDQ0O3RoaXMuYnl0ZUxlbmd0aD0wO3RoaXMuZGltZW5zaW9uPTE7dGhpcy5kdHlwZT01MTIxO3RoaXMucGVyc2lzdGVudERhdGE9bnVsbDtuLnByb2ZpbGUmJih0aGlzLnN0YXRzPXtzaXplOjB9KX1mdW5jdGlvbiBCKGMsYSxiKXtjLmJ5dGVMZW5ndGg9YS5ieXRlTGVuZ3RoO2YuYnVmZmVyRGF0YShjLnR5cGUsYSxiKX1mdW5jdGlvbiBwKGEsaCxtLGYsZyxuKXthLnVzYWdlPW07aWYoQXJyYXkuaXNBcnJheShoKSl7aWYoYS5kdHlwZT1mfHw1MTI2LDA8aC5sZW5ndGgpaWYoQXJyYXkuaXNBcnJheShoWzBdKSl7Zz1NKGgpO2Zvcih2YXIgSz1mPTE7SzxnLmxlbmd0aDsrK0spZio9Z1tLXTthLmRpbWVuc2lvbj1mO2g9RihoLFxuZyxhLmR0eXBlKTtCKGEsaCxtKTtuP2EucGVyc2lzdGVudERhdGE9aDpiLmZyZWVUeXBlKGgpfWVsc2VcIm51bWJlclwiPT09dHlwZW9mIGhbMF0/KGEuZGltZW5zaW9uPWcsZz1iLmFsbG9jVHlwZShhLmR0eXBlLGgubGVuZ3RoKSxrKGcsaCksQihhLGcsbSksbj9hLnBlcnNpc3RlbnREYXRhPWc6Yi5mcmVlVHlwZShnKSk6cihoWzBdKSYmKGEuZGltZW5zaW9uPWhbMF0ubGVuZ3RoLGEuZHR5cGU9Znx8bChoWzBdKXx8NTEyNixoPUYoaCxbaC5sZW5ndGgsaFswXS5sZW5ndGhdLGEuZHR5cGUpLEIoYSxoLG0pLG4/YS5wZXJzaXN0ZW50RGF0YT1oOmIuZnJlZVR5cGUoaCkpfWVsc2UgaWYocihoKSlhLmR0eXBlPWZ8fGwoaCksYS5kaW1lbnNpb249ZyxCKGEsaCxtKSxuJiYoYS5wZXJzaXN0ZW50RGF0YT1uZXcgVWludDhBcnJheShuZXcgVWludDhBcnJheShoLmJ1ZmZlcikpKTtlbHNlIGlmKGMoaCkpe2c9aC5zaGFwZTt2YXIgQz1oLnN0cmlkZSxLPWgub2Zmc2V0LHk9MCxxPTAsUz0wLHQ9XG4wOzE9PT1nLmxlbmd0aD8oeT1nWzBdLHE9MSxTPUNbMF0sdD0wKToyPT09Zy5sZW5ndGgmJih5PWdbMF0scT1nWzFdLFM9Q1swXSx0PUNbMV0pO2EuZHR5cGU9Znx8bChoLmRhdGEpfHw1MTI2O2EuZGltZW5zaW9uPXE7Zz1iLmFsbG9jVHlwZShhLmR0eXBlLHkqcSk7eChnLGguZGF0YSx5LHEsUyx0LEspO0IoYSxnLG0pO24/YS5wZXJzaXN0ZW50RGF0YT1nOmIuZnJlZVR5cGUoZyl9fWZ1bmN0aW9uIEwoYyl7dC5idWZmZXJDb3VudC0tO2YuZGVsZXRlQnVmZmVyKGMuYnVmZmVyKTtjLmJ1ZmZlcj1udWxsO2RlbGV0ZSBoW2MuaWRdfXZhciBIPTAsaD17fTttLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKCl7Zi5iaW5kQnVmZmVyKHRoaXMudHlwZSx0aGlzLmJ1ZmZlcil9O20ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtMKHRoaXMpfTt2YXIgZmE9W107bi5wcm9maWxlJiYodC5nZXRUb3RhbEJ1ZmZlclNpemU9ZnVuY3Rpb24oKXt2YXIgYz0wO09iamVjdC5rZXlzKGgpLmZvckVhY2goZnVuY3Rpb24oYSl7Yys9XG5oW2FdLnN0YXRzLnNpemV9KTtyZXR1cm4gY30pO3JldHVybntjcmVhdGU6ZnVuY3Rpb24oYSxCLEgsZmEpe2Z1bmN0aW9uIHUoYSl7dmFyIGg9MzUwNDQsYj1udWxsLHE9MCxrPTAsbT0xO0FycmF5LmlzQXJyYXkoYSl8fHIoYSl8fGMoYSk/Yj1hOlwibnVtYmVyXCI9PT10eXBlb2YgYT9xPWF8MDphJiYoXCJkYXRhXCJpbiBhJiYoYj1hLmRhdGEpLFwidXNhZ2VcImluIGEmJihoPWdbYS51c2FnZV0pLFwidHlwZVwiaW4gYSYmKGs9eVthLnR5cGVdKSxcImRpbWVuc2lvblwiaW4gYSYmKG09YS5kaW1lbnNpb258MCksXCJsZW5ndGhcImluIGEmJihxPWEubGVuZ3RofDApKTtELmJpbmQoKTtiP3AoRCxiLGgsayxtLGZhKTooZi5idWZmZXJEYXRhKEQudHlwZSxxLGgpLEQuZHR5cGU9a3x8NTEyMSxELnVzYWdlPWgsRC5kaW1lbnNpb249bSxELmJ5dGVMZW5ndGg9cSk7bi5wcm9maWxlJiYoRC5zdGF0cy5zaXplPUQuYnl0ZUxlbmd0aCpFW0QuZHR5cGVdKTtyZXR1cm4gdX10LmJ1ZmZlckNvdW50Kys7dmFyIEQ9XG5uZXcgbShCKTtoW0QuaWRdPUQ7SHx8dShhKTt1Ll9yZWdsVHlwZT1cImJ1ZmZlclwiO3UuX2J1ZmZlcj1EO3Uuc3ViZGF0YT1mdW5jdGlvbihhLGgpe3ZhciBtPShofHwwKXwwLHE7RC5iaW5kKCk7aWYoQXJyYXkuaXNBcnJheShhKSl7aWYoMDxhLmxlbmd0aClpZihcIm51bWJlclwiPT09dHlwZW9mIGFbMF0pe3ZhciBnPWIuYWxsb2NUeXBlKEQuZHR5cGUsYS5sZW5ndGgpO2soZyxhKTtmLmJ1ZmZlclN1YkRhdGEoRC50eXBlLG0sZyk7Yi5mcmVlVHlwZShnKX1lbHNlIGlmKEFycmF5LmlzQXJyYXkoYVswXSl8fHIoYVswXSkpcT1NKGEpLGc9RihhLHEsRC5kdHlwZSksZi5idWZmZXJTdWJEYXRhKEQudHlwZSxtLGcpLGIuZnJlZVR5cGUoZyl9ZWxzZSBpZihyKGEpKWYuYnVmZmVyU3ViRGF0YShELnR5cGUsbSxhKTtlbHNlIGlmKGMoYSkpe3E9YS5zaGFwZTt2YXIgbj1hLnN0cmlkZSxCPWc9MCx5PTAsdD0wOzE9PT1xLmxlbmd0aD8oZz1xWzBdLEI9MSx5PW5bMF0sdD0wKToyPT09cS5sZW5ndGgmJlxuKGc9cVswXSxCPXFbMV0seT1uWzBdLHQ9blsxXSk7cT1BcnJheS5pc0FycmF5KGEuZGF0YSk/RC5kdHlwZTpsKGEuZGF0YSk7cT1iLmFsbG9jVHlwZShxLGcqQik7eChxLGEuZGF0YSxnLEIseSx0LGEub2Zmc2V0KTtmLmJ1ZmZlclN1YkRhdGEoRC50eXBlLG0scSk7Yi5mcmVlVHlwZShxKX1yZXR1cm4gdX07bi5wcm9maWxlJiYodS5zdGF0cz1ELnN0YXRzKTt1LmRlc3Ryb3k9ZnVuY3Rpb24oKXtMKEQpfTtyZXR1cm4gdX0sY3JlYXRlU3RyZWFtOmZ1bmN0aW9uKGEsYyl7dmFyIGg9ZmEucG9wKCk7aHx8KGg9bmV3IG0oYSkpO2guYmluZCgpO3AoaCxjLDM1MDQwLDAsMSwhMSk7cmV0dXJuIGh9LGRlc3Ryb3lTdHJlYW06ZnVuY3Rpb24oYSl7ZmEucHVzaChhKX0sY2xlYXI6ZnVuY3Rpb24oKXthKGgpLmZvckVhY2goTCk7ZmEuZm9yRWFjaChMKX0sZ2V0QnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLl9idWZmZXIgaW5zdGFuY2VvZiBtP2EuX2J1ZmZlcjpudWxsfSxyZXN0b3JlOmZ1bmN0aW9uKCl7YShoKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuYnVmZmVyPVxuZi5jcmVhdGVCdWZmZXIoKTtmLmJpbmRCdWZmZXIoYS50eXBlLGEuYnVmZmVyKTtmLmJ1ZmZlckRhdGEoYS50eXBlLGEucGVyc2lzdGVudERhdGF8fGEuYnl0ZUxlbmd0aCxhLnVzYWdlKX0pfSxfaW5pdEJ1ZmZlcjpwfX19LHtcIi4vY29uc3RhbnRzL2FycmF5dHlwZXMuanNvblwiOjMsXCIuL2NvbnN0YW50cy9kdHlwZXMuanNvblwiOjQsXCIuL2NvbnN0YW50cy91c2FnZS5qc29uXCI6NixcIi4vdXRpbC9mbGF0dGVuXCI6MjMsXCIuL3V0aWwvaXMtbmRhcnJheVwiOjI1LFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCI6MjYsXCIuL3V0aWwvcG9vbFwiOjI4LFwiLi91dGlsL3ZhbHVlc1wiOjMxfV0sMzpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz17XCJbb2JqZWN0IEludDhBcnJheV1cIjo1MTIwLFwiW29iamVjdCBJbnQxNkFycmF5XVwiOjUxMjIsXCJbb2JqZWN0IEludDMyQXJyYXldXCI6NTEyNCxcIltvYmplY3QgVWludDhBcnJheV1cIjo1MTIxLFwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV1cIjo1MTIxLFwiW29iamVjdCBVaW50MTZBcnJheV1cIjo1MTIzLFxuXCJbb2JqZWN0IFVpbnQzMkFycmF5XVwiOjUxMjUsXCJbb2JqZWN0IEZsb2F0MzJBcnJheV1cIjo1MTI2LFwiW29iamVjdCBGbG9hdDY0QXJyYXldXCI6NTEyMSxcIltvYmplY3QgQXJyYXlCdWZmZXJdXCI6NTEyMX19LHt9XSw0OltmdW5jdGlvbihmLHAsdSl7cC5leHBvcnRzPXtpbnQ4OjUxMjAsaW50MTY6NTEyMixpbnQzMjo1MTI0LHVpbnQ4OjUxMjEsdWludDE2OjUxMjMsdWludDMyOjUxMjUsXCJmbG9hdFwiOjUxMjYsZmxvYXQzMjo1MTI2fX0se31dLDU6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9e3BvaW50czowLHBvaW50OjAsbGluZXM6MSxsaW5lOjEsXCJsaW5lIGxvb3BcIjoyLFwibGluZSBzdHJpcFwiOjMsdHJpYW5nbGVzOjQsdHJpYW5nbGU6NCxcInRyaWFuZ2xlIHN0cmlwXCI6NSxcInRyaWFuZ2xlIGZhblwiOjZ9fSx7fV0sNjpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz17XCJzdGF0aWNcIjozNTA0NCxkeW5hbWljOjM1MDQ4LHN0cmVhbTozNTA0MH19LHt9XSw3OltmdW5jdGlvbihmLHAsdSl7ZnVuY3Rpb24gbChhKXtyZXR1cm4gQXJyYXkuaXNBcnJheShhKXx8XG5NKGEpfHx0KGEpfWZ1bmN0aW9uIGsoYSl7cmV0dXJuIGEuc29ydChmdW5jdGlvbihhLGMpe3JldHVyblwidmlld3BvcnRcIj09PWE/LTE6XCJ2aWV3cG9ydFwiPT09Yz8xOmE8Yz8tMToxfSl9ZnVuY3Rpb24geChhLGMsYixrKXt0aGlzLnRoaXNEZXA9YTt0aGlzLmNvbnRleHREZXA9Yzt0aGlzLnByb3BEZXA9Yjt0aGlzLmFwcGVuZD1rfWZ1bmN0aW9uIHIoYSl7cmV0dXJuIGEmJiEoYS50aGlzRGVwfHxhLmNvbnRleHREZXB8fGEucHJvcERlcCl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gbmV3IHgoITEsITEsITEsYSl9ZnVuY3Rpb24gYShhLGMpe3ZhciBiPWEudHlwZTtyZXR1cm4gMD09PWI/KGI9YS5kYXRhLmxlbmd0aCxuZXcgeCghMCwxPD1iLDI8PWIsYykpOjQ9PT1iPyhiPWEuZGF0YSxuZXcgeChiLnRoaXNEZXAsYi5jb250ZXh0RGVwLGIucHJvcERlcCxjKSk6bmV3IHgoMz09PWIsMj09PWIsMT09PWIsYyl9dmFyIGI9ZihcIi4vdXRpbC9jb2RlZ2VuXCIpLEY9ZihcIi4vdXRpbC9sb29wXCIpLFxuTT1mKFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCIpLHQ9ZihcIi4vdXRpbC9pcy1uZGFycmF5XCIpLHk9ZihcIi4vdXRpbC9pcy1hcnJheS1saWtlXCIpLGc9ZihcIi4vZHluYW1pY1wiKSxFPWYoXCIuL2NvbnN0YW50cy9wcmltaXRpdmVzLmpzb25cIiksQz1mKFwiLi9jb25zdGFudHMvZHR5cGVzLmpzb25cIiksTj1bXCJ4XCIsXCJ5XCIsXCJ6XCIsXCJ3XCJdLG49XCJibGVuZC5mdW5jIGJsZW5kLmVxdWF0aW9uIHN0ZW5jaWwuZnVuYyBzdGVuY2lsLm9wRnJvbnQgc3RlbmNpbC5vcEJhY2sgc2FtcGxlLmNvdmVyYWdlIHZpZXdwb3J0IHNjaXNzb3IuYm94IHBvbHlnb25PZmZzZXQub2Zmc2V0XCIuc3BsaXQoXCIgXCIpLG09ezA6MCwxOjEsemVybzowLG9uZToxLFwic3JjIGNvbG9yXCI6NzY4LFwib25lIG1pbnVzIHNyYyBjb2xvclwiOjc2OSxcInNyYyBhbHBoYVwiOjc3MCxcIm9uZSBtaW51cyBzcmMgYWxwaGFcIjo3NzEsXCJkc3QgY29sb3JcIjo3NzQsXCJvbmUgbWludXMgZHN0IGNvbG9yXCI6Nzc1LFwiZHN0IGFscGhhXCI6NzcyLFwib25lIG1pbnVzIGRzdCBhbHBoYVwiOjc3MyxcblwiY29uc3RhbnQgY29sb3JcIjozMjc2OSxcIm9uZSBtaW51cyBjb25zdGFudCBjb2xvclwiOjMyNzcwLFwiY29uc3RhbnQgYWxwaGFcIjozMjc3MSxcIm9uZSBtaW51cyBjb25zdGFudCBhbHBoYVwiOjMyNzcyLFwic3JjIGFscGhhIHNhdHVyYXRlXCI6Nzc2fSxCPXtuZXZlcjo1MTIsbGVzczo1MTMsXCI8XCI6NTEzLGVxdWFsOjUxNCxcIj1cIjo1MTQsXCI9PVwiOjUxNCxcIj09PVwiOjUxNCxsZXF1YWw6NTE1LFwiPD1cIjo1MTUsZ3JlYXRlcjo1MTYsXCI+XCI6NTE2LG5vdGVxdWFsOjUxNyxcIiE9XCI6NTE3LFwiIT09XCI6NTE3LGdlcXVhbDo1MTgsXCI+PVwiOjUxOCxhbHdheXM6NTE5fSxZPXswOjAsemVybzowLGtlZXA6NzY4MCxyZXBsYWNlOjc2ODEsaW5jcmVtZW50Ojc2ODIsZGVjcmVtZW50Ojc2ODMsXCJpbmNyZW1lbnQgd3JhcFwiOjM0MDU1LFwiZGVjcmVtZW50IHdyYXBcIjozNDA1NixpbnZlcnQ6NTM4Nn0sTD17Y3c6MjMwNCxjY3c6MjMwNX0sSD1uZXcgeCghMSwhMSwhMSxmdW5jdGlvbigpe30pO3AuZXhwb3J0cz1mdW5jdGlvbihoLFxuZix0LHAsTSx1LFosRCxLLEFhLHZhLHEsUyxtYSxnYSl7ZnVuY3Rpb24gVyhkKXtyZXR1cm4gZC5yZXBsYWNlKFwiLlwiLFwiX1wiKX1mdW5jdGlvbiBSKGQsYSxjKXt2YXIgYj1XKGQpO3cucHVzaChkKTt6W2JdPWVbYl09ISFjO3dhW2JdPWF9ZnVuY3Rpb24gRyhkLGEsYyl7dmFyIGI9VyhkKTt3LnB1c2goZCk7QXJyYXkuaXNBcnJheShjKT8oZVtiXT1jLnNsaWNlKCkseltiXT1jLnNsaWNlKCkpOmVbYl09eltiXT1jO3hhW2JdPWF9ZnVuY3Rpb24gYmEoKXt2YXIgZD1iKCksYT1kLmxpbmssYz1kLmdsb2JhbDtkLmlkPVJhKys7ZC5iYXRjaElkPVwiMFwiO3ZhciBoPWEoUWEpLEE9ZC5zaGFyZWQ9e3Byb3BzOlwiYTBcIn07T2JqZWN0LmtleXMoUWEpLmZvckVhY2goZnVuY3Rpb24oZCl7QVtkXT1jLmRlZihoLFwiLlwiLGQpfSk7dmFyIEo9ZC5uZXh0PXt9LFA9ZC5jdXJyZW50PXt9O09iamVjdC5rZXlzKHhhKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe0FycmF5LmlzQXJyYXkoZVtkXSkmJihKW2RdPWMuZGVmKEEubmV4dCxcblwiLlwiLGQpLFBbZF09Yy5kZWYoQS5jdXJyZW50LFwiLlwiLGQpKX0pO3ZhciBTYT1kLmNvbnN0YW50cz17fTtPYmplY3Qua2V5cyhNYSkuZm9yRWFjaChmdW5jdGlvbihkKXtTYVtkXT1jLmRlZihKU09OLnN0cmluZ2lmeShNYVtkXSkpfSk7ZC5pbnZva2U9ZnVuY3Rpb24oZSxJKXtzd2l0Y2goSS50eXBlKXtjYXNlIDA6dmFyIGM9W1widGhpc1wiLEEuY29udGV4dCxBLnByb3BzLGQuYmF0Y2hJZF07cmV0dXJuIGUuZGVmKGEoSS5kYXRhKSxcIi5jYWxsKFwiLGMuc2xpY2UoMCxNYXRoLm1heChJLmRhdGEubGVuZ3RoKzEsNCkpLFwiKVwiKTtjYXNlIDE6cmV0dXJuIGUuZGVmKEEucHJvcHMsSS5kYXRhKTtjYXNlIDI6cmV0dXJuIGUuZGVmKEEuY29udGV4dCxJLmRhdGEpO2Nhc2UgMzpyZXR1cm4gZS5kZWYoXCJ0aGlzXCIsSS5kYXRhKTtjYXNlIDQ6cmV0dXJuIEkuZGF0YS5hcHBlbmQoZCxlKSxJLmRhdGEucmVmfX07ZC5hdHRyaWJDYWNoZT17fTt2YXIgST17fTtkLnNjb3BlQXR0cmliPWZ1bmN0aW9uKGQpe2Q9XG5mLmlkKGQpO2lmKGQgaW4gSSlyZXR1cm4gSVtkXTt2YXIgZT1BYS5zY29wZVtkXTtlfHwoZT1BYS5zY29wZVtkXT1uZXcgQmEpO3JldHVybiBJW2RdPWEoZSl9O3JldHVybiBkfWZ1bmN0aW9uIG5hKGQpe3ZhciBlPWRbXCJzdGF0aWNcIl07ZD1kLmR5bmFtaWM7dmFyIGI7aWYoXCJwcm9maWxlXCJpbiBlKXt2YXIgaD0hIWUucHJvZmlsZTtiPWMoZnVuY3Rpb24oZCxlKXtyZXR1cm4gaH0pO2IuZW5hYmxlPWh9ZWxzZSBpZihcInByb2ZpbGVcImluIGQpe3ZhciBBPWQucHJvZmlsZTtiPWEoQSxmdW5jdGlvbihkLGUpe3JldHVybiBkLmludm9rZShlLEEpfSl9cmV0dXJuIGJ9ZnVuY3Rpb24geWEoZCxlKXt2YXIgYj1kW1wic3RhdGljXCJdLGg9ZC5keW5hbWljO2lmKFwiZnJhbWVidWZmZXJcImluIGIpe3ZhciBBPWIuZnJhbWVidWZmZXI7cmV0dXJuIEE/KEE9RC5nZXRGcmFtZWJ1ZmZlcihBKSxjKGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5saW5rKEEpLHY9ZC5zaGFyZWQ7ZS5zZXQodi5mcmFtZWJ1ZmZlcixcblwiLm5leHRcIixhKTt2PXYuY29udGV4dDtlLnNldCh2LFwiLmZyYW1lYnVmZmVyV2lkdGhcIixhK1wiLndpZHRoXCIpO2Uuc2V0KHYsXCIuZnJhbWVidWZmZXJIZWlnaHRcIixhK1wiLmhlaWdodFwiKTtyZXR1cm4gYX0pKTpjKGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5zaGFyZWQ7ZS5zZXQoYS5mcmFtZWJ1ZmZlcixcIi5uZXh0XCIsXCJudWxsXCIpO2E9YS5jb250ZXh0O2Uuc2V0KGEsXCIuZnJhbWVidWZmZXJXaWR0aFwiLGErXCIuZHJhd2luZ0J1ZmZlcldpZHRoXCIpO2Uuc2V0KGEsXCIuZnJhbWVidWZmZXJIZWlnaHRcIixhK1wiLmRyYXdpbmdCdWZmZXJIZWlnaHRcIik7cmV0dXJuXCJudWxsXCJ9KX1pZihcImZyYW1lYnVmZmVyXCJpbiBoKXt2YXIgSj1oLmZyYW1lYnVmZmVyO3JldHVybiBhKEosZnVuY3Rpb24oZCxlKXt2YXIgYT1kLmludm9rZShlLEopLHY9ZC5zaGFyZWQsYz12LmZyYW1lYnVmZmVyLGE9ZS5kZWYoYyxcIi5nZXRGcmFtZWJ1ZmZlcihcIixhLFwiKVwiKTtlLnNldChjLFwiLm5leHRcIixhKTt2PXYuY29udGV4dDtlLnNldCh2LFxuXCIuZnJhbWVidWZmZXJXaWR0aFwiLGErXCI/XCIrYStcIi53aWR0aDpcIit2K1wiLmRyYXdpbmdCdWZmZXJXaWR0aFwiKTtlLnNldCh2LFwiLmZyYW1lYnVmZmVySGVpZ2h0XCIsYStcIj9cIithK1wiLmhlaWdodDpcIit2K1wiLmRyYXdpbmdCdWZmZXJIZWlnaHRcIik7cmV0dXJuIGF9KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBVKGQsZSxjKXtmdW5jdGlvbiBiKGQpe2lmKGQgaW4gaCl7dmFyIEk9aFtkXTtkPSEwO3ZhciBjPUkueHwwLHFhPUkueXwwLFAsYWE7XCJ3aWR0aFwiaW4gST9QPUkud2lkdGh8MDpkPSExO1wiaGVpZ2h0XCJpbiBJP2FhPUkuaGVpZ2h0fDA6ZD0hMTtyZXR1cm4gbmV3IHgoIWQmJmUmJmUudGhpc0RlcCwhZCYmZSYmZS5jb250ZXh0RGVwLCFkJiZlJiZlLnByb3BEZXAsZnVuY3Rpb24oZCxlKXt2YXIgYT1kLnNoYXJlZC5jb250ZXh0LHY9UDtcIndpZHRoXCJpbiBJfHwodj1lLmRlZihhLFwiLlwiLFwiZnJhbWVidWZmZXJXaWR0aFwiLFwiLVwiLGMpKTt2YXIgYj1hYTtcImhlaWdodFwiaW4gSXx8KGI9ZS5kZWYoYSxcblwiLlwiLFwiZnJhbWVidWZmZXJIZWlnaHRcIixcIi1cIixxYSkpO3JldHVybltjLHFhLHYsYl19KX1pZihkIGluIEope3ZhciB3PUpbZF07ZD1hKHcsZnVuY3Rpb24oZCxlKXt2YXIgYT1kLmludm9rZShlLHcpLEk9ZC5zaGFyZWQuY29udGV4dCxjPWUuZGVmKGEsXCIueHwwXCIpLHY9ZS5kZWYoYSxcIi55fDBcIikscWE9ZS5kZWYoJ1wid2lkdGhcIiBpbiAnLGEsXCI/XCIsYSxcIi53aWR0aHwwOlwiLFwiKFwiLEksXCIuXCIsXCJmcmFtZWJ1ZmZlcldpZHRoXCIsXCItXCIsYyxcIilcIiksYT1lLmRlZignXCJoZWlnaHRcIiBpbiAnLGEsXCI/XCIsYSxcIi5oZWlnaHR8MDpcIixcIihcIixJLFwiLlwiLFwiZnJhbWVidWZmZXJIZWlnaHRcIixcIi1cIix2LFwiKVwiKTtyZXR1cm5bYyx2LHFhLGFdfSk7ZSYmKGQudGhpc0RlcD1kLnRoaXNEZXB8fGUudGhpc0RlcCxkLmNvbnRleHREZXA9ZC5jb250ZXh0RGVwfHxlLmNvbnRleHREZXAsZC5wcm9wRGVwPWQucHJvcERlcHx8ZS5wcm9wRGVwKTtyZXR1cm4gZH1yZXR1cm4gZT9uZXcgeChlLnRoaXNEZXAsZS5jb250ZXh0RGVwLFxuZS5wcm9wRGVwLGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5zaGFyZWQuY29udGV4dDtyZXR1cm5bMCwwLGUuZGVmKGEsXCIuXCIsXCJmcmFtZWJ1ZmZlcldpZHRoXCIpLGUuZGVmKGEsXCIuXCIsXCJmcmFtZWJ1ZmZlckhlaWdodFwiKV19KTpudWxsfXZhciBoPWRbXCJzdGF0aWNcIl0sSj1kLmR5bmFtaWM7aWYoZD1iKFwidmlld3BvcnRcIikpe3ZhciBQPWQ7ZD1uZXcgeChkLnRoaXNEZXAsZC5jb250ZXh0RGVwLGQucHJvcERlcCxmdW5jdGlvbihkLGUpe3ZhciBhPVAuYXBwZW5kKGQsZSksYz1kLnNoYXJlZC5jb250ZXh0O2Uuc2V0KGMsXCIudmlld3BvcnRXaWR0aFwiLGFbMl0pO2Uuc2V0KGMsXCIudmlld3BvcnRIZWlnaHRcIixhWzNdKTtyZXR1cm4gYX0pfXJldHVybnt2aWV3cG9ydDpkLHNjaXNzb3JfYm94OmIoXCJzY2lzc29yLmJveFwiKX19ZnVuY3Rpb24gaWEoZCl7ZnVuY3Rpb24gZShkKXtpZihkIGluIGIpe3ZhciBJPWYuaWQoYltkXSk7ZD1jKGZ1bmN0aW9uKCl7cmV0dXJuIEl9KTtkLmlkPUk7cmV0dXJuIGR9aWYoZCBpblxuaCl7dmFyIHY9aFtkXTtyZXR1cm4gYSh2LGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5pbnZva2UoZSx2KTtyZXR1cm4gZS5kZWYoZC5zaGFyZWQuc3RyaW5ncyxcIi5pZChcIixhLFwiKVwiKX0pfXJldHVybiBudWxsfXZhciBiPWRbXCJzdGF0aWNcIl0saD1kLmR5bmFtaWMsQT1lKFwiZnJhZ1wiKSxKPWUoXCJ2ZXJ0XCIpLFA9bnVsbDtyKEEpJiZyKEopPyhQPXZhLnByb2dyYW0oSi5pZCxBLmlkKSxkPWMoZnVuY3Rpb24oZCxlKXtyZXR1cm4gZC5saW5rKFApfSkpOmQ9bmV3IHgoQSYmQS50aGlzRGVwfHxKJiZKLnRoaXNEZXAsQSYmQS5jb250ZXh0RGVwfHxKJiZKLmNvbnRleHREZXAsQSYmQS5wcm9wRGVwfHxKJiZKLnByb3BEZXAsZnVuY3Rpb24oZCxlKXt2YXIgYT1kLnNoYXJlZC5zaGFkZXIsYztjPUE/QS5hcHBlbmQoZCxlKTplLmRlZihhLFwiLlwiLFwiZnJhZ1wiKTt2YXIgdjt2PUo/Si5hcHBlbmQoZCxlKTplLmRlZihhLFwiLlwiLFwidmVydFwiKTtyZXR1cm4gZS5kZWYoYStcIi5wcm9ncmFtKFwiK3YrXCIsXCIrYytcblwiKVwiKX0pO3JldHVybntmcmFnOkEsdmVydDpKLHByb2dWYXI6ZCxwcm9ncmFtOlB9fWZ1bmN0aW9uIGthKGQsZSl7ZnVuY3Rpb24gYihkLGUpe2lmKGQgaW4gaCl7dmFyIHY9aFtkXXwwO3JldHVybiBjKGZ1bmN0aW9uKGQsYSl7ZSYmKGQuT0ZGU0VUPXYpO3JldHVybiB2fSl9aWYoZCBpbiBBKXt2YXIgcWE9QVtkXTtyZXR1cm4gYShxYSxmdW5jdGlvbihkLGEpe3ZhciBjPWQuaW52b2tlKGEscWEpO2UmJihkLk9GRlNFVD1jKTtyZXR1cm4gY30pfXJldHVybiBlJiZKP2MoZnVuY3Rpb24oZCxlKXtkLk9GRlNFVD1cIjBcIjtyZXR1cm4gMH0pOm51bGx9dmFyIGg9ZFtcInN0YXRpY1wiXSxBPWQuZHluYW1pYyxKPWZ1bmN0aW9uKCl7aWYoXCJlbGVtZW50c1wiaW4gaCl7dmFyIGQ9aC5lbGVtZW50cztsKGQpP2Q9dS5nZXRFbGVtZW50cyh1LmNyZWF0ZShkLCEwKSk6ZCYmKGQ9dS5nZXRFbGVtZW50cyhkKSk7dmFyIGU9YyhmdW5jdGlvbihlLGEpe2lmKGQpe3ZhciBjPWUubGluayhkKTtyZXR1cm4gZS5FTEVNRU5UUz1cbmN9cmV0dXJuIGUuRUxFTUVOVFM9bnVsbH0pO2UudmFsdWU9ZDtyZXR1cm4gZX1pZihcImVsZW1lbnRzXCJpbiBBKXt2YXIgdj1BLmVsZW1lbnRzO3JldHVybiBhKHYsZnVuY3Rpb24oZCxlKXt2YXIgYT1kLnNoYXJlZCxjPWEuaXNCdWZmZXJBcmdzLGE9YS5lbGVtZW50cyxJPWQuaW52b2tlKGUsdiksYj1lLmRlZihcIm51bGxcIiksYz1lLmRlZihjLFwiKFwiLEksXCIpXCIpLEk9ZC5jb25kKGMpLnRoZW4oYixcIj1cIixhLFwiLmNyZWF0ZVN0cmVhbShcIixJLFwiKTtcIilbXCJlbHNlXCJdKGIsXCI9XCIsYSxcIi5nZXRFbGVtZW50cyhcIixJLFwiKTtcIik7ZS5lbnRyeShJKTtlLmV4aXQoZC5jb25kKGMpLnRoZW4oYSxcIi5kZXN0cm95U3RyZWFtKFwiLGIsXCIpO1wiKSk7cmV0dXJuIGQuRUxFTUVOVFM9Yn0pfXJldHVybiBudWxsfSgpLFA9YihcIm9mZnNldFwiLCEwKTtyZXR1cm57ZWxlbWVudHM6SixwcmltaXRpdmU6ZnVuY3Rpb24oKXtpZihcInByaW1pdGl2ZVwiaW4gaCl7dmFyIGQ9aC5wcmltaXRpdmU7cmV0dXJuIGMoZnVuY3Rpb24oZSxcbmEpe3JldHVybiBFW2RdfSl9aWYoXCJwcmltaXRpdmVcImluIEEpe3ZhciBlPUEucHJpbWl0aXZlO3JldHVybiBhKGUsZnVuY3Rpb24oZCxhKXt2YXIgYz1kLmNvbnN0YW50cy5wcmltVHlwZXMsdj1kLmludm9rZShhLGUpO3JldHVybiBhLmRlZihjLFwiW1wiLHYsXCJdXCIpfSl9cmV0dXJuIEo/cihKKT9KLnZhbHVlP2MoZnVuY3Rpb24oZCxlKXtyZXR1cm4gZS5kZWYoZC5FTEVNRU5UUyxcIi5wcmltVHlwZVwiKX0pOmMoZnVuY3Rpb24oKXtyZXR1cm4gNH0pOm5ldyB4KEoudGhpc0RlcCxKLmNvbnRleHREZXAsSi5wcm9wRGVwLGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5FTEVNRU5UUztyZXR1cm4gZS5kZWYoYSxcIj9cIixhLFwiLnByaW1UeXBlOlwiLDQpfSk6bnVsbH0oKSxjb3VudDpmdW5jdGlvbigpe2lmKFwiY291bnRcImluIGgpe3ZhciBkPWguY291bnR8MDtyZXR1cm4gYyhmdW5jdGlvbigpe3JldHVybiBkfSl9aWYoXCJjb3VudFwiaW4gQSl7dmFyIGU9QS5jb3VudDtyZXR1cm4gYShlLGZ1bmN0aW9uKGQsXG5hKXtyZXR1cm4gZC5pbnZva2UoYSxlKX0pfXJldHVybiBKP3IoSik/Sj9QP25ldyB4KFAudGhpc0RlcCxQLmNvbnRleHREZXAsUC5wcm9wRGVwLGZ1bmN0aW9uKGQsZSl7cmV0dXJuIGUuZGVmKGQuRUxFTUVOVFMsXCIudmVydENvdW50LVwiLGQuT0ZGU0VUKX0pOmMoZnVuY3Rpb24oZCxlKXtyZXR1cm4gZS5kZWYoZC5FTEVNRU5UUyxcIi52ZXJ0Q291bnRcIil9KTpjKGZ1bmN0aW9uKCl7cmV0dXJuLTF9KTpuZXcgeChKLnRoaXNEZXB8fFAudGhpc0RlcCxKLmNvbnRleHREZXB8fFAuY29udGV4dERlcCxKLnByb3BEZXB8fFAucHJvcERlcCxmdW5jdGlvbihkLGUpe3ZhciBhPWQuRUxFTUVOVFM7cmV0dXJuIGQuT0ZGU0VUP2UuZGVmKGEsXCI/XCIsYSxcIi52ZXJ0Q291bnQtXCIsZC5PRkZTRVQsXCI6LTFcIik6ZS5kZWYoYSxcIj9cIixhLFwiLnZlcnRDb3VudDotMVwiKX0pOm51bGx9KCksaW5zdGFuY2VzOmIoXCJpbnN0YW5jZXNcIiwhMSksb2Zmc2V0OlB9fWZ1bmN0aW9uIHJhKGQsZSl7dmFyIGI9ZFtcInN0YXRpY1wiXSxcbmg9ZC5keW5hbWljLEE9e307dy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGUoSSx3KXtpZihkIGluIGIpe3ZhciBxYT1JKGJbZF0pO0Fbdl09YyhmdW5jdGlvbigpe3JldHVybiBxYX0pfWVsc2UgaWYoZCBpbiBoKXt2YXIgUD1oW2RdO0Fbdl09YShQLGZ1bmN0aW9uKGQsZSl7cmV0dXJuIHcoZCxlLGQuaW52b2tlKGUsUCkpfSl9fXZhciB2PVcoZCk7c3dpdGNoKGQpe2Nhc2UgXCJjdWxsLmVuYWJsZVwiOmNhc2UgXCJibGVuZC5lbmFibGVcIjpjYXNlIFwiZGl0aGVyXCI6Y2FzZSBcInN0ZW5jaWwuZW5hYmxlXCI6Y2FzZSBcImRlcHRoLmVuYWJsZVwiOmNhc2UgXCJzY2lzc29yLmVuYWJsZVwiOmNhc2UgXCJwb2x5Z29uT2Zmc2V0LmVuYWJsZVwiOmNhc2UgXCJzYW1wbGUuYWxwaGFcIjpjYXNlIFwic2FtcGxlLmVuYWJsZVwiOmNhc2UgXCJkZXB0aC5tYXNrXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuIGR9LGZ1bmN0aW9uKGQsZSxhKXtyZXR1cm4gYX0pO2Nhc2UgXCJkZXB0aC5mdW5jXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuIEJbZF19LFxuZnVuY3Rpb24oZCxlLGEpe3JldHVybiBlLmRlZihkLmNvbnN0YW50cy5jb21wYXJlRnVuY3MsXCJbXCIsYSxcIl1cIil9KTtjYXNlIFwiZGVwdGgucmFuZ2VcIjpyZXR1cm4gZShmdW5jdGlvbihkKXtyZXR1cm4gZH0sZnVuY3Rpb24oZCxlLGEpe2Q9ZS5kZWYoXCIrXCIsYSxcIlswXVwiKTtlPWUuZGVmKFwiK1wiLGEsXCJbMV1cIik7cmV0dXJuW2QsZV19KTtjYXNlIFwiYmxlbmQuZnVuY1wiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3JldHVyblttW1wic3JjUkdCXCJpbiBkP2Quc3JjUkdCOmQuc3JjXSxtW1wiZHN0UkdCXCJpbiBkP2QuZHN0UkdCOmQuZHN0XSxtW1wic3JjQWxwaGFcImluIGQ/ZC5zcmNBbHBoYTpkLnNyY10sbVtcImRzdEFscGhhXCJpbiBkP2QuZHN0QWxwaGE6ZC5kc3RdXX0sZnVuY3Rpb24oZCxlLGEpe2Z1bmN0aW9uIGMoZCx2KXtyZXR1cm4gZS5kZWYoJ1wiJyxkLHYsJ1wiIGluICcsYSxcIj9cIixhLFwiLlwiLGQsdixcIjpcIixhLFwiLlwiLGQpfWQ9ZC5jb25zdGFudHMuYmxlbmRGdW5jczt2YXIgdj1jKFwic3JjXCIsXCJSR0JcIiksXG5iPWMoXCJkc3RcIixcIlJHQlwiKSx2PWUuZGVmKGQsXCJbXCIsdixcIl1cIiksaD1lLmRlZihkLFwiW1wiLGMoXCJzcmNcIixcIkFscGhhXCIpLFwiXVwiKSxiPWUuZGVmKGQsXCJbXCIsYixcIl1cIik7ZD1lLmRlZihkLFwiW1wiLGMoXCJkc3RcIixcIkFscGhhXCIpLFwiXVwiKTtyZXR1cm5bdixiLGgsZF19KTtjYXNlIFwiYmxlbmQuZXF1YXRpb25cIjpyZXR1cm4gZShmdW5jdGlvbihkKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGQpcmV0dXJuW2NhW2RdLGNhW2RdXTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGQpcmV0dXJuW2NhW2QucmdiXSxjYVtkLmFscGhhXV19LGZ1bmN0aW9uKGQsZSxhKXt2YXIgYz1kLmNvbnN0YW50cy5ibGVuZEVxdWF0aW9ucyx2PWUuZGVmKCksYj1lLmRlZigpO2Q9ZC5jb25kKFwidHlwZW9mIFwiLGEsJz09PVwic3RyaW5nXCInKTtkLnRoZW4odixcIj1cIixiLFwiPVwiLGMsXCJbXCIsYSxcIl07XCIpO2RbXCJlbHNlXCJdKHYsXCI9XCIsYyxcIltcIixhLFwiLnJnYl07XCIsYixcIj1cIixjLFwiW1wiLGEsXCIuYWxwaGFdO1wiKTtlKGQpO3JldHVyblt2LGJdfSk7XG5jYXNlIFwiYmxlbmQuY29sb3JcIjpyZXR1cm4gZShmdW5jdGlvbihkKXtyZXR1cm4gRig0LGZ1bmN0aW9uKGUpe3JldHVybitkW2VdfSl9LGZ1bmN0aW9uKGQsZSxhKXtyZXR1cm4gRig0LGZ1bmN0aW9uKGQpe3JldHVybiBlLmRlZihcIitcIixhLFwiW1wiLGQsXCJdXCIpfSl9KTtjYXNlIFwic3RlbmNpbC5tYXNrXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuIGR8MH0sZnVuY3Rpb24oZCxlLGEpe3JldHVybiBlLmRlZihhLFwifDBcIil9KTtjYXNlIFwic3RlbmNpbC5mdW5jXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuW0JbZC5jbXB8fFwia2VlcFwiXSxkLnJlZnx8MCxcIm1hc2tcImluIGQ/ZC5tYXNrOi0xXX0sZnVuY3Rpb24oZCxlLGEpe2Q9ZS5kZWYoJ1wiY21wXCIgaW4gJyxhLFwiP1wiLGQuY29uc3RhbnRzLmNvbXBhcmVGdW5jcyxcIltcIixhLFwiLmNtcF1cIixcIjpcIiw3NjgwKTt2YXIgYz1lLmRlZihhLFwiLnJlZnwwXCIpO2U9ZS5kZWYoJ1wibWFza1wiIGluICcsYSxcIj9cIixhLFwiLm1hc2t8MDotMVwiKTtyZXR1cm5bZCxcbmMsZV19KTtjYXNlIFwic3RlbmNpbC5vcEZyb250XCI6Y2FzZSBcInN0ZW5jaWwub3BCYWNrXCI6cmV0dXJuIGUoZnVuY3Rpb24oZSl7cmV0dXJuW1wic3RlbmNpbC5vcEJhY2tcIj09PWQ/MTAyOToxMDI4LFlbZS5mYWlsfHxcImtlZXBcIl0sWVtlLnpmYWlsfHxcImtlZXBcIl0sWVtlLnpwYXNzfHxcImtlZXBcIl1dfSxmdW5jdGlvbihlLGEsYyl7ZnVuY3Rpb24gdihkKXtyZXR1cm4gYS5kZWYoJ1wiJyxkLCdcIiBpbiAnLGMsXCI/XCIsYixcIltcIixjLFwiLlwiLGQsXCJdOlwiLDc2ODApfXZhciBiPWUuY29uc3RhbnRzLnN0ZW5jaWxPcHM7cmV0dXJuW1wic3RlbmNpbC5vcEJhY2tcIj09PWQ/MTAyOToxMDI4LHYoXCJmYWlsXCIpLHYoXCJ6ZmFpbFwiKSx2KFwienBhc3NcIildfSk7Y2FzZSBcInBvbHlnb25PZmZzZXQub2Zmc2V0XCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuW2QuZmFjdG9yfDAsZC51bml0c3wwXX0sZnVuY3Rpb24oZCxlLGEpe2Q9ZS5kZWYoYSxcIi5mYWN0b3J8MFwiKTtlPWUuZGVmKGEsXCIudW5pdHN8MFwiKTtyZXR1cm5bZCxcbmVdfSk7Y2FzZSBcImN1bGwuZmFjZVwiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3ZhciBlPTA7XCJmcm9udFwiPT09ZD9lPTEwMjg6XCJiYWNrXCI9PT1kJiYoZT0xMDI5KTtyZXR1cm4gZX0sZnVuY3Rpb24oZCxlLGEpe3JldHVybiBlLmRlZihhLCc9PT1cImZyb250XCI/JywxMDI4LFwiOlwiLDEwMjkpfSk7Y2FzZSBcImxpbmVXaWR0aFwiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3JldHVybiBkfSxmdW5jdGlvbihkLGUsYSl7cmV0dXJuIGF9KTtjYXNlIFwiZnJvbnRGYWNlXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuIExbZF19LGZ1bmN0aW9uKGQsZSxhKXtyZXR1cm4gZS5kZWYoYSsnPT09XCJjd1wiPzIzMDQ6MjMwNScpfSk7Y2FzZSBcImNvbG9yTWFza1wiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3JldHVybiBkLm1hcChmdW5jdGlvbihkKXtyZXR1cm4hIWR9KX0sZnVuY3Rpb24oZCxlLGEpe3JldHVybiBGKDQsZnVuY3Rpb24oZCl7cmV0dXJuXCIhIVwiK2ErXCJbXCIrZCtcIl1cIn0pfSk7Y2FzZSBcInNhbXBsZS5jb3ZlcmFnZVwiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3JldHVybltcInZhbHVlXCJpblxuZD9kLnZhbHVlOjEsISFkLmludmVydF19LGZ1bmN0aW9uKGQsZSxhKXtkPWUuZGVmKCdcInZhbHVlXCIgaW4gJyxhLFwiPytcIixhLFwiLnZhbHVlOjFcIik7ZT1lLmRlZihcIiEhXCIsYSxcIi5pbnZlcnRcIik7cmV0dXJuW2QsZV19KX19KTtyZXR1cm4gQX1mdW5jdGlvbiBzYShkLGUpe3ZhciBiPWRbXCJzdGF0aWNcIl0saD1kLmR5bmFtaWMsQT17fTtPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWJbZF0sYTtpZihcIm51bWJlclwiPT09dHlwZW9mIGV8fFwiYm9vbGVhblwiPT09dHlwZW9mIGUpYT1jKGZ1bmN0aW9uKCl7cmV0dXJuIGV9KTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgdj1lLl9yZWdsVHlwZTtpZihcInRleHR1cmUyZFwiPT09dnx8XCJ0ZXh0dXJlQ3ViZVwiPT09dilhPWMoZnVuY3Rpb24oZCl7cmV0dXJuIGQubGluayhlKX0pO2Vsc2UgaWYoXCJmcmFtZWJ1ZmZlclwiPT09dnx8XCJmcmFtZWJ1ZmZlckN1YmVcIj09PXYpYT1jKGZ1bmN0aW9uKGQpe3JldHVybiBkLmxpbmsoZS5jb2xvclswXSl9KX1lbHNlIHkoZSkmJlxuKGE9YyhmdW5jdGlvbihkKXtyZXR1cm4gZC5nbG9iYWwuZGVmKFwiW1wiLEYoZS5sZW5ndGgsZnVuY3Rpb24oZCl7cmV0dXJuIGVbZF19KSxcIl1cIil9KSk7YS52YWx1ZT1lO0FbZF09YX0pO09iamVjdC5rZXlzKGgpLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGU9aFtkXTtBW2RdPWEoZSxmdW5jdGlvbihkLGEpe3JldHVybiBkLmludm9rZShhLGUpfSl9KTtyZXR1cm4gQX1mdW5jdGlvbiBkYShkLGUpe3ZhciBiPWRbXCJzdGF0aWNcIl0saD1kLmR5bmFtaWMsQT17fTtPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWJbZF0sYT1mLmlkKGQpLHY9bmV3IEJhO2lmKGwoZSkpdi5zdGF0ZT0xLHYuYnVmZmVyPU0uZ2V0QnVmZmVyKE0uY3JlYXRlKGUsMzQ5NjIsITEsITApKSx2LnR5cGU9MDtlbHNle3ZhciBoPU0uZ2V0QnVmZmVyKGUpO2lmKGgpdi5zdGF0ZT0xLHYuYnVmZmVyPWgsdi50eXBlPTA7ZWxzZSBpZihlLmNvbnN0YW50KXt2YXIgdz1lLmNvbnN0YW50O3YuYnVmZmVyPVxuXCJudWxsXCI7di5zdGF0ZT0yO1wibnVtYmVyXCI9PT10eXBlb2Ygdz92Lng9dzpOLmZvckVhY2goZnVuY3Rpb24oZCxlKXtlPHcubGVuZ3RoJiYodltkXT13W2VdKX0pfWVsc2V7dmFyIGg9bChlLmJ1ZmZlcik/TS5nZXRCdWZmZXIoTS5jcmVhdGUoZS5idWZmZXIsMzQ5NjIsITEsITApKTpNLmdldEJ1ZmZlcihlLmJ1ZmZlciksej1lLm9mZnNldHwwLHE9ZS5zdHJpZGV8MCxrPWUuc2l6ZXwwLGc9ISFlLm5vcm1hbGl6ZWQsbT0wO1widHlwZVwiaW4gZSYmKG09Q1tlLnR5cGVdKTtlPWUuZGl2aXNvcnwwO3YuYnVmZmVyPWg7di5zdGF0ZT0xO3Yuc2l6ZT1rO3Yubm9ybWFsaXplZD1nO3YudHlwZT1tfHxoLmR0eXBlO3Yub2Zmc2V0PXo7di5zdHJpZGU9cTt2LmRpdmlzb3I9ZX19QVtkXT1jKGZ1bmN0aW9uKGQsZSl7dmFyIGM9ZC5hdHRyaWJDYWNoZTtpZihhIGluIGMpcmV0dXJuIGNbYV07dmFyIGI9e2lzU3RyZWFtOiExfTtPYmplY3Qua2V5cyh2KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZF09XG52W2RdfSk7di5idWZmZXImJihiLmJ1ZmZlcj1kLmxpbmsodi5idWZmZXIpLGIudHlwZT1iLnR5cGV8fGIuYnVmZmVyK1wiLmR0eXBlXCIpO3JldHVybiBjW2FdPWJ9KX0pO09iamVjdC5rZXlzKGgpLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGU9aFtkXTtBW2RdPWEoZSxmdW5jdGlvbihkLGEpe2Z1bmN0aW9uIHYoZCl7YShBW2RdLFwiPVwiLGMsXCIuXCIsZCxcInwwO1wiKX12YXIgYz1kLmludm9rZShhLGUpLGI9ZC5zaGFyZWQsaD1iLmlzQnVmZmVyQXJncyx3PWIuYnVmZmVyLEE9e2lzU3RyZWFtOmEuZGVmKCExKX0sej1uZXcgQmE7ei5zdGF0ZT0xO09iamVjdC5rZXlzKHopLmZvckVhY2goZnVuY3Rpb24oZCl7QVtkXT1hLmRlZihcIlwiK3pbZF0pfSk7dmFyIGFhPUEuYnVmZmVyLHE9QS50eXBlO2EoXCJpZihcIixoLFwiKFwiLGMsXCIpKXtcIixBLmlzU3RyZWFtLFwiPXRydWU7XCIsYWEsXCI9XCIsdyxcIi5jcmVhdGVTdHJlYW0oXCIsMzQ5NjIsXCIsXCIsYyxcIik7XCIscSxcIj1cIixhYSxcIi5kdHlwZTtcIixcIn1lbHNle1wiLFxuYWEsXCI9XCIsdyxcIi5nZXRCdWZmZXIoXCIsYyxcIik7XCIsXCJpZihcIixhYSxcIil7XCIscSxcIj1cIixhYSxcIi5kdHlwZTtcIiwnfWVsc2UgaWYoXCJjb25zdGFudFwiIGluICcsYyxcIil7XCIsQS5zdGF0ZSxcIj1cIiwyLFwiO1wiLFwiaWYodHlwZW9mIFwiK2MrJy5jb25zdGFudCA9PT0gXCJudW1iZXJcIil7JyxBW05bMF1dLFwiPVwiLGMsXCIuY29uc3RhbnQ7XCIsTi5zbGljZSgxKS5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIEFbZF19KS5qb2luKFwiPVwiKSxcIj0wO1wiLFwifWVsc2V7XCIsTi5tYXAoZnVuY3Rpb24oZCxlKXtyZXR1cm4gQVtkXStcIj1cIitjK1wiLmNvbnN0YW50Lmxlbmd0aD49XCIrZStcIj9cIitjK1wiLmNvbnN0YW50W1wiK2UrXCJdOjA7XCJ9KS5qb2luKFwiXCIpLFwifX1lbHNle1wiLFwiaWYoXCIsaCxcIihcIixjLFwiLmJ1ZmZlcikpe1wiLGFhLFwiPVwiLHcsXCIuY3JlYXRlU3RyZWFtKFwiLDM0OTYyLFwiLFwiLGMsXCIuYnVmZmVyKTtcIixcIn1lbHNle1wiLGFhLFwiPVwiLHcsXCIuZ2V0QnVmZmVyKFwiLGMsXCIuYnVmZmVyKTtcIixcIn1cIixxLCc9XCJ0eXBlXCIgaW4gJyxcbmMsXCI/XCIsYi5nbFR5cGVzLFwiW1wiLGMsXCIudHlwZV06XCIsYWEsXCIuZHR5cGU7XCIsQS5ub3JtYWxpemVkLFwiPSEhXCIsYyxcIi5ub3JtYWxpemVkO1wiKTt2KFwic2l6ZVwiKTt2KFwib2Zmc2V0XCIpO3YoXCJzdHJpZGVcIik7dihcImRpdmlzb3JcIik7YShcIn19XCIpO2EuZXhpdChcImlmKFwiLEEuaXNTdHJlYW0sXCIpe1wiLHcsXCIuZGVzdHJveVN0cmVhbShcIixhYSxcIik7XCIsXCJ9XCIpO3JldHVybiBBfSl9KTtyZXR1cm4gQX1mdW5jdGlvbiBqYShkKXt2YXIgZT1kW1wic3RhdGljXCJdLGI9ZC5keW5hbWljLGg9e307T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgYT1lW2RdO2hbZF09YyhmdW5jdGlvbihkLGUpe3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYXx8XCJib29sZWFuXCI9PT10eXBlb2YgYT9cIlwiK2E6ZC5saW5rKGEpfSl9KTtPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWJbZF07aFtkXT1hKGUsZnVuY3Rpb24oZCxhKXtyZXR1cm4gZC5pbnZva2UoYSxlKX0pfSk7cmV0dXJuIGh9XG5mdW5jdGlvbiBsYShkLGUsYSxjLGIpe3ZhciBoPXlhKGQsYiksdz1VKGQsaCxiKSx6PWthKGQsYikscT1yYShkLGIpLGs9aWEoZCxiKSxnPXcudmlld3BvcnQ7ZyYmKHEudmlld3BvcnQ9Zyk7Zz1XKFwic2Npc3Nvci5ib3hcIik7KHc9d1tnXSkmJihxW2ddPXcpO3c9MDxPYmplY3Qua2V5cyhxKS5sZW5ndGg7aD17ZnJhbWVidWZmZXI6aCxkcmF3Onosc2hhZGVyOmssc3RhdGU6cSxkaXJ0eTp3fTtoLnByb2ZpbGU9bmEoZCxiKTtoLnVuaWZvcm1zPXNhKGEsYik7aC5hdHRyaWJ1dGVzPWRhKGUsYik7aC5jb250ZXh0PWphKGMsYik7cmV0dXJuIGh9ZnVuY3Rpb24gZWEoZCxlLGEpe3ZhciBjPWQuc2hhcmVkLmNvbnRleHQsYj1kLnNjb3BlKCk7T2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbihoKXtlLnNhdmUoYyxcIi5cIitoKTtiKGMsXCIuXCIsaCxcIj1cIixhW2hdLmFwcGVuZChkLGUpLFwiO1wiKX0pO2UoYil9ZnVuY3Rpb24gTyhkLGUsYSxjKXt2YXIgYj1kLnNoYXJlZCxoPWIuZ2wsdz1iLmZyYW1lYnVmZmVyLFxuejtvYSYmKHo9ZS5kZWYoYi5leHRlbnNpb25zLFwiLndlYmdsX2RyYXdfYnVmZmVyc1wiKSk7dmFyIHE9ZC5jb25zdGFudHMsYj1xLmRyYXdCdWZmZXIscT1xLmJhY2tCdWZmZXI7ZD1hP2EuYXBwZW5kKGQsZSk6ZS5kZWYodyxcIi5uZXh0XCIpO2N8fGUoXCJpZihcIixkLFwiIT09XCIsdyxcIi5jdXIpe1wiKTtlKFwiaWYoXCIsZCxcIil7XCIsaCxcIi5iaW5kRnJhbWVidWZmZXIoXCIsMzYxNjAsXCIsXCIsZCxcIi5mcmFtZWJ1ZmZlcik7XCIpO29hJiZlKHosXCIuZHJhd0J1ZmZlcnNXRUJHTChcIixiLFwiW1wiLGQsXCIuY29sb3JBdHRhY2htZW50cy5sZW5ndGhdKTtcIik7ZShcIn1lbHNle1wiLGgsXCIuYmluZEZyYW1lYnVmZmVyKFwiLDM2MTYwLFwiLG51bGwpO1wiKTtvYSYmZSh6LFwiLmRyYXdCdWZmZXJzV0VCR0woXCIscSxcIik7XCIpO2UoXCJ9XCIsdyxcIi5jdXI9XCIsZCxcIjtcIik7Y3x8ZShcIn1cIil9ZnVuY3Rpb24gaGEoZCxhLGMpe3ZhciBiPWQuc2hhcmVkLGg9Yi5nbCx6PWQuY3VycmVudCxxPWQubmV4dCxnPWIuY3VycmVudCxrPWIubmV4dCxcbm09ZC5jb25kKGcsXCIuZGlydHlcIik7dy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9VyhhKTtpZighKGEgaW4gYy5zdGF0ZSkpe3ZhciB2LGI7aWYoYSBpbiBxKXt2PXFbYV07Yj16W2FdO3ZhciB3PUYoZVthXS5sZW5ndGgsZnVuY3Rpb24oZCl7cmV0dXJuIG0uZGVmKHYsXCJbXCIsZCxcIl1cIil9KTttKGQuY29uZCh3Lm1hcChmdW5jdGlvbihkLGUpe3JldHVybiBkK1wiIT09XCIrYitcIltcIitlK1wiXVwifSkuam9pbihcInx8XCIpKS50aGVuKGgsXCIuXCIseGFbYV0sXCIoXCIsdyxcIik7XCIsdy5tYXAoZnVuY3Rpb24oZCxlKXtyZXR1cm4gYitcIltcIitlK1wiXT1cIitkfSkuam9pbihcIjtcIiksXCI7XCIpKX1lbHNlIHY9bS5kZWYoayxcIi5cIixhKSx3PWQuY29uZCh2LFwiIT09XCIsZyxcIi5cIixhKSxtKHcpLGEgaW4gd2E/dyhkLmNvbmQodikudGhlbihoLFwiLmVuYWJsZShcIix3YVthXSxcIik7XCIpW1wiZWxzZVwiXShoLFwiLmRpc2FibGUoXCIsd2FbYV0sXCIpO1wiKSxnLFwiLlwiLGEsXCI9XCIsdixcIjtcIik6dyhoLFwiLlwiLHhhW2FdLFwiKFwiLHYsXCIpO1wiLFxuZyxcIi5cIixhLFwiPVwiLHYsXCI7XCIpfX0pOzA9PT1PYmplY3Qua2V5cyhjLnN0YXRlKS5sZW5ndGgmJm0oZyxcIi5kaXJ0eT1mYWxzZTtcIik7YShtKX1mdW5jdGlvbiBRKGQsZSxhLGMpe3ZhciBiPWQuc2hhcmVkLGg9ZC5jdXJyZW50LHc9Yi5jdXJyZW50LHE9Yi5nbDtrKE9iamVjdC5rZXlzKGEpKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciB6PWFbYl07aWYoIWN8fGMoeikpe3ZhciBnPXouYXBwZW5kKGQsZSk7aWYod2FbYl0pe3ZhciBrPXdhW2JdO3Ioeik/Zz9lKHEsXCIuZW5hYmxlKFwiLGssXCIpO1wiKTplKHEsXCIuZGlzYWJsZShcIixrLFwiKTtcIik6ZShkLmNvbmQoZykudGhlbihxLFwiLmVuYWJsZShcIixrLFwiKTtcIilbXCJlbHNlXCJdKHEsXCIuZGlzYWJsZShcIixrLFwiKTtcIikpO2UodyxcIi5cIixiLFwiPVwiLGcsXCI7XCIpfWVsc2UgaWYoeShnKSl7dmFyIG09aFtiXTtlKHEsXCIuXCIseGFbYl0sXCIoXCIsZyxcIik7XCIsZy5tYXAoZnVuY3Rpb24oZCxlKXtyZXR1cm4gbStcIltcIitlK1wiXT1cIitkfSkuam9pbihcIjtcIiksXCI7XCIpfWVsc2UgZShxLFxuXCIuXCIseGFbYl0sXCIoXCIsZyxcIik7XCIsdyxcIi5cIixiLFwiPVwiLGcsXCI7XCIpfX0pfWZ1bmN0aW9uIHBhKGQsZSl7dGEmJihkLmluc3RhbmNpbmc9ZS5kZWYoZC5zaGFyZWQuZXh0ZW5zaW9ucyxcIi5hbmdsZV9pbnN0YW5jZWRfYXJyYXlzXCIpKX1mdW5jdGlvbiBWKGQsZSxhLGMsYil7ZnVuY3Rpb24gaCgpe3JldHVyblwidW5kZWZpbmVkXCI9PT10eXBlb2YgcGVyZm9ybWFuY2U/XCJEYXRlLm5vdygpXCI6XCJwZXJmb3JtYW5jZS5ub3coKVwifWZ1bmN0aW9uIHcoZCl7bD1lLmRlZigpO2QobCxcIj1cIixoKCksXCI7XCIpO1wic3RyaW5nXCI9PT10eXBlb2YgYj9kKGssXCIuY291bnQrPVwiLGIsXCI7XCIpOmQoayxcIi5jb3VudCsrO1wiKTttYSYmKGM/KG49ZS5kZWYoKSxkKG4sXCI9XCIsZixcIi5nZXROdW1QZW5kaW5nUXVlcmllcygpO1wiKSk6ZChmLFwiLmJlZ2luUXVlcnkoXCIsayxcIik7XCIpKX1mdW5jdGlvbiBxKGQpe2QoayxcIi5jcHVUaW1lKz1cIixoKCksXCItXCIsbCxcIjtcIik7bWEmJihjP2QoZixcIi5wdXNoU2NvcGVTdGF0cyhcIixuLFxuXCIsXCIsZixcIi5nZXROdW1QZW5kaW5nUXVlcmllcygpLFwiLGssXCIpO1wiKTpkKGYsXCIuZW5kUXVlcnkoKTtcIikpfWZ1bmN0aW9uIHooZCl7dmFyIGE9ZS5kZWYobSxcIi5wcm9maWxlXCIpO2UobSxcIi5wcm9maWxlPVwiLGQsXCI7XCIpO2UuZXhpdChtLFwiLnByb2ZpbGU9XCIsYSxcIjtcIil9dmFyIGc9ZC5zaGFyZWQsaz1kLnN0YXRzLG09Zy5jdXJyZW50LGY9Zy50aW1lcjthPWEucHJvZmlsZTt2YXIgbCxuO2lmKGEpe2lmKHIoYSkpe2EuZW5hYmxlPyh3KGUpLHEoZS5leGl0KSx6KFwidHJ1ZVwiKSk6eihcImZhbHNlXCIpO3JldHVybn1hPWEuYXBwZW5kKGQsZSk7eihhKX1lbHNlIGE9ZS5kZWYobSxcIi5wcm9maWxlXCIpO2c9ZC5ibG9jaygpO3coZyk7ZShcImlmKFwiLGEsXCIpe1wiLGcsXCJ9XCIpO2Q9ZC5ibG9jaygpO3EoZCk7ZS5leGl0KFwiaWYoXCIsYSxcIil7XCIsZCxcIn1cIil9ZnVuY3Rpb24gWChkLGUsYSxjLGIpe2Z1bmN0aW9uIGgoZCl7c3dpdGNoKGQpe2Nhc2UgMzU2NjQ6Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiAyO1xuY2FzZSAzNTY2NTpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIDM7Y2FzZSAzNTY2NjpjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIDQ7ZGVmYXVsdDpyZXR1cm4gMX19ZnVuY3Rpb24gdyhhLGMsYil7ZnVuY3Rpb24gaCgpe2UoXCJpZighXCIsbSxcIi5idWZmZXIpe1wiLGcsXCIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoXCIsayxcIik7fVwiKTt2YXIgYT1iLnR5cGUsdzt3PWIuc2l6ZT9lLmRlZihiLnNpemUsXCJ8fFwiLGMpOmM7ZShcImlmKFwiLG0sXCIudHlwZSE9PVwiLGEsXCJ8fFwiLG0sXCIuc2l6ZSE9PVwiLHcsXCJ8fFwiLGFhLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbStcIi5cIitkK1wiIT09XCIrYltkXX0pLmpvaW4oXCJ8fFwiKSxcIil7XCIsZyxcIi5iaW5kQnVmZmVyKFwiLDM0OTYyLFwiLFwiLGYsXCIuYnVmZmVyKTtcIixnLFwiLnZlcnRleEF0dHJpYlBvaW50ZXIoXCIsW2ssdyxhLGIubm9ybWFsaXplZCxiLnN0cmlkZSxiLm9mZnNldF0sXCIpO1wiLG0sXCIudHlwZT1cIixhLFwiO1wiLG0sXCIuc2l6ZT1cIix3LFwiO1wiLGFhLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbStcblwiLlwiK2QrXCI9XCIrYltkXStcIjtcIn0pLmpvaW4oXCJcIiksXCJ9XCIpO3RhJiYoYT1iLmRpdmlzb3IsZShcImlmKFwiLG0sXCIuZGl2aXNvciE9PVwiLGEsXCIpe1wiLGQuaW5zdGFuY2luZyxcIi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoXCIsW2ssYV0sXCIpO1wiLG0sXCIuZGl2aXNvcj1cIixhLFwiO31cIikpfWZ1bmN0aW9uIHooKXtlKFwiaWYoXCIsbSxcIi5idWZmZXIpe1wiLGcsXCIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KFwiLGssXCIpO1wiLFwifWlmKFwiLE4ubWFwKGZ1bmN0aW9uKGQsZSl7cmV0dXJuIG0rXCIuXCIrZCtcIiE9PVwiK0FbZV19KS5qb2luKFwifHxcIiksXCIpe1wiLGcsXCIudmVydGV4QXR0cmliNGYoXCIsayxcIixcIixBLFwiKTtcIixOLm1hcChmdW5jdGlvbihkLGUpe3JldHVybiBtK1wiLlwiK2QrXCI9XCIrQVtlXStcIjtcIn0pLmpvaW4oXCJcIiksXCJ9XCIpfXZhciBnPXEuZ2wsaz1lLmRlZihhLFwiLmxvY2F0aW9uXCIpLG09ZS5kZWYocS5hdHRyaWJ1dGVzLFwiW1wiLGssXCJdXCIpO2E9Yi5zdGF0ZTt2YXIgZj1iLmJ1ZmZlcixBPVtiLngsYi55LFxuYi56LGIud10sYWE9W1wiYnVmZmVyXCIsXCJub3JtYWxpemVkXCIsXCJvZmZzZXRcIixcInN0cmlkZVwiXTsxPT09YT9oKCk6Mj09PWE/eigpOihlKFwiaWYoXCIsYSxcIj09PVwiLDEsXCIpe1wiKSxoKCksZShcIn1lbHNle1wiKSx6KCksZShcIn1cIikpfXZhciBxPWQuc2hhcmVkO2MuZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgcT1jLm5hbWUsZz1hLmF0dHJpYnV0ZXNbcV0sejtpZihnKXtpZighYihnKSlyZXR1cm47ej1nLmFwcGVuZChkLGUpfWVsc2V7aWYoIWIoSCkpcmV0dXJuO3ZhciBtPWQuc2NvcGVBdHRyaWIocSk7ej17fTtPYmplY3Qua2V5cyhuZXcgQmEpLmZvckVhY2goZnVuY3Rpb24oZCl7eltkXT1lLmRlZihtLFwiLlwiLGQpfSl9dyhkLmxpbmsoYyksaChjLmluZm8udHlwZSkseil9KX1mdW5jdGlvbiBUKGQsZSxhLGMsYil7Zm9yKHZhciBoPWQuc2hhcmVkLHc9aC5nbCxnLHE9MDtxPGMubGVuZ3RoOysrcSl7dmFyIHo9Y1txXSxtPXoubmFtZSxrPXouaW5mby50eXBlLGw9YS51bmlmb3Jtc1ttXSx6PWQubGluayh6KStcblwiLmxvY2F0aW9uXCIsbjtpZihsKXtpZighYihsKSljb250aW51ZTtpZihyKGwpKXttPWwudmFsdWU7aWYoMzU2Nzg9PT1rfHwzNTY4MD09PWspaz1kLmxpbmsobS5fdGV4dHVyZXx8bS5jb2xvclswXS5fdGV4dHVyZSksZSh3LFwiLnVuaWZvcm0xaShcIix6LFwiLFwiLGsrXCIuYmluZCgpKTtcIiksZS5leGl0KGssXCIudW5iaW5kKCk7XCIpO2Vsc2UgaWYoMzU2NzQ9PT1rfHwzNTY3NT09PWt8fDM1Njc2PT09ayltPWQuZ2xvYmFsLmRlZihcIm5ldyBGbG9hdDMyQXJyYXkoW1wiK0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG0pK1wiXSlcIiksbD0yLDM1Njc1PT09az9sPTM6MzU2NzY9PT1rJiYobD00KSxlKHcsXCIudW5pZm9ybU1hdHJpeFwiLGwsXCJmdihcIix6LFwiLGZhbHNlLFwiLG0sXCIpO1wiKTtlbHNle3N3aXRjaChrKXtjYXNlIDUxMjY6Zz1cIjFmXCI7YnJlYWs7Y2FzZSAzNTY2NDpnPVwiMmZcIjticmVhaztjYXNlIDM1NjY1Omc9XCIzZlwiO2JyZWFrO2Nhc2UgMzU2NjY6Zz1cIjRmXCI7YnJlYWs7Y2FzZSAzNTY3MDpnPVxuXCIxaVwiO2JyZWFrO2Nhc2UgNTEyNDpnPVwiMWlcIjticmVhaztjYXNlIDM1NjcxOmc9XCIyaVwiO2JyZWFrO2Nhc2UgMzU2Njc6Zz1cIjJpXCI7YnJlYWs7Y2FzZSAzNTY3MjpnPVwiM2lcIjticmVhaztjYXNlIDM1NjY4Omc9XCIzaVwiO2JyZWFrO2Nhc2UgMzU2NzM6Zz1cIjRpXCI7YnJlYWs7Y2FzZSAzNTY2OTpnPVwiNGlcIn1lKHcsXCIudW5pZm9ybVwiLGcsXCIoXCIseixcIixcIix5KG0pP0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG0pOm0sXCIpO1wiKX1jb250aW51ZX1lbHNlIG49bC5hcHBlbmQoZCxlKX1lbHNle2lmKCFiKEgpKWNvbnRpbnVlO249ZS5kZWYoaC51bmlmb3JtcyxcIltcIixmLmlkKG0pLFwiXVwiKX0zNTY3OD09PWs/ZShcImlmKFwiLG4sXCImJlwiLG4sJy5fcmVnbFR5cGU9PT1cImZyYW1lYnVmZmVyXCIpeycsbixcIj1cIixuLFwiLmNvbG9yWzBdO1wiLFwifVwiKTozNTY4MD09PWsmJmUoXCJpZihcIixuLFwiJiZcIixuLCcuX3JlZ2xUeXBlPT09XCJmcmFtZWJ1ZmZlckN1YmVcIil7JyxuLFwiPVwiLG4sXCIuY29sb3JbMF07XCIsXCJ9XCIpO1xubT0xO3N3aXRjaChrKXtjYXNlIDM1Njc4OmNhc2UgMzU2ODA6az1lLmRlZihuLFwiLl90ZXh0dXJlXCIpO2UodyxcIi51bmlmb3JtMWkoXCIseixcIixcIixrLFwiLmJpbmQoKSk7XCIpO2UuZXhpdChrLFwiLnVuYmluZCgpO1wiKTtjb250aW51ZTtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpnPVwiMWlcIjticmVhaztjYXNlIDM1NjY3OmNhc2UgMzU2NzE6Zz1cIjJpXCI7bT0yO2JyZWFrO2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpnPVwiM2lcIjttPTM7YnJlYWs7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOmc9XCI0aVwiO209NDticmVhaztjYXNlIDUxMjY6Zz1cIjFmXCI7YnJlYWs7Y2FzZSAzNTY2NDpnPVwiMmZcIjttPTI7YnJlYWs7Y2FzZSAzNTY2NTpnPVwiM2ZcIjttPTM7YnJlYWs7Y2FzZSAzNTY2NjpnPVwiNGZcIjttPTQ7YnJlYWs7Y2FzZSAzNTY3NDpnPVwiTWF0cml4MmZ2XCI7YnJlYWs7Y2FzZSAzNTY3NTpnPVwiTWF0cml4M2Z2XCI7YnJlYWs7Y2FzZSAzNTY3NjpnPVwiTWF0cml4NGZ2XCJ9ZSh3LFwiLnVuaWZvcm1cIixnLFwiKFwiLHosXCIsXCIpO1xuaWYoXCJNXCI9PT1nLmNoYXJBdCgwKSl7dmFyIHo9TWF0aC5wb3coay0zNTY3NCsyLDIpLEI9ZC5nbG9iYWwuZGVmKFwibmV3IEZsb2F0MzJBcnJheShcIix6LFwiKVwiKTtlKFwiZmFsc2UsKEFycmF5LmlzQXJyYXkoXCIsbixcIil8fFwiLG4sXCIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpP1wiLG4sXCI6KFwiLEYoeixmdW5jdGlvbihkKXtyZXR1cm4gQitcIltcIitkK1wiXT1cIituK1wiW1wiK2QrXCJdXCJ9KSxcIixcIixCLFwiKVwiKX1lbHNlIDE8bT9lKEYobSxmdW5jdGlvbihkKXtyZXR1cm4gbitcIltcIitkK1wiXVwifSkpOmUobik7ZShcIik7XCIpfX1mdW5jdGlvbiB1YShkLGUsYSxjKXtmdW5jdGlvbiBiKGgpe3ZhciBnPWtbaF07cmV0dXJuIGc/Zy5jb250ZXh0RGVwJiZjLmNvbnRleHREeW5hbWljfHxnLnByb3BEZXA/Zy5hcHBlbmQoZCxhKTpnLmFwcGVuZChkLGUpOmUuZGVmKG0sXCIuXCIsaCl9ZnVuY3Rpb24gaCgpe2Z1bmN0aW9uIGQoKXthKHgsXCIuZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUoXCIsW2YsbixLLGwrXCI8PCgoXCIrXG5LK1wiLTUxMjEpPj4xKVwiLEJdLFwiKTtcIil9ZnVuY3Rpb24gZSgpe2EoeCxcIi5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoXCIsW2YsbCxuLEJdLFwiKTtcIil9cT9TP2QoKTooYShcImlmKFwiLHEsXCIpe1wiKSxkKCksYShcIn1lbHNle1wiKSxlKCksYShcIn1cIikpOmUoKX1mdW5jdGlvbiBnKCl7ZnVuY3Rpb24gZCgpe2EoeitcIi5kcmF3RWxlbWVudHMoXCIrW2YsbixLLGwrXCI8PCgoXCIrSytcIi01MTIxKT4+MSlcIl0rXCIpO1wiKX1mdW5jdGlvbiBlKCl7YSh6K1wiLmRyYXdBcnJheXMoXCIrW2YsbCxuXStcIik7XCIpfXE/Uz9kKCk6KGEoXCJpZihcIixxLFwiKXtcIiksZCgpLGEoXCJ9ZWxzZXtcIiksZSgpLGEoXCJ9XCIpKTplKCl9dmFyIHc9ZC5zaGFyZWQsej13LmdsLG09dy5kcmF3LGs9Yy5kcmF3LHE9ZnVuY3Rpb24oKXt2YXIgYj1rLmVsZW1lbnRzLGg9ZTtpZihiKXtpZihiLmNvbnRleHREZXAmJmMuY29udGV4dER5bmFtaWN8fGIucHJvcERlcCloPWE7Yj1iLmFwcGVuZChkLGgpfWVsc2UgYj1oLmRlZihtLFwiLlwiLFwiZWxlbWVudHNcIik7XG5iJiZoKFwiaWYoXCIrYitcIilcIit6K1wiLmJpbmRCdWZmZXIoMzQ5NjMsXCIrYitcIi5idWZmZXIuYnVmZmVyKTtcIik7cmV0dXJuIGJ9KCksZj1iKFwicHJpbWl0aXZlXCIpLGw9YihcIm9mZnNldFwiKSxuPWZ1bmN0aW9uKCl7dmFyIGI9ay5jb3VudCxoPWU7aWYoYil7aWYoYi5jb250ZXh0RGVwJiZjLmNvbnRleHREeW5hbWljfHxiLnByb3BEZXApaD1hO2I9Yi5hcHBlbmQoZCxoKX1lbHNlIGI9aC5kZWYobSxcIi5cIixcImNvdW50XCIpO3JldHVybiBifSgpO2lmKFwibnVtYmVyXCI9PT10eXBlb2Ygbil7aWYoMD09PW4pcmV0dXJufWVsc2UgYShcImlmKFwiLG4sXCIpe1wiKSxhLmV4aXQoXCJ9XCIpO3ZhciBCLHg7dGEmJihCPWIoXCJpbnN0YW5jZXNcIikseD1kLmluc3RhbmNpbmcpO3ZhciBLPXErXCIudHlwZVwiLFM9ay5lbGVtZW50cyYmcihrLmVsZW1lbnRzKTt0YSYmKFwibnVtYmVyXCIhPT10eXBlb2YgQnx8MDw9Qik/XCJzdHJpbmdcIj09PXR5cGVvZiBCPyhhKFwiaWYoXCIsQixcIj4wKXtcIiksaCgpLGEoXCJ9ZWxzZSBpZihcIixCLFxuXCI8MCl7XCIpLGcoKSxhKFwifVwiKSk6aCgpOmcoKX1mdW5jdGlvbiBFYShkLGUsYSxiLGMpe2U9YmEoKTtjPWUucHJvYyhcImJvZHlcIixjKTt0YSYmKGUuaW5zdGFuY2luZz1jLmRlZihlLnNoYXJlZC5leHRlbnNpb25zLFwiLmFuZ2xlX2luc3RhbmNlZF9hcnJheXNcIikpO2QoZSxjLGEsYik7cmV0dXJuIGUuY29tcGlsZSgpLmJvZHl9ZnVuY3Rpb24gRmEoZCxlLGEsYil7cGEoZCxlKTtYKGQsZSxhLGIuYXR0cmlidXRlcyxmdW5jdGlvbigpe3JldHVybiEwfSk7VChkLGUsYSxiLnVuaWZvcm1zLGZ1bmN0aW9uKCl7cmV0dXJuITB9KTt1YShkLGUsZSxhKX1mdW5jdGlvbiBIYShkLGUpe3ZhciBhPWQucHJvYyhcImRyYXdcIiwxKTtwYShkLGEpO2VhKGQsYSxlLmNvbnRleHQpO08oZCxhLGUuZnJhbWVidWZmZXIpO2hhKGQsYSxlKTtRKGQsYSxlLnN0YXRlKTtWKGQsYSxlLCExLCEwKTt2YXIgYj1lLnNoYWRlci5wcm9nVmFyLmFwcGVuZChkLGEpO2EoZC5zaGFyZWQuZ2wsXCIudXNlUHJvZ3JhbShcIixiLFxuXCIucHJvZ3JhbSk7XCIpO2lmKGUuc2hhZGVyLnByb2dyYW0pRmEoZCxhLGUsZS5zaGFkZXIucHJvZ3JhbSk7ZWxzZXt2YXIgYz1kLmdsb2JhbC5kZWYoXCJ7fVwiKSxoPWEuZGVmKGIsXCIuaWRcIiksZz1hLmRlZihjLFwiW1wiLGgsXCJdXCIpO2EoZC5jb25kKGcpLnRoZW4oZyxcIi5jYWxsKHRoaXMsYTApO1wiKVtcImVsc2VcIl0oZyxcIj1cIixjLFwiW1wiLGgsXCJdPVwiLGQubGluayhmdW5jdGlvbihhKXtyZXR1cm4gRWEoRmEsZCxlLGEsMSl9KSxcIihcIixiLFwiKTtcIixnLFwiLmNhbGwodGhpcyxhMCk7XCIpKX0wPE9iamVjdC5rZXlzKGUuc3RhdGUpLmxlbmd0aCYmYShkLnNoYXJlZC5jdXJyZW50LFwiLmRpcnR5PXRydWU7XCIpfWZ1bmN0aW9uIElhKGQsZSxhLGIpe2Z1bmN0aW9uIGMoKXtyZXR1cm4hMH1kLmJhdGNoSWQ9XCJhMVwiO3BhKGQsZSk7WChkLGUsYSxiLmF0dHJpYnV0ZXMsYyk7VChkLGUsYSxiLnVuaWZvcm1zLGMpO3VhKGQsZSxlLGEpfWZ1bmN0aW9uIENhKGUsYSxiLGMpe2Z1bmN0aW9uIGgoZSl7cmV0dXJuIGUuY29udGV4dERlcCYmXG53fHxlLnByb3BEZXB9ZnVuY3Rpb24gZyhlKXtyZXR1cm4haChlKX1wYShlLGEpO3ZhciB3PWIuY29udGV4dERlcCx6PWEuZGVmKCksbT1hLmRlZigpO2Uuc2hhcmVkLnByb3BzPW07ZS5iYXRjaElkPXo7dmFyIGs9ZS5zY29wZSgpLHE9ZS5zY29wZSgpO2Eoay5lbnRyeSxcImZvcihcIix6LFwiPTA7XCIseixcIjxcIixcImExXCIsXCI7KytcIix6LFwiKXtcIixtLFwiPVwiLFwiYTBcIixcIltcIix6LFwiXTtcIixxLFwifVwiLGsuZXhpdCk7Yi5uZWVkc0NvbnRleHQmJmVhKGUscSxiLmNvbnRleHQpO2IubmVlZHNGcmFtZWJ1ZmZlciYmTyhlLHEsYi5mcmFtZWJ1ZmZlcik7UShlLHEsYi5zdGF0ZSxoKTtiLnByb2ZpbGUmJmgoYi5wcm9maWxlKSYmVihlLHEsYiwhMSwhMCk7Yz8oWChlLGssYixjLmF0dHJpYnV0ZXMsZyksWChlLHEsYixjLmF0dHJpYnV0ZXMsaCksVChlLGssYixjLnVuaWZvcm1zLGcpLFQoZSxxLGIsYy51bmlmb3JtcyxoKSx1YShlLGsscSxiKSk6KGE9ZS5nbG9iYWwuZGVmKFwie31cIiksYz1iLnNoYWRlci5wcm9nVmFyLmFwcGVuZChlLFxucSksbT1xLmRlZihjLFwiLmlkXCIpLGs9cS5kZWYoYSxcIltcIixtLFwiXVwiKSxxKGUuc2hhcmVkLmdsLFwiLnVzZVByb2dyYW0oXCIsYyxcIi5wcm9ncmFtKTtcIixcImlmKCFcIixrLFwiKXtcIixrLFwiPVwiLGEsXCJbXCIsbSxcIl09XCIsZS5saW5rKGZ1bmN0aW9uKGEpe3JldHVybiBFYShJYSxlLGIsYSwyKX0pLFwiKFwiLGMsXCIpO31cIixrLFwiLmNhbGwodGhpcyxhMFtcIix6LFwiXSxcIix6LFwiKTtcIikpfWZ1bmN0aW9uIERhKGUsYSl7ZnVuY3Rpb24gYihlKXtyZXR1cm4gZS5jb250ZXh0RGVwJiZofHxlLnByb3BEZXB9dmFyIGM9ZS5wcm9jKFwiYmF0Y2hcIiwyKTtlLmJhdGNoSWQ9XCIwXCI7cGEoZSxjKTt2YXIgaD0hMSxnPSEwO09iamVjdC5rZXlzKGEuY29udGV4dCkuZm9yRWFjaChmdW5jdGlvbihlKXtoPWh8fGEuY29udGV4dFtlXS5wcm9wRGVwfSk7aHx8KGVhKGUsYyxhLmNvbnRleHQpLGc9ITEpO3ZhciB3PWEuZnJhbWVidWZmZXIsej0hMTt3Pyh3LnByb3BEZXA/aD16PSEwOncuY29udGV4dERlcCYmaCYmKHo9ITApLFxuenx8TyhlLGMsdykpOk8oZSxjLG51bGwpO2Euc3RhdGUudmlld3BvcnQmJmEuc3RhdGUudmlld3BvcnQucHJvcERlcCYmKGg9ITApO2hhKGUsYyxhKTtRKGUsYyxhLnN0YXRlLGZ1bmN0aW9uKGUpe3JldHVybiFiKGUpfSk7YS5wcm9maWxlJiZiKGEucHJvZmlsZSl8fFYoZSxjLGEsITEsXCJhMVwiKTthLmNvbnRleHREZXA9aDthLm5lZWRzQ29udGV4dD1nO2EubmVlZHNGcmFtZWJ1ZmZlcj16O2c9YS5zaGFkZXIucHJvZ1ZhcjtpZihnLmNvbnRleHREZXAmJmh8fGcucHJvcERlcClDYShlLGMsYSxudWxsKTtlbHNlIGlmKGc9Zy5hcHBlbmQoZSxjKSxjKGUuc2hhcmVkLmdsLFwiLnVzZVByb2dyYW0oXCIsZyxcIi5wcm9ncmFtKTtcIiksYS5zaGFkZXIucHJvZ3JhbSlDYShlLGMsYSxhLnNoYWRlci5wcm9ncmFtKTtlbHNle3ZhciB3PWUuZ2xvYmFsLmRlZihcInt9XCIpLHo9Yy5kZWYoZyxcIi5pZFwiKSxxPWMuZGVmKHcsXCJbXCIseixcIl1cIik7YyhlLmNvbmQocSkudGhlbihxLFwiLmNhbGwodGhpcyxhMCxhMSk7XCIpW1wiZWxzZVwiXShxLFxuXCI9XCIsdyxcIltcIix6LFwiXT1cIixlLmxpbmsoZnVuY3Rpb24oYil7cmV0dXJuIEVhKENhLGUsYSxiLDIpfSksXCIoXCIsZyxcIik7XCIscSxcIi5jYWxsKHRoaXMsYTAsYTEpO1wiKSl9MDxPYmplY3Qua2V5cyhhLnN0YXRlKS5sZW5ndGgmJmMoZS5zaGFyZWQuY3VycmVudCxcIi5kaXJ0eT10cnVlO1wiKX1mdW5jdGlvbiBQYShlLGEpe2Z1bmN0aW9uIGIoZyl7dmFyIHc9YS5zaGFkZXJbZ107dyYmYy5zZXQoaC5zaGFkZXIsXCIuXCIrZyx3LmFwcGVuZChlLGMpKX12YXIgYz1lLnByb2MoXCJzY29wZVwiLDMpO2UuYmF0Y2hJZD1cImEyXCI7dmFyIGg9ZS5zaGFyZWQsZz1oLmN1cnJlbnQ7ZWEoZSxjLGEuY29udGV4dCk7YS5mcmFtZWJ1ZmZlciYmYS5mcmFtZWJ1ZmZlci5hcHBlbmQoZSxjKTtrKE9iamVjdC5rZXlzKGEuc3RhdGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBnPWEuc3RhdGVbYl0uYXBwZW5kKGUsYyk7eShnKT9nLmZvckVhY2goZnVuY3Rpb24oYSxoKXtjLnNldChlLm5leHRbYl0sXCJbXCIraCtcIl1cIixcbmEpfSk6Yy5zZXQoaC5uZXh0LFwiLlwiK2IsZyl9KTtWKGUsYyxhLCEwLCEwKTtbXCJlbGVtZW50c1wiLFwib2Zmc2V0XCIsXCJjb3VudFwiLFwiaW5zdGFuY2VzXCIsXCJwcmltaXRpdmVcIl0uZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZz1hLmRyYXdbYl07ZyYmYy5zZXQoaC5kcmF3LFwiLlwiK2IsXCJcIitnLmFwcGVuZChlLGMpKX0pO09iamVjdC5rZXlzKGEudW5pZm9ybXMpLmZvckVhY2goZnVuY3Rpb24oYil7Yy5zZXQoaC51bmlmb3JtcyxcIltcIitmLmlkKGIpK1wiXVwiLGEudW5pZm9ybXNbYl0uYXBwZW5kKGUsYykpfSk7T2JqZWN0LmtleXMoYS5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBoPWEuYXR0cmlidXRlc1tiXS5hcHBlbmQoZSxjKSxnPWUuc2NvcGVBdHRyaWIoYik7T2JqZWN0LmtleXMobmV3IEJhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Muc2V0KGcsXCIuXCIrZSxoW2VdKX0pfSk7YihcInZlcnRcIik7YihcImZyYWdcIik7MDxPYmplY3Qua2V5cyhhLnN0YXRlKS5sZW5ndGgmJihjKGcsXG5cIi5kaXJ0eT10cnVlO1wiKSxjLmV4aXQoZyxcIi5kaXJ0eT10cnVlO1wiKSk7YyhcImExKFwiLGUuc2hhcmVkLmNvbnRleHQsXCIsYTAsXCIsZS5iYXRjaElkLFwiKTtcIil9ZnVuY3Rpb24gTmEoZSl7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBlJiYheShlKSl7Zm9yKHZhciBhPU9iamVjdC5rZXlzKGUpLGI9MDtiPGEubGVuZ3RoOysrYilpZihnLmlzRHluYW1pYyhlW2FbYl1dKSlyZXR1cm4hMDtyZXR1cm4hMX19ZnVuY3Rpb24gSmEoZSxiLGMpe2Z1bmN0aW9uIGgoZSxhKXtxLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGI9d1tkXTtnLmlzRHluYW1pYyhiKSYmKGI9ZS5pbnZva2UoYSxiKSxhKG4sXCIuXCIsZCxcIj1cIixiLFwiO1wiKSl9KX12YXIgdz1iW1wic3RhdGljXCJdW2NdO2lmKHcmJk5hKHcpKXt2YXIgej1lLmdsb2JhbCxxPU9iamVjdC5rZXlzKHcpLGs9ITEsbT0hMSxmPSExLG49ZS5nbG9iYWwuZGVmKFwie31cIik7cS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPXdbYl07aWYoZy5pc0R5bmFtaWMoYykpXCJmdW5jdGlvblwiPT09XG50eXBlb2YgYyYmKGM9d1tiXT1nLnVuYm94KGMpKSxiPWEoYyxudWxsKSxrPWt8fGIudGhpc0RlcCxmPWZ8fGIucHJvcERlcCxtPW18fGIuY29udGV4dERlcDtlbHNle3oobixcIi5cIixiLFwiPVwiKTtzd2l0Y2godHlwZW9mIGMpe2Nhc2UgXCJudW1iZXJcIjp6KGMpO2JyZWFrO2Nhc2UgXCJzdHJpbmdcIjp6KCdcIicsYywnXCInKTticmVhaztjYXNlIFwib2JqZWN0XCI6QXJyYXkuaXNBcnJheShjKSYmeihcIltcIixjLmpvaW4oKSxcIl1cIik7YnJlYWs7ZGVmYXVsdDp6KGUubGluayhjKSl9eihcIjtcIil9fSk7Yi5keW5hbWljW2NdPW5ldyBnLkR5bmFtaWNWYXJpYWJsZSg0LHt0aGlzRGVwOmssY29udGV4dERlcDptLHByb3BEZXA6ZixyZWY6bixhcHBlbmQ6aH0pO2RlbGV0ZSBiW1wic3RhdGljXCJdW2NdfX12YXIgQmE9QWEuUmVjb3JkLGNhPXthZGQ6MzI3NzQsc3VidHJhY3Q6MzI3NzgsXCJyZXZlcnNlIHN1YnRyYWN0XCI6MzI3Nzl9O3QuZXh0X2JsZW5kX21pbm1heCYmKGNhLm1pbj0zMjc3NSxjYS5tYXg9MzI3NzYpO1xudmFyIHRhPXQuYW5nbGVfaW5zdGFuY2VkX2FycmF5cyxvYT10LndlYmdsX2RyYXdfYnVmZmVycyxlPXtkaXJ0eTohMCxwcm9maWxlOmdhLnByb2ZpbGV9LHo9e30sdz1bXSx3YT17fSx4YT17fTtSKFwiZGl0aGVyXCIsMzAyNCk7UihcImJsZW5kLmVuYWJsZVwiLDMwNDIpO0coXCJibGVuZC5jb2xvclwiLFwiYmxlbmRDb2xvclwiLFswLDAsMCwwXSk7RyhcImJsZW5kLmVxdWF0aW9uXCIsXCJibGVuZEVxdWF0aW9uU2VwYXJhdGVcIixbMzI3NzQsMzI3NzRdKTtHKFwiYmxlbmQuZnVuY1wiLFwiYmxlbmRGdW5jU2VwYXJhdGVcIixbMSwwLDEsMF0pO1IoXCJkZXB0aC5lbmFibGVcIiwyOTI5LCEwKTtHKFwiZGVwdGguZnVuY1wiLFwiZGVwdGhGdW5jXCIsNTEzKTtHKFwiZGVwdGgucmFuZ2VcIixcImRlcHRoUmFuZ2VcIixbMCwxXSk7RyhcImRlcHRoLm1hc2tcIixcImRlcHRoTWFza1wiLCEwKTtHKFwiY29sb3JNYXNrXCIsXCJjb2xvck1hc2tcIixbITAsITAsITAsITBdKTtSKFwiY3VsbC5lbmFibGVcIiwyODg0KTtHKFwiY3VsbC5mYWNlXCIsXCJjdWxsRmFjZVwiLFxuMTAyOSk7RyhcImZyb250RmFjZVwiLFwiZnJvbnRGYWNlXCIsMjMwNSk7RyhcImxpbmVXaWR0aFwiLFwibGluZVdpZHRoXCIsMSk7UihcInBvbHlnb25PZmZzZXQuZW5hYmxlXCIsMzI4MjMpO0coXCJwb2x5Z29uT2Zmc2V0Lm9mZnNldFwiLFwicG9seWdvbk9mZnNldFwiLFswLDBdKTtSKFwic2FtcGxlLmFscGhhXCIsMzI5MjYpO1IoXCJzYW1wbGUuZW5hYmxlXCIsMzI5MjgpO0coXCJzYW1wbGUuY292ZXJhZ2VcIixcInNhbXBsZUNvdmVyYWdlXCIsWzEsITFdKTtSKFwic3RlbmNpbC5lbmFibGVcIiwyOTYwKTtHKFwic3RlbmNpbC5tYXNrXCIsXCJzdGVuY2lsTWFza1wiLC0xKTtHKFwic3RlbmNpbC5mdW5jXCIsXCJzdGVuY2lsRnVuY1wiLFs1MTksMCwtMV0pO0coXCJzdGVuY2lsLm9wRnJvbnRcIixcInN0ZW5jaWxPcFNlcGFyYXRlXCIsWzEwMjgsNzY4MCw3NjgwLDc2ODBdKTtHKFwic3RlbmNpbC5vcEJhY2tcIixcInN0ZW5jaWxPcFNlcGFyYXRlXCIsWzEwMjksNzY4MCw3NjgwLDc2ODBdKTtSKFwic2Npc3Nvci5lbmFibGVcIiwzMDg5KTtHKFwic2Npc3Nvci5ib3hcIixcblwic2Npc3NvclwiLFswLDAsaC5kcmF3aW5nQnVmZmVyV2lkdGgsaC5kcmF3aW5nQnVmZmVySGVpZ2h0XSk7RyhcInZpZXdwb3J0XCIsXCJ2aWV3cG9ydFwiLFswLDAsaC5kcmF3aW5nQnVmZmVyV2lkdGgsaC5kcmF3aW5nQnVmZmVySGVpZ2h0XSk7dmFyIFFhPXtnbDpoLGNvbnRleHQ6UyxzdHJpbmdzOmYsbmV4dDp6LGN1cnJlbnQ6ZSxkcmF3OnEsZWxlbWVudHM6dSxidWZmZXI6TSxzaGFkZXI6dmEsYXR0cmlidXRlczpBYS5zdGF0ZSx1bmlmb3JtczpLLGZyYW1lYnVmZmVyOkQsZXh0ZW5zaW9uczp0LHRpbWVyOm1hLGlzQnVmZmVyQXJnczpsfSxNYT17cHJpbVR5cGVzOkUsY29tcGFyZUZ1bmNzOkIsYmxlbmRGdW5jczptLGJsZW5kRXF1YXRpb25zOmNhLHN0ZW5jaWxPcHM6WSxnbFR5cGVzOkMsb3JpZW50YXRpb25UeXBlOkx9O29hJiYoTWEuYmFja0J1ZmZlcj1bMTAyOV0sTWEuZHJhd0J1ZmZlcj1GKHAubWF4RHJhd2J1ZmZlcnMsZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lP1swXTpGKGUsZnVuY3Rpb24oZSl7cmV0dXJuIDM2MDY0K1xuZX0pfSkpO3ZhciBSYT0wO3JldHVybntuZXh0OnosY3VycmVudDplLHByb2NzOmZ1bmN0aW9uKCl7dmFyIGE9YmEoKSxiPWEucHJvYyhcInBvbGxcIiksYz1hLnByb2MoXCJyZWZyZXNoXCIpLGc9YS5ibG9jaygpO2IoZyk7YyhnKTt2YXIgdz1hLnNoYXJlZCx6PXcuZ2wscT13Lm5leHQsaz13LmN1cnJlbnQ7ZyhrLFwiLmRpcnR5PWZhbHNlO1wiKTtPKGEsYik7TyhhLGMsbnVsbCwhMCk7dmFyIG09aC5nZXRFeHRlbnNpb24oXCJhbmdsZV9pbnN0YW5jZWRfYXJyYXlzXCIpLGY7bSYmKGY9YS5saW5rKG0pKTtmb3IodmFyIG49MDtuPHAubWF4QXR0cmlidXRlczsrK24pe3ZhciBsPWMuZGVmKHcuYXR0cmlidXRlcyxcIltcIixuLFwiXVwiKSxCPWEuY29uZChsLFwiLmJ1ZmZlclwiKTtCLnRoZW4oeixcIi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShcIixuLFwiKTtcIix6LFwiLmJpbmRCdWZmZXIoXCIsMzQ5NjIsXCIsXCIsbCxcIi5idWZmZXIuYnVmZmVyKTtcIix6LFwiLnZlcnRleEF0dHJpYlBvaW50ZXIoXCIsbixcIixcIixsLFwiLnNpemUsXCIsXG5sLFwiLnR5cGUsXCIsbCxcIi5ub3JtYWxpemVkLFwiLGwsXCIuc3RyaWRlLFwiLGwsXCIub2Zmc2V0KTtcIilbXCJlbHNlXCJdKHosXCIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KFwiLG4sXCIpO1wiLHosXCIudmVydGV4QXR0cmliNGYoXCIsbixcIixcIixsLFwiLngsXCIsbCxcIi55LFwiLGwsXCIueixcIixsLFwiLncpO1wiLGwsXCIuYnVmZmVyPW51bGw7XCIpO2MoQik7bSYmYyhmLFwiLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRShcIixuLFwiLFwiLGwsXCIuZGl2aXNvcik7XCIpfU9iamVjdC5rZXlzKHdhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBoPXdhW2VdLHc9Zy5kZWYocSxcIi5cIixlKSxtPWEuYmxvY2soKTttKFwiaWYoXCIsdyxcIil7XCIseixcIi5lbmFibGUoXCIsaCxcIil9ZWxzZXtcIix6LFwiLmRpc2FibGUoXCIsaCxcIil9XCIsayxcIi5cIixlLFwiPVwiLHcsXCI7XCIpO2MobSk7YihcImlmKFwiLHcsXCIhPT1cIixrLFwiLlwiLGUsXCIpe1wiLG0sXCJ9XCIpfSk7T2JqZWN0LmtleXMoeGEpLmZvckVhY2goZnVuY3Rpb24oaCl7dmFyIHc9eGFbaF0sbT1lW2hdLGYsXG5uLGw9YS5ibG9jaygpO2woeixcIi5cIix3LFwiKFwiKTt5KG0pPyh3PW0ubGVuZ3RoLGY9YS5nbG9iYWwuZGVmKHEsXCIuXCIsaCksbj1hLmdsb2JhbC5kZWYoayxcIi5cIixoKSxsKEYodyxmdW5jdGlvbihlKXtyZXR1cm4gZitcIltcIitlK1wiXVwifSksXCIpO1wiLEYodyxmdW5jdGlvbihlKXtyZXR1cm4gbitcIltcIitlK1wiXT1cIitmK1wiW1wiK2UrXCJdO1wifSkuam9pbihcIlwiKSksYihcImlmKFwiLEYodyxmdW5jdGlvbihlKXtyZXR1cm4gZitcIltcIitlK1wiXSE9PVwiK24rXCJbXCIrZStcIl1cIn0pLmpvaW4oXCJ8fFwiKSxcIil7XCIsbCxcIn1cIikpOihmPWcuZGVmKHEsXCIuXCIsaCksbj1nLmRlZihrLFwiLlwiLGgpLGwoZixcIik7XCIsayxcIi5cIixoLFwiPVwiLGYsXCI7XCIpLGIoXCJpZihcIixmLFwiIT09XCIsbixcIil7XCIsbCxcIn1cIikpO2MobCl9KTtyZXR1cm4gYS5jb21waWxlKCl9KCksY29tcGlsZTpmdW5jdGlvbihlLGEsYixjLGgpe3ZhciBnPWJhKCk7Zy5zdGF0cz1nLmxpbmsoaCk7T2JqZWN0LmtleXMoYVtcInN0YXRpY1wiXSkuZm9yRWFjaChmdW5jdGlvbihlKXtKYShnLFxuYSxlKX0pO24uZm9yRWFjaChmdW5jdGlvbihhKXtKYShnLGUsYSl9KTtiPWxhKGUsYSxiLGMsZyk7SGEoZyxiKTtQYShnLGIpO0RhKGcsYik7cmV0dXJuIGcuY29tcGlsZSgpfX19fSx7XCIuL2NvbnN0YW50cy9kdHlwZXMuanNvblwiOjQsXCIuL2NvbnN0YW50cy9wcmltaXRpdmVzLmpzb25cIjo1LFwiLi9keW5hbWljXCI6OCxcIi4vdXRpbC9jb2RlZ2VuXCI6MjEsXCIuL3V0aWwvaXMtYXJyYXktbGlrZVwiOjI0LFwiLi91dGlsL2lzLW5kYXJyYXlcIjoyNSxcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiOjI2LFwiLi91dGlsL2xvb3BcIjoyN31dLDg6W2Z1bmN0aW9uKGYscCx1KXtmdW5jdGlvbiBsKGMsYSl7dGhpcy5pZD1yKys7dGhpcy50eXBlPWM7dGhpcy5kYXRhPWF9ZnVuY3Rpb24gayhjKXtpZigwPT09Yy5sZW5ndGgpcmV0dXJuW107dmFyIGE9Yy5jaGFyQXQoMCksYj1jLmNoYXJBdChjLmxlbmd0aC0xKTtpZigxPGMubGVuZ3RoJiZhPT09YiYmKCdcIic9PT1hfHxcIidcIj09PWEpKXJldHVyblsnXCInK2Muc3Vic3RyKDEsXG5jLmxlbmd0aC0yKS5yZXBsYWNlKC9cXFxcL2csXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCdcXFxcXCInKSsnXCInXTtpZihhPS9cXFsoZmFsc2V8dHJ1ZXxudWxsfFxcZCt8J1teJ10qJ3xcIlteXCJdKlwiKVxcXS8uZXhlYyhjKSlyZXR1cm4gayhjLnN1YnN0cigwLGEuaW5kZXgpKS5jb25jYXQoayhhWzFdKSkuY29uY2F0KGsoYy5zdWJzdHIoYS5pbmRleCthWzBdLmxlbmd0aCkpKTthPWMuc3BsaXQoXCIuXCIpO2lmKDE9PT1hLmxlbmd0aClyZXR1cm5bJ1wiJytjLnJlcGxhY2UoL1xcXFwvZyxcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csJ1xcXFxcIicpKydcIiddO2M9W107Zm9yKGI9MDtiPGEubGVuZ3RoOysrYiljPWMuY29uY2F0KGsoYVtiXSkpO3JldHVybiBjfWZ1bmN0aW9uIHgoYyl7cmV0dXJuXCJbXCIrayhjKS5qb2luKFwiXVtcIikrXCJdXCJ9dmFyIHI9MDtwLmV4cG9ydHM9e0R5bmFtaWNWYXJpYWJsZTpsLGRlZmluZTpmdW5jdGlvbihjLGEpe3JldHVybiBuZXcgbChjLHgoYStcIlwiKSl9LGlzRHluYW1pYzpmdW5jdGlvbihjKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT1cbnR5cGVvZiBjJiYhYy5fcmVnbFR5cGV8fGMgaW5zdGFuY2VvZiBsfSx1bmJveDpmdW5jdGlvbihjLGEpe3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBjP25ldyBsKDAsYyk6Y30sYWNjZXNzb3I6eH19LHt9XSw5OltmdW5jdGlvbihmLHAsdSl7dmFyIGw9ZihcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiKSxrPWYoXCIuL3V0aWwvaXMtbmRhcnJheVwiKSx4PWYoXCIuL3V0aWwvdmFsdWVzXCIpLHI9ZihcIi4vY29uc3RhbnRzL3ByaW1pdGl2ZXMuanNvblwiKSxjPWYoXCIuL2NvbnN0YW50cy91c2FnZS5qc29uXCIpO3AuZXhwb3J0cz1mdW5jdGlvbihhLGIsZixwKXtmdW5jdGlvbiB0KGEpe3RoaXMuaWQ9QysrO0VbdGhpcy5pZF09dGhpczt0aGlzLmJ1ZmZlcj1hO3RoaXMucHJpbVR5cGU9NDt0aGlzLnR5cGU9dGhpcy52ZXJ0Q291bnQ9MH1mdW5jdGlvbiB5KGMsZyxuLHIseCxoLHQpe2MuYnVmZmVyLmJpbmQoKTtpZihnKXt2YXIgeT10O3R8fGwoZykmJighayhnKXx8bChnLmRhdGEpKXx8KHk9Yi5vZXNfZWxlbWVudF9pbmRleF91aW50P1xuNTEyNTo1MTIzKTtmLl9pbml0QnVmZmVyKGMuYnVmZmVyLGcsbix5LDMpfWVsc2UgYS5idWZmZXJEYXRhKDM0OTYzLGgsbiksYy5idWZmZXIuZHR5cGU9eXx8NTEyMSxjLmJ1ZmZlci51c2FnZT1uLGMuYnVmZmVyLmRpbWVuc2lvbj0zLGMuYnVmZmVyLmJ5dGVMZW5ndGg9aDt5PXQ7aWYoIXQpe3N3aXRjaChjLmJ1ZmZlci5kdHlwZSl7Y2FzZSA1MTIxOmNhc2UgNTEyMDp5PTUxMjE7YnJlYWs7Y2FzZSA1MTIzOmNhc2UgNTEyMjp5PTUxMjM7YnJlYWs7Y2FzZSA1MTI1OmNhc2UgNTEyNDp5PTUxMjV9Yy5idWZmZXIuZHR5cGU9eX1jLnR5cGU9eTtnPXg7MD5nJiYoZz1jLmJ1ZmZlci5ieXRlTGVuZ3RoLDUxMjM9PT15P2c+Pj0xOjUxMjU9PT15JiYoZz4+PTIpKTtjLnZlcnRDb3VudD1nO2c9cjswPnImJihnPTQscj1jLmJ1ZmZlci5kaW1lbnNpb24sMT09PXImJihnPTApLDI9PT1yJiYoZz0xKSwzPT09ciYmKGc9NCkpO2MucHJpbVR5cGU9Z31mdW5jdGlvbiBnKGEpe3AuZWxlbWVudHNDb3VudC0tO1xuZGVsZXRlIEVbYS5pZF07YS5idWZmZXIuZGVzdHJveSgpO2EuYnVmZmVyPW51bGx9dmFyIEU9e30sQz0wLE49e3VpbnQ4OjUxMjEsdWludDE2OjUxMjN9O2Iub2VzX2VsZW1lbnRfaW5kZXhfdWludCYmKE4udWludDMyPTUxMjUpO3QucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oKXt0aGlzLmJ1ZmZlci5iaW5kKCl9O3ZhciBuPVtdO3JldHVybntjcmVhdGU6ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBuKGEpe2lmKGEpaWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXgoYSksQy5wcmltVHlwZT00LEMudmVydENvdW50PWF8MCxDLnR5cGU9NTEyMTtlbHNle3ZhciBiPW51bGwsZz0zNTA0NCxtPS0xLGY9LTEsdD0wLEI9MDtpZihBcnJheS5pc0FycmF5KGEpfHxsKGEpfHxrKGEpKWI9YTtlbHNlIGlmKFwiZGF0YVwiaW4gYSYmKGI9YS5kYXRhKSxcInVzYWdlXCJpbiBhJiYoZz1jW2EudXNhZ2VdKSxcInByaW1pdGl2ZVwiaW4gYSYmKG09clthLnByaW1pdGl2ZV0pLFwiY291bnRcImluIGEmJihmPWEuY291bnR8MCksXG5cInR5cGVcImluIGEmJihCPU5bYS50eXBlXSksXCJsZW5ndGhcImluIGEpdD1hLmxlbmd0aHwwO2Vsc2UgaWYodD1mLDUxMjM9PT1CfHw1MTIyPT09Qil0Kj0yO2Vsc2UgaWYoNTEyNT09PUJ8fDUxMjQ9PT1CKXQqPTQ7eShDLGIsZyxtLGYsdCxCKX1lbHNlIHgoKSxDLnByaW1UeXBlPTQsQy52ZXJ0Q291bnQ9MCxDLnR5cGU9NTEyMTtyZXR1cm4gbn12YXIgeD1mLmNyZWF0ZShudWxsLDM0OTYzLCEwKSxDPW5ldyB0KHguX2J1ZmZlcik7cC5lbGVtZW50c0NvdW50Kys7bihhKTtuLl9yZWdsVHlwZT1cImVsZW1lbnRzXCI7bi5fZWxlbWVudHM9QztuLnN1YmRhdGE9ZnVuY3Rpb24oYSxiKXt4LnN1YmRhdGEoYSxiKTtyZXR1cm4gbn07bi5kZXN0cm95PWZ1bmN0aW9uKCl7ZyhDKX07cmV0dXJuIG59LGNyZWF0ZVN0cmVhbTpmdW5jdGlvbihhKXt2YXIgYj1uLnBvcCgpO2J8fChiPW5ldyB0KGYuY3JlYXRlKG51bGwsMzQ5NjMsITAsITEpLl9idWZmZXIpKTt5KGIsYSwzNTA0MCwtMSwtMSwwLDApO3JldHVybiBifSxcbmRlc3Ryb3lTdHJlYW06ZnVuY3Rpb24oYSl7bi5wdXNoKGEpfSxnZXRFbGVtZW50czpmdW5jdGlvbihhKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmYS5fZWxlbWVudHMgaW5zdGFuY2VvZiB0P2EuX2VsZW1lbnRzOm51bGx9LGNsZWFyOmZ1bmN0aW9uKCl7eChFKS5mb3JFYWNoKGcpfX19fSx7XCIuL2NvbnN0YW50cy9wcmltaXRpdmVzLmpzb25cIjo1LFwiLi9jb25zdGFudHMvdXNhZ2UuanNvblwiOjYsXCIuL3V0aWwvaXMtbmRhcnJheVwiOjI1LFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCI6MjYsXCIuL3V0aWwvdmFsdWVzXCI6MzF9XSwxMDpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz1mdW5jdGlvbihmLGspe2Z1bmN0aW9uIHgoYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGM7dHJ5e2M9clthXT1mLmdldEV4dGVuc2lvbihhKX1jYXRjaChrKXt9cmV0dXJuISFjfWZvcih2YXIgcj17fSxjPTA7YzxrLmV4dGVuc2lvbnMubGVuZ3RoOysrYyl7dmFyIGE9ay5leHRlbnNpb25zW2NdO2lmKCF4KGEpKXJldHVybiBrLm9uRGVzdHJveSgpLFxuay5vbkRvbmUoJ1wiJythKydcIiBleHRlbnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBXZWJHTCBjb250ZXh0LCB0cnkgdXBncmFkaW5nIHlvdXIgc3lzdGVtIG9yIGEgZGlmZmVyZW50IGJyb3dzZXInKSxudWxsfWsub3B0aW9uYWxFeHRlbnNpb25zLmZvckVhY2goeCk7cmV0dXJue2V4dGVuc2lvbnM6cixyZXN0b3JlOmZ1bmN0aW9uKCl7T2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihhKXtpZigheChhKSl0aHJvdyBFcnJvcihcIihyZWdsKTogZXJyb3IgcmVzdG9yaW5nIGV4dGVuc2lvbiBcIithKTt9KX19fX0se31dLDExOltmdW5jdGlvbihmLHAsdSl7dmFyIGw9ZihcIi4vdXRpbC92YWx1ZXNcIiksaz1mKFwiLi91dGlsL2V4dGVuZFwiKSx4PVtdO3hbNjQwOF09NDt2YXIgcj1bXTtyWzUxMjFdPTE7cls1MTI2XT00O3JbMzYxOTNdPTI7cC5leHBvcnRzPWZ1bmN0aW9uKGMsYSxiLGYscCx0KXtmdW5jdGlvbiB5KGEsYyxiKXt0aGlzLnRhcmdldD1hO3RoaXMudGV4dHVyZT1cbmM7dGhpcy5yZW5kZXJidWZmZXI9Yjt2YXIgaD1hPTA7Yz8oYT1jLndpZHRoLGg9Yy5oZWlnaHQpOmImJihhPWIud2lkdGgsaD1iLmhlaWdodCk7dGhpcy53aWR0aD1hO3RoaXMuaGVpZ2h0PWh9ZnVuY3Rpb24gZyhhKXthJiYoYS50ZXh0dXJlJiZhLnRleHR1cmUuX3RleHR1cmUuZGVjUmVmKCksYS5yZW5kZXJidWZmZXImJmEucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZGVjUmVmKCkpfWZ1bmN0aW9uIEUoYSxjLGIpe2EmJihhLnRleHR1cmU/YS50ZXh0dXJlLl90ZXh0dXJlLnJlZkNvdW50Kz0xOmEucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIucmVmQ291bnQrPTEpfWZ1bmN0aW9uIEMoYSxiKXtiJiYoYi50ZXh0dXJlP2MuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsYSxiLnRhcmdldCxiLnRleHR1cmUuX3RleHR1cmUudGV4dHVyZSwwKTpjLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKDM2MTYwLGEsMzYxNjEsYi5yZW5kZXJidWZmZXIuX3JlbmRlcmJ1ZmZlci5yZW5kZXJidWZmZXIpKX1cbmZ1bmN0aW9uIE4oYSl7dmFyIGI9MzU1MyxjPW51bGwsaD1udWxsLGc9YTtcIm9iamVjdFwiPT09dHlwZW9mIGEmJihnPWEuZGF0YSxcInRhcmdldFwiaW4gYSYmKGI9YS50YXJnZXR8MCkpO2E9Zy5fcmVnbFR5cGU7XCJ0ZXh0dXJlMmRcIj09PWE/Yz1nOlwidGV4dHVyZUN1YmVcIj09PWE/Yz1nOlwicmVuZGVyYnVmZmVyXCI9PT1hJiYoaD1nLGI9MzYxNjEpO3JldHVybiBuZXcgeShiLGMsaCl9ZnVuY3Rpb24gbihhLGIsYyxoLGcpe2lmKGMpcmV0dXJuIGE9Zi5jcmVhdGUyRCh7d2lkdGg6YSxoZWlnaHQ6Yixmb3JtYXQ6aCx0eXBlOmd9KSxhLl90ZXh0dXJlLnJlZkNvdW50PTAsbmV3IHkoMzU1MyxhLG51bGwpO2E9cC5jcmVhdGUoe3dpZHRoOmEsaGVpZ2h0OmIsZm9ybWF0Omh9KTthLl9yZW5kZXJidWZmZXIucmVmQ291bnQ9MDtyZXR1cm4gbmV3IHkoMzYxNjEsbnVsbCxhKX1mdW5jdGlvbiBtKGEpe3JldHVybiBhJiYoYS50ZXh0dXJlfHxhLnJlbmRlcmJ1ZmZlcil9ZnVuY3Rpb24gQihhLGIsYyl7YSYmXG4oYS50ZXh0dXJlP2EudGV4dHVyZS5yZXNpemUoYixjKTphLnJlbmRlcmJ1ZmZlciYmYS5yZW5kZXJidWZmZXIucmVzaXplKGIsYykpfWZ1bmN0aW9uIHUoKXt0aGlzLmlkPVorKztEW3RoaXMuaWRdPXRoaXM7dGhpcy5mcmFtZWJ1ZmZlcj1jLmNyZWF0ZUZyYW1lYnVmZmVyKCk7dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD0wO3RoaXMuY29sb3JBdHRhY2htZW50cz1bXTt0aGlzLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ9dGhpcy5zdGVuY2lsQXR0YWNobWVudD10aGlzLmRlcHRoQXR0YWNobWVudD1udWxsfWZ1bmN0aW9uIEwoYSl7YS5jb2xvckF0dGFjaG1lbnRzLmZvckVhY2goZyk7ZyhhLmRlcHRoQXR0YWNobWVudCk7ZyhhLnN0ZW5jaWxBdHRhY2htZW50KTtnKGEuZGVwdGhTdGVuY2lsQXR0YWNobWVudCl9ZnVuY3Rpb24gSChhKXtjLmRlbGV0ZUZyYW1lYnVmZmVyKGEuZnJhbWVidWZmZXIpO2EuZnJhbWVidWZmZXI9bnVsbDt0LmZyYW1lYnVmZmVyQ291bnQtLTtkZWxldGUgRFthLmlkXX1cbmZ1bmN0aW9uIGgoYSl7dmFyIGg7Yy5iaW5kRnJhbWVidWZmZXIoMzYxNjAsYS5mcmFtZWJ1ZmZlcik7dmFyIGc9YS5jb2xvckF0dGFjaG1lbnRzO2ZvcihoPTA7aDxnLmxlbmd0aDsrK2gpQygzNjA2NCtoLGdbaF0pO2ZvcihoPWcubGVuZ3RoO2g8Yi5tYXhDb2xvckF0dGFjaG1lbnRzOysraCljLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0K2gsMzU1MyxudWxsLDApO2MuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzMzMDYsMzU1MyxudWxsLDApO2MuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwOTYsMzU1MyxudWxsLDApO2MuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYxMjgsMzU1MyxudWxsLDApO0MoMzYwOTYsYS5kZXB0aEF0dGFjaG1lbnQpO0MoMzYxMjgsYS5zdGVuY2lsQXR0YWNobWVudCk7QygzMzMwNixhLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQpO2MuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cygzNjE2MCk7Yy5iaW5kRnJhbWVidWZmZXIoMzYxNjAsXG5LYS5uZXh0KTtLYS5jdXI9S2EubmV4dDtjLmdldEVycm9yKCl9ZnVuY3Rpb24gZmEoYSxiKXtmdW5jdGlvbiBjKGEsYil7dmFyIGssZj0wLGw9MCx0PSEwLHk9ITA7az1udWxsO3ZhciBCPSEwLEM9XCJyZ2JhXCIsRj1cInVpbnQ4XCIscD0xLE09bnVsbCxIPW51bGwsdT1udWxsLFk9ITE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWY9YXwwLGw9YnwwfHxmO2Vsc2UgaWYoYSl7XCJzaGFwZVwiaW4gYT8obD1hLnNoYXBlLGY9bFswXSxsPWxbMV0pOihcInJhZGl1c1wiaW4gYSYmKGY9bD1hLnJhZGl1cyksXCJ3aWR0aFwiaW4gYSYmKGY9YS53aWR0aCksXCJoZWlnaHRcImluIGEmJihsPWEuaGVpZ2h0KSk7aWYoXCJjb2xvclwiaW4gYXx8XCJjb2xvcnNcImluIGEpaz1hLmNvbG9yfHxhLmNvbG9ycyxBcnJheS5pc0FycmF5KGspO2lmKCFrKXtcImNvbG9yQ291bnRcImluIGEmJihwPWEuY29sb3JDb3VudHwwKTtcImNvbG9yVGV4dHVyZVwiaW4gYSYmKEI9ISFhLmNvbG9yVGV4dHVyZSxDPVwicmdiYTRcIik7aWYoXCJjb2xvclR5cGVcImluXG5hJiYoRj1hLmNvbG9yVHlwZSwhQikpaWYoXCJoYWxmIGZsb2F0XCI9PT1GfHxcImZsb2F0MTZcIj09PUYpQz1cInJnYmExNmZcIjtlbHNlIGlmKFwiZmxvYXRcIj09PUZ8fFwiZmxvYXQzMlwiPT09RilDPVwicmdiYTMyZlwiO1wiY29sb3JGb3JtYXRcImluIGEmJihDPWEuY29sb3JGb3JtYXQsMDw9TGEuaW5kZXhPZihDKT9CPSEwOjA8PXphLmluZGV4T2YoQykmJihCPSExKSl9aWYoXCJkZXB0aFRleHR1cmVcImluIGF8fFwiZGVwdGhTdGVuY2lsVGV4dHVyZVwiaW4gYSlZPSEoIWEuZGVwdGhUZXh0dXJlJiYhYS5kZXB0aFN0ZW5jaWxUZXh0dXJlKTtcImRlcHRoXCJpbiBhJiYoXCJib29sZWFuXCI9PT10eXBlb2YgYS5kZXB0aD90PWEuZGVwdGg6KE09YS5kZXB0aCx5PSExKSk7XCJzdGVuY2lsXCJpbiBhJiYoXCJib29sZWFuXCI9PT10eXBlb2YgYS5zdGVuY2lsP3k9YS5zdGVuY2lsOihIPWEuc3RlbmNpbCx0PSExKSk7XCJkZXB0aFN0ZW5jaWxcImluIGEmJihcImJvb2xlYW5cIj09PXR5cGVvZiBhLmRlcHRoU3RlbmNpbD90PXk9YS5kZXB0aFN0ZW5jaWw6XG4odT1hLmRlcHRoU3RlbmNpbCx5PXQ9ITEpKX1lbHNlIGY9bD0xO3ZhciBEPW51bGwsZmE9bnVsbCxLPW51bGwsTz1udWxsO2lmKEFycmF5LmlzQXJyYXkoaykpRD1rLm1hcChOKTtlbHNlIGlmKGspRD1bTihrKV07ZWxzZSBmb3IoRD1BcnJheShwKSxrPTA7azxwOysraylEW2tdPW4oZixsLEIsQyxGKTtmPWZ8fERbMF0ud2lkdGg7bD1sfHxEWzBdLmhlaWdodDtNP2ZhPU4oTSk6dCYmIXkmJihmYT1uKGYsbCxZLFwiZGVwdGhcIixcInVpbnQzMlwiKSk7SD9LPU4oSCk6eSYmIXQmJihLPW4oZixsLCExLFwic3RlbmNpbFwiLFwidWludDhcIikpO3U/Tz1OKHUpOiFNJiYhSCYmeSYmdCYmKE89bihmLGwsWSxcImRlcHRoIHN0ZW5jaWxcIixcImRlcHRoIHN0ZW5jaWxcIikpO3Q9bnVsbDtmb3Ioaz0wO2s8RC5sZW5ndGg7KytrKUUoRFtrXSxmLGwpLERba10mJkRba10udGV4dHVyZSYmKHk9eFtEW2tdLnRleHR1cmUuX3RleHR1cmUuZm9ybWF0XSpyW0Rba10udGV4dHVyZS5fdGV4dHVyZS50eXBlXSxudWxsPT09XG50JiYodD15KSk7RShmYSxmLGwpO0UoSyxmLGwpO0UoTyxmLGwpO0woZyk7Zy53aWR0aD1mO2cuaGVpZ2h0PWw7Zy5jb2xvckF0dGFjaG1lbnRzPUQ7Zy5kZXB0aEF0dGFjaG1lbnQ9ZmE7Zy5zdGVuY2lsQXR0YWNobWVudD1LO2cuZGVwdGhTdGVuY2lsQXR0YWNobWVudD1PO2MuY29sb3I9RC5tYXAobSk7Yy5kZXB0aD1tKGZhKTtjLnN0ZW5jaWw9bShLKTtjLmRlcHRoU3RlbmNpbD1tKE8pO2Mud2lkdGg9Zy53aWR0aDtjLmhlaWdodD1nLmhlaWdodDtoKGcpO3JldHVybiBjfXZhciBnPW5ldyB1O3QuZnJhbWVidWZmZXJDb3VudCsrO2MoYSxiKTtyZXR1cm4gayhjLHtyZXNpemU6ZnVuY3Rpb24oYSxiKXt2YXIgaz1hfDAsZj1ifDB8fGs7aWYoaz09PWcud2lkdGgmJmY9PT1nLmhlaWdodClyZXR1cm4gYztmb3IodmFyIG09Zy5jb2xvckF0dGFjaG1lbnRzLGw9MDtsPG0ubGVuZ3RoOysrbClCKG1bbF0sayxmKTtCKGcuZGVwdGhBdHRhY2htZW50LGssZik7QihnLnN0ZW5jaWxBdHRhY2htZW50LFxuayxmKTtCKGcuZGVwdGhTdGVuY2lsQXR0YWNobWVudCxrLGYpO2cud2lkdGg9Yy53aWR0aD1rO2cuaGVpZ2h0PWMuaGVpZ2h0PWY7aChnKTtyZXR1cm4gY30sX3JlZ2xUeXBlOlwiZnJhbWVidWZmZXJcIixfZnJhbWVidWZmZXI6ZyxkZXN0cm95OmZ1bmN0aW9uKCl7SChnKTtMKGcpfX0pfXZhciBLYT17Y3VyOm51bGwsbmV4dDpudWxsLGRpcnR5OiExfSxMYT1bXCJyZ2JhXCJdLHphPVtcInJnYmE0XCIsXCJyZ2I1NjVcIixcInJnYjUgYTFcIl07YS5leHRfc3JnYiYmemEucHVzaChcInNyZ2JhXCIpO2EuZXh0X2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JiZ6YS5wdXNoKFwicmdiYTE2ZlwiLFwicmdiMTZmXCIpO2Eud2ViZ2xfY29sb3JfYnVmZmVyX2Zsb2F0JiZ6YS5wdXNoKFwicmdiYTMyZlwiKTt2YXIgR2E9W1widWludDhcIl07YS5vZXNfdGV4dHVyZV9oYWxmX2Zsb2F0JiZHYS5wdXNoKFwiaGFsZiBmbG9hdFwiLFwiZmxvYXQxNlwiKTthLm9lc190ZXh0dXJlX2Zsb2F0JiZHYS5wdXNoKFwiZmxvYXRcIixcImZsb2F0MzJcIik7dmFyIFo9XG4wLEQ9e307cmV0dXJuIGsoS2Ese2dldEZyYW1lYnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhJiZcImZyYW1lYnVmZmVyXCI9PT1hLl9yZWdsVHlwZSYmKGE9YS5fZnJhbWVidWZmZXIsYSBpbnN0YW5jZW9mIHUpP2E6bnVsbH0sY3JlYXRlOmZhLGNyZWF0ZUN1YmU6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhKXt2YXIgZyxoPXtjb2xvcjpudWxsfSxtPTAsbD1udWxsO2c9XCJyZ2JhXCI7dmFyIG49XCJ1aW50OFwiLHI9MTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpbT1hfDA7ZWxzZSBpZihhKXtcInNoYXBlXCJpbiBhP209YS5zaGFwZVswXTooXCJyYWRpdXNcImluIGEmJihtPWEucmFkaXVzfDApLFwid2lkdGhcImluIGE/bT1hLndpZHRofDA6XCJoZWlnaHRcImluIGEmJihtPWEuaGVpZ2h0fDApKTtpZihcImNvbG9yXCJpbiBhfHxcImNvbG9yc1wiaW4gYSlsPWEuY29sb3J8fGEuY29sb3JzLEFycmF5LmlzQXJyYXkobCk7bHx8KFwiY29sb3JDb3VudFwiaW4gYSYmKHI9YS5jb2xvckNvdW50fFxuMCksXCJjb2xvclR5cGVcImluIGEmJihuPWEuY29sb3JUeXBlKSxcImNvbG9yRm9ybWF0XCJpbiBhJiYoZz1hLmNvbG9yRm9ybWF0KSk7XCJkZXB0aFwiaW4gYSYmKGguZGVwdGg9YS5kZXB0aCk7XCJzdGVuY2lsXCJpbiBhJiYoaC5zdGVuY2lsPWEuc3RlbmNpbCk7XCJkZXB0aFN0ZW5jaWxcImluIGEmJihoLmRlcHRoU3RlbmNpbD1hLmRlcHRoU3RlbmNpbCl9ZWxzZSBtPTE7aWYobClpZihBcnJheS5pc0FycmF5KGwpKWZvcihhPVtdLGc9MDtnPGwubGVuZ3RoOysrZylhW2ddPWxbZ107ZWxzZSBhPVtsXTtlbHNlIGZvcihhPUFycmF5KHIpLGw9e3JhZGl1czptLGZvcm1hdDpnLHR5cGU6bn0sZz0wO2c8cjsrK2cpYVtnXT1mLmNyZWF0ZUN1YmUobCk7aC5jb2xvcj1BcnJheShhLmxlbmd0aCk7Zm9yKGc9MDtnPGEubGVuZ3RoOysrZylyPWFbZ10sbT1tfHxyLndpZHRoLGguY29sb3JbZ109e3RhcmdldDozNDA2OSxkYXRhOmFbZ119O2ZvcihnPTA7Nj5nOysrZyl7Zm9yKHI9MDtyPGEubGVuZ3RoOysrciloLmNvbG9yW3JdLnRhcmdldD1cbjM0MDY5K2c7MDxnJiYoaC5kZXB0aD1iWzBdLmRlcHRoLGguc3RlbmNpbD1iWzBdLnN0ZW5jaWwsaC5kZXB0aFN0ZW5jaWw9YlswXS5kZXB0aFN0ZW5jaWwpO2lmKGJbZ10pYltnXShoKTtlbHNlIGJbZ109ZmEoaCl9cmV0dXJuIGsoYyx7d2lkdGg6bSxoZWlnaHQ6bSxjb2xvcjphfSl9dmFyIGI9QXJyYXkoNik7YyhhKTtyZXR1cm4gayhjLHtmYWNlczpiLHJlc2l6ZTpmdW5jdGlvbihhKXt2YXIgZz1hfDA7aWYoZz09PWMud2lkdGgpcmV0dXJuIGM7dmFyIGg9Yy5jb2xvcjtmb3IoYT0wO2E8aC5sZW5ndGg7KythKWhbYV0ucmVzaXplKGcpO2ZvcihhPTA7Nj5hOysrYSliW2FdLnJlc2l6ZShnKTtjLndpZHRoPWMuaGVpZ2h0PWc7cmV0dXJuIGN9LF9yZWdsVHlwZTpcImZyYW1lYnVmZmVyQ3ViZVwiLGRlc3Ryb3k6ZnVuY3Rpb24oKXtiLmZvckVhY2goZnVuY3Rpb24oYSl7YS5kZXN0cm95KCl9KX19KX0sY2xlYXI6ZnVuY3Rpb24oKXtsKEQpLmZvckVhY2goSCl9LHJlc3RvcmU6ZnVuY3Rpb24oKXtsKEQpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5mcmFtZWJ1ZmZlcj1cbmMuY3JlYXRlRnJhbWVidWZmZXIoKTtoKGEpfSl9fSl9fSx7XCIuL3V0aWwvZXh0ZW5kXCI6MjIsXCIuL3V0aWwvdmFsdWVzXCI6MzF9XSwxMjpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz1mdW5jdGlvbihmLGspe3ZhciB4PTE7ay5leHRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMmJih4PWYuZ2V0UGFyYW1ldGVyKDM0MDQ3KSk7dmFyIHI9MSxjPTE7ay53ZWJnbF9kcmF3X2J1ZmZlcnMmJihyPWYuZ2V0UGFyYW1ldGVyKDM0ODUyKSxjPWYuZ2V0UGFyYW1ldGVyKDM2MDYzKSk7cmV0dXJue2NvbG9yQml0czpbZi5nZXRQYXJhbWV0ZXIoMzQxMCksZi5nZXRQYXJhbWV0ZXIoMzQxMSksZi5nZXRQYXJhbWV0ZXIoMzQxMiksZi5nZXRQYXJhbWV0ZXIoMzQxMyldLGRlcHRoQml0czpmLmdldFBhcmFtZXRlcigzNDE0KSxzdGVuY2lsQml0czpmLmdldFBhcmFtZXRlcigzNDE1KSxzdWJwaXhlbEJpdHM6Zi5nZXRQYXJhbWV0ZXIoMzQwOCksZXh0ZW5zaW9uczpPYmplY3Qua2V5cyhrKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFrW2FdfSksXG5tYXhBbmlzb3Ryb3BpYzp4LG1heERyYXdidWZmZXJzOnIsbWF4Q29sb3JBdHRhY2htZW50czpjLHBvaW50U2l6ZURpbXM6Zi5nZXRQYXJhbWV0ZXIoMzM5MDEpLGxpbmVXaWR0aERpbXM6Zi5nZXRQYXJhbWV0ZXIoMzM5MDIpLG1heFZpZXdwb3J0RGltczpmLmdldFBhcmFtZXRlcigzMzg2KSxtYXhDb21iaW5lZFRleHR1cmVVbml0czpmLmdldFBhcmFtZXRlcigzNTY2MSksbWF4Q3ViZU1hcFNpemU6Zi5nZXRQYXJhbWV0ZXIoMzQwNzYpLG1heFJlbmRlcmJ1ZmZlclNpemU6Zi5nZXRQYXJhbWV0ZXIoMzQwMjQpLG1heFRleHR1cmVVbml0czpmLmdldFBhcmFtZXRlcigzNDkzMCksbWF4VGV4dHVyZVNpemU6Zi5nZXRQYXJhbWV0ZXIoMzM3OSksbWF4QXR0cmlidXRlczpmLmdldFBhcmFtZXRlcigzNDkyMSksbWF4VmVydGV4VW5pZm9ybXM6Zi5nZXRQYXJhbWV0ZXIoMzYzNDcpLG1heFZlcnRleFRleHR1cmVVbml0czpmLmdldFBhcmFtZXRlcigzNTY2MCksbWF4VmFyeWluZ1ZlY3RvcnM6Zi5nZXRQYXJhbWV0ZXIoMzYzNDgpLFxubWF4RnJhZ21lbnRVbmlmb3JtczpmLmdldFBhcmFtZXRlcigzNjM0OSksZ2xzbDpmLmdldFBhcmFtZXRlcigzNTcyNCkscmVuZGVyZXI6Zi5nZXRQYXJhbWV0ZXIoNzkzNyksdmVuZG9yOmYuZ2V0UGFyYW1ldGVyKDc5MzYpLHZlcnNpb246Zi5nZXRQYXJhbWV0ZXIoNzkzOCl9fX0se31dLDEzOltmdW5jdGlvbihmLHAsdSl7dmFyIGw9ZihcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiKTtwLmV4cG9ydHM9ZnVuY3Rpb24oayxmLHIsYyxhLGIpe3JldHVybiBmdW5jdGlvbihhKXt2YXIgYjtiPW51bGw9PT1mLm5leHQ/NTEyMTpmLm5leHQuY29sb3JBdHRhY2htZW50c1swXS50ZXh0dXJlLl90ZXh0dXJlLnR5cGU7dmFyIHQ9MCx5PTAsZz1jLmZyYW1lYnVmZmVyV2lkdGgscD1jLmZyYW1lYnVmZmVySGVpZ2h0LEM9bnVsbDtsKGEpP0M9YTphJiYodD1hLnh8MCx5PWEueXwwLGc9KGEud2lkdGh8fGMuZnJhbWVidWZmZXJXaWR0aC10KXwwLHA9KGEuaGVpZ2h0fHxjLmZyYW1lYnVmZmVySGVpZ2h0LVxueSl8MCxDPWEuZGF0YXx8bnVsbCk7cigpO2E9ZypwKjQ7Q3x8KDUxMjE9PT1iP0M9bmV3IFVpbnQ4QXJyYXkoYSk6NTEyNj09PWImJihDPUN8fG5ldyBGbG9hdDMyQXJyYXkoYSkpKTtrLnBpeGVsU3RvcmVpKDMzMzMsNCk7ay5yZWFkUGl4ZWxzKHQseSxnLHAsNjQwOCxiLEMpO3JldHVybiBDfX19LHtcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiOjI2fV0sMTQ6W2Z1bmN0aW9uKGYscCx1KXt2YXIgbD1mKFwiLi91dGlsL3ZhbHVlc1wiKSxrPVtdO2tbMzI4NTRdPTI7a1szMjg1NV09MjtrWzM2MTk0XT0yO2tbMzMxODldPTI7a1szNjE2OF09MTtrWzM0MDQxXT00O2tbMzU5MDddPTQ7a1szNDgzNl09MTY7a1szNDg0Ml09ODtrWzM0ODQzXT02O3AuZXhwb3J0cz1mdW5jdGlvbihmLHIsYyxhLGIpe2Z1bmN0aW9uIHAoYSl7dGhpcy5pZD1nKys7dGhpcy5yZWZDb3VudD0xO3RoaXMucmVuZGVyYnVmZmVyPWE7dGhpcy5mb3JtYXQ9MzI4NTQ7dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD0wO2IucHJvZmlsZSYmXG4odGhpcy5zdGF0cz17c2l6ZTowfSl9ZnVuY3Rpb24gTShiKXt2YXIgYz1iLnJlbmRlcmJ1ZmZlcjtmLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbnVsbCk7Zi5kZWxldGVSZW5kZXJidWZmZXIoYyk7Yi5yZW5kZXJidWZmZXI9bnVsbDtiLnJlZkNvdW50PTA7ZGVsZXRlIEVbYi5pZF07YS5yZW5kZXJidWZmZXJDb3VudC0tfXZhciB0PXtyZ2JhNDozMjg1NCxyZ2I1NjU6MzYxOTQsXCJyZ2I1IGExXCI6MzI4NTUsZGVwdGg6MzMxODksc3RlbmNpbDozNjE2OCxcImRlcHRoIHN0ZW5jaWxcIjozNDA0MX07ci5leHRfc3JnYiYmKHQuc3JnYmE9MzU5MDcpO3IuZXh0X2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JiYodC5yZ2JhMTZmPTM0ODQyLHQucmdiMTZmPTM0ODQzKTtyLndlYmdsX2NvbG9yX2J1ZmZlcl9mbG9hdCYmKHQucmdiYTMyZj0zNDgzNik7dmFyIHk9W107T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihhKXt5W3RbYV1dPWF9KTt2YXIgZz0wLEU9e307cC5wcm90b3R5cGUuZGVjUmVmPVxuZnVuY3Rpb24oKXswPj0tLXRoaXMucmVmQ291bnQmJk0odGhpcyl9O2IucHJvZmlsZSYmKGEuZ2V0VG90YWxSZW5kZXJidWZmZXJTaXplPWZ1bmN0aW9uKCl7dmFyIGE9MDtPYmplY3Qua2V5cyhFKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2ErPUVbYl0uc3RhdHMuc2l6ZX0pO3JldHVybiBhfSk7cmV0dXJue2NyZWF0ZTpmdW5jdGlvbihjLGcpe2Z1bmN0aW9uIG4oYSxjKXt2YXIgZz0wLGw9MCxoPTMyODU0O1wib2JqZWN0XCI9PT10eXBlb2YgYSYmYT8oXCJzaGFwZVwiaW4gYT8obD1hLnNoYXBlLGc9bFswXXwwLGw9bFsxXXwwKTooXCJyYWRpdXNcImluIGEmJihnPWw9YS5yYWRpdXN8MCksXCJ3aWR0aFwiaW4gYSYmKGc9YS53aWR0aHwwKSxcImhlaWdodFwiaW4gYSYmKGw9YS5oZWlnaHR8MCkpLFwiZm9ybWF0XCJpbiBhJiYoaD10W2EuZm9ybWF0XSkpOlwibnVtYmVyXCI9PT10eXBlb2YgYT8oZz1hfDAsbD1cIm51bWJlclwiPT09dHlwZW9mIGM/Y3wwOmcpOmF8fChnPWw9MSk7aWYoZyE9PW0ud2lkdGh8fGwhPT1cbm0uaGVpZ2h0fHxoIT09bS5mb3JtYXQpcmV0dXJuIG4ud2lkdGg9bS53aWR0aD1nLG4uaGVpZ2h0PW0uaGVpZ2h0PWwsbS5mb3JtYXQ9aCxmLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbS5yZW5kZXJidWZmZXIpLGYucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxoLGcsbCksYi5wcm9maWxlJiYobS5zdGF0cy5zaXplPWtbbS5mb3JtYXRdKm0ud2lkdGgqbS5oZWlnaHQpLG4uZm9ybWF0PXlbbS5mb3JtYXRdLG59dmFyIG09bmV3IHAoZi5jcmVhdGVSZW5kZXJidWZmZXIoKSk7RVttLmlkXT1tO2EucmVuZGVyYnVmZmVyQ291bnQrKztuKGMsZyk7bi5yZXNpemU9ZnVuY3Rpb24oYSxjKXt2YXIgZz1hfDAsbD1jfDB8fGc7aWYoZz09PW0ud2lkdGgmJmw9PT1tLmhlaWdodClyZXR1cm4gbjtuLndpZHRoPW0ud2lkdGg9ZztuLmhlaWdodD1tLmhlaWdodD1sO2YuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxtLnJlbmRlcmJ1ZmZlcik7Zi5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLG0uZm9ybWF0LFxuZyxsKTtiLnByb2ZpbGUmJihtLnN0YXRzLnNpemU9a1ttLmZvcm1hdF0qbS53aWR0aCptLmhlaWdodCk7cmV0dXJuIG59O24uX3JlZ2xUeXBlPVwicmVuZGVyYnVmZmVyXCI7bi5fcmVuZGVyYnVmZmVyPW07Yi5wcm9maWxlJiYobi5zdGF0cz1tLnN0YXRzKTtuLmRlc3Ryb3k9ZnVuY3Rpb24oKXttLmRlY1JlZigpfTtyZXR1cm4gbn0sY2xlYXI6ZnVuY3Rpb24oKXtsKEUpLmZvckVhY2goTSl9LHJlc3RvcmU6ZnVuY3Rpb24oKXtsKEUpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5yZW5kZXJidWZmZXI9Zi5jcmVhdGVSZW5kZXJidWZmZXIoKTtmLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsYS5yZW5kZXJidWZmZXIpO2YucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxhLmZvcm1hdCxhLndpZHRoLGEuaGVpZ2h0KX0pO2YuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX19fX0se1wiLi91dGlsL3ZhbHVlc1wiOjMxfV0sMTU6W2Z1bmN0aW9uKGYscCx1KXt2YXIgbD1mKFwiLi91dGlsL3ZhbHVlc1wiKTtcbnAuZXhwb3J0cz1mdW5jdGlvbihmLHgscixjKXtmdW5jdGlvbiBhKGEsYyxiLGcpe3RoaXMubmFtZT1hO3RoaXMuaWQ9Yzt0aGlzLmxvY2F0aW9uPWI7dGhpcy5pbmZvPWd9ZnVuY3Rpb24gYihhLGMpe2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7KytiKWlmKGFbYl0uaWQ9PT1jLmlkKXthW2JdLmxvY2F0aW9uPWMubG9jYXRpb247cmV0dXJufWEucHVzaChjKX1mdW5jdGlvbiBwKGEsYyxiKXtiPTM1NjMyPT09YT95Omc7dmFyIGw9YltjXTtpZighbCl7dmFyIHI9eC5zdHIoYyksbD1mLmNyZWF0ZVNoYWRlcihhKTtmLnNoYWRlclNvdXJjZShsLHIpO2YuY29tcGlsZVNoYWRlcihsKTtiW2NdPWx9cmV0dXJuIGx9ZnVuY3Rpb24gTShhLGIpe3RoaXMuaWQ9dSsrO3RoaXMuZnJhZ0lkPWE7dGhpcy52ZXJ0SWQ9Yjt0aGlzLnByb2dyYW09bnVsbDt0aGlzLnVuaWZvcm1zPVtdO3RoaXMuYXR0cmlidXRlcz1bXTtjLnByb2ZpbGUmJih0aGlzLnN0YXRzPXt1bmlmb3Jtc0NvdW50OjAsYXR0cmlidXRlc0NvdW50OjB9KX1cbmZ1bmN0aW9uIHQoZyxtKXt2YXIgbCxyO2w9cCgzNTYzMixnLmZyYWdJZCk7cj1wKDM1NjMzLGcudmVydElkKTt2YXIgdD1nLnByb2dyYW09Zi5jcmVhdGVQcm9ncmFtKCk7Zi5hdHRhY2hTaGFkZXIodCxsKTtmLmF0dGFjaFNoYWRlcih0LHIpO2YubGlua1Byb2dyYW0odCk7dmFyIHk9Zi5nZXRQcm9ncmFtUGFyYW1ldGVyKHQsMzU3MTgpO2MucHJvZmlsZSYmKGcuc3RhdHMudW5pZm9ybXNDb3VudD15KTt2YXIgaD1nLnVuaWZvcm1zO2ZvcihsPTA7bDx5OysrbClpZihyPWYuZ2V0QWN0aXZlVW5pZm9ybSh0LGwpKWlmKDE8ci5zaXplKWZvcih2YXIgQz0wO0M8ci5zaXplOysrQyl7dmFyIEU9ci5uYW1lLnJlcGxhY2UoXCJbMF1cIixcIltcIitDK1wiXVwiKTtiKGgsbmV3IGEoRSx4LmlkKEUpLGYuZ2V0VW5pZm9ybUxvY2F0aW9uKHQsRSkscikpfWVsc2UgYihoLG5ldyBhKHIubmFtZSx4LmlkKHIubmFtZSksZi5nZXRVbmlmb3JtTG9jYXRpb24odCxyLm5hbWUpLHIpKTt5PWYuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0LFxuMzU3MjEpO2MucHJvZmlsZSYmKGcuc3RhdHMuYXR0cmlidXRlc0NvdW50PXkpO2g9Zy5hdHRyaWJ1dGVzO2ZvcihsPTA7bDx5OysrbCkocj1mLmdldEFjdGl2ZUF0dHJpYih0LGwpKSYmYihoLG5ldyBhKHIubmFtZSx4LmlkKHIubmFtZSksZi5nZXRBdHRyaWJMb2NhdGlvbih0LHIubmFtZSkscikpfXZhciB5PXt9LGc9e30sRT17fSxDPVtdLHU9MDtjLnByb2ZpbGUmJihyLmdldE1heFVuaWZvcm1zQ291bnQ9ZnVuY3Rpb24oKXt2YXIgYT0wO0MuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0YXRzLnVuaWZvcm1zQ291bnQ+YSYmKGE9Yi5zdGF0cy51bmlmb3Jtc0NvdW50KX0pO3JldHVybiBhfSxyLmdldE1heEF0dHJpYnV0ZXNDb3VudD1mdW5jdGlvbigpe3ZhciBhPTA7Qy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2Iuc3RhdHMuYXR0cmlidXRlc0NvdW50PmEmJihhPWIuc3RhdHMuYXR0cmlidXRlc0NvdW50KX0pO3JldHVybiBhfSk7cmV0dXJue2NsZWFyOmZ1bmN0aW9uKCl7dmFyIGE9Zi5kZWxldGVTaGFkZXIuYmluZChmKTtcbmwoeSkuZm9yRWFjaChhKTt5PXt9O2woZykuZm9yRWFjaChhKTtnPXt9O0MuZm9yRWFjaChmdW5jdGlvbihhKXtmLmRlbGV0ZVByb2dyYW0oYS5wcm9ncmFtKX0pO0MubGVuZ3RoPTA7RT17fTtyLnNoYWRlckNvdW50PTB9LHByb2dyYW06ZnVuY3Rpb24oYSxiLGMpe3Iuc2hhZGVyQ291bnQrKzt2YXIgZz1FW2JdO2d8fChnPUVbYl09e30pO3ZhciBmPWdbYV07Znx8KGY9bmV3IE0oYixhKSx0KGYsYyksZ1thXT1mLEMucHVzaChmKSk7cmV0dXJuIGZ9LHJlc3RvcmU6ZnVuY3Rpb24oKXt5PXt9O2c9e307Zm9yKHZhciBhPTA7YTxDLmxlbmd0aDsrK2EpdChDW2FdKX0sc2hhZGVyOnAsZnJhZzotMSx2ZXJ0Oi0xfX19LHtcIi4vdXRpbC92YWx1ZXNcIjozMX1dLDE2OltmdW5jdGlvbihmLHAsdSl7cC5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJue2J1ZmZlckNvdW50OjAsZWxlbWVudHNDb3VudDowLGZyYW1lYnVmZmVyQ291bnQ6MCxzaGFkZXJDb3VudDowLHRleHR1cmVDb3VudDowLGN1YmVDb3VudDowLFxucmVuZGVyYnVmZmVyQ291bnQ6MCxtYXhUZXh0dXJlVW5pdHM6MH19fSx7fV0sMTc6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgZj17XCJcIjowfSxrPVtcIlwiXTtyZXR1cm57aWQ6ZnVuY3Rpb24oeCl7dmFyIHI9Zlt4XTtpZihyKXJldHVybiByO3I9Zlt4XT1rLmxlbmd0aDtrLnB1c2goeCk7cmV0dXJuIHJ9LHN0cjpmdW5jdGlvbihmKXtyZXR1cm4ga1tmXX19fX0se31dLDE4OltmdW5jdGlvbihmLHAsdSl7ZnVuY3Rpb24gbChhKXtyZXR1cm4gQXJyYXkuaXNBcnJheShhKSYmKDA9PT1hLmxlbmd0aHx8XCJudW1iZXJcIj09PXR5cGVvZiBhWzBdKX1mdW5jdGlvbiBrKGEpe3JldHVybiBBcnJheS5pc0FycmF5KGEpJiYwIT09YS5sZW5ndGgmJkUoYVswXSk/ITA6ITF9ZnVuY3Rpb24geChhKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfWZ1bmN0aW9uIHIoYSl7aWYoIWEpcmV0dXJuITE7dmFyIGI9eChhKTtyZXR1cm4gMDw9WS5pbmRleE9mKGIpP1xuITA6bChhKXx8ayhhKXx8dChhKX1mdW5jdGlvbiBjKGEsYil7MzYxOTM9PT1hLnR5cGU/KGEuZGF0YT1nKGIpLHkuZnJlZVR5cGUoYikpOmEuZGF0YT1ifWZ1bmN0aW9uIGEoYSxiLGMsZyxmLGspe2E9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBIW2FdP0hbYV06QlthXSpMW2JdO2smJihhKj02KTtpZihmKXtmb3IoZz0wOzE8PWM7KWcrPWEqYypjLGMvPTI7cmV0dXJuIGd9cmV0dXJuIGEqYypnfXZhciBiPWYoXCIuL3V0aWwvZXh0ZW5kXCIpLEY9ZihcIi4vdXRpbC92YWx1ZXNcIiksTT1mKFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCIpLHQ9ZihcIi4vdXRpbC9pcy1uZGFycmF5XCIpLHk9ZihcIi4vdXRpbC9wb29sXCIpLGc9ZihcIi4vdXRpbC90by1oYWxmLWZsb2F0XCIpLEU9ZihcIi4vdXRpbC9pcy1hcnJheS1saWtlXCIpLEM9ZihcIi4vdXRpbC9mbGF0dGVuXCIpO3U9ZihcIi4vY29uc3RhbnRzL2FycmF5dHlwZXMuanNvblwiKTt2YXIgTj1mKFwiLi9jb25zdGFudHMvYXJyYXl0eXBlcy5qc29uXCIpLG49Wzk5ODQsOTk4Nixcbjk5ODUsOTk4N10sbT1bMCw2NDA5LDY0MTAsNjQwNyw2NDA4XSxCPXt9O0JbNjQwOV09Qls2NDA2XT1CWzY0MDJdPTE7QlszNDA0MV09Qls2NDEwXT0yO0JbNjQwN109QlszNTkwNF09MztCWzY0MDhdPUJbMzU5MDZdPTQ7dmFyIFk9T2JqZWN0LmtleXModSkuY29uY2F0KFtcIltvYmplY3QgSFRNTENhbnZhc0VsZW1lbnRdXCIsXCJbb2JqZWN0IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRF1cIixcIltvYmplY3QgSFRNTEltYWdlRWxlbWVudF1cIixcIltvYmplY3QgSFRNTFZpZGVvRWxlbWVudF1cIl0pLEw9W107TFs1MTIxXT0xO0xbNTEyNl09NDtMWzM2MTkzXT0yO0xbNTEyM109MjtMWzUxMjVdPTQ7dmFyIEg9W107SFszMjg1NF09MjtIWzMyODU1XT0yO0hbMzYxOTRdPTI7SFszNDA0MV09NDtIWzMzNzc2XT0uNTtIWzMzNzc3XT0uNTtIWzMzNzc4XT0xO0hbMzM3NzldPTE7SFszNTk4Nl09LjU7SFszNTk4N109MTtIWzM0Nzk4XT0xO0hbMzU4NDBdPS41O0hbMzU4NDFdPS4yNTtIWzM1ODQyXT0uNTtcbkhbMzU4NDNdPS4yNTtIWzM2MTk2XT0uNTtwLmV4cG9ydHM9ZnVuY3Rpb24oaCxmLHAsdSxILEwsWil7ZnVuY3Rpb24gRCgpe3RoaXMuZm9ybWF0PXRoaXMuaW50ZXJuYWxmb3JtYXQ9NjQwODt0aGlzLnR5cGU9NTEyMTt0aGlzLmZsaXBZPXRoaXMucHJlbXVsdGlwbHlBbHBoYT10aGlzLmNvbXByZXNzZWQ9ITE7dGhpcy51bnBhY2tBbGlnbm1lbnQ9MTt0aGlzLmNoYW5uZWxzPXRoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5jb2xvclNwYWNlPTB9ZnVuY3Rpb24gSyhhLGIpe2EuaW50ZXJuYWxmb3JtYXQ9Yi5pbnRlcm5hbGZvcm1hdDthLmZvcm1hdD1iLmZvcm1hdDthLnR5cGU9Yi50eXBlO2EuY29tcHJlc3NlZD1iLmNvbXByZXNzZWQ7YS5wcmVtdWx0aXBseUFscGhhPWIucHJlbXVsdGlwbHlBbHBoYTthLmZsaXBZPWIuZmxpcFk7YS51bnBhY2tBbGlnbm1lbnQ9Yi51bnBhY2tBbGlnbm1lbnQ7YS5jb2xvclNwYWNlPWIuY29sb3JTcGFjZTthLndpZHRoPWIud2lkdGg7YS5oZWlnaHQ9XG5iLmhlaWdodDthLmNoYW5uZWxzPWIuY2hhbm5lbHN9ZnVuY3Rpb24gWShhLGIpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYiYmYil7XCJwcmVtdWx0aXBseUFscGhhXCJpbiBiJiYoYS5wcmVtdWx0aXBseUFscGhhPWIucHJlbXVsdGlwbHlBbHBoYSk7XCJmbGlwWVwiaW4gYiYmKGEuZmxpcFk9Yi5mbGlwWSk7XCJhbGlnbm1lbnRcImluIGImJihhLnVucGFja0FsaWdubWVudD1iLmFsaWdubWVudCk7XCJjb2xvclNwYWNlXCJpbiBiJiYoYS5jb2xvclNwYWNlPXBhW2IuY29sb3JTcGFjZV0pO1widHlwZVwiaW4gYiYmKGEudHlwZT1WW2IudHlwZV0pO3ZhciBjPWEud2lkdGgsZz1hLmhlaWdodCxoPWEuY2hhbm5lbHMsZj0hMTtcInNoYXBlXCJpbiBiPyhjPWIuc2hhcGVbMF0sZz1iLnNoYXBlWzFdLDM9PT1iLnNoYXBlLmxlbmd0aCYmKGg9Yi5zaGFwZVsyXSxmPSEwKSk6KFwicmFkaXVzXCJpbiBiJiYoYz1nPWIucmFkaXVzKSxcIndpZHRoXCJpbiBiJiYoYz1iLndpZHRoKSxcImhlaWdodFwiaW4gYiYmKGc9Yi5oZWlnaHQpLFxuXCJjaGFubmVsc1wiaW4gYiYmKGg9Yi5jaGFubmVscyxmPSEwKSk7YS53aWR0aD1jfDA7YS5oZWlnaHQ9Z3wwO2EuY2hhbm5lbHM9aHwwO2M9ITE7XCJmb3JtYXRcImluIGImJihjPWIuZm9ybWF0LGc9YS5pbnRlcm5hbGZvcm1hdD1YW2NdLGEuZm9ybWF0PVBhW2ddLGMgaW4gViYmIShcInR5cGVcImluIGIpJiYoYS50eXBlPVZbY10pLGMgaW4gVCYmKGEuY29tcHJlc3NlZD0hMCksYz0hMCk7IWYmJmM/YS5jaGFubmVscz1CW2EuZm9ybWF0XTpmJiYhYyYmYS5jaGFubmVscyE9PW1bYS5mb3JtYXRdJiYoYS5mb3JtYXQ9YS5pbnRlcm5hbGZvcm1hdD1tW2EuY2hhbm5lbHNdKX19ZnVuY3Rpb24gdmEoYSl7aC5waXhlbFN0b3JlaSgzNzQ0MCxhLmZsaXBZKTtoLnBpeGVsU3RvcmVpKDM3NDQxLGEucHJlbXVsdGlwbHlBbHBoYSk7aC5waXhlbFN0b3JlaSgzNzQ0MyxhLmNvbG9yU3BhY2UpO2gucGl4ZWxTdG9yZWkoMzMxNyxhLnVucGFja0FsaWdubWVudCl9ZnVuY3Rpb24gcSgpe0QuY2FsbCh0aGlzKTtcbnRoaXMueU9mZnNldD10aGlzLnhPZmZzZXQ9MDt0aGlzLmRhdGE9bnVsbDt0aGlzLm5lZWRzRnJlZT0hMTt0aGlzLmVsZW1lbnQ9bnVsbDt0aGlzLm5lZWRzQ29weT0hMX1mdW5jdGlvbiBTKGEsYil7dmFyIGg9bnVsbDtyKGIpP2g9YjpiJiYoWShhLGIpLFwieFwiaW4gYiYmKGEueE9mZnNldD1iLnh8MCksXCJ5XCJpbiBiJiYoYS55T2Zmc2V0PWIueXwwKSxyKGIuZGF0YSkmJihoPWIuZGF0YSkpO2lmKGIuY29weSl7dmFyIGY9SC52aWV3cG9ydFdpZHRoLG49SC52aWV3cG9ydEhlaWdodDthLndpZHRoPWEud2lkdGh8fGYtYS54T2Zmc2V0O2EuaGVpZ2h0PWEuaGVpZ2h0fHxuLWEueU9mZnNldDthLm5lZWRzQ29weT0hMH1lbHNlIGlmKCFoKWEud2lkdGg9YS53aWR0aHx8MSxhLmhlaWdodD1hLmhlaWdodHx8MSxhLmNoYW5uZWxzPWEuY2hhbm5lbHN8fDQ7ZWxzZSBpZihNKGgpKWEuY2hhbm5lbHM9YS5jaGFubmVsc3x8NCxhLmRhdGE9aCxcInR5cGVcImluIGJ8fDUxMjEhPT1hLnR5cGV8fChhLnR5cGU9XG5OW09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChoKV18MCk7ZWxzZSBpZihsKGgpKXthLmNoYW5uZWxzPWEuY2hhbm5lbHN8fDQ7Zj1oO249Zi5sZW5ndGg7c3dpdGNoKGEudHlwZSl7Y2FzZSA1MTIxOmNhc2UgNTEyMzpjYXNlIDUxMjU6Y2FzZSA1MTI2Om49eS5hbGxvY1R5cGUoYS50eXBlLG4pO24uc2V0KGYpO2EuZGF0YT1uO2JyZWFrO2Nhc2UgMzYxOTM6YS5kYXRhPWcoZil9YS5hbGlnbm1lbnQ9MTthLm5lZWRzRnJlZT0hMH1lbHNlIGlmKHQoaCkpe2Y9aC5kYXRhO0FycmF5LmlzQXJyYXkoZil8fDUxMjEhPT1hLnR5cGV8fChhLnR5cGU9TltPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZildfDApO3ZhciBuPWguc2hhcGUscT1oLnN0cmlkZSxwLEYsZCx2OzM9PT1uLmxlbmd0aD8oZD1uWzJdLHY9cVsyXSk6dj1kPTE7cD1uWzBdO0Y9blsxXTtuPXFbMF07cT1xWzFdO2EuYWxpZ25tZW50PTE7YS53aWR0aD1wO2EuaGVpZ2h0PUY7YS5jaGFubmVscz1kO2EuZm9ybWF0PVxuYS5pbnRlcm5hbGZvcm1hdD1tW2RdO2EubmVlZHNGcmVlPSEwO3A9djtoPWgub2Zmc2V0O2Q9YS53aWR0aDt2PWEuaGVpZ2h0O0Y9YS5jaGFubmVscztmb3IodmFyIHU9eS5hbGxvY1R5cGUoMzYxOTM9PT1hLnR5cGU/NTEyNjphLnR5cGUsZCp2KkYpLEI9MCxBPTA7QTx2OysrQSlmb3IodmFyIEQ9MDtEPGQ7KytEKWZvcih2YXIgdWE9MDt1YTxGOysrdWEpdVtCKytdPWZbbipEK3EqQStwKnVhK2hdO2MoYSx1KX1lbHNlIGlmKFwiW29iamVjdCBIVE1MQ2FudmFzRWxlbWVudF1cIj09PXgoaCl8fFwiW29iamVjdCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRdXCI9PT14KGgpKVwiW29iamVjdCBIVE1MQ2FudmFzRWxlbWVudF1cIj09PXgoaCk/YS5lbGVtZW50PWg6YS5lbGVtZW50PWguY2FudmFzLGEud2lkdGg9YS5lbGVtZW50LndpZHRoLGEuaGVpZ2h0PWEuZWxlbWVudC5oZWlnaHQsYS5jaGFubmVscz00O2Vsc2UgaWYoXCJbb2JqZWN0IEhUTUxJbWFnZUVsZW1lbnRdXCI9PT14KGgpKWEuZWxlbWVudD1cbmgsYS53aWR0aD1oLm5hdHVyYWxXaWR0aCxhLmhlaWdodD1oLm5hdHVyYWxIZWlnaHQsYS5jaGFubmVscz00O2Vsc2UgaWYoXCJbb2JqZWN0IEhUTUxWaWRlb0VsZW1lbnRdXCI9PT14KGgpKWEuZWxlbWVudD1oLGEud2lkdGg9aC52aWRlb1dpZHRoLGEuaGVpZ2h0PWgudmlkZW9IZWlnaHQsYS5jaGFubmVscz00O2Vsc2UgaWYoayhoKSl7Zj1hLndpZHRofHxoWzBdLmxlbmd0aDtuPWEuaGVpZ2h0fHxoLmxlbmd0aDtxPWEuY2hhbm5lbHM7cT1FKGhbMF1bMF0pP3F8fGhbMF1bMF0ubGVuZ3RoOnF8fDE7cD1DLnNoYXBlKGgpO2Q9MTtmb3Iodj0wO3Y8cC5sZW5ndGg7Kyt2KWQqPXBbdl07ZD15LmFsbG9jVHlwZSgzNjE5Mz09PWEudHlwZT81MTI2OmEudHlwZSxkKTtDLmZsYXR0ZW4oaCxwLFwiXCIsZCk7YyhhLGQpO2EuYWxpZ25tZW50PTE7YS53aWR0aD1mO2EuaGVpZ2h0PW47YS5jaGFubmVscz1xO2EuZm9ybWF0PWEuaW50ZXJuYWxmb3JtYXQ9bVtxXTthLm5lZWRzRnJlZT0hMH19ZnVuY3Rpb24gbWEoYSxcbmIsYyxnLGYpe3ZhciBrPWEuZWxlbWVudCxsPWEuZGF0YSxtPWEuaW50ZXJuYWxmb3JtYXQsZD1hLmZvcm1hdCxyPWEudHlwZSxuPWEud2lkdGgscT1hLmhlaWdodDt2YShhKTtrP2gudGV4U3ViSW1hZ2UyRChiLGYsYyxnLGQscixrKTphLmNvbXByZXNzZWQ/aC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChiLGYsYyxnLG0sbixxLGwpOmEubmVlZHNDb3B5Pyh1KCksaC5jb3B5VGV4U3ViSW1hZ2UyRChiLGYsYyxnLGEueE9mZnNldCxhLnlPZmZzZXQsbixxKSk6aC50ZXhTdWJJbWFnZTJEKGIsZixjLGcsbixxLGQscixsKX1mdW5jdGlvbiBnYSgpe3JldHVybiBOYS5wb3AoKXx8bmV3IHF9ZnVuY3Rpb24gVyhhKXthLm5lZWRzRnJlZSYmeS5mcmVlVHlwZShhLmRhdGEpO3EuY2FsbChhKTtOYS5wdXNoKGEpfWZ1bmN0aW9uIFIoKXtELmNhbGwodGhpcyk7dGhpcy5nZW5NaXBtYXBzPSExO3RoaXMubWlwbWFwSGludD00MzUyO3RoaXMubWlwbWFzaz0wO3RoaXMuaW1hZ2VzPUFycmF5KDE2KX1cbmZ1bmN0aW9uIEcoYSxiLGMpe3ZhciBnPWEuaW1hZ2VzWzBdPWdhKCk7YS5taXBtYXNrPTE7Zy53aWR0aD1hLndpZHRoPWI7Zy5oZWlnaHQ9YS5oZWlnaHQ9YztnLmNoYW5uZWxzPWEuY2hhbm5lbHM9NH1mdW5jdGlvbiBiYShhLGIpe3ZhciBjPW51bGw7aWYocihiKSljPWEuaW1hZ2VzWzBdPWdhKCksSyhjLGEpLFMoYyxiKSxhLm1pcG1hc2s9MTtlbHNlIGlmKFkoYSxiKSxBcnJheS5pc0FycmF5KGIubWlwbWFwKSlmb3IodmFyIGc9Yi5taXBtYXAsaD0wO2g8Zy5sZW5ndGg7KytoKWM9YS5pbWFnZXNbaF09Z2EoKSxLKGMsYSksYy53aWR0aD4+PWgsYy5oZWlnaHQ+Pj1oLFMoYyxnW2hdKSxhLm1pcG1hc2t8PTE8PGg7ZWxzZSBjPWEuaW1hZ2VzWzBdPWdhKCksSyhjLGEpLFMoYyxiKSxhLm1pcG1hc2s9MTtLKGEsYS5pbWFnZXNbMF0pfWZ1bmN0aW9uIG5hKGEsYil7Zm9yKHZhciBjPWEuaW1hZ2VzLGc9MDtnPGMubGVuZ3RoJiZjW2ddOysrZyl7dmFyIGY9Y1tnXSxrPWIsbD1nLG09Zi5lbGVtZW50LFxuZD1mLmRhdGEscj1mLmludGVybmFsZm9ybWF0LG49Zi5mb3JtYXQscT1mLnR5cGUsdD1mLndpZHRoLHk9Zi5oZWlnaHQ7dmEoZik7bT9oLnRleEltYWdlMkQoayxsLG4sbixxLG0pOmYuY29tcHJlc3NlZD9oLmNvbXByZXNzZWRUZXhJbWFnZTJEKGssbCxyLHQseSwwLGQpOmYubmVlZHNDb3B5Pyh1KCksaC5jb3B5VGV4SW1hZ2UyRChrLGwsbixmLnhPZmZzZXQsZi55T2Zmc2V0LHQseSwwKSk6aC50ZXhJbWFnZTJEKGssbCxuLHQseSwwLG4scSxkKX19ZnVuY3Rpb24geWEoKXt2YXIgYT1KYS5wb3AoKXx8bmV3IFI7RC5jYWxsKGEpO2Zvcih2YXIgYj1hLm1pcG1hc2s9MDsxNj5iOysrYilhLmltYWdlc1tiXT1udWxsO3JldHVybiBhfWZ1bmN0aW9uIFUoYSl7Zm9yKHZhciBiPWEuaW1hZ2VzLGM9MDtjPGIubGVuZ3RoOysrYyliW2NdJiZXKGJbY10pLGJbY109bnVsbDtKYS5wdXNoKGEpfWZ1bmN0aW9uIGlhKCl7dGhpcy5tYWdGaWx0ZXI9dGhpcy5taW5GaWx0ZXI9OTcyODt0aGlzLndyYXBUPVxudGhpcy53cmFwUz0zMzA3MTt0aGlzLmFuaXNvdHJvcGljPTE7dGhpcy5nZW5NaXBtYXBzPSExO3RoaXMubWlwbWFwSGludD00MzUyfWZ1bmN0aW9uIGthKGEsYil7XCJtaW5cImluIGImJihhLm1pbkZpbHRlcj1RW2IubWluXSwwPD1uLmluZGV4T2YoYS5taW5GaWx0ZXIpJiYoYS5nZW5NaXBtYXBzPSEwKSk7XCJtYWdcImluIGImJihhLm1hZ0ZpbHRlcj1oYVtiLm1hZ10pO3ZhciBjPWEud3JhcFMsZz1hLndyYXBUO2lmKFwid3JhcFwiaW4gYil7dmFyIGg9Yi53cmFwO1wic3RyaW5nXCI9PT10eXBlb2YgaD9jPWc9T1toXTpBcnJheS5pc0FycmF5KGgpJiYoYz1PW2hbMF1dLGc9T1toWzFdXSl9ZWxzZVwid3JhcFNcImluIGImJihjPU9bYi53cmFwU10pLFwid3JhcFRcImluIGImJihnPU9bYi53cmFwVF0pO2Eud3JhcFM9YzthLndyYXBUPWc7XCJhbmlzb3Ryb3BpY1wiaW4gYiYmKGEuYW5pc290cm9waWM9Yi5hbmlzb3Ryb3BpYyk7aWYoXCJtaXBtYXBcImluIGIpe2M9ITE7c3dpdGNoKHR5cGVvZiBiLm1pcG1hcCl7Y2FzZSBcInN0cmluZ1wiOmEubWlwbWFwSGludD1cbmVhW2IubWlwbWFwXTtjPWEuZ2VuTWlwbWFwcz0hMDticmVhaztjYXNlIFwiYm9vbGVhblwiOmM9YS5nZW5NaXBtYXBzPWIubWlwbWFwO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjphLmdlbk1pcG1hcHM9ITEsYz0hMH0hY3x8XCJtaW5cImluIGJ8fChhLm1pbkZpbHRlcj05OTg0KX19ZnVuY3Rpb24gcmEoYSxiKXtoLnRleFBhcmFtZXRlcmkoYiwxMDI0MSxhLm1pbkZpbHRlcik7aC50ZXhQYXJhbWV0ZXJpKGIsMTAyNDAsYS5tYWdGaWx0ZXIpO2gudGV4UGFyYW1ldGVyaShiLDEwMjQyLGEud3JhcFMpO2gudGV4UGFyYW1ldGVyaShiLDEwMjQzLGEud3JhcFQpO2YuZXh0X3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJiZoLnRleFBhcmFtZXRlcmkoYiwzNDA0NixhLmFuaXNvdHJvcGljKTthLmdlbk1pcG1hcHMmJihoLmhpbnQoMzMxNzAsYS5taXBtYXBIaW50KSxoLmdlbmVyYXRlTWlwbWFwKGIpKX1mdW5jdGlvbiBzYShhKXtELmNhbGwodGhpcyk7dGhpcy5taXBtYXNrPTA7dGhpcy5pbnRlcm5hbGZvcm1hdD1cbjY0MDg7dGhpcy5pZD1CYSsrO3RoaXMucmVmQ291bnQ9MTt0aGlzLnRhcmdldD1hO3RoaXMudGV4dHVyZT1oLmNyZWF0ZVRleHR1cmUoKTt0aGlzLnVuaXQ9LTE7dGhpcy5iaW5kQ291bnQ9MDt0aGlzLnRleEluZm89bmV3IGlhO1oucHJvZmlsZSYmKHRoaXMuc3RhdHM9e3NpemU6MH0pfWZ1bmN0aW9uIGRhKGEpe2guYWN0aXZlVGV4dHVyZSgzMzk4NCk7aC5iaW5kVGV4dHVyZShhLnRhcmdldCxhLnRleHR1cmUpfWZ1bmN0aW9uIGphKCl7dmFyIGE9b2FbMF07YT9oLmJpbmRUZXh0dXJlKGEudGFyZ2V0LGEudGV4dHVyZSk6aC5iaW5kVGV4dHVyZSgzNTUzLG51bGwpfWZ1bmN0aW9uIGxhKGEpe3ZhciBiPWEudGV4dHVyZSxjPWEudW5pdCxnPWEudGFyZ2V0OzA8PWMmJihoLmFjdGl2ZVRleHR1cmUoMzM5ODQrYyksaC5iaW5kVGV4dHVyZShnLG51bGwpLG9hW2NdPW51bGwpO2guZGVsZXRlVGV4dHVyZShiKTthLnRleHR1cmU9bnVsbDthLnBhcmFtcz1udWxsO2EucGl4ZWxzPW51bGw7YS5yZWZDb3VudD1cbjA7ZGVsZXRlIGNhW2EuaWRdO0wudGV4dHVyZUNvdW50LS19dmFyIGVhPXtcImRvbid0IGNhcmVcIjo0MzUyLFwiZG9udCBjYXJlXCI6NDM1MixuaWNlOjQzNTQsZmFzdDo0MzUzfSxPPXtyZXBlYXQ6MTA0OTcsY2xhbXA6MzMwNzEsbWlycm9yOjMzNjQ4fSxoYT17bmVhcmVzdDo5NzI4LGxpbmVhcjo5NzI5fSxRPWIoe21pcG1hcDo5OTg3LFwibmVhcmVzdCBtaXBtYXAgbmVhcmVzdFwiOjk5ODQsXCJsaW5lYXIgbWlwbWFwIG5lYXJlc3RcIjo5OTg1LFwibmVhcmVzdCBtaXBtYXAgbGluZWFyXCI6OTk4NixcImxpbmVhciBtaXBtYXAgbGluZWFyXCI6OTk4N30saGEpLHBhPXtub25lOjAsYnJvd3NlcjozNzQ0NH0sVj17dWludDg6NTEyMSxyZ2JhNDozMjgxOSxyZ2I1NjU6MzM2MzUsXCJyZ2I1IGExXCI6MzI4MjB9LFg9e2FscGhhOjY0MDYsbHVtaW5hbmNlOjY0MDksXCJsdW1pbmFuY2UgYWxwaGFcIjo2NDEwLHJnYjo2NDA3LHJnYmE6NjQwOCxyZ2JhNDozMjg1NCxcInJnYjUgYTFcIjozMjg1NSxyZ2I1NjU6MzYxOTR9LFxuVD17fTtmLmV4dF9zcmdiJiYoWC5zcmdiPTM1OTA0LFguc3JnYmE9MzU5MDYpO2Yub2VzX3RleHR1cmVfZmxvYXQmJihWLmZsb2F0MzI9VltcImZsb2F0XCJdPTUxMjYpO2Yub2VzX3RleHR1cmVfaGFsZl9mbG9hdCYmKFYuZmxvYXQxNj1WW1wiaGFsZiBmbG9hdFwiXT0zNjE5Myk7Zi53ZWJnbF9kZXB0aF90ZXh0dXJlJiYoYihYLHtkZXB0aDo2NDAyLFwiZGVwdGggc3RlbmNpbFwiOjM0MDQxfSksYihWLHt1aW50MTY6NTEyMyx1aW50MzI6NTEyNSxcImRlcHRoIHN0ZW5jaWxcIjozNDA0Mn0pKTtmLndlYmdsX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJiZiKFQse1wicmdiIHMzdGMgZHh0MVwiOjMzNzc2LFwicmdiYSBzM3RjIGR4dDFcIjozMzc3NyxcInJnYmEgczN0YyBkeHQzXCI6MzM3NzgsXCJyZ2JhIHMzdGMgZHh0NVwiOjMzNzc5fSk7Zi53ZWJnbF9jb21wcmVzc2VkX3RleHR1cmVfYXRjJiZiKFQse1wicmdiIGF0Y1wiOjM1OTg2LFwicmdiYSBhdGMgZXhwbGljaXQgYWxwaGFcIjozNTk4NyxcInJnYmEgYXRjIGludGVycG9sYXRlZCBhbHBoYVwiOjM0Nzk4fSk7XG5mLndlYmdsX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyYmYihULHtcInJnYiBwdnJ0YyA0YnBwdjFcIjozNTg0MCxcInJnYiBwdnJ0YyAyYnBwdjFcIjozNTg0MSxcInJnYmEgcHZydGMgNGJwcHYxXCI6MzU4NDIsXCJyZ2JhIHB2cnRjIDJicHB2MVwiOjM1ODQzfSk7Zi53ZWJnbF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSYmKFRbXCJyZ2IgZXRjMVwiXT0zNjE5Nik7dmFyIHVhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGguZ2V0UGFyYW1ldGVyKDM0NDY3KSk7T2JqZWN0LmtleXMoVCkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1UW2FdOzA8PXVhLmluZGV4T2YoYikmJihYW2FdPWIpfSk7dmFyIEVhPU9iamVjdC5rZXlzKFgpO3AudGV4dHVyZUZvcm1hdHM9RWE7dmFyIEZhPVtdO09iamVjdC5rZXlzKFgpLmZvckVhY2goZnVuY3Rpb24oYSl7RmFbWFthXV09YX0pO3ZhciBIYT1bXTtPYmplY3Qua2V5cyhWKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0hhW1ZbYV1dPWF9KTt2YXIgSWE9W107T2JqZWN0LmtleXMoaGEpLmZvckVhY2goZnVuY3Rpb24oYSl7SWFbaGFbYV1dPVxuYX0pO3ZhciBDYT1bXTtPYmplY3Qua2V5cyhRKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0NhW1FbYV1dPWF9KTt2YXIgRGE9W107T2JqZWN0LmtleXMoTykuZm9yRWFjaChmdW5jdGlvbihhKXtEYVtPW2FdXT1hfSk7dmFyIFBhPUVhLnJlZHVjZShmdW5jdGlvbihhLGIpe3ZhciBjPVhbYl07NjQwOT09PWN8fDY0MDY9PT1jfHw2NDA5PT09Y3x8NjQxMD09PWN8fDY0MDI9PT1jfHwzNDA0MT09PWM/YVtjXT1jOjMyODU1PT09Y3x8MDw9Yi5pbmRleE9mKFwicmdiYVwiKT9hW2NdPTY0MDg6YVtjXT02NDA3O3JldHVybiBhfSx7fSksTmE9W10sSmE9W10sQmE9MCxjYT17fSx0YT1wLm1heFRleHR1cmVVbml0cyxvYT1BcnJheSh0YSkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9KTtiKHNhLnByb3RvdHlwZSx7YmluZDpmdW5jdGlvbigpe3RoaXMuYmluZENvdW50Kz0xO3ZhciBhPXRoaXMudW5pdDtpZigwPmEpe2Zvcih2YXIgYj0wO2I8dGE7KytiKXt2YXIgYz1vYVtiXTtpZihjKXtpZigwPGMuYmluZENvdW50KWNvbnRpbnVlO1xuYy51bml0PS0xfW9hW2JdPXRoaXM7YT1iO2JyZWFrfVoucHJvZmlsZSYmTC5tYXhUZXh0dXJlVW5pdHM8YSsxJiYoTC5tYXhUZXh0dXJlVW5pdHM9YSsxKTt0aGlzLnVuaXQ9YTtoLmFjdGl2ZVRleHR1cmUoMzM5ODQrYSk7aC5iaW5kVGV4dHVyZSh0aGlzLnRhcmdldCx0aGlzLnRleHR1cmUpfXJldHVybiBhfSx1bmJpbmQ6ZnVuY3Rpb24oKXstLXRoaXMuYmluZENvdW50fSxkZWNSZWY6ZnVuY3Rpb24oKXswPj0tLXRoaXMucmVmQ291bnQmJmxhKHRoaXMpfX0pO1oucHJvZmlsZSYmKEwuZ2V0VG90YWxUZXh0dXJlU2l6ZT1mdW5jdGlvbigpe3ZhciBhPTA7T2JqZWN0LmtleXMoY2EpLmZvckVhY2goZnVuY3Rpb24oYil7YSs9Y2FbYl0uc3RhdHMuc2l6ZX0pO3JldHVybiBhfSk7cmV0dXJue2NyZWF0ZTJEOmZ1bmN0aW9uKGIsYyl7ZnVuY3Rpb24gZyhiLGMpe3ZhciBlPWYudGV4SW5mbztpYS5jYWxsKGUpO3ZhciBoPXlhKCk7XCJudW1iZXJcIj09PXR5cGVvZiBiP1wibnVtYmVyXCI9PT10eXBlb2YgYz9cbkcoaCxifDAsY3wwKTpHKGgsYnwwLGJ8MCk6Yj8oa2EoZSxiKSxiYShoLGIpKTpHKGgsMSwxKTtlLmdlbk1pcG1hcHMmJihoLm1pcG1hc2s9KGgud2lkdGg8PDEpLTEpO2YubWlwbWFzaz1oLm1pcG1hc2s7SyhmLGgpO2YuaW50ZXJuYWxmb3JtYXQ9aC5pbnRlcm5hbGZvcm1hdDtnLndpZHRoPWgud2lkdGg7Zy5oZWlnaHQ9aC5oZWlnaHQ7ZGEoZik7bmEoaCwzNTUzKTtyYShlLDM1NTMpO2phKCk7VShoKTtaLnByb2ZpbGUmJihmLnN0YXRzLnNpemU9YShmLmludGVybmFsZm9ybWF0LGYudHlwZSxoLndpZHRoLGguaGVpZ2h0LGUuZ2VuTWlwbWFwcywhMSkpO2cuZm9ybWF0PUZhW2YuaW50ZXJuYWxmb3JtYXRdO2cudHlwZT1IYVtmLnR5cGVdO2cubWFnPUlhW2UubWFnRmlsdGVyXTtnLm1pbj1DYVtlLm1pbkZpbHRlcl07Zy53cmFwUz1EYVtlLndyYXBTXTtnLndyYXBUPURhW2Uud3JhcFRdO3JldHVybiBnfXZhciBmPW5ldyBzYSgzNTUzKTtjYVtmLmlkXT1mO0wudGV4dHVyZUNvdW50Kys7XG5nKGIsYyk7Zy5zdWJpbWFnZT1mdW5jdGlvbihhLGIsYyxlKXtifD0wO2N8PTA7ZXw9MDt2YXIgZD1nYSgpO0soZCxmKTtkLndpZHRoPTA7ZC5oZWlnaHQ9MDtTKGQsYSk7ZC53aWR0aD1kLndpZHRofHwoZi53aWR0aD4+ZSktYjtkLmhlaWdodD1kLmhlaWdodHx8KGYuaGVpZ2h0Pj5lKS1jO2RhKGYpO21hKGQsMzU1MyxiLGMsZSk7amEoKTtXKGQpO3JldHVybiBnfTtnLnJlc2l6ZT1mdW5jdGlvbihiLGMpe3ZhciBlPWJ8MCxrPWN8MHx8ZTtpZihlPT09Zi53aWR0aCYmaz09PWYuaGVpZ2h0KXJldHVybiBnO2cud2lkdGg9Zi53aWR0aD1lO2cuaGVpZ2h0PWYuaGVpZ2h0PWs7ZGEoZik7Zm9yKHZhciBkPTA7Zi5taXBtYXNrPj5kOysrZCloLnRleEltYWdlMkQoMzU1MyxkLGYuZm9ybWF0LGU+PmQsaz4+ZCwwLGYuZm9ybWF0LGYudHlwZSxudWxsKTtqYSgpO1oucHJvZmlsZSYmKGYuc3RhdHMuc2l6ZT1hKGYuaW50ZXJuYWxmb3JtYXQsZi50eXBlLGUsaywhMSwhMSkpO3JldHVybiBnfTtcbmcuX3JlZ2xUeXBlPVwidGV4dHVyZTJkXCI7Zy5fdGV4dHVyZT1mO1oucHJvZmlsZSYmKGcuc3RhdHM9Zi5zdGF0cyk7Zy5kZXN0cm95PWZ1bmN0aW9uKCl7Zi5kZWNSZWYoKX07cmV0dXJuIGd9LGNyZWF0ZUN1YmU6ZnVuY3Rpb24oYixjLGcsZixrLGwpe2Z1bmN0aW9uIG0oYixjLGUsZyxoLGYpe3ZhciBrLGw9bi50ZXhJbmZvO2lhLmNhbGwobCk7Zm9yKGs9MDs2Pms7KytrKWRba109eWEoKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGJ8fCFiKWZvcihiPWJ8MHx8MSxrPTA7Nj5rOysraylHKGRba10sYixiKTtlbHNlIGlmKFwib2JqZWN0XCI9PT10eXBlb2YgYilpZihjKWJhKGRbMF0sYiksYmEoZFsxXSxjKSxiYShkWzJdLGUpLGJhKGRbM10sZyksYmEoZFs0XSxoKSxiYShkWzVdLGYpO2Vsc2UgaWYoa2EobCxiKSxZKG4sYiksXCJmYWNlc1wiaW4gYilmb3IoYj1iLmZhY2VzLGs9MDs2Pms7KytrKUsoZFtrXSxuKSxiYShkW2tdLGJba10pO2Vsc2UgZm9yKGs9MDs2Pms7KytrKWJhKGRba10sYik7XG5LKG4sZFswXSk7bi5taXBtYXNrPWwuZ2VuTWlwbWFwcz8oZFswXS53aWR0aDw8MSktMTpkWzBdLm1pcG1hc2s7bi5pbnRlcm5hbGZvcm1hdD1kWzBdLmludGVybmFsZm9ybWF0O20ud2lkdGg9ZFswXS53aWR0aDttLmhlaWdodD1kWzBdLmhlaWdodDtkYShuKTtmb3Ioaz0wOzY+azsrK2spbmEoZFtrXSwzNDA2OStrKTtyYShsLDM0MDY3KTtqYSgpO1oucHJvZmlsZSYmKG4uc3RhdHMuc2l6ZT1hKG4uaW50ZXJuYWxmb3JtYXQsbi50eXBlLG0ud2lkdGgsbS5oZWlnaHQsbC5nZW5NaXBtYXBzLCEwKSk7bS5mb3JtYXQ9RmFbbi5pbnRlcm5hbGZvcm1hdF07bS50eXBlPUhhW24udHlwZV07bS5tYWc9SWFbbC5tYWdGaWx0ZXJdO20ubWluPUNhW2wubWluRmlsdGVyXTttLndyYXBTPURhW2wud3JhcFNdO20ud3JhcFQ9RGFbbC53cmFwVF07Zm9yKGs9MDs2Pms7KytrKVUoZFtrXSk7cmV0dXJuIG19dmFyIG49bmV3IHNhKDM0MDY3KTtjYVtuLmlkXT1uO0wuY3ViZUNvdW50Kys7dmFyIGQ9QXJyYXkoNik7XG5tKGIsYyxnLGYsayxsKTttLnN1YmltYWdlPWZ1bmN0aW9uKGEsYixjLGQsZSl7Y3w9MDtkfD0wO2V8PTA7dmFyIGc9Z2EoKTtLKGcsbik7Zy53aWR0aD0wO2cuaGVpZ2h0PTA7UyhnLGIpO2cud2lkdGg9Zy53aWR0aHx8KG4ud2lkdGg+PmUpLWM7Zy5oZWlnaHQ9Zy5oZWlnaHR8fChuLmhlaWdodD4+ZSktZDtkYShuKTttYShnLDM0MDY5K2EsYyxkLGUpO2phKCk7VyhnKTtyZXR1cm4gbX07bS5yZXNpemU9ZnVuY3Rpb24oYil7Ynw9MDtpZihiIT09bi53aWR0aCl7bS53aWR0aD1uLndpZHRoPWI7bS5oZWlnaHQ9bi5oZWlnaHQ9YjtkYShuKTtmb3IodmFyIGM9MDs2PmM7KytjKWZvcih2YXIgZD0wO24ubWlwbWFzaz4+ZDsrK2QpaC50ZXhJbWFnZTJEKDM0MDY5K2MsZCxuLmZvcm1hdCxiPj5kLGI+PmQsMCxuLmZvcm1hdCxuLnR5cGUsbnVsbCk7amEoKTtaLnByb2ZpbGUmJihuLnN0YXRzLnNpemU9YShuLmludGVybmFsZm9ybWF0LG4udHlwZSxtLndpZHRoLG0uaGVpZ2h0LCExLCEwKSk7XG5yZXR1cm4gbX19O20uX3JlZ2xUeXBlPVwidGV4dHVyZUN1YmVcIjttLl90ZXh0dXJlPW47Wi5wcm9maWxlJiYobS5zdGF0cz1uLnN0YXRzKTttLmRlc3Ryb3k9ZnVuY3Rpb24oKXtuLmRlY1JlZigpfTtyZXR1cm4gbX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRhOysrYSloLmFjdGl2ZVRleHR1cmUoMzM5ODQrYSksaC5iaW5kVGV4dHVyZSgzNTUzLG51bGwpLG9hW2FdPW51bGw7RihjYSkuZm9yRWFjaChsYSk7TC5jdWJlQ291bnQ9MDtMLnRleHR1cmVDb3VudD0wfSxnZXRUZXh0dXJlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsfSxyZXN0b3JlOmZ1bmN0aW9uKCl7RihjYSkuZm9yRWFjaChmdW5jdGlvbihhKXthLnRleHR1cmU9aC5jcmVhdGVUZXh0dXJlKCk7aC5iaW5kVGV4dHVyZShhLnRhcmdldCxhLnRleHR1cmUpO2Zvcih2YXIgYj0wOzMyPmI7KytiKWlmKDAhPT0oYS5taXBtYXNrJjE8PGIpKWlmKDM1NTM9PT1hLnRhcmdldCloLnRleEltYWdlMkQoMzU1MyxiLGEuaW50ZXJuYWxmb3JtYXQsXG5hLndpZHRoPj5iLGEuaGVpZ2h0Pj5iLDAsYS5pbnRlcm5hbGZvcm1hdCxhLnR5cGUsbnVsbCk7ZWxzZSBmb3IodmFyIGM9MDs2PmM7KytjKWgudGV4SW1hZ2UyRCgzNDA2OStjLGIsYS5pbnRlcm5hbGZvcm1hdCxhLndpZHRoPj5iLGEuaGVpZ2h0Pj5iLDAsYS5pbnRlcm5hbGZvcm1hdCxhLnR5cGUsbnVsbCk7cmEoYS50ZXhJbmZvLGEudGFyZ2V0KX0pfX19fSx7XCIuL2NvbnN0YW50cy9hcnJheXR5cGVzLmpzb25cIjozLFwiLi91dGlsL2V4dGVuZFwiOjIyLFwiLi91dGlsL2ZsYXR0ZW5cIjoyMyxcIi4vdXRpbC9pcy1hcnJheS1saWtlXCI6MjQsXCIuL3V0aWwvaXMtbmRhcnJheVwiOjI1LFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCI6MjYsXCIuL3V0aWwvcG9vbFwiOjI4LFwiLi91dGlsL3RvLWhhbGYtZmxvYXRcIjozMCxcIi4vdXRpbC92YWx1ZXNcIjozMX1dLDE5OltmdW5jdGlvbihmLHAsdSl7cC5leHBvcnRzPWZ1bmN0aW9uKGYsayl7ZnVuY3Rpb24gcCgpe3RoaXMuZW5kUXVlcnlJbmRleD10aGlzLnN0YXJ0UXVlcnlJbmRleD1cbi0xO3RoaXMuc3VtPTA7dGhpcy5zdGF0cz1udWxsfWZ1bmN0aW9uIHIoYSxiLGMpe3ZhciBmPUYucG9wKCl8fG5ldyBwO2Yuc3RhcnRRdWVyeUluZGV4PWE7Zi5lbmRRdWVyeUluZGV4PWI7Zi5zdW09MDtmLnN0YXRzPWM7dS5wdXNoKGYpfXZhciBjPWsuZXh0X2Rpc2pvaW50X3RpbWVyX3F1ZXJ5O2lmKCFjKXJldHVybiBudWxsO3ZhciBhPVtdLGI9W10sRj1bXSx1PVtdLHQ9W10seT1bXTtyZXR1cm57YmVnaW5RdWVyeTpmdW5jdGlvbihnKXt2YXIgZj1hLnBvcCgpfHxjLmNyZWF0ZVF1ZXJ5RVhUKCk7Yy5iZWdpblF1ZXJ5RVhUKDM1MDA3LGYpO2IucHVzaChmKTtyKGIubGVuZ3RoLTEsYi5sZW5ndGgsZyl9LGVuZFF1ZXJ5OmZ1bmN0aW9uKCl7Yy5lbmRRdWVyeUVYVCgzNTAwNyl9LHB1c2hTY29wZVN0YXRzOnIsdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGcsZjtnPWIubGVuZ3RoO2lmKDAhPT1nKXt5Lmxlbmd0aD1NYXRoLm1heCh5Lmxlbmd0aCxnKzEpO3QubGVuZ3RoPU1hdGgubWF4KHQubGVuZ3RoLFxuZysxKTt0WzBdPTA7dmFyIGs9eVswXT0wO2ZvcihmPWc9MDtmPGIubGVuZ3RoOysrZil7dmFyIGw9YltmXTtjLmdldFF1ZXJ5T2JqZWN0RVhUKGwsMzQ5MTkpPyhrKz1jLmdldFF1ZXJ5T2JqZWN0RVhUKGwsMzQ5MTgpLGEucHVzaChsKSk6YltnKytdPWw7dFtmKzFdPWs7eVtmKzFdPWd9Yi5sZW5ndGg9Zztmb3IoZj1nPTA7Zjx1Lmxlbmd0aDsrK2Ype3ZhciBrPXVbZl0sbj1rLnN0YXJ0UXVlcnlJbmRleCxsPWsuZW5kUXVlcnlJbmRleDtrLnN1bSs9dFtsXS10W25dO249eVtuXTtsPXlbbF07bD09PW4/KGsuc3RhdHMuZ3B1VGltZSs9ay5zdW0vMUU2LEYucHVzaChrKSk6KGsuc3RhcnRRdWVyeUluZGV4PW4say5lbmRRdWVyeUluZGV4PWwsdVtnKytdPWspfXUubGVuZ3RoPWd9fSxnZXROdW1QZW5kaW5nUXVlcmllczpmdW5jdGlvbigpe3JldHVybiBiLmxlbmd0aH0sY2xlYXI6ZnVuY3Rpb24oKXthLnB1c2guYXBwbHkoYSxiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyljLmRlbGV0ZVF1ZXJ5RVhUKGFbZ10pO1xuYi5sZW5ndGg9MDthLmxlbmd0aD0wfSxyZXN0b3JlOmZ1bmN0aW9uKCl7Yi5sZW5ndGg9MDthLmxlbmd0aD0wfX19fSx7fV0sMjA6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P2Z1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX19LHt9XSwyMTpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoZil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGYpfWZ1bmN0aW9uIGsoZil7cmV0dXJuIGwoZikuam9pbihcIlwiKX12YXIgeD1mKFwiLi9leHRlbmRcIik7cC5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZigpe3ZhciBiPVtdLGM9W107cmV0dXJuIHgoZnVuY3Rpb24oKXtiLnB1c2guYXBwbHkoYixsKGFyZ3VtZW50cykpfSx7ZGVmOmZ1bmN0aW9uKCl7dmFyIGY9XCJ2XCIrYSsrO2MucHVzaChmKTswPGFyZ3VtZW50cy5sZW5ndGgmJlxuKGIucHVzaChmLFwiPVwiKSxiLnB1c2guYXBwbHkoYixsKGFyZ3VtZW50cykpLGIucHVzaChcIjtcIikpO3JldHVybiBmfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiBrKFswPGMubGVuZ3RoP1widmFyIFwiK2MrXCI7XCI6XCJcIixrKGIpXSl9fSl9ZnVuY3Rpb24gYygpe2Z1bmN0aW9uIGEoZixrKXtjKGYsayxcIj1cIixiLmRlZihmLGspLFwiO1wiKX12YXIgYj1mKCksYz1mKCksaz1iLnRvU3RyaW5nLHQ9Yy50b1N0cmluZztyZXR1cm4geChmdW5jdGlvbigpe2IuYXBwbHkoYixsKGFyZ3VtZW50cykpfSx7ZGVmOmIuZGVmLGVudHJ5OmIsZXhpdDpjLHNhdmU6YSxzZXQ6ZnVuY3Rpb24oYyxmLGspe2EoYyxmKTtiKGMsZixcIj1cIixrLFwiO1wiKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gaygpK3QoKX19KX12YXIgYT0wLGI9W10scD1bXSx1PWYoKSx0PXt9O3JldHVybntnbG9iYWw6dSxsaW5rOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZz0wO2c8cC5sZW5ndGg7KytnKWlmKHBbZ109PT1jKXJldHVybiBiW2ddO1xuZz1cImdcIithKys7Yi5wdXNoKGcpO3AucHVzaChjKTtyZXR1cm4gZ30sYmxvY2s6Zixwcm9jOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZigpe3ZhciBhPVwiYVwiK2wubGVuZ3RoO2wucHVzaChhKTtyZXR1cm4gYX12YXIgbD1bXTtiPWJ8fDA7Zm9yKHZhciByPTA7cjxiOysrcilmKCk7dmFyIHI9YygpLG49ci50b1N0cmluZztyZXR1cm4gdFthXT14KHIse2FyZzpmLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIGsoW1wiZnVuY3Rpb24oXCIsbC5qb2luKCksXCIpe1wiLG4oKSxcIn1cIl0pfX0pfSxzY29wZTpjLGNvbmQ6ZnVuY3Rpb24oKXt2YXIgYT1rKGFyZ3VtZW50cyksYj1jKCksZj1jKCkscj1iLnRvU3RyaW5nLHQ9Zi50b1N0cmluZztyZXR1cm4geChiLHt0aGVuOmZ1bmN0aW9uKCl7Yi5hcHBseShiLGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LFwiZWxzZVwiOmZ1bmN0aW9uKCl7Zi5hcHBseShmLGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGI9XG50KCk7YiYmKGI9XCJlbHNle1wiK2IrXCJ9XCIpO3JldHVybiBrKFtcImlmKFwiLGEsXCIpe1wiLHIoKSxcIn1cIixiXSl9fSl9LGNvbXBpbGU6ZnVuY3Rpb24oKXt2YXIgYT1bJ1widXNlIHN0cmljdFwiOycsdSxcInJldHVybiB7XCJdO09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24oYil7YS5wdXNoKCdcIicsYiwnXCI6Jyx0W2JdLnRvU3RyaW5nKCksXCIsXCIpfSk7YS5wdXNoKFwifVwiKTt2YXIgYz1rKGEpLnJlcGxhY2UoLzsvZyxcIjtcXG5cIikucmVwbGFjZSgvfS9nLFwifVxcblwiKS5yZXBsYWNlKC97L2csXCJ7XFxuXCIpO3JldHVybiBGdW5jdGlvbi5hcHBseShudWxsLGIuY29uY2F0KGMpKS5hcHBseShudWxsLHApfX19fSx7XCIuL2V4dGVuZFwiOjIyfV0sMjI6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9ZnVuY3Rpb24oZixrKXtmb3IodmFyIHA9T2JqZWN0LmtleXMoaykscj0wO3I8cC5sZW5ndGg7KytyKWZbcFtyXV09a1twW3JdXTtyZXR1cm4gZn19LHt9XSwyMzpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoZixcbmMsYSxiLGssbCl7Zm9yKHZhciB0PTA7dDxjOysrdClmb3IodmFyIHA9Zlt0XSxnPTA7ZzxhOysrZylmb3IodmFyIHg9cFtnXSx1PTA7dTxiOysrdSlrW2wrK109eFt1XX1mdW5jdGlvbiBrKGYsYyxhLGIscCl7Zm9yKHZhciB4PTEsdD1hKzE7dDxjLmxlbmd0aDsrK3QpeCo9Y1t0XTt2YXIgeT1jW2FdO2lmKDQ9PT1jLmxlbmd0aC1hKXt2YXIgZz1jW2ErMV0sdT1jW2ErMl07Yz1jW2ErM107Zm9yKHQ9MDt0PHk7Kyt0KWwoZlt0XSxnLHUsYyxiLHApLHArPXh9ZWxzZSBmb3IodD0wO3Q8eTsrK3QpayhmW3RdLGMsYSsxLGIscCkscCs9eH12YXIgeD1mKFwiLi9wb29sXCIpO3AuZXhwb3J0cz17c2hhcGU6ZnVuY3Rpb24oZil7Zm9yKHZhciBjPVtdO2YubGVuZ3RoO2Y9ZlswXSljLnB1c2goZi5sZW5ndGgpO3JldHVybiBjfSxmbGF0dGVuOmZ1bmN0aW9uKGYsYyxhLGIpe3ZhciBwPTE7aWYoYy5sZW5ndGgpZm9yKHZhciB1PTA7dTxjLmxlbmd0aDsrK3UpcCo9Y1t1XTtlbHNlIHA9MDthPWJ8fFxueC5hbGxvY1R5cGUoYSxwKTtzd2l0Y2goYy5sZW5ndGgpe2Nhc2UgMDpicmVhaztjYXNlIDE6Yj1jWzBdO2ZvcihjPTA7YzxiOysrYylhW2NdPWZbY107YnJlYWs7Y2FzZSAyOmI9Y1swXTtjPWNbMV07Zm9yKHU9cD0wO3U8YjsrK3UpZm9yKHZhciB0PWZbdV0seT0wO3k8YzsrK3kpYVtwKytdPXRbeV07YnJlYWs7Y2FzZSAzOmwoZixjWzBdLGNbMV0sY1syXSxhLDApO2JyZWFrO2RlZmF1bHQ6ayhmLGMsMCxhLDApfXJldHVybiBhfX19LHtcIi4vcG9vbFwiOjI4fV0sMjQ6W2Z1bmN0aW9uKGYscCx1KXt2YXIgbD1mKFwiLi9pcy10eXBlZC1hcnJheVwiKTtwLmV4cG9ydHM9ZnVuY3Rpb24oZil7cmV0dXJuIEFycmF5LmlzQXJyYXkoZil8fGwoZil9fSx7XCIuL2lzLXR5cGVkLWFycmF5XCI6MjZ9XSwyNTpbZnVuY3Rpb24oZixwLHUpe3ZhciBsPWYoXCIuL2lzLXR5cGVkLWFycmF5XCIpO3AuZXhwb3J0cz1mdW5jdGlvbihmKXtyZXR1cm4hIWYmJlwib2JqZWN0XCI9PT10eXBlb2YgZiYmQXJyYXkuaXNBcnJheShmLnNoYXBlKSYmXG5BcnJheS5pc0FycmF5KGYuc3RyaWRlKSYmXCJudW1iZXJcIj09PXR5cGVvZiBmLm9mZnNldCYmZi5zaGFwZS5sZW5ndGg9PT1mLnN0cmlkZS5sZW5ndGgmJihBcnJheS5pc0FycmF5KGYuZGF0YSl8fGwoZi5kYXRhKSl9fSx7XCIuL2lzLXR5cGVkLWFycmF5XCI6MjZ9XSwyNjpbZnVuY3Rpb24oZixwLHUpe3ZhciBsPWYoXCIuLi9jb25zdGFudHMvYXJyYXl0eXBlcy5qc29uXCIpO3AuZXhwb3J0cz1mdW5jdGlvbihmKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGYpaW4gbH19LHtcIi4uL2NvbnN0YW50cy9hcnJheXR5cGVzLmpzb25cIjozfV0sMjc6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9ZnVuY3Rpb24oZixrKXtmb3IodmFyIHA9QXJyYXkoZikscj0wO3I8ZjsrK3IpcFtyXT1rKHIpO3JldHVybiBwfX0se31dLDI4OltmdW5jdGlvbihmLHAsdSl7ZnVuY3Rpb24gbChjKXt2YXIgYSxiO2E9KDY1NTM1PGMpPDw0O2M+Pj49YTtiPSgyNTU8Yyk8PDM7Yz4+Pj1iO2F8PVxuYjtiPSgxNTxjKTw8MjtjPj4+PWI7YXw9YjtiPSgzPGMpPDwxO3JldHVybiBhfGJ8Yz4+PmI+PjF9ZnVuY3Rpb24gayhjKXthOntmb3IodmFyIGE9MTY7MjY4NDM1NDU2Pj1hO2EqPTE2KWlmKGM8PWEpe2M9YTticmVhayBhfWM9MH1hPXJbbChjKT4+Ml07cmV0dXJuIDA8YS5sZW5ndGg/YS5wb3AoKTpuZXcgQXJyYXlCdWZmZXIoYyl9ZnVuY3Rpb24geChjKXtyW2woYy5ieXRlTGVuZ3RoKT4+Ml0ucHVzaChjKX12YXIgcj1mKFwiLi9sb29wXCIpKDgsZnVuY3Rpb24oKXtyZXR1cm5bXX0pO3AuZXhwb3J0cz17YWxsb2M6ayxmcmVlOngsYWxsb2NUeXBlOmZ1bmN0aW9uKGMsYSl7dmFyIGI9bnVsbDtzd2l0Y2goYyl7Y2FzZSA1MTIwOmI9bmV3IEludDhBcnJheShrKGEpLDAsYSk7YnJlYWs7Y2FzZSA1MTIxOmI9bmV3IFVpbnQ4QXJyYXkoayhhKSwwLGEpO2JyZWFrO2Nhc2UgNTEyMjpiPW5ldyBJbnQxNkFycmF5KGsoMiphKSwwLGEpO2JyZWFrO2Nhc2UgNTEyMzpiPW5ldyBVaW50MTZBcnJheShrKDIqXG5hKSwwLGEpO2JyZWFrO2Nhc2UgNTEyNDpiPW5ldyBJbnQzMkFycmF5KGsoNCphKSwwLGEpO2JyZWFrO2Nhc2UgNTEyNTpiPW5ldyBVaW50MzJBcnJheShrKDQqYSksMCxhKTticmVhaztjYXNlIDUxMjY6Yj1uZXcgRmxvYXQzMkFycmF5KGsoNCphKSwwLGEpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIG51bGx9cmV0dXJuIGIubGVuZ3RoIT09YT9iLnN1YmFycmF5KDAsYSk6Yn0sZnJlZVR5cGU6ZnVuY3Rpb24oYyl7eChjLmJ1ZmZlcil9fX0se1wiLi9sb29wXCI6Mjd9XSwyOTpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz1cImZ1bmN0aW9uXCI9PT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWU/e25leHQ6ZnVuY3Rpb24oZil7cmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShmKX0sY2FuY2VsOmZ1bmN0aW9uKGYpe3JldHVybiBjYW5jZWxBbmltYXRpb25GcmFtZShmKX19OntuZXh0OmZ1bmN0aW9uKGYpe3JldHVybiBzZXRUaW1lb3V0KGYsXG4xNil9LGNhbmNlbDpjbGVhclRpbWVvdXR9fSx7fV0sMzA6W2Z1bmN0aW9uKGYscCx1KXt2YXIgbD1mKFwiLi9wb29sXCIpLGs9bmV3IEZsb2F0MzJBcnJheSgxKSx4PW5ldyBVaW50MzJBcnJheShrLmJ1ZmZlcik7cC5leHBvcnRzPWZ1bmN0aW9uKGYpe2Zvcih2YXIgYz1sLmFsbG9jVHlwZSg1MTIzLGYubGVuZ3RoKSxhPTA7YTxmLmxlbmd0aDsrK2EpaWYoaXNOYU4oZlthXSkpY1thXT02NTUzNTtlbHNlIGlmKEluZmluaXR5PT09ZlthXSljW2FdPTMxNzQ0O2Vsc2UgaWYoLUluZmluaXR5PT09ZlthXSljW2FdPTY0NTEyO2Vsc2V7a1swXT1mW2FdO3ZhciBiPXhbMF0scD1iPj4+MzE8PDE1LHU9KGI8PDE+Pj4yNCktMTI3LGI9Yj4+MTMmMTAyMztjW2FdPS0yND51P3A6LTE0PnU/cCsoYisxMDI0Pj4tMTQtdSk6MTU8dT9wKzMxNzQ0OnArKHUrMTU8PDEwKStifXJldHVybiBjfX0se1wiLi9wb29sXCI6Mjh9XSwzMTpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz1mdW5jdGlvbihmKXtyZXR1cm4gT2JqZWN0LmtleXMoZikubWFwKGZ1bmN0aW9uKGspe3JldHVybiBmW2tdfSl9fSxcbnt9XSwzMjpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoYSxiLGYpe2Z1bmN0aW9uIGsoKXt2YXIgYj13aW5kb3cuaW5uZXJXaWR0aCxnPXdpbmRvdy5pbm5lckhlaWdodDthIT09ZG9jdW1lbnQuYm9keSYmKGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxiPWcucmlnaHQtZy5sZWZ0LGc9Zy50b3AtZy5ib3R0b20pO2wud2lkdGg9ZipiO2wuaGVpZ2h0PWYqZztjKGwuc3R5bGUse3dpZHRoOmIrXCJweFwiLGhlaWdodDpnK1wicHhcIn0pfXZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7YyhsLnN0eWxlLHtib3JkZXI6MCxtYXJnaW46MCxwYWRkaW5nOjAsdG9wOjAsbGVmdDowfSk7YS5hcHBlbmRDaGlsZChsKTthPT09ZG9jdW1lbnQuYm9keSYmKGwuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLGMoYS5zdHlsZSx7bWFyZ2luOjAscGFkZGluZzowfSkpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsaywhMSk7aygpO3JldHVybntjYW52YXM6bCxvbkRlc3Ryb3k6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLFxuayk7YS5yZW1vdmVDaGlsZChsKX19fWZ1bmN0aW9uIGsoYSxiKXtmdW5jdGlvbiBjKGYpe3RyeXtyZXR1cm4gYS5nZXRDb250ZXh0KGYsYil9Y2F0Y2goayl7cmV0dXJuIG51bGx9fXJldHVybiBjKFwid2ViZ2xcIil8fGMoXCJleHBlcmltZW50YWwtd2ViZ2xcIil8fGMoXCJ3ZWJnbC1leHBlcmltZW50YWxcIil9ZnVuY3Rpb24geChhKXtyZXR1cm5cInN0cmluZ1wiPT09dHlwZW9mIGE/YS5zcGxpdCgpOmF9ZnVuY3Rpb24gcihhKXtyZXR1cm5cInN0cmluZ1wiPT09dHlwZW9mIGE/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhKTphfXZhciBjPWYoXCIuL3V0aWwvZXh0ZW5kXCIpO3AuZXhwb3J0cz1mdW5jdGlvbihhKXt2YXIgYj1hfHx7fSxjLGYscCx1O2E9e307dmFyIGc9W10sRT1bXSxDPVwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93PzE6d2luZG93LmRldmljZVBpeGVsUmF0aW8sTj0hMSxuPWZ1bmN0aW9uKGEpe30sbT1mdW5jdGlvbigpe307XCJzdHJpbmdcIj09PXR5cGVvZiBiP2M9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihiKTpcblwib2JqZWN0XCI9PT10eXBlb2YgYiYmKFwic3RyaW5nXCI9PT10eXBlb2YgYi5ub2RlTmFtZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIuYXBwZW5kQ2hpbGQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD9jPWI6XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuZHJhd0FycmF5c3x8XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuZHJhd0VsZW1lbnRzPyh1PWIscD11LmNhbnZhcyk6KFwiZ2xcImluIGI/dT1iLmdsOlwiY2FudmFzXCJpbiBiP3A9cihiLmNhbnZhcyk6XCJjb250YWluZXJcImluIGImJihmPXIoYi5jb250YWluZXIpKSxcImF0dHJpYnV0ZXNcImluIGImJihhPWIuYXR0cmlidXRlcyksXCJleHRlbnNpb25zXCJpbiBiJiYoZz14KGIuZXh0ZW5zaW9ucykpLFwib3B0aW9uYWxFeHRlbnNpb25zXCJpbiBiJiYoRT14KGIub3B0aW9uYWxFeHRlbnNpb25zKSksXCJvbkRvbmVcImluIGImJihuPWIub25Eb25lKSxcInByb2ZpbGVcImluIGImJihOPSEhYi5wcm9maWxlKSxcInBpeGVsUmF0aW9cImluIGImJlxuKEM9K2IucGl4ZWxSYXRpbykpKTtjJiYoXCJjYW52YXNcIj09PWMubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9wPWM6Zj1jKTtpZighdSl7aWYoIXApe2M9bChmfHxkb2N1bWVudC5ib2R5LG4sQyk7aWYoIWMpcmV0dXJuIG51bGw7cD1jLmNhbnZhczttPWMub25EZXN0cm95fXU9ayhwLGEpfXJldHVybiB1P3tnbDp1LGNhbnZhczpwLGNvbnRhaW5lcjpmLGV4dGVuc2lvbnM6ZyxvcHRpb25hbEV4dGVuc2lvbnM6RSxwaXhlbFJhdGlvOkMscHJvZmlsZTpOLG9uRG9uZTpuLG9uRGVzdHJveTptfToobSgpLG4oXCJ3ZWJnbCBub3Qgc3VwcG9ydGVkLCB0cnkgdXBncmFkaW5nIHlvdXIgYnJvd3NlciBvciBncmFwaGljcyBkcml2ZXJzIGh0dHA6Ly9nZXQud2ViZ2wub3JnXCIpLG51bGwpfX0se1wiLi91dGlsL2V4dGVuZFwiOjIyfV0sMzM6W2Z1bmN0aW9uKGYscCx1KXtmdW5jdGlvbiBsKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDsrK2MpaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9dmFyIGs9XG5mKFwiLi9saWIvdXRpbC9leHRlbmRcIikseD1mKFwiLi9saWIvZHluYW1pY1wiKSxyPWYoXCIuL2xpYi91dGlsL3JhZlwiKSxjPWYoXCIuL2xpYi91dGlsL2Nsb2NrXCIpLGE9ZihcIi4vbGliL3N0cmluZ3NcIiksYj1mKFwiLi9saWIvd2ViZ2xcIiksRj1mKFwiLi9saWIvZXh0ZW5zaW9uXCIpLE09ZihcIi4vbGliL2xpbWl0c1wiKSx0PWYoXCIuL2xpYi9idWZmZXJcIikseT1mKFwiLi9saWIvZWxlbWVudHNcIiksZz1mKFwiLi9saWIvdGV4dHVyZVwiKSxFPWYoXCIuL2xpYi9yZW5kZXJidWZmZXJcIiksQz1mKFwiLi9saWIvZnJhbWVidWZmZXJcIiksTj1mKFwiLi9saWIvYXR0cmlidXRlXCIpLG49ZihcIi4vbGliL3NoYWRlclwiKSxtPWYoXCIuL2xpYi9yZWFkXCIpLEI9ZihcIi4vbGliL2NvcmVcIiksWT1mKFwiLi9saWIvc3RhdHNcIiksTD1mKFwiLi9saWIvdGltZXJcIik7cC5leHBvcnRzPWZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgoKXtpZigwPT09US5sZW5ndGgpRyYmRy51cGRhdGUoKSxUPW51bGw7ZWxzZXtUPXIubmV4dChoKTtLKCk7Zm9yKHZhciBhPVxuUS5sZW5ndGgtMTswPD1hOy0tYSl7dmFyIGI9UVthXTtiJiZiKFUsbnVsbCwwKX1xLmZsdXNoKCk7RyYmRy51cGRhdGUoKX19ZnVuY3Rpb24gcCgpeyFUJiYwPFEubGVuZ3RoJiYoVD1yLm5leHQoaCkpfWZ1bmN0aW9uIHUoKXtUJiYoci5jYW5jZWwoaCksVD1udWxsKX1mdW5jdGlvbiBMYShhKXthLnByZXZlbnREZWZhdWx0KCk7dSgpO3BhLmZvckVhY2goZnVuY3Rpb24oYSl7YSgpfSl9ZnVuY3Rpb24gemEoYSl7cS5nZXRFcnJvcigpO21hLnJlc3RvcmUoKTtzYS5yZXN0b3JlKCk7a2EucmVzdG9yZSgpO2RhLnJlc3RvcmUoKTtqYS5yZXN0b3JlKCk7bGEucmVzdG9yZSgpO0cmJkcucmVzdG9yZSgpO2VhLnByb2NzLnJlZnJlc2goKTtwKCk7Vi5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pfWZ1bmN0aW9uIEdhKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9e30sZj17fTtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBnPWFbYl07eC5pc0R5bmFtaWMoZyk/ZltiXT14LnVuYm94KGcsXG5iKTpjW2JdPWd9KTtyZXR1cm57ZHluYW1pYzpmLFwic3RhdGljXCI6Y319ZnVuY3Rpb24gYyhhKXtmb3IoO3EubGVuZ3RoPGE7KXEucHVzaChudWxsKTtyZXR1cm4gcX12YXIgZj1iKGEuY29udGV4dHx8e30pLGc9YihhLnVuaWZvcm1zfHx7fSksaD1iKGEuYXR0cmlidXRlc3x8e30pLGw9YihmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe2lmKGEgaW4gYyl7dmFyIGY9Y1thXTtkZWxldGUgY1thXTtPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2NbYStcIi5cIitiXT1mW2JdfSl9fXZhciBjPWsoe30sYSk7ZGVsZXRlIGMudW5pZm9ybXM7ZGVsZXRlIGMuYXR0cmlidXRlcztkZWxldGUgYy5jb250ZXh0O1wic3RlbmNpbFwiaW4gYyYmYy5zdGVuY2lsLm9wJiYoYy5zdGVuY2lsLm9wQmFjaz1jLnN0ZW5jaWwub3BGcm9udD1jLnN0ZW5jaWwub3AsZGVsZXRlIGMuc3RlbmNpbC5vcCk7YihcImJsZW5kXCIpO2IoXCJkZXB0aFwiKTtiKFwiY3VsbFwiKTtiKFwic3RlbmNpbFwiKTtiKFwicG9seWdvbk9mZnNldFwiKTtcbmIoXCJzY2lzc29yXCIpO2IoXCJzYW1wbGVcIik7cmV0dXJuIGN9KGEpKTthPXtncHVUaW1lOjAsY3B1VGltZTowLGNvdW50OjB9O3ZhciBmPWVhLmNvbXBpbGUobCxoLGcsZixhKSxtPWYuZHJhdyxuPWYuYmF0Y2gscD1mLnNjb3BlLHE9W107cmV0dXJuIGsoZnVuY3Rpb24oYSxiKXt2YXIgZjtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gcC5jYWxsKHRoaXMsbnVsbCxhLDApO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKWlmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlmb3IoZj0wO2Y8YTsrK2YpcC5jYWxsKHRoaXMsbnVsbCxiLGYpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShhKSlmb3IoZj0wO2Y8YS5sZW5ndGg7KytmKXAuY2FsbCh0aGlzLGFbZl0sYixmKTtlbHNlIHJldHVybiBwLmNhbGwodGhpcyxhLGIsMCk7ZWxzZSBpZihcIm51bWJlclwiPT09dHlwZW9mIGEpe2lmKDA8YSlyZXR1cm4gbi5jYWxsKHRoaXMsYyhhfDApLGF8MCl9ZWxzZSBpZihBcnJheS5pc0FycmF5KGEpKXtpZihhLmxlbmd0aClyZXR1cm4gbi5jYWxsKHRoaXMsXG5hLGEubGVuZ3RoKX1lbHNlIHJldHVybiBtLmNhbGwodGhpcyxhKX0se3N0YXRzOmF9KX1mdW5jdGlvbiBaKGEpe1EucHVzaChhKTtwKCk7cmV0dXJue2NhbmNlbDpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYT1sKFEsYik7UVthXT1RW1EubGVuZ3RoLTFdOy0tUS5sZW5ndGg7MD49US5sZW5ndGgmJnUoKX12YXIgYz1sKFEsYSk7UVtjXT1ifX19ZnVuY3Rpb24gRCgpe3ZhciBhPU8udmlld3BvcnQsYj1PLnNjaXNzb3JfYm94O2FbMF09YVsxXT1iWzBdPWJbMV09MDtVLnZpZXdwb3J0V2lkdGg9VS5mcmFtZWJ1ZmZlcldpZHRoPVUuZHJhd2luZ0J1ZmZlcldpZHRoPWFbMl09YlsyXT1xLmRyYXdpbmdCdWZmZXJXaWR0aDtVLnZpZXdwb3J0SGVpZ2h0PVUuZnJhbWVidWZmZXJIZWlnaHQ9VS5kcmF3aW5nQnVmZmVySGVpZ2h0PWFbM109YlszXT1xLmRyYXdpbmdCdWZmZXJIZWlnaHR9ZnVuY3Rpb24gSygpe1UudGljays9MTtVLnRpbWU9dmEoKTtEKCk7ZWEucHJvY3MucG9sbCgpfWZ1bmN0aW9uIEFhKCl7RCgpO1xuZWEucHJvY3MucmVmcmVzaCgpO0cmJkcudXBkYXRlKCl9ZnVuY3Rpb24gdmEoKXtyZXR1cm4oYygpLWJhKS8xRTN9Zj1iKGYpO2lmKCFmKXJldHVybiBudWxsO3ZhciBxPWYuZ2wsUz1xLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7cS5pc0NvbnRleHRMb3N0KCk7dmFyIG1hPUYocSxmKTtpZighbWEpcmV0dXJuIG51bGw7dmFyIGdhPWEoKSxXPVkoKSxSPW1hLmV4dGVuc2lvbnMsRz1MKHEsUiksYmE9YygpLG5hPXEuZHJhd2luZ0J1ZmZlcldpZHRoLHlhPXEuZHJhd2luZ0J1ZmZlckhlaWdodCxVPXt0aWNrOjAsdGltZTowLHZpZXdwb3J0V2lkdGg6bmEsdmlld3BvcnRIZWlnaHQ6eWEsZnJhbWVidWZmZXJXaWR0aDpuYSxmcmFtZWJ1ZmZlckhlaWdodDp5YSxkcmF3aW5nQnVmZmVyV2lkdGg6bmEsZHJhd2luZ0J1ZmZlckhlaWdodDp5YSxwaXhlbFJhdGlvOmYucGl4ZWxSYXRpb30saWE9TShxLFIpLGthPXQocSxXLGYpLHJhPXkocSxSLGthLFcpLG5hPU4ocSxSLGlhLGthLGdhKSxzYT1uKHEsXG5nYSxXLGYpLGRhPWcocSxSLGlhLGZ1bmN0aW9uKCl7ZWEucHJvY3MucG9sbCgpfSxVLFcsZiksamE9RShxLFIsaWEsVyxmKSxsYT1DKHEsUixpYSxkYSxqYSxXKSxlYT1CKHEsZ2EsUixpYSxrYSxyYSxkYSxsYSx7fSxuYSxzYSx7ZWxlbWVudHM6bnVsbCxwcmltaXRpdmU6NCxjb3VudDotMSxvZmZzZXQ6MCxpbnN0YW5jZXM6LTF9LFUsRyxmKSxnYT1tKHEsbGEsZWEucHJvY3MucG9sbCxVLFMsUiksTz1lYS5uZXh0LGhhPXEuY2FudmFzLFE9W10scGE9W10sVj1bXSxYPVtmLm9uRGVzdHJveV0sVD1udWxsO2hhJiYoaGEuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dGxvc3RcIixMYSwhMSksaGEuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dHJlc3RvcmVkXCIsemEsITEpKTtBYSgpO1M9ayhHYSx7Y2xlYXI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtlYS5wcm9jcy5wb2xsKCk7dmFyIGM9YS5jb2xvcjtjJiYocS5jbGVhckNvbG9yKCtjWzBdfHwwLCtjWzFdfHwwLCtjWzJdfHwwLFxuK2NbM118fDApLGJ8PTE2Mzg0KTtcImRlcHRoXCJpbiBhJiYocS5jbGVhckRlcHRoKCthLmRlcHRoKSxifD0yNTYpO1wic3RlbmNpbFwiaW4gYSYmKHEuY2xlYXJTdGVuY2lsKGEuc3RlbmNpbHwwKSxifD0xMDI0KTtxLmNsZWFyKGIpfSxwcm9wOnguZGVmaW5lLmJpbmQobnVsbCwxKSxjb250ZXh0OnguZGVmaW5lLmJpbmQobnVsbCwyKSxcInRoaXNcIjp4LmRlZmluZS5iaW5kKG51bGwsMyksZHJhdzpHYSh7fSksYnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVybiBrYS5jcmVhdGUoYSwzNDk2MiwhMSwhMSl9LGVsZW1lbnRzOmZ1bmN0aW9uKGEpe3JldHVybiByYS5jcmVhdGUoYSwhMSl9LHRleHR1cmU6ZGEuY3JlYXRlMkQsY3ViZTpkYS5jcmVhdGVDdWJlLHJlbmRlcmJ1ZmZlcjpqYS5jcmVhdGUsZnJhbWVidWZmZXI6bGEuY3JlYXRlLGZyYW1lYnVmZmVyQ3ViZTpsYS5jcmVhdGVDdWJlLGF0dHJpYnV0ZXM6UyxmcmFtZTpaLG9uOmZ1bmN0aW9uKGEsYil7dmFyIGM7c3dpdGNoKGEpe2Nhc2UgXCJmcmFtZVwiOnJldHVybiBaKGIpO1xuY2FzZSBcImxvc3RcIjpjPXBhO2JyZWFrO2Nhc2UgXCJyZXN0b3JlXCI6Yz1WO2JyZWFrO2Nhc2UgXCJkZXN0cm95XCI6Yz1YfWMucHVzaChiKTtyZXR1cm57Y2FuY2VsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aDsrK2EpaWYoY1thXT09PWIpe2NbYV09Y1tjLmxlbmd0aC0xXTtjLnBvcCgpO2JyZWFrfX19fSxsaW1pdHM6aWEsaGFzRXh0ZW5zaW9uOmZ1bmN0aW9uKGEpe3JldHVybiAwPD1pYS5leHRlbnNpb25zLmluZGV4T2YoYS50b0xvd2VyQ2FzZSgpKX0scmVhZDpnYSxkZXN0cm95OmZ1bmN0aW9uKCl7US5sZW5ndGg9MDt1KCk7aGEmJihoYS5yZW1vdmVFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0bG9zdFwiLExhKSxoYS5yZW1vdmVFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0cmVzdG9yZWRcIix6YSkpO3NhLmNsZWFyKCk7bGEuY2xlYXIoKTtqYS5jbGVhcigpO2RhLmNsZWFyKCk7cmEuY2xlYXIoKTtrYS5jbGVhcigpO0cmJkcuY2xlYXIoKTtYLmZvckVhY2goZnVuY3Rpb24oYSl7YSgpfSl9LFxuX2dsOnEsX3JlZnJlc2g6QWEscG9sbDpmdW5jdGlvbigpe0soKTtHJiZHLnVwZGF0ZSgpfSxub3c6dmEsc3RhdHM6V30pO2Yub25Eb25lKG51bGwsUyk7cmV0dXJuIFN9fSx7XCIuL2xpYi9hdHRyaWJ1dGVcIjoxLFwiLi9saWIvYnVmZmVyXCI6MixcIi4vbGliL2NvcmVcIjo3LFwiLi9saWIvZHluYW1pY1wiOjgsXCIuL2xpYi9lbGVtZW50c1wiOjksXCIuL2xpYi9leHRlbnNpb25cIjoxMCxcIi4vbGliL2ZyYW1lYnVmZmVyXCI6MTEsXCIuL2xpYi9saW1pdHNcIjoxMixcIi4vbGliL3JlYWRcIjoxMyxcIi4vbGliL3JlbmRlcmJ1ZmZlclwiOjE0LFwiLi9saWIvc2hhZGVyXCI6MTUsXCIuL2xpYi9zdGF0c1wiOjE2LFwiLi9saWIvc3RyaW5nc1wiOjE3LFwiLi9saWIvdGV4dHVyZVwiOjE4LFwiLi9saWIvdGltZXJcIjoxOSxcIi4vbGliL3V0aWwvY2xvY2tcIjoyMCxcIi4vbGliL3V0aWwvZXh0ZW5kXCI6MjIsXCIuL2xpYi91dGlsL3JhZlwiOjI5LFwiLi9saWIvd2ViZ2xcIjozMn1dfSx7fSxbMzNdKSgzMyl9KTtcbiJdfQ==
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInJlZ2wuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbihmdW5jdGlvbihPYSl7XCJvYmplY3RcIj09PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1PYSgpOlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLE9hKTooXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93OlwidW5kZWZpbmVkXCIhPT10eXBlb2YgZ2xvYmFsP2dsb2JhbDpcInVuZGVmaW5lZFwiIT09dHlwZW9mIHNlbGY/c2VsZjp0aGlzKS5jcmVhdGVSRUdMPU9hKCl9KShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBmKHAsdSxsKXtmdW5jdGlvbiBrKGMsYSl7aWYoIXVbY10pe2lmKCFwW2NdKXt2YXIgYj1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFhJiZiKXJldHVybiBiKGMsITApO2lmKHgpcmV0dXJuIHgoYywhMCk7Yj1FcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrYytcIidcIik7dGhyb3cgYi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGI7fWI9XG51W2NdPXtleHBvcnRzOnt9fTtwW2NdWzBdLmNhbGwoYi5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBiPXBbY11bMV1bYV07cmV0dXJuIGsoYj9iOmEpfSxiLGIuZXhwb3J0cyxmLHAsdSxsKX1yZXR1cm4gdVtjXS5leHBvcnRzfWZvcih2YXIgeD1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLHI9MDtyPGwubGVuZ3RoO3IrKylrKGxbcl0pO3JldHVybiBrfSh7MTpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoKXt0aGlzLnc9dGhpcy56PXRoaXMueT10aGlzLng9dGhpcy5zdGF0ZT0wO3RoaXMuYnVmZmVyPW51bGw7dGhpcy5zaXplPTA7dGhpcy5ub3JtYWxpemVkPSExO3RoaXMudHlwZT01MTI2O3RoaXMuZGl2aXNvcj10aGlzLnN0cmlkZT10aGlzLm9mZnNldD0wfXAuZXhwb3J0cz1mdW5jdGlvbihrLHgscixjLGEpe2s9ci5tYXhBdHRyaWJ1dGVzO3g9QXJyYXkoayk7Zm9yKHI9MDtyPGs7KytyKXhbcl09bmV3IGw7cmV0dXJue1JlY29yZDpsLHNjb3BlOnt9LHN0YXRlOnh9fX0sXG57fV0sMjpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoYyl7cmV0dXJuIHRbT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGMpXXwwfWZ1bmN0aW9uIGsoYyxhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoOysrYiljW2JdPWFbYl19ZnVuY3Rpb24geChjLGEsYixrLGwscix4KXtmb3IodmFyIGc9MCxoPTA7aDxiOysraClmb3IodmFyIGY9MDtmPGs7KytmKWNbZysrXT1hW2wqaCtyKmYreF19dmFyIHI9ZihcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiKSxjPWYoXCIuL3V0aWwvaXMtbmRhcnJheVwiKSxhPWYoXCIuL3V0aWwvdmFsdWVzXCIpLGI9ZihcIi4vdXRpbC9wb29sXCIpO3U9ZihcIi4vdXRpbC9mbGF0dGVuXCIpO3ZhciBGPXUuZmxhdHRlbixNPXUuc2hhcGUsdD1mKFwiLi9jb25zdGFudHMvYXJyYXl0eXBlcy5qc29uXCIpLHk9ZihcIi4vY29uc3RhbnRzL2R0eXBlcy5qc29uXCIpLGc9ZihcIi4vY29uc3RhbnRzL3VzYWdlLmpzb25cIiksRT1bXTtFWzUxMjBdPTE7RVs1MTIyXT0yO0VbNTEyNF09XG40O0VbNTEyMV09MTtFWzUxMjNdPTI7RVs1MTI1XT00O0VbNTEyNl09NDtwLmV4cG9ydHM9ZnVuY3Rpb24oZix0LG4pe2Z1bmN0aW9uIG0oYyl7dGhpcy5pZD1IKys7dGhpcy5idWZmZXI9Zi5jcmVhdGVCdWZmZXIoKTt0aGlzLnR5cGU9Yzt0aGlzLnVzYWdlPTM1MDQ0O3RoaXMuYnl0ZUxlbmd0aD0wO3RoaXMuZGltZW5zaW9uPTE7dGhpcy5kdHlwZT01MTIxO3RoaXMucGVyc2lzdGVudERhdGE9bnVsbDtuLnByb2ZpbGUmJih0aGlzLnN0YXRzPXtzaXplOjB9KX1mdW5jdGlvbiBCKGMsYSxiKXtjLmJ5dGVMZW5ndGg9YS5ieXRlTGVuZ3RoO2YuYnVmZmVyRGF0YShjLnR5cGUsYSxiKX1mdW5jdGlvbiBwKGEsaCxtLGYsZyxuKXthLnVzYWdlPW07aWYoQXJyYXkuaXNBcnJheShoKSl7aWYoYS5kdHlwZT1mfHw1MTI2LDA8aC5sZW5ndGgpaWYoQXJyYXkuaXNBcnJheShoWzBdKSl7Zz1NKGgpO2Zvcih2YXIgSz1mPTE7SzxnLmxlbmd0aDsrK0spZio9Z1tLXTthLmRpbWVuc2lvbj1mO2g9RihoLFxuZyxhLmR0eXBlKTtCKGEsaCxtKTtuP2EucGVyc2lzdGVudERhdGE9aDpiLmZyZWVUeXBlKGgpfWVsc2VcIm51bWJlclwiPT09dHlwZW9mIGhbMF0/KGEuZGltZW5zaW9uPWcsZz1iLmFsbG9jVHlwZShhLmR0eXBlLGgubGVuZ3RoKSxrKGcsaCksQihhLGcsbSksbj9hLnBlcnNpc3RlbnREYXRhPWc6Yi5mcmVlVHlwZShnKSk6cihoWzBdKSYmKGEuZGltZW5zaW9uPWhbMF0ubGVuZ3RoLGEuZHR5cGU9Znx8bChoWzBdKXx8NTEyNixoPUYoaCxbaC5sZW5ndGgsaFswXS5sZW5ndGhdLGEuZHR5cGUpLEIoYSxoLG0pLG4/YS5wZXJzaXN0ZW50RGF0YT1oOmIuZnJlZVR5cGUoaCkpfWVsc2UgaWYocihoKSlhLmR0eXBlPWZ8fGwoaCksYS5kaW1lbnNpb249ZyxCKGEsaCxtKSxuJiYoYS5wZXJzaXN0ZW50RGF0YT1uZXcgVWludDhBcnJheShuZXcgVWludDhBcnJheShoLmJ1ZmZlcikpKTtlbHNlIGlmKGMoaCkpe2c9aC5zaGFwZTt2YXIgQz1oLnN0cmlkZSxLPWgub2Zmc2V0LHk9MCxxPTAsUz0wLHQ9XG4wOzE9PT1nLmxlbmd0aD8oeT1nWzBdLHE9MSxTPUNbMF0sdD0wKToyPT09Zy5sZW5ndGgmJih5PWdbMF0scT1nWzFdLFM9Q1swXSx0PUNbMV0pO2EuZHR5cGU9Znx8bChoLmRhdGEpfHw1MTI2O2EuZGltZW5zaW9uPXE7Zz1iLmFsbG9jVHlwZShhLmR0eXBlLHkqcSk7eChnLGguZGF0YSx5LHEsUyx0LEspO0IoYSxnLG0pO24/YS5wZXJzaXN0ZW50RGF0YT1nOmIuZnJlZVR5cGUoZyl9fWZ1bmN0aW9uIEwoYyl7dC5idWZmZXJDb3VudC0tO2YuZGVsZXRlQnVmZmVyKGMuYnVmZmVyKTtjLmJ1ZmZlcj1udWxsO2RlbGV0ZSBoW2MuaWRdfXZhciBIPTAsaD17fTttLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKCl7Zi5iaW5kQnVmZmVyKHRoaXMudHlwZSx0aGlzLmJ1ZmZlcil9O20ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtMKHRoaXMpfTt2YXIgZmE9W107bi5wcm9maWxlJiYodC5nZXRUb3RhbEJ1ZmZlclNpemU9ZnVuY3Rpb24oKXt2YXIgYz0wO09iamVjdC5rZXlzKGgpLmZvckVhY2goZnVuY3Rpb24oYSl7Yys9XG5oW2FdLnN0YXRzLnNpemV9KTtyZXR1cm4gY30pO3JldHVybntjcmVhdGU6ZnVuY3Rpb24oYSxCLEgsZmEpe2Z1bmN0aW9uIHUoYSl7dmFyIGg9MzUwNDQsYj1udWxsLHE9MCxrPTAsbT0xO0FycmF5LmlzQXJyYXkoYSl8fHIoYSl8fGMoYSk/Yj1hOlwibnVtYmVyXCI9PT10eXBlb2YgYT9xPWF8MDphJiYoXCJkYXRhXCJpbiBhJiYoYj1hLmRhdGEpLFwidXNhZ2VcImluIGEmJihoPWdbYS51c2FnZV0pLFwidHlwZVwiaW4gYSYmKGs9eVthLnR5cGVdKSxcImRpbWVuc2lvblwiaW4gYSYmKG09YS5kaW1lbnNpb258MCksXCJsZW5ndGhcImluIGEmJihxPWEubGVuZ3RofDApKTtELmJpbmQoKTtiP3AoRCxiLGgsayxtLGZhKTooZi5idWZmZXJEYXRhKEQudHlwZSxxLGgpLEQuZHR5cGU9a3x8NTEyMSxELnVzYWdlPWgsRC5kaW1lbnNpb249bSxELmJ5dGVMZW5ndGg9cSk7bi5wcm9maWxlJiYoRC5zdGF0cy5zaXplPUQuYnl0ZUxlbmd0aCpFW0QuZHR5cGVdKTtyZXR1cm4gdX10LmJ1ZmZlckNvdW50Kys7dmFyIEQ9XG5uZXcgbShCKTtoW0QuaWRdPUQ7SHx8dShhKTt1Ll9yZWdsVHlwZT1cImJ1ZmZlclwiO3UuX2J1ZmZlcj1EO3Uuc3ViZGF0YT1mdW5jdGlvbihhLGgpe3ZhciBtPShofHwwKXwwLHE7RC5iaW5kKCk7aWYoQXJyYXkuaXNBcnJheShhKSl7aWYoMDxhLmxlbmd0aClpZihcIm51bWJlclwiPT09dHlwZW9mIGFbMF0pe3ZhciBnPWIuYWxsb2NUeXBlKEQuZHR5cGUsYS5sZW5ndGgpO2soZyxhKTtmLmJ1ZmZlclN1YkRhdGEoRC50eXBlLG0sZyk7Yi5mcmVlVHlwZShnKX1lbHNlIGlmKEFycmF5LmlzQXJyYXkoYVswXSl8fHIoYVswXSkpcT1NKGEpLGc9RihhLHEsRC5kdHlwZSksZi5idWZmZXJTdWJEYXRhKEQudHlwZSxtLGcpLGIuZnJlZVR5cGUoZyl9ZWxzZSBpZihyKGEpKWYuYnVmZmVyU3ViRGF0YShELnR5cGUsbSxhKTtlbHNlIGlmKGMoYSkpe3E9YS5zaGFwZTt2YXIgbj1hLnN0cmlkZSxCPWc9MCx5PTAsdD0wOzE9PT1xLmxlbmd0aD8oZz1xWzBdLEI9MSx5PW5bMF0sdD0wKToyPT09cS5sZW5ndGgmJlxuKGc9cVswXSxCPXFbMV0seT1uWzBdLHQ9blsxXSk7cT1BcnJheS5pc0FycmF5KGEuZGF0YSk/RC5kdHlwZTpsKGEuZGF0YSk7cT1iLmFsbG9jVHlwZShxLGcqQik7eChxLGEuZGF0YSxnLEIseSx0LGEub2Zmc2V0KTtmLmJ1ZmZlclN1YkRhdGEoRC50eXBlLG0scSk7Yi5mcmVlVHlwZShxKX1yZXR1cm4gdX07bi5wcm9maWxlJiYodS5zdGF0cz1ELnN0YXRzKTt1LmRlc3Ryb3k9ZnVuY3Rpb24oKXtMKEQpfTtyZXR1cm4gdX0sY3JlYXRlU3RyZWFtOmZ1bmN0aW9uKGEsYyl7dmFyIGg9ZmEucG9wKCk7aHx8KGg9bmV3IG0oYSkpO2guYmluZCgpO3AoaCxjLDM1MDQwLDAsMSwhMSk7cmV0dXJuIGh9LGRlc3Ryb3lTdHJlYW06ZnVuY3Rpb24oYSl7ZmEucHVzaChhKX0sY2xlYXI6ZnVuY3Rpb24oKXthKGgpLmZvckVhY2goTCk7ZmEuZm9yRWFjaChMKX0sZ2V0QnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLl9idWZmZXIgaW5zdGFuY2VvZiBtP2EuX2J1ZmZlcjpudWxsfSxyZXN0b3JlOmZ1bmN0aW9uKCl7YShoKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuYnVmZmVyPVxuZi5jcmVhdGVCdWZmZXIoKTtmLmJpbmRCdWZmZXIoYS50eXBlLGEuYnVmZmVyKTtmLmJ1ZmZlckRhdGEoYS50eXBlLGEucGVyc2lzdGVudERhdGF8fGEuYnl0ZUxlbmd0aCxhLnVzYWdlKX0pfSxfaW5pdEJ1ZmZlcjpwfX19LHtcIi4vY29uc3RhbnRzL2FycmF5dHlwZXMuanNvblwiOjMsXCIuL2NvbnN0YW50cy9kdHlwZXMuanNvblwiOjQsXCIuL2NvbnN0YW50cy91c2FnZS5qc29uXCI6NixcIi4vdXRpbC9mbGF0dGVuXCI6MjMsXCIuL3V0aWwvaXMtbmRhcnJheVwiOjI1LFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCI6MjYsXCIuL3V0aWwvcG9vbFwiOjI4LFwiLi91dGlsL3ZhbHVlc1wiOjMxfV0sMzpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz17XCJbb2JqZWN0IEludDhBcnJheV1cIjo1MTIwLFwiW29iamVjdCBJbnQxNkFycmF5XVwiOjUxMjIsXCJbb2JqZWN0IEludDMyQXJyYXldXCI6NTEyNCxcIltvYmplY3QgVWludDhBcnJheV1cIjo1MTIxLFwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV1cIjo1MTIxLFwiW29iamVjdCBVaW50MTZBcnJheV1cIjo1MTIzLFxuXCJbb2JqZWN0IFVpbnQzMkFycmF5XVwiOjUxMjUsXCJbb2JqZWN0IEZsb2F0MzJBcnJheV1cIjo1MTI2LFwiW29iamVjdCBGbG9hdDY0QXJyYXldXCI6NTEyMSxcIltvYmplY3QgQXJyYXlCdWZmZXJdXCI6NTEyMX19LHt9XSw0OltmdW5jdGlvbihmLHAsdSl7cC5leHBvcnRzPXtpbnQ4OjUxMjAsaW50MTY6NTEyMixpbnQzMjo1MTI0LHVpbnQ4OjUxMjEsdWludDE2OjUxMjMsdWludDMyOjUxMjUsXCJmbG9hdFwiOjUxMjYsZmxvYXQzMjo1MTI2fX0se31dLDU6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9e3BvaW50czowLHBvaW50OjAsbGluZXM6MSxsaW5lOjEsXCJsaW5lIGxvb3BcIjoyLFwibGluZSBzdHJpcFwiOjMsdHJpYW5nbGVzOjQsdHJpYW5nbGU6NCxcInRyaWFuZ2xlIHN0cmlwXCI6NSxcInRyaWFuZ2xlIGZhblwiOjZ9fSx7fV0sNjpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz17XCJzdGF0aWNcIjozNTA0NCxkeW5hbWljOjM1MDQ4LHN0cmVhbTozNTA0MH19LHt9XSw3OltmdW5jdGlvbihmLHAsdSl7ZnVuY3Rpb24gbChhKXtyZXR1cm4gQXJyYXkuaXNBcnJheShhKXx8XG5NKGEpfHx0KGEpfWZ1bmN0aW9uIGsoYSl7cmV0dXJuIGEuc29ydChmdW5jdGlvbihhLGMpe3JldHVyblwidmlld3BvcnRcIj09PWE/LTE6XCJ2aWV3cG9ydFwiPT09Yz8xOmE8Yz8tMToxfSl9ZnVuY3Rpb24geChhLGMsYixrKXt0aGlzLnRoaXNEZXA9YTt0aGlzLmNvbnRleHREZXA9Yzt0aGlzLnByb3BEZXA9Yjt0aGlzLmFwcGVuZD1rfWZ1bmN0aW9uIHIoYSl7cmV0dXJuIGEmJiEoYS50aGlzRGVwfHxhLmNvbnRleHREZXB8fGEucHJvcERlcCl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gbmV3IHgoITEsITEsITEsYSl9ZnVuY3Rpb24gYShhLGMpe3ZhciBiPWEudHlwZTtyZXR1cm4gMD09PWI/KGI9YS5kYXRhLmxlbmd0aCxuZXcgeCghMCwxPD1iLDI8PWIsYykpOjQ9PT1iPyhiPWEuZGF0YSxuZXcgeChiLnRoaXNEZXAsYi5jb250ZXh0RGVwLGIucHJvcERlcCxjKSk6bmV3IHgoMz09PWIsMj09PWIsMT09PWIsYyl9dmFyIGI9ZihcIi4vdXRpbC9jb2RlZ2VuXCIpLEY9ZihcIi4vdXRpbC9sb29wXCIpLFxuTT1mKFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCIpLHQ9ZihcIi4vdXRpbC9pcy1uZGFycmF5XCIpLHk9ZihcIi4vdXRpbC9pcy1hcnJheS1saWtlXCIpLGc9ZihcIi4vZHluYW1pY1wiKSxFPWYoXCIuL2NvbnN0YW50cy9wcmltaXRpdmVzLmpzb25cIiksQz1mKFwiLi9jb25zdGFudHMvZHR5cGVzLmpzb25cIiksTj1bXCJ4XCIsXCJ5XCIsXCJ6XCIsXCJ3XCJdLG49XCJibGVuZC5mdW5jIGJsZW5kLmVxdWF0aW9uIHN0ZW5jaWwuZnVuYyBzdGVuY2lsLm9wRnJvbnQgc3RlbmNpbC5vcEJhY2sgc2FtcGxlLmNvdmVyYWdlIHZpZXdwb3J0IHNjaXNzb3IuYm94IHBvbHlnb25PZmZzZXQub2Zmc2V0XCIuc3BsaXQoXCIgXCIpLG09ezA6MCwxOjEsemVybzowLG9uZToxLFwic3JjIGNvbG9yXCI6NzY4LFwib25lIG1pbnVzIHNyYyBjb2xvclwiOjc2OSxcInNyYyBhbHBoYVwiOjc3MCxcIm9uZSBtaW51cyBzcmMgYWxwaGFcIjo3NzEsXCJkc3QgY29sb3JcIjo3NzQsXCJvbmUgbWludXMgZHN0IGNvbG9yXCI6Nzc1LFwiZHN0IGFscGhhXCI6NzcyLFwib25lIG1pbnVzIGRzdCBhbHBoYVwiOjc3MyxcblwiY29uc3RhbnQgY29sb3JcIjozMjc2OSxcIm9uZSBtaW51cyBjb25zdGFudCBjb2xvclwiOjMyNzcwLFwiY29uc3RhbnQgYWxwaGFcIjozMjc3MSxcIm9uZSBtaW51cyBjb25zdGFudCBhbHBoYVwiOjMyNzcyLFwic3JjIGFscGhhIHNhdHVyYXRlXCI6Nzc2fSxCPXtuZXZlcjo1MTIsbGVzczo1MTMsXCI8XCI6NTEzLGVxdWFsOjUxNCxcIj1cIjo1MTQsXCI9PVwiOjUxNCxcIj09PVwiOjUxNCxsZXF1YWw6NTE1LFwiPD1cIjo1MTUsZ3JlYXRlcjo1MTYsXCI+XCI6NTE2LG5vdGVxdWFsOjUxNyxcIiE9XCI6NTE3LFwiIT09XCI6NTE3LGdlcXVhbDo1MTgsXCI+PVwiOjUxOCxhbHdheXM6NTE5fSxZPXswOjAsemVybzowLGtlZXA6NzY4MCxyZXBsYWNlOjc2ODEsaW5jcmVtZW50Ojc2ODIsZGVjcmVtZW50Ojc2ODMsXCJpbmNyZW1lbnQgd3JhcFwiOjM0MDU1LFwiZGVjcmVtZW50IHdyYXBcIjozNDA1NixpbnZlcnQ6NTM4Nn0sTD17Y3c6MjMwNCxjY3c6MjMwNX0sSD1uZXcgeCghMSwhMSwhMSxmdW5jdGlvbigpe30pO3AuZXhwb3J0cz1mdW5jdGlvbihoLFxuZix0LHAsTSx1LFosRCxLLEFhLHZhLHEsUyxtYSxnYSl7ZnVuY3Rpb24gVyhkKXtyZXR1cm4gZC5yZXBsYWNlKFwiLlwiLFwiX1wiKX1mdW5jdGlvbiBSKGQsYSxjKXt2YXIgYj1XKGQpO3cucHVzaChkKTt6W2JdPWVbYl09ISFjO3dhW2JdPWF9ZnVuY3Rpb24gRyhkLGEsYyl7dmFyIGI9VyhkKTt3LnB1c2goZCk7QXJyYXkuaXNBcnJheShjKT8oZVtiXT1jLnNsaWNlKCkseltiXT1jLnNsaWNlKCkpOmVbYl09eltiXT1jO3hhW2JdPWF9ZnVuY3Rpb24gYmEoKXt2YXIgZD1iKCksYT1kLmxpbmssYz1kLmdsb2JhbDtkLmlkPVJhKys7ZC5iYXRjaElkPVwiMFwiO3ZhciBoPWEoUWEpLEE9ZC5zaGFyZWQ9e3Byb3BzOlwiYTBcIn07T2JqZWN0LmtleXMoUWEpLmZvckVhY2goZnVuY3Rpb24oZCl7QVtkXT1jLmRlZihoLFwiLlwiLGQpfSk7dmFyIEo9ZC5uZXh0PXt9LFA9ZC5jdXJyZW50PXt9O09iamVjdC5rZXlzKHhhKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe0FycmF5LmlzQXJyYXkoZVtkXSkmJihKW2RdPWMuZGVmKEEubmV4dCxcblwiLlwiLGQpLFBbZF09Yy5kZWYoQS5jdXJyZW50LFwiLlwiLGQpKX0pO3ZhciBTYT1kLmNvbnN0YW50cz17fTtPYmplY3Qua2V5cyhNYSkuZm9yRWFjaChmdW5jdGlvbihkKXtTYVtkXT1jLmRlZihKU09OLnN0cmluZ2lmeShNYVtkXSkpfSk7ZC5pbnZva2U9ZnVuY3Rpb24oZSxJKXtzd2l0Y2goSS50eXBlKXtjYXNlIDA6dmFyIGM9W1widGhpc1wiLEEuY29udGV4dCxBLnByb3BzLGQuYmF0Y2hJZF07cmV0dXJuIGUuZGVmKGEoSS5kYXRhKSxcIi5jYWxsKFwiLGMuc2xpY2UoMCxNYXRoLm1heChJLmRhdGEubGVuZ3RoKzEsNCkpLFwiKVwiKTtjYXNlIDE6cmV0dXJuIGUuZGVmKEEucHJvcHMsSS5kYXRhKTtjYXNlIDI6cmV0dXJuIGUuZGVmKEEuY29udGV4dCxJLmRhdGEpO2Nhc2UgMzpyZXR1cm4gZS5kZWYoXCJ0aGlzXCIsSS5kYXRhKTtjYXNlIDQ6cmV0dXJuIEkuZGF0YS5hcHBlbmQoZCxlKSxJLmRhdGEucmVmfX07ZC5hdHRyaWJDYWNoZT17fTt2YXIgST17fTtkLnNjb3BlQXR0cmliPWZ1bmN0aW9uKGQpe2Q9XG5mLmlkKGQpO2lmKGQgaW4gSSlyZXR1cm4gSVtkXTt2YXIgZT1BYS5zY29wZVtkXTtlfHwoZT1BYS5zY29wZVtkXT1uZXcgQmEpO3JldHVybiBJW2RdPWEoZSl9O3JldHVybiBkfWZ1bmN0aW9uIG5hKGQpe3ZhciBlPWRbXCJzdGF0aWNcIl07ZD1kLmR5bmFtaWM7dmFyIGI7aWYoXCJwcm9maWxlXCJpbiBlKXt2YXIgaD0hIWUucHJvZmlsZTtiPWMoZnVuY3Rpb24oZCxlKXtyZXR1cm4gaH0pO2IuZW5hYmxlPWh9ZWxzZSBpZihcInByb2ZpbGVcImluIGQpe3ZhciBBPWQucHJvZmlsZTtiPWEoQSxmdW5jdGlvbihkLGUpe3JldHVybiBkLmludm9rZShlLEEpfSl9cmV0dXJuIGJ9ZnVuY3Rpb24geWEoZCxlKXt2YXIgYj1kW1wic3RhdGljXCJdLGg9ZC5keW5hbWljO2lmKFwiZnJhbWVidWZmZXJcImluIGIpe3ZhciBBPWIuZnJhbWVidWZmZXI7cmV0dXJuIEE/KEE9RC5nZXRGcmFtZWJ1ZmZlcihBKSxjKGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5saW5rKEEpLHY9ZC5zaGFyZWQ7ZS5zZXQodi5mcmFtZWJ1ZmZlcixcblwiLm5leHRcIixhKTt2PXYuY29udGV4dDtlLnNldCh2LFwiLmZyYW1lYnVmZmVyV2lkdGhcIixhK1wiLndpZHRoXCIpO2Uuc2V0KHYsXCIuZnJhbWVidWZmZXJIZWlnaHRcIixhK1wiLmhlaWdodFwiKTtyZXR1cm4gYX0pKTpjKGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5zaGFyZWQ7ZS5zZXQoYS5mcmFtZWJ1ZmZlcixcIi5uZXh0XCIsXCJudWxsXCIpO2E9YS5jb250ZXh0O2Uuc2V0KGEsXCIuZnJhbWVidWZmZXJXaWR0aFwiLGErXCIuZHJhd2luZ0J1ZmZlcldpZHRoXCIpO2Uuc2V0KGEsXCIuZnJhbWVidWZmZXJIZWlnaHRcIixhK1wiLmRyYXdpbmdCdWZmZXJIZWlnaHRcIik7cmV0dXJuXCJudWxsXCJ9KX1pZihcImZyYW1lYnVmZmVyXCJpbiBoKXt2YXIgSj1oLmZyYW1lYnVmZmVyO3JldHVybiBhKEosZnVuY3Rpb24oZCxlKXt2YXIgYT1kLmludm9rZShlLEopLHY9ZC5zaGFyZWQsYz12LmZyYW1lYnVmZmVyLGE9ZS5kZWYoYyxcIi5nZXRGcmFtZWJ1ZmZlcihcIixhLFwiKVwiKTtlLnNldChjLFwiLm5leHRcIixhKTt2PXYuY29udGV4dDtlLnNldCh2LFxuXCIuZnJhbWVidWZmZXJXaWR0aFwiLGErXCI/XCIrYStcIi53aWR0aDpcIit2K1wiLmRyYXdpbmdCdWZmZXJXaWR0aFwiKTtlLnNldCh2LFwiLmZyYW1lYnVmZmVySGVpZ2h0XCIsYStcIj9cIithK1wiLmhlaWdodDpcIit2K1wiLmRyYXdpbmdCdWZmZXJIZWlnaHRcIik7cmV0dXJuIGF9KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBVKGQsZSxjKXtmdW5jdGlvbiBiKGQpe2lmKGQgaW4gaCl7dmFyIEk9aFtkXTtkPSEwO3ZhciBjPUkueHwwLHFhPUkueXwwLFAsYWE7XCJ3aWR0aFwiaW4gST9QPUkud2lkdGh8MDpkPSExO1wiaGVpZ2h0XCJpbiBJP2FhPUkuaGVpZ2h0fDA6ZD0hMTtyZXR1cm4gbmV3IHgoIWQmJmUmJmUudGhpc0RlcCwhZCYmZSYmZS5jb250ZXh0RGVwLCFkJiZlJiZlLnByb3BEZXAsZnVuY3Rpb24oZCxlKXt2YXIgYT1kLnNoYXJlZC5jb250ZXh0LHY9UDtcIndpZHRoXCJpbiBJfHwodj1lLmRlZihhLFwiLlwiLFwiZnJhbWVidWZmZXJXaWR0aFwiLFwiLVwiLGMpKTt2YXIgYj1hYTtcImhlaWdodFwiaW4gSXx8KGI9ZS5kZWYoYSxcblwiLlwiLFwiZnJhbWVidWZmZXJIZWlnaHRcIixcIi1cIixxYSkpO3JldHVybltjLHFhLHYsYl19KX1pZihkIGluIEope3ZhciB3PUpbZF07ZD1hKHcsZnVuY3Rpb24oZCxlKXt2YXIgYT1kLmludm9rZShlLHcpLEk9ZC5zaGFyZWQuY29udGV4dCxjPWUuZGVmKGEsXCIueHwwXCIpLHY9ZS5kZWYoYSxcIi55fDBcIikscWE9ZS5kZWYoJ1wid2lkdGhcIiBpbiAnLGEsXCI/XCIsYSxcIi53aWR0aHwwOlwiLFwiKFwiLEksXCIuXCIsXCJmcmFtZWJ1ZmZlcldpZHRoXCIsXCItXCIsYyxcIilcIiksYT1lLmRlZignXCJoZWlnaHRcIiBpbiAnLGEsXCI/XCIsYSxcIi5oZWlnaHR8MDpcIixcIihcIixJLFwiLlwiLFwiZnJhbWVidWZmZXJIZWlnaHRcIixcIi1cIix2LFwiKVwiKTtyZXR1cm5bYyx2LHFhLGFdfSk7ZSYmKGQudGhpc0RlcD1kLnRoaXNEZXB8fGUudGhpc0RlcCxkLmNvbnRleHREZXA9ZC5jb250ZXh0RGVwfHxlLmNvbnRleHREZXAsZC5wcm9wRGVwPWQucHJvcERlcHx8ZS5wcm9wRGVwKTtyZXR1cm4gZH1yZXR1cm4gZT9uZXcgeChlLnRoaXNEZXAsZS5jb250ZXh0RGVwLFxuZS5wcm9wRGVwLGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5zaGFyZWQuY29udGV4dDtyZXR1cm5bMCwwLGUuZGVmKGEsXCIuXCIsXCJmcmFtZWJ1ZmZlcldpZHRoXCIpLGUuZGVmKGEsXCIuXCIsXCJmcmFtZWJ1ZmZlckhlaWdodFwiKV19KTpudWxsfXZhciBoPWRbXCJzdGF0aWNcIl0sSj1kLmR5bmFtaWM7aWYoZD1iKFwidmlld3BvcnRcIikpe3ZhciBQPWQ7ZD1uZXcgeChkLnRoaXNEZXAsZC5jb250ZXh0RGVwLGQucHJvcERlcCxmdW5jdGlvbihkLGUpe3ZhciBhPVAuYXBwZW5kKGQsZSksYz1kLnNoYXJlZC5jb250ZXh0O2Uuc2V0KGMsXCIudmlld3BvcnRXaWR0aFwiLGFbMl0pO2Uuc2V0KGMsXCIudmlld3BvcnRIZWlnaHRcIixhWzNdKTtyZXR1cm4gYX0pfXJldHVybnt2aWV3cG9ydDpkLHNjaXNzb3JfYm94OmIoXCJzY2lzc29yLmJveFwiKX19ZnVuY3Rpb24gaWEoZCl7ZnVuY3Rpb24gZShkKXtpZihkIGluIGIpe3ZhciBJPWYuaWQoYltkXSk7ZD1jKGZ1bmN0aW9uKCl7cmV0dXJuIEl9KTtkLmlkPUk7cmV0dXJuIGR9aWYoZCBpblxuaCl7dmFyIHY9aFtkXTtyZXR1cm4gYSh2LGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5pbnZva2UoZSx2KTtyZXR1cm4gZS5kZWYoZC5zaGFyZWQuc3RyaW5ncyxcIi5pZChcIixhLFwiKVwiKX0pfXJldHVybiBudWxsfXZhciBiPWRbXCJzdGF0aWNcIl0saD1kLmR5bmFtaWMsQT1lKFwiZnJhZ1wiKSxKPWUoXCJ2ZXJ0XCIpLFA9bnVsbDtyKEEpJiZyKEopPyhQPXZhLnByb2dyYW0oSi5pZCxBLmlkKSxkPWMoZnVuY3Rpb24oZCxlKXtyZXR1cm4gZC5saW5rKFApfSkpOmQ9bmV3IHgoQSYmQS50aGlzRGVwfHxKJiZKLnRoaXNEZXAsQSYmQS5jb250ZXh0RGVwfHxKJiZKLmNvbnRleHREZXAsQSYmQS5wcm9wRGVwfHxKJiZKLnByb3BEZXAsZnVuY3Rpb24oZCxlKXt2YXIgYT1kLnNoYXJlZC5zaGFkZXIsYztjPUE/QS5hcHBlbmQoZCxlKTplLmRlZihhLFwiLlwiLFwiZnJhZ1wiKTt2YXIgdjt2PUo/Si5hcHBlbmQoZCxlKTplLmRlZihhLFwiLlwiLFwidmVydFwiKTtyZXR1cm4gZS5kZWYoYStcIi5wcm9ncmFtKFwiK3YrXCIsXCIrYytcblwiKVwiKX0pO3JldHVybntmcmFnOkEsdmVydDpKLHByb2dWYXI6ZCxwcm9ncmFtOlB9fWZ1bmN0aW9uIGthKGQsZSl7ZnVuY3Rpb24gYihkLGUpe2lmKGQgaW4gaCl7dmFyIHY9aFtkXXwwO3JldHVybiBjKGZ1bmN0aW9uKGQsYSl7ZSYmKGQuT0ZGU0VUPXYpO3JldHVybiB2fSl9aWYoZCBpbiBBKXt2YXIgcWE9QVtkXTtyZXR1cm4gYShxYSxmdW5jdGlvbihkLGEpe3ZhciBjPWQuaW52b2tlKGEscWEpO2UmJihkLk9GRlNFVD1jKTtyZXR1cm4gY30pfXJldHVybiBlJiZKP2MoZnVuY3Rpb24oZCxlKXtkLk9GRlNFVD1cIjBcIjtyZXR1cm4gMH0pOm51bGx9dmFyIGg9ZFtcInN0YXRpY1wiXSxBPWQuZHluYW1pYyxKPWZ1bmN0aW9uKCl7aWYoXCJlbGVtZW50c1wiaW4gaCl7dmFyIGQ9aC5lbGVtZW50cztsKGQpP2Q9dS5nZXRFbGVtZW50cyh1LmNyZWF0ZShkLCEwKSk6ZCYmKGQ9dS5nZXRFbGVtZW50cyhkKSk7dmFyIGU9YyhmdW5jdGlvbihlLGEpe2lmKGQpe3ZhciBjPWUubGluayhkKTtyZXR1cm4gZS5FTEVNRU5UUz1cbmN9cmV0dXJuIGUuRUxFTUVOVFM9bnVsbH0pO2UudmFsdWU9ZDtyZXR1cm4gZX1pZihcImVsZW1lbnRzXCJpbiBBKXt2YXIgdj1BLmVsZW1lbnRzO3JldHVybiBhKHYsZnVuY3Rpb24oZCxlKXt2YXIgYT1kLnNoYXJlZCxjPWEuaXNCdWZmZXJBcmdzLGE9YS5lbGVtZW50cyxJPWQuaW52b2tlKGUsdiksYj1lLmRlZihcIm51bGxcIiksYz1lLmRlZihjLFwiKFwiLEksXCIpXCIpLEk9ZC5jb25kKGMpLnRoZW4oYixcIj1cIixhLFwiLmNyZWF0ZVN0cmVhbShcIixJLFwiKTtcIilbXCJlbHNlXCJdKGIsXCI9XCIsYSxcIi5nZXRFbGVtZW50cyhcIixJLFwiKTtcIik7ZS5lbnRyeShJKTtlLmV4aXQoZC5jb25kKGMpLnRoZW4oYSxcIi5kZXN0cm95U3RyZWFtKFwiLGIsXCIpO1wiKSk7cmV0dXJuIGQuRUxFTUVOVFM9Yn0pfXJldHVybiBudWxsfSgpLFA9YihcIm9mZnNldFwiLCEwKTtyZXR1cm57ZWxlbWVudHM6SixwcmltaXRpdmU6ZnVuY3Rpb24oKXtpZihcInByaW1pdGl2ZVwiaW4gaCl7dmFyIGQ9aC5wcmltaXRpdmU7cmV0dXJuIGMoZnVuY3Rpb24oZSxcbmEpe3JldHVybiBFW2RdfSl9aWYoXCJwcmltaXRpdmVcImluIEEpe3ZhciBlPUEucHJpbWl0aXZlO3JldHVybiBhKGUsZnVuY3Rpb24oZCxhKXt2YXIgYz1kLmNvbnN0YW50cy5wcmltVHlwZXMsdj1kLmludm9rZShhLGUpO3JldHVybiBhLmRlZihjLFwiW1wiLHYsXCJdXCIpfSl9cmV0dXJuIEo/cihKKT9KLnZhbHVlP2MoZnVuY3Rpb24oZCxlKXtyZXR1cm4gZS5kZWYoZC5FTEVNRU5UUyxcIi5wcmltVHlwZVwiKX0pOmMoZnVuY3Rpb24oKXtyZXR1cm4gNH0pOm5ldyB4KEoudGhpc0RlcCxKLmNvbnRleHREZXAsSi5wcm9wRGVwLGZ1bmN0aW9uKGQsZSl7dmFyIGE9ZC5FTEVNRU5UUztyZXR1cm4gZS5kZWYoYSxcIj9cIixhLFwiLnByaW1UeXBlOlwiLDQpfSk6bnVsbH0oKSxjb3VudDpmdW5jdGlvbigpe2lmKFwiY291bnRcImluIGgpe3ZhciBkPWguY291bnR8MDtyZXR1cm4gYyhmdW5jdGlvbigpe3JldHVybiBkfSl9aWYoXCJjb3VudFwiaW4gQSl7dmFyIGU9QS5jb3VudDtyZXR1cm4gYShlLGZ1bmN0aW9uKGQsXG5hKXtyZXR1cm4gZC5pbnZva2UoYSxlKX0pfXJldHVybiBKP3IoSik/Sj9QP25ldyB4KFAudGhpc0RlcCxQLmNvbnRleHREZXAsUC5wcm9wRGVwLGZ1bmN0aW9uKGQsZSl7cmV0dXJuIGUuZGVmKGQuRUxFTUVOVFMsXCIudmVydENvdW50LVwiLGQuT0ZGU0VUKX0pOmMoZnVuY3Rpb24oZCxlKXtyZXR1cm4gZS5kZWYoZC5FTEVNRU5UUyxcIi52ZXJ0Q291bnRcIil9KTpjKGZ1bmN0aW9uKCl7cmV0dXJuLTF9KTpuZXcgeChKLnRoaXNEZXB8fFAudGhpc0RlcCxKLmNvbnRleHREZXB8fFAuY29udGV4dERlcCxKLnByb3BEZXB8fFAucHJvcERlcCxmdW5jdGlvbihkLGUpe3ZhciBhPWQuRUxFTUVOVFM7cmV0dXJuIGQuT0ZGU0VUP2UuZGVmKGEsXCI/XCIsYSxcIi52ZXJ0Q291bnQtXCIsZC5PRkZTRVQsXCI6LTFcIik6ZS5kZWYoYSxcIj9cIixhLFwiLnZlcnRDb3VudDotMVwiKX0pOm51bGx9KCksaW5zdGFuY2VzOmIoXCJpbnN0YW5jZXNcIiwhMSksb2Zmc2V0OlB9fWZ1bmN0aW9uIHJhKGQsZSl7dmFyIGI9ZFtcInN0YXRpY1wiXSxcbmg9ZC5keW5hbWljLEE9e307dy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGUoSSx3KXtpZihkIGluIGIpe3ZhciBxYT1JKGJbZF0pO0Fbdl09YyhmdW5jdGlvbigpe3JldHVybiBxYX0pfWVsc2UgaWYoZCBpbiBoKXt2YXIgUD1oW2RdO0Fbdl09YShQLGZ1bmN0aW9uKGQsZSl7cmV0dXJuIHcoZCxlLGQuaW52b2tlKGUsUCkpfSl9fXZhciB2PVcoZCk7c3dpdGNoKGQpe2Nhc2UgXCJjdWxsLmVuYWJsZVwiOmNhc2UgXCJibGVuZC5lbmFibGVcIjpjYXNlIFwiZGl0aGVyXCI6Y2FzZSBcInN0ZW5jaWwuZW5hYmxlXCI6Y2FzZSBcImRlcHRoLmVuYWJsZVwiOmNhc2UgXCJzY2lzc29yLmVuYWJsZVwiOmNhc2UgXCJwb2x5Z29uT2Zmc2V0LmVuYWJsZVwiOmNhc2UgXCJzYW1wbGUuYWxwaGFcIjpjYXNlIFwic2FtcGxlLmVuYWJsZVwiOmNhc2UgXCJkZXB0aC5tYXNrXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuIGR9LGZ1bmN0aW9uKGQsZSxhKXtyZXR1cm4gYX0pO2Nhc2UgXCJkZXB0aC5mdW5jXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuIEJbZF19LFxuZnVuY3Rpb24oZCxlLGEpe3JldHVybiBlLmRlZihkLmNvbnN0YW50cy5jb21wYXJlRnVuY3MsXCJbXCIsYSxcIl1cIil9KTtjYXNlIFwiZGVwdGgucmFuZ2VcIjpyZXR1cm4gZShmdW5jdGlvbihkKXtyZXR1cm4gZH0sZnVuY3Rpb24oZCxlLGEpe2Q9ZS5kZWYoXCIrXCIsYSxcIlswXVwiKTtlPWUuZGVmKFwiK1wiLGEsXCJbMV1cIik7cmV0dXJuW2QsZV19KTtjYXNlIFwiYmxlbmQuZnVuY1wiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3JldHVyblttW1wic3JjUkdCXCJpbiBkP2Quc3JjUkdCOmQuc3JjXSxtW1wiZHN0UkdCXCJpbiBkP2QuZHN0UkdCOmQuZHN0XSxtW1wic3JjQWxwaGFcImluIGQ/ZC5zcmNBbHBoYTpkLnNyY10sbVtcImRzdEFscGhhXCJpbiBkP2QuZHN0QWxwaGE6ZC5kc3RdXX0sZnVuY3Rpb24oZCxlLGEpe2Z1bmN0aW9uIGMoZCx2KXtyZXR1cm4gZS5kZWYoJ1wiJyxkLHYsJ1wiIGluICcsYSxcIj9cIixhLFwiLlwiLGQsdixcIjpcIixhLFwiLlwiLGQpfWQ9ZC5jb25zdGFudHMuYmxlbmRGdW5jczt2YXIgdj1jKFwic3JjXCIsXCJSR0JcIiksXG5iPWMoXCJkc3RcIixcIlJHQlwiKSx2PWUuZGVmKGQsXCJbXCIsdixcIl1cIiksaD1lLmRlZihkLFwiW1wiLGMoXCJzcmNcIixcIkFscGhhXCIpLFwiXVwiKSxiPWUuZGVmKGQsXCJbXCIsYixcIl1cIik7ZD1lLmRlZihkLFwiW1wiLGMoXCJkc3RcIixcIkFscGhhXCIpLFwiXVwiKTtyZXR1cm5bdixiLGgsZF19KTtjYXNlIFwiYmxlbmQuZXF1YXRpb25cIjpyZXR1cm4gZShmdW5jdGlvbihkKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGQpcmV0dXJuW2NhW2RdLGNhW2RdXTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGQpcmV0dXJuW2NhW2QucmdiXSxjYVtkLmFscGhhXV19LGZ1bmN0aW9uKGQsZSxhKXt2YXIgYz1kLmNvbnN0YW50cy5ibGVuZEVxdWF0aW9ucyx2PWUuZGVmKCksYj1lLmRlZigpO2Q9ZC5jb25kKFwidHlwZW9mIFwiLGEsJz09PVwic3RyaW5nXCInKTtkLnRoZW4odixcIj1cIixiLFwiPVwiLGMsXCJbXCIsYSxcIl07XCIpO2RbXCJlbHNlXCJdKHYsXCI9XCIsYyxcIltcIixhLFwiLnJnYl07XCIsYixcIj1cIixjLFwiW1wiLGEsXCIuYWxwaGFdO1wiKTtlKGQpO3JldHVyblt2LGJdfSk7XG5jYXNlIFwiYmxlbmQuY29sb3JcIjpyZXR1cm4gZShmdW5jdGlvbihkKXtyZXR1cm4gRig0LGZ1bmN0aW9uKGUpe3JldHVybitkW2VdfSl9LGZ1bmN0aW9uKGQsZSxhKXtyZXR1cm4gRig0LGZ1bmN0aW9uKGQpe3JldHVybiBlLmRlZihcIitcIixhLFwiW1wiLGQsXCJdXCIpfSl9KTtjYXNlIFwic3RlbmNpbC5tYXNrXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuIGR8MH0sZnVuY3Rpb24oZCxlLGEpe3JldHVybiBlLmRlZihhLFwifDBcIil9KTtjYXNlIFwic3RlbmNpbC5mdW5jXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuW0JbZC5jbXB8fFwia2VlcFwiXSxkLnJlZnx8MCxcIm1hc2tcImluIGQ/ZC5tYXNrOi0xXX0sZnVuY3Rpb24oZCxlLGEpe2Q9ZS5kZWYoJ1wiY21wXCIgaW4gJyxhLFwiP1wiLGQuY29uc3RhbnRzLmNvbXBhcmVGdW5jcyxcIltcIixhLFwiLmNtcF1cIixcIjpcIiw3NjgwKTt2YXIgYz1lLmRlZihhLFwiLnJlZnwwXCIpO2U9ZS5kZWYoJ1wibWFza1wiIGluICcsYSxcIj9cIixhLFwiLm1hc2t8MDotMVwiKTtyZXR1cm5bZCxcbmMsZV19KTtjYXNlIFwic3RlbmNpbC5vcEZyb250XCI6Y2FzZSBcInN0ZW5jaWwub3BCYWNrXCI6cmV0dXJuIGUoZnVuY3Rpb24oZSl7cmV0dXJuW1wic3RlbmNpbC5vcEJhY2tcIj09PWQ/MTAyOToxMDI4LFlbZS5mYWlsfHxcImtlZXBcIl0sWVtlLnpmYWlsfHxcImtlZXBcIl0sWVtlLnpwYXNzfHxcImtlZXBcIl1dfSxmdW5jdGlvbihlLGEsYyl7ZnVuY3Rpb24gdihkKXtyZXR1cm4gYS5kZWYoJ1wiJyxkLCdcIiBpbiAnLGMsXCI/XCIsYixcIltcIixjLFwiLlwiLGQsXCJdOlwiLDc2ODApfXZhciBiPWUuY29uc3RhbnRzLnN0ZW5jaWxPcHM7cmV0dXJuW1wic3RlbmNpbC5vcEJhY2tcIj09PWQ/MTAyOToxMDI4LHYoXCJmYWlsXCIpLHYoXCJ6ZmFpbFwiKSx2KFwienBhc3NcIildfSk7Y2FzZSBcInBvbHlnb25PZmZzZXQub2Zmc2V0XCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuW2QuZmFjdG9yfDAsZC51bml0c3wwXX0sZnVuY3Rpb24oZCxlLGEpe2Q9ZS5kZWYoYSxcIi5mYWN0b3J8MFwiKTtlPWUuZGVmKGEsXCIudW5pdHN8MFwiKTtyZXR1cm5bZCxcbmVdfSk7Y2FzZSBcImN1bGwuZmFjZVwiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3ZhciBlPTA7XCJmcm9udFwiPT09ZD9lPTEwMjg6XCJiYWNrXCI9PT1kJiYoZT0xMDI5KTtyZXR1cm4gZX0sZnVuY3Rpb24oZCxlLGEpe3JldHVybiBlLmRlZihhLCc9PT1cImZyb250XCI/JywxMDI4LFwiOlwiLDEwMjkpfSk7Y2FzZSBcImxpbmVXaWR0aFwiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3JldHVybiBkfSxmdW5jdGlvbihkLGUsYSl7cmV0dXJuIGF9KTtjYXNlIFwiZnJvbnRGYWNlXCI6cmV0dXJuIGUoZnVuY3Rpb24oZCl7cmV0dXJuIExbZF19LGZ1bmN0aW9uKGQsZSxhKXtyZXR1cm4gZS5kZWYoYSsnPT09XCJjd1wiPzIzMDQ6MjMwNScpfSk7Y2FzZSBcImNvbG9yTWFza1wiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3JldHVybiBkLm1hcChmdW5jdGlvbihkKXtyZXR1cm4hIWR9KX0sZnVuY3Rpb24oZCxlLGEpe3JldHVybiBGKDQsZnVuY3Rpb24oZCl7cmV0dXJuXCIhIVwiK2ErXCJbXCIrZCtcIl1cIn0pfSk7Y2FzZSBcInNhbXBsZS5jb3ZlcmFnZVwiOnJldHVybiBlKGZ1bmN0aW9uKGQpe3JldHVybltcInZhbHVlXCJpblxuZD9kLnZhbHVlOjEsISFkLmludmVydF19LGZ1bmN0aW9uKGQsZSxhKXtkPWUuZGVmKCdcInZhbHVlXCIgaW4gJyxhLFwiPytcIixhLFwiLnZhbHVlOjFcIik7ZT1lLmRlZihcIiEhXCIsYSxcIi5pbnZlcnRcIik7cmV0dXJuW2QsZV19KX19KTtyZXR1cm4gQX1mdW5jdGlvbiBzYShkLGUpe3ZhciBiPWRbXCJzdGF0aWNcIl0saD1kLmR5bmFtaWMsQT17fTtPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWJbZF0sYTtpZihcIm51bWJlclwiPT09dHlwZW9mIGV8fFwiYm9vbGVhblwiPT09dHlwZW9mIGUpYT1jKGZ1bmN0aW9uKCl7cmV0dXJuIGV9KTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgdj1lLl9yZWdsVHlwZTtpZihcInRleHR1cmUyZFwiPT09dnx8XCJ0ZXh0dXJlQ3ViZVwiPT09dilhPWMoZnVuY3Rpb24oZCl7cmV0dXJuIGQubGluayhlKX0pO2Vsc2UgaWYoXCJmcmFtZWJ1ZmZlclwiPT09dnx8XCJmcmFtZWJ1ZmZlckN1YmVcIj09PXYpYT1jKGZ1bmN0aW9uKGQpe3JldHVybiBkLmxpbmsoZS5jb2xvclswXSl9KX1lbHNlIHkoZSkmJlxuKGE9YyhmdW5jdGlvbihkKXtyZXR1cm4gZC5nbG9iYWwuZGVmKFwiW1wiLEYoZS5sZW5ndGgsZnVuY3Rpb24oZCl7cmV0dXJuIGVbZF19KSxcIl1cIil9KSk7YS52YWx1ZT1lO0FbZF09YX0pO09iamVjdC5rZXlzKGgpLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGU9aFtkXTtBW2RdPWEoZSxmdW5jdGlvbihkLGEpe3JldHVybiBkLmludm9rZShhLGUpfSl9KTtyZXR1cm4gQX1mdW5jdGlvbiBkYShkLGUpe3ZhciBiPWRbXCJzdGF0aWNcIl0saD1kLmR5bmFtaWMsQT17fTtPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWJbZF0sYT1mLmlkKGQpLHY9bmV3IEJhO2lmKGwoZSkpdi5zdGF0ZT0xLHYuYnVmZmVyPU0uZ2V0QnVmZmVyKE0uY3JlYXRlKGUsMzQ5NjIsITEsITApKSx2LnR5cGU9MDtlbHNle3ZhciBoPU0uZ2V0QnVmZmVyKGUpO2lmKGgpdi5zdGF0ZT0xLHYuYnVmZmVyPWgsdi50eXBlPTA7ZWxzZSBpZihlLmNvbnN0YW50KXt2YXIgdz1lLmNvbnN0YW50O3YuYnVmZmVyPVxuXCJudWxsXCI7di5zdGF0ZT0yO1wibnVtYmVyXCI9PT10eXBlb2Ygdz92Lng9dzpOLmZvckVhY2goZnVuY3Rpb24oZCxlKXtlPHcubGVuZ3RoJiYodltkXT13W2VdKX0pfWVsc2V7dmFyIGg9bChlLmJ1ZmZlcik/TS5nZXRCdWZmZXIoTS5jcmVhdGUoZS5idWZmZXIsMzQ5NjIsITEsITApKTpNLmdldEJ1ZmZlcihlLmJ1ZmZlciksej1lLm9mZnNldHwwLHE9ZS5zdHJpZGV8MCxrPWUuc2l6ZXwwLGc9ISFlLm5vcm1hbGl6ZWQsbT0wO1widHlwZVwiaW4gZSYmKG09Q1tlLnR5cGVdKTtlPWUuZGl2aXNvcnwwO3YuYnVmZmVyPWg7di5zdGF0ZT0xO3Yuc2l6ZT1rO3Yubm9ybWFsaXplZD1nO3YudHlwZT1tfHxoLmR0eXBlO3Yub2Zmc2V0PXo7di5zdHJpZGU9cTt2LmRpdmlzb3I9ZX19QVtkXT1jKGZ1bmN0aW9uKGQsZSl7dmFyIGM9ZC5hdHRyaWJDYWNoZTtpZihhIGluIGMpcmV0dXJuIGNbYV07dmFyIGI9e2lzU3RyZWFtOiExfTtPYmplY3Qua2V5cyh2KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZF09XG52W2RdfSk7di5idWZmZXImJihiLmJ1ZmZlcj1kLmxpbmsodi5idWZmZXIpLGIudHlwZT1iLnR5cGV8fGIuYnVmZmVyK1wiLmR0eXBlXCIpO3JldHVybiBjW2FdPWJ9KX0pO09iamVjdC5rZXlzKGgpLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGU9aFtkXTtBW2RdPWEoZSxmdW5jdGlvbihkLGEpe2Z1bmN0aW9uIHYoZCl7YShBW2RdLFwiPVwiLGMsXCIuXCIsZCxcInwwO1wiKX12YXIgYz1kLmludm9rZShhLGUpLGI9ZC5zaGFyZWQsaD1iLmlzQnVmZmVyQXJncyx3PWIuYnVmZmVyLEE9e2lzU3RyZWFtOmEuZGVmKCExKX0sej1uZXcgQmE7ei5zdGF0ZT0xO09iamVjdC5rZXlzKHopLmZvckVhY2goZnVuY3Rpb24oZCl7QVtkXT1hLmRlZihcIlwiK3pbZF0pfSk7dmFyIGFhPUEuYnVmZmVyLHE9QS50eXBlO2EoXCJpZihcIixoLFwiKFwiLGMsXCIpKXtcIixBLmlzU3RyZWFtLFwiPXRydWU7XCIsYWEsXCI9XCIsdyxcIi5jcmVhdGVTdHJlYW0oXCIsMzQ5NjIsXCIsXCIsYyxcIik7XCIscSxcIj1cIixhYSxcIi5kdHlwZTtcIixcIn1lbHNle1wiLFxuYWEsXCI9XCIsdyxcIi5nZXRCdWZmZXIoXCIsYyxcIik7XCIsXCJpZihcIixhYSxcIil7XCIscSxcIj1cIixhYSxcIi5kdHlwZTtcIiwnfWVsc2UgaWYoXCJjb25zdGFudFwiIGluICcsYyxcIil7XCIsQS5zdGF0ZSxcIj1cIiwyLFwiO1wiLFwiaWYodHlwZW9mIFwiK2MrJy5jb25zdGFudCA9PT0gXCJudW1iZXJcIil7JyxBW05bMF1dLFwiPVwiLGMsXCIuY29uc3RhbnQ7XCIsTi5zbGljZSgxKS5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIEFbZF19KS5qb2luKFwiPVwiKSxcIj0wO1wiLFwifWVsc2V7XCIsTi5tYXAoZnVuY3Rpb24oZCxlKXtyZXR1cm4gQVtkXStcIj1cIitjK1wiLmNvbnN0YW50Lmxlbmd0aD49XCIrZStcIj9cIitjK1wiLmNvbnN0YW50W1wiK2UrXCJdOjA7XCJ9KS5qb2luKFwiXCIpLFwifX1lbHNle1wiLFwiaWYoXCIsaCxcIihcIixjLFwiLmJ1ZmZlcikpe1wiLGFhLFwiPVwiLHcsXCIuY3JlYXRlU3RyZWFtKFwiLDM0OTYyLFwiLFwiLGMsXCIuYnVmZmVyKTtcIixcIn1lbHNle1wiLGFhLFwiPVwiLHcsXCIuZ2V0QnVmZmVyKFwiLGMsXCIuYnVmZmVyKTtcIixcIn1cIixxLCc9XCJ0eXBlXCIgaW4gJyxcbmMsXCI/XCIsYi5nbFR5cGVzLFwiW1wiLGMsXCIudHlwZV06XCIsYWEsXCIuZHR5cGU7XCIsQS5ub3JtYWxpemVkLFwiPSEhXCIsYyxcIi5ub3JtYWxpemVkO1wiKTt2KFwic2l6ZVwiKTt2KFwib2Zmc2V0XCIpO3YoXCJzdHJpZGVcIik7dihcImRpdmlzb3JcIik7YShcIn19XCIpO2EuZXhpdChcImlmKFwiLEEuaXNTdHJlYW0sXCIpe1wiLHcsXCIuZGVzdHJveVN0cmVhbShcIixhYSxcIik7XCIsXCJ9XCIpO3JldHVybiBBfSl9KTtyZXR1cm4gQX1mdW5jdGlvbiBqYShkKXt2YXIgZT1kW1wic3RhdGljXCJdLGI9ZC5keW5hbWljLGg9e307T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgYT1lW2RdO2hbZF09YyhmdW5jdGlvbihkLGUpe3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYXx8XCJib29sZWFuXCI9PT10eXBlb2YgYT9cIlwiK2E6ZC5saW5rKGEpfSl9KTtPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWJbZF07aFtkXT1hKGUsZnVuY3Rpb24oZCxhKXtyZXR1cm4gZC5pbnZva2UoYSxlKX0pfSk7cmV0dXJuIGh9XG5mdW5jdGlvbiBsYShkLGUsYSxjLGIpe3ZhciBoPXlhKGQsYiksdz1VKGQsaCxiKSx6PWthKGQsYikscT1yYShkLGIpLGs9aWEoZCxiKSxnPXcudmlld3BvcnQ7ZyYmKHEudmlld3BvcnQ9Zyk7Zz1XKFwic2Npc3Nvci5ib3hcIik7KHc9d1tnXSkmJihxW2ddPXcpO3c9MDxPYmplY3Qua2V5cyhxKS5sZW5ndGg7aD17ZnJhbWVidWZmZXI6aCxkcmF3Onosc2hhZGVyOmssc3RhdGU6cSxkaXJ0eTp3fTtoLnByb2ZpbGU9bmEoZCxiKTtoLnVuaWZvcm1zPXNhKGEsYik7aC5hdHRyaWJ1dGVzPWRhKGUsYik7aC5jb250ZXh0PWphKGMsYik7cmV0dXJuIGh9ZnVuY3Rpb24gZWEoZCxlLGEpe3ZhciBjPWQuc2hhcmVkLmNvbnRleHQsYj1kLnNjb3BlKCk7T2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbihoKXtlLnNhdmUoYyxcIi5cIitoKTtiKGMsXCIuXCIsaCxcIj1cIixhW2hdLmFwcGVuZChkLGUpLFwiO1wiKX0pO2UoYil9ZnVuY3Rpb24gTyhkLGUsYSxjKXt2YXIgYj1kLnNoYXJlZCxoPWIuZ2wsdz1iLmZyYW1lYnVmZmVyLFxuejtvYSYmKHo9ZS5kZWYoYi5leHRlbnNpb25zLFwiLndlYmdsX2RyYXdfYnVmZmVyc1wiKSk7dmFyIHE9ZC5jb25zdGFudHMsYj1xLmRyYXdCdWZmZXIscT1xLmJhY2tCdWZmZXI7ZD1hP2EuYXBwZW5kKGQsZSk6ZS5kZWYodyxcIi5uZXh0XCIpO2N8fGUoXCJpZihcIixkLFwiIT09XCIsdyxcIi5jdXIpe1wiKTtlKFwiaWYoXCIsZCxcIil7XCIsaCxcIi5iaW5kRnJhbWVidWZmZXIoXCIsMzYxNjAsXCIsXCIsZCxcIi5mcmFtZWJ1ZmZlcik7XCIpO29hJiZlKHosXCIuZHJhd0J1ZmZlcnNXRUJHTChcIixiLFwiW1wiLGQsXCIuY29sb3JBdHRhY2htZW50cy5sZW5ndGhdKTtcIik7ZShcIn1lbHNle1wiLGgsXCIuYmluZEZyYW1lYnVmZmVyKFwiLDM2MTYwLFwiLG51bGwpO1wiKTtvYSYmZSh6LFwiLmRyYXdCdWZmZXJzV0VCR0woXCIscSxcIik7XCIpO2UoXCJ9XCIsdyxcIi5jdXI9XCIsZCxcIjtcIik7Y3x8ZShcIn1cIil9ZnVuY3Rpb24gaGEoZCxhLGMpe3ZhciBiPWQuc2hhcmVkLGg9Yi5nbCx6PWQuY3VycmVudCxxPWQubmV4dCxnPWIuY3VycmVudCxrPWIubmV4dCxcbm09ZC5jb25kKGcsXCIuZGlydHlcIik7dy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9VyhhKTtpZighKGEgaW4gYy5zdGF0ZSkpe3ZhciB2LGI7aWYoYSBpbiBxKXt2PXFbYV07Yj16W2FdO3ZhciB3PUYoZVthXS5sZW5ndGgsZnVuY3Rpb24oZCl7cmV0dXJuIG0uZGVmKHYsXCJbXCIsZCxcIl1cIil9KTttKGQuY29uZCh3Lm1hcChmdW5jdGlvbihkLGUpe3JldHVybiBkK1wiIT09XCIrYitcIltcIitlK1wiXVwifSkuam9pbihcInx8XCIpKS50aGVuKGgsXCIuXCIseGFbYV0sXCIoXCIsdyxcIik7XCIsdy5tYXAoZnVuY3Rpb24oZCxlKXtyZXR1cm4gYitcIltcIitlK1wiXT1cIitkfSkuam9pbihcIjtcIiksXCI7XCIpKX1lbHNlIHY9bS5kZWYoayxcIi5cIixhKSx3PWQuY29uZCh2LFwiIT09XCIsZyxcIi5cIixhKSxtKHcpLGEgaW4gd2E/dyhkLmNvbmQodikudGhlbihoLFwiLmVuYWJsZShcIix3YVthXSxcIik7XCIpW1wiZWxzZVwiXShoLFwiLmRpc2FibGUoXCIsd2FbYV0sXCIpO1wiKSxnLFwiLlwiLGEsXCI9XCIsdixcIjtcIik6dyhoLFwiLlwiLHhhW2FdLFwiKFwiLHYsXCIpO1wiLFxuZyxcIi5cIixhLFwiPVwiLHYsXCI7XCIpfX0pOzA9PT1PYmplY3Qua2V5cyhjLnN0YXRlKS5sZW5ndGgmJm0oZyxcIi5kaXJ0eT1mYWxzZTtcIik7YShtKX1mdW5jdGlvbiBRKGQsZSxhLGMpe3ZhciBiPWQuc2hhcmVkLGg9ZC5jdXJyZW50LHc9Yi5jdXJyZW50LHE9Yi5nbDtrKE9iamVjdC5rZXlzKGEpKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciB6PWFbYl07aWYoIWN8fGMoeikpe3ZhciBnPXouYXBwZW5kKGQsZSk7aWYod2FbYl0pe3ZhciBrPXdhW2JdO3Ioeik/Zz9lKHEsXCIuZW5hYmxlKFwiLGssXCIpO1wiKTplKHEsXCIuZGlzYWJsZShcIixrLFwiKTtcIik6ZShkLmNvbmQoZykudGhlbihxLFwiLmVuYWJsZShcIixrLFwiKTtcIilbXCJlbHNlXCJdKHEsXCIuZGlzYWJsZShcIixrLFwiKTtcIikpO2UodyxcIi5cIixiLFwiPVwiLGcsXCI7XCIpfWVsc2UgaWYoeShnKSl7dmFyIG09aFtiXTtlKHEsXCIuXCIseGFbYl0sXCIoXCIsZyxcIik7XCIsZy5tYXAoZnVuY3Rpb24oZCxlKXtyZXR1cm4gbStcIltcIitlK1wiXT1cIitkfSkuam9pbihcIjtcIiksXCI7XCIpfWVsc2UgZShxLFxuXCIuXCIseGFbYl0sXCIoXCIsZyxcIik7XCIsdyxcIi5cIixiLFwiPVwiLGcsXCI7XCIpfX0pfWZ1bmN0aW9uIHBhKGQsZSl7dGEmJihkLmluc3RhbmNpbmc9ZS5kZWYoZC5zaGFyZWQuZXh0ZW5zaW9ucyxcIi5hbmdsZV9pbnN0YW5jZWRfYXJyYXlzXCIpKX1mdW5jdGlvbiBWKGQsZSxhLGMsYil7ZnVuY3Rpb24gaCgpe3JldHVyblwidW5kZWZpbmVkXCI9PT10eXBlb2YgcGVyZm9ybWFuY2U/XCJEYXRlLm5vdygpXCI6XCJwZXJmb3JtYW5jZS5ub3coKVwifWZ1bmN0aW9uIHcoZCl7bD1lLmRlZigpO2QobCxcIj1cIixoKCksXCI7XCIpO1wic3RyaW5nXCI9PT10eXBlb2YgYj9kKGssXCIuY291bnQrPVwiLGIsXCI7XCIpOmQoayxcIi5jb3VudCsrO1wiKTttYSYmKGM/KG49ZS5kZWYoKSxkKG4sXCI9XCIsZixcIi5nZXROdW1QZW5kaW5nUXVlcmllcygpO1wiKSk6ZChmLFwiLmJlZ2luUXVlcnkoXCIsayxcIik7XCIpKX1mdW5jdGlvbiBxKGQpe2QoayxcIi5jcHVUaW1lKz1cIixoKCksXCItXCIsbCxcIjtcIik7bWEmJihjP2QoZixcIi5wdXNoU2NvcGVTdGF0cyhcIixuLFxuXCIsXCIsZixcIi5nZXROdW1QZW5kaW5nUXVlcmllcygpLFwiLGssXCIpO1wiKTpkKGYsXCIuZW5kUXVlcnkoKTtcIikpfWZ1bmN0aW9uIHooZCl7dmFyIGE9ZS5kZWYobSxcIi5wcm9maWxlXCIpO2UobSxcIi5wcm9maWxlPVwiLGQsXCI7XCIpO2UuZXhpdChtLFwiLnByb2ZpbGU9XCIsYSxcIjtcIil9dmFyIGc9ZC5zaGFyZWQsaz1kLnN0YXRzLG09Zy5jdXJyZW50LGY9Zy50aW1lcjthPWEucHJvZmlsZTt2YXIgbCxuO2lmKGEpe2lmKHIoYSkpe2EuZW5hYmxlPyh3KGUpLHEoZS5leGl0KSx6KFwidHJ1ZVwiKSk6eihcImZhbHNlXCIpO3JldHVybn1hPWEuYXBwZW5kKGQsZSk7eihhKX1lbHNlIGE9ZS5kZWYobSxcIi5wcm9maWxlXCIpO2c9ZC5ibG9jaygpO3coZyk7ZShcImlmKFwiLGEsXCIpe1wiLGcsXCJ9XCIpO2Q9ZC5ibG9jaygpO3EoZCk7ZS5leGl0KFwiaWYoXCIsYSxcIil7XCIsZCxcIn1cIil9ZnVuY3Rpb24gWChkLGUsYSxjLGIpe2Z1bmN0aW9uIGgoZCl7c3dpdGNoKGQpe2Nhc2UgMzU2NjQ6Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiAyO1xuY2FzZSAzNTY2NTpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIDM7Y2FzZSAzNTY2NjpjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIDQ7ZGVmYXVsdDpyZXR1cm4gMX19ZnVuY3Rpb24gdyhhLGMsYil7ZnVuY3Rpb24gaCgpe2UoXCJpZighXCIsbSxcIi5idWZmZXIpe1wiLGcsXCIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoXCIsayxcIik7fVwiKTt2YXIgYT1iLnR5cGUsdzt3PWIuc2l6ZT9lLmRlZihiLnNpemUsXCJ8fFwiLGMpOmM7ZShcImlmKFwiLG0sXCIudHlwZSE9PVwiLGEsXCJ8fFwiLG0sXCIuc2l6ZSE9PVwiLHcsXCJ8fFwiLGFhLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbStcIi5cIitkK1wiIT09XCIrYltkXX0pLmpvaW4oXCJ8fFwiKSxcIil7XCIsZyxcIi5iaW5kQnVmZmVyKFwiLDM0OTYyLFwiLFwiLGYsXCIuYnVmZmVyKTtcIixnLFwiLnZlcnRleEF0dHJpYlBvaW50ZXIoXCIsW2ssdyxhLGIubm9ybWFsaXplZCxiLnN0cmlkZSxiLm9mZnNldF0sXCIpO1wiLG0sXCIudHlwZT1cIixhLFwiO1wiLG0sXCIuc2l6ZT1cIix3LFwiO1wiLGFhLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbStcblwiLlwiK2QrXCI9XCIrYltkXStcIjtcIn0pLmpvaW4oXCJcIiksXCJ9XCIpO3RhJiYoYT1iLmRpdmlzb3IsZShcImlmKFwiLG0sXCIuZGl2aXNvciE9PVwiLGEsXCIpe1wiLGQuaW5zdGFuY2luZyxcIi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoXCIsW2ssYV0sXCIpO1wiLG0sXCIuZGl2aXNvcj1cIixhLFwiO31cIikpfWZ1bmN0aW9uIHooKXtlKFwiaWYoXCIsbSxcIi5idWZmZXIpe1wiLGcsXCIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KFwiLGssXCIpO1wiLFwifWlmKFwiLE4ubWFwKGZ1bmN0aW9uKGQsZSl7cmV0dXJuIG0rXCIuXCIrZCtcIiE9PVwiK0FbZV19KS5qb2luKFwifHxcIiksXCIpe1wiLGcsXCIudmVydGV4QXR0cmliNGYoXCIsayxcIixcIixBLFwiKTtcIixOLm1hcChmdW5jdGlvbihkLGUpe3JldHVybiBtK1wiLlwiK2QrXCI9XCIrQVtlXStcIjtcIn0pLmpvaW4oXCJcIiksXCJ9XCIpfXZhciBnPXEuZ2wsaz1lLmRlZihhLFwiLmxvY2F0aW9uXCIpLG09ZS5kZWYocS5hdHRyaWJ1dGVzLFwiW1wiLGssXCJdXCIpO2E9Yi5zdGF0ZTt2YXIgZj1iLmJ1ZmZlcixBPVtiLngsYi55LFxuYi56LGIud10sYWE9W1wiYnVmZmVyXCIsXCJub3JtYWxpemVkXCIsXCJvZmZzZXRcIixcInN0cmlkZVwiXTsxPT09YT9oKCk6Mj09PWE/eigpOihlKFwiaWYoXCIsYSxcIj09PVwiLDEsXCIpe1wiKSxoKCksZShcIn1lbHNle1wiKSx6KCksZShcIn1cIikpfXZhciBxPWQuc2hhcmVkO2MuZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgcT1jLm5hbWUsZz1hLmF0dHJpYnV0ZXNbcV0sejtpZihnKXtpZighYihnKSlyZXR1cm47ej1nLmFwcGVuZChkLGUpfWVsc2V7aWYoIWIoSCkpcmV0dXJuO3ZhciBtPWQuc2NvcGVBdHRyaWIocSk7ej17fTtPYmplY3Qua2V5cyhuZXcgQmEpLmZvckVhY2goZnVuY3Rpb24oZCl7eltkXT1lLmRlZihtLFwiLlwiLGQpfSl9dyhkLmxpbmsoYyksaChjLmluZm8udHlwZSkseil9KX1mdW5jdGlvbiBUKGQsZSxhLGMsYil7Zm9yKHZhciBoPWQuc2hhcmVkLHc9aC5nbCxnLHE9MDtxPGMubGVuZ3RoOysrcSl7dmFyIHo9Y1txXSxtPXoubmFtZSxrPXouaW5mby50eXBlLGw9YS51bmlmb3Jtc1ttXSx6PWQubGluayh6KStcblwiLmxvY2F0aW9uXCIsbjtpZihsKXtpZighYihsKSljb250aW51ZTtpZihyKGwpKXttPWwudmFsdWU7aWYoMzU2Nzg9PT1rfHwzNTY4MD09PWspaz1kLmxpbmsobS5fdGV4dHVyZXx8bS5jb2xvclswXS5fdGV4dHVyZSksZSh3LFwiLnVuaWZvcm0xaShcIix6LFwiLFwiLGsrXCIuYmluZCgpKTtcIiksZS5leGl0KGssXCIudW5iaW5kKCk7XCIpO2Vsc2UgaWYoMzU2NzQ9PT1rfHwzNTY3NT09PWt8fDM1Njc2PT09ayltPWQuZ2xvYmFsLmRlZihcIm5ldyBGbG9hdDMyQXJyYXkoW1wiK0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG0pK1wiXSlcIiksbD0yLDM1Njc1PT09az9sPTM6MzU2NzY9PT1rJiYobD00KSxlKHcsXCIudW5pZm9ybU1hdHJpeFwiLGwsXCJmdihcIix6LFwiLGZhbHNlLFwiLG0sXCIpO1wiKTtlbHNle3N3aXRjaChrKXtjYXNlIDUxMjY6Zz1cIjFmXCI7YnJlYWs7Y2FzZSAzNTY2NDpnPVwiMmZcIjticmVhaztjYXNlIDM1NjY1Omc9XCIzZlwiO2JyZWFrO2Nhc2UgMzU2NjY6Zz1cIjRmXCI7YnJlYWs7Y2FzZSAzNTY3MDpnPVxuXCIxaVwiO2JyZWFrO2Nhc2UgNTEyNDpnPVwiMWlcIjticmVhaztjYXNlIDM1NjcxOmc9XCIyaVwiO2JyZWFrO2Nhc2UgMzU2Njc6Zz1cIjJpXCI7YnJlYWs7Y2FzZSAzNTY3MjpnPVwiM2lcIjticmVhaztjYXNlIDM1NjY4Omc9XCIzaVwiO2JyZWFrO2Nhc2UgMzU2NzM6Zz1cIjRpXCI7YnJlYWs7Y2FzZSAzNTY2OTpnPVwiNGlcIn1lKHcsXCIudW5pZm9ybVwiLGcsXCIoXCIseixcIixcIix5KG0pP0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG0pOm0sXCIpO1wiKX1jb250aW51ZX1lbHNlIG49bC5hcHBlbmQoZCxlKX1lbHNle2lmKCFiKEgpKWNvbnRpbnVlO249ZS5kZWYoaC51bmlmb3JtcyxcIltcIixmLmlkKG0pLFwiXVwiKX0zNTY3OD09PWs/ZShcImlmKFwiLG4sXCImJlwiLG4sJy5fcmVnbFR5cGU9PT1cImZyYW1lYnVmZmVyXCIpeycsbixcIj1cIixuLFwiLmNvbG9yWzBdO1wiLFwifVwiKTozNTY4MD09PWsmJmUoXCJpZihcIixuLFwiJiZcIixuLCcuX3JlZ2xUeXBlPT09XCJmcmFtZWJ1ZmZlckN1YmVcIil7JyxuLFwiPVwiLG4sXCIuY29sb3JbMF07XCIsXCJ9XCIpO1xubT0xO3N3aXRjaChrKXtjYXNlIDM1Njc4OmNhc2UgMzU2ODA6az1lLmRlZihuLFwiLl90ZXh0dXJlXCIpO2UodyxcIi51bmlmb3JtMWkoXCIseixcIixcIixrLFwiLmJpbmQoKSk7XCIpO2UuZXhpdChrLFwiLnVuYmluZCgpO1wiKTtjb250aW51ZTtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpnPVwiMWlcIjticmVhaztjYXNlIDM1NjY3OmNhc2UgMzU2NzE6Zz1cIjJpXCI7bT0yO2JyZWFrO2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpnPVwiM2lcIjttPTM7YnJlYWs7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOmc9XCI0aVwiO209NDticmVhaztjYXNlIDUxMjY6Zz1cIjFmXCI7YnJlYWs7Y2FzZSAzNTY2NDpnPVwiMmZcIjttPTI7YnJlYWs7Y2FzZSAzNTY2NTpnPVwiM2ZcIjttPTM7YnJlYWs7Y2FzZSAzNTY2NjpnPVwiNGZcIjttPTQ7YnJlYWs7Y2FzZSAzNTY3NDpnPVwiTWF0cml4MmZ2XCI7YnJlYWs7Y2FzZSAzNTY3NTpnPVwiTWF0cml4M2Z2XCI7YnJlYWs7Y2FzZSAzNTY3NjpnPVwiTWF0cml4NGZ2XCJ9ZSh3LFwiLnVuaWZvcm1cIixnLFwiKFwiLHosXCIsXCIpO1xuaWYoXCJNXCI9PT1nLmNoYXJBdCgwKSl7dmFyIHo9TWF0aC5wb3coay0zNTY3NCsyLDIpLEI9ZC5nbG9iYWwuZGVmKFwibmV3IEZsb2F0MzJBcnJheShcIix6LFwiKVwiKTtlKFwiZmFsc2UsKEFycmF5LmlzQXJyYXkoXCIsbixcIil8fFwiLG4sXCIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpP1wiLG4sXCI6KFwiLEYoeixmdW5jdGlvbihkKXtyZXR1cm4gQitcIltcIitkK1wiXT1cIituK1wiW1wiK2QrXCJdXCJ9KSxcIixcIixCLFwiKVwiKX1lbHNlIDE8bT9lKEYobSxmdW5jdGlvbihkKXtyZXR1cm4gbitcIltcIitkK1wiXVwifSkpOmUobik7ZShcIik7XCIpfX1mdW5jdGlvbiB1YShkLGUsYSxjKXtmdW5jdGlvbiBiKGgpe3ZhciBnPWtbaF07cmV0dXJuIGc/Zy5jb250ZXh0RGVwJiZjLmNvbnRleHREeW5hbWljfHxnLnByb3BEZXA/Zy5hcHBlbmQoZCxhKTpnLmFwcGVuZChkLGUpOmUuZGVmKG0sXCIuXCIsaCl9ZnVuY3Rpb24gaCgpe2Z1bmN0aW9uIGQoKXthKHgsXCIuZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUoXCIsW2YsbixLLGwrXCI8PCgoXCIrXG5LK1wiLTUxMjEpPj4xKVwiLEJdLFwiKTtcIil9ZnVuY3Rpb24gZSgpe2EoeCxcIi5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoXCIsW2YsbCxuLEJdLFwiKTtcIil9cT9TP2QoKTooYShcImlmKFwiLHEsXCIpe1wiKSxkKCksYShcIn1lbHNle1wiKSxlKCksYShcIn1cIikpOmUoKX1mdW5jdGlvbiBnKCl7ZnVuY3Rpb24gZCgpe2EoeitcIi5kcmF3RWxlbWVudHMoXCIrW2YsbixLLGwrXCI8PCgoXCIrSytcIi01MTIxKT4+MSlcIl0rXCIpO1wiKX1mdW5jdGlvbiBlKCl7YSh6K1wiLmRyYXdBcnJheXMoXCIrW2YsbCxuXStcIik7XCIpfXE/Uz9kKCk6KGEoXCJpZihcIixxLFwiKXtcIiksZCgpLGEoXCJ9ZWxzZXtcIiksZSgpLGEoXCJ9XCIpKTplKCl9dmFyIHc9ZC5zaGFyZWQsej13LmdsLG09dy5kcmF3LGs9Yy5kcmF3LHE9ZnVuY3Rpb24oKXt2YXIgYj1rLmVsZW1lbnRzLGg9ZTtpZihiKXtpZihiLmNvbnRleHREZXAmJmMuY29udGV4dER5bmFtaWN8fGIucHJvcERlcCloPWE7Yj1iLmFwcGVuZChkLGgpfWVsc2UgYj1oLmRlZihtLFwiLlwiLFwiZWxlbWVudHNcIik7XG5iJiZoKFwiaWYoXCIrYitcIilcIit6K1wiLmJpbmRCdWZmZXIoMzQ5NjMsXCIrYitcIi5idWZmZXIuYnVmZmVyKTtcIik7cmV0dXJuIGJ9KCksZj1iKFwicHJpbWl0aXZlXCIpLGw9YihcIm9mZnNldFwiKSxuPWZ1bmN0aW9uKCl7dmFyIGI9ay5jb3VudCxoPWU7aWYoYil7aWYoYi5jb250ZXh0RGVwJiZjLmNvbnRleHREeW5hbWljfHxiLnByb3BEZXApaD1hO2I9Yi5hcHBlbmQoZCxoKX1lbHNlIGI9aC5kZWYobSxcIi5cIixcImNvdW50XCIpO3JldHVybiBifSgpO2lmKFwibnVtYmVyXCI9PT10eXBlb2Ygbil7aWYoMD09PW4pcmV0dXJufWVsc2UgYShcImlmKFwiLG4sXCIpe1wiKSxhLmV4aXQoXCJ9XCIpO3ZhciBCLHg7dGEmJihCPWIoXCJpbnN0YW5jZXNcIikseD1kLmluc3RhbmNpbmcpO3ZhciBLPXErXCIudHlwZVwiLFM9ay5lbGVtZW50cyYmcihrLmVsZW1lbnRzKTt0YSYmKFwibnVtYmVyXCIhPT10eXBlb2YgQnx8MDw9Qik/XCJzdHJpbmdcIj09PXR5cGVvZiBCPyhhKFwiaWYoXCIsQixcIj4wKXtcIiksaCgpLGEoXCJ9ZWxzZSBpZihcIixCLFxuXCI8MCl7XCIpLGcoKSxhKFwifVwiKSk6aCgpOmcoKX1mdW5jdGlvbiBFYShkLGUsYSxiLGMpe2U9YmEoKTtjPWUucHJvYyhcImJvZHlcIixjKTt0YSYmKGUuaW5zdGFuY2luZz1jLmRlZihlLnNoYXJlZC5leHRlbnNpb25zLFwiLmFuZ2xlX2luc3RhbmNlZF9hcnJheXNcIikpO2QoZSxjLGEsYik7cmV0dXJuIGUuY29tcGlsZSgpLmJvZHl9ZnVuY3Rpb24gRmEoZCxlLGEsYil7cGEoZCxlKTtYKGQsZSxhLGIuYXR0cmlidXRlcyxmdW5jdGlvbigpe3JldHVybiEwfSk7VChkLGUsYSxiLnVuaWZvcm1zLGZ1bmN0aW9uKCl7cmV0dXJuITB9KTt1YShkLGUsZSxhKX1mdW5jdGlvbiBIYShkLGUpe3ZhciBhPWQucHJvYyhcImRyYXdcIiwxKTtwYShkLGEpO2VhKGQsYSxlLmNvbnRleHQpO08oZCxhLGUuZnJhbWVidWZmZXIpO2hhKGQsYSxlKTtRKGQsYSxlLnN0YXRlKTtWKGQsYSxlLCExLCEwKTt2YXIgYj1lLnNoYWRlci5wcm9nVmFyLmFwcGVuZChkLGEpO2EoZC5zaGFyZWQuZ2wsXCIudXNlUHJvZ3JhbShcIixiLFxuXCIucHJvZ3JhbSk7XCIpO2lmKGUuc2hhZGVyLnByb2dyYW0pRmEoZCxhLGUsZS5zaGFkZXIucHJvZ3JhbSk7ZWxzZXt2YXIgYz1kLmdsb2JhbC5kZWYoXCJ7fVwiKSxoPWEuZGVmKGIsXCIuaWRcIiksZz1hLmRlZihjLFwiW1wiLGgsXCJdXCIpO2EoZC5jb25kKGcpLnRoZW4oZyxcIi5jYWxsKHRoaXMsYTApO1wiKVtcImVsc2VcIl0oZyxcIj1cIixjLFwiW1wiLGgsXCJdPVwiLGQubGluayhmdW5jdGlvbihhKXtyZXR1cm4gRWEoRmEsZCxlLGEsMSl9KSxcIihcIixiLFwiKTtcIixnLFwiLmNhbGwodGhpcyxhMCk7XCIpKX0wPE9iamVjdC5rZXlzKGUuc3RhdGUpLmxlbmd0aCYmYShkLnNoYXJlZC5jdXJyZW50LFwiLmRpcnR5PXRydWU7XCIpfWZ1bmN0aW9uIElhKGQsZSxhLGIpe2Z1bmN0aW9uIGMoKXtyZXR1cm4hMH1kLmJhdGNoSWQ9XCJhMVwiO3BhKGQsZSk7WChkLGUsYSxiLmF0dHJpYnV0ZXMsYyk7VChkLGUsYSxiLnVuaWZvcm1zLGMpO3VhKGQsZSxlLGEpfWZ1bmN0aW9uIENhKGUsYSxiLGMpe2Z1bmN0aW9uIGgoZSl7cmV0dXJuIGUuY29udGV4dERlcCYmXG53fHxlLnByb3BEZXB9ZnVuY3Rpb24gZyhlKXtyZXR1cm4haChlKX1wYShlLGEpO3ZhciB3PWIuY29udGV4dERlcCx6PWEuZGVmKCksbT1hLmRlZigpO2Uuc2hhcmVkLnByb3BzPW07ZS5iYXRjaElkPXo7dmFyIGs9ZS5zY29wZSgpLHE9ZS5zY29wZSgpO2Eoay5lbnRyeSxcImZvcihcIix6LFwiPTA7XCIseixcIjxcIixcImExXCIsXCI7KytcIix6LFwiKXtcIixtLFwiPVwiLFwiYTBcIixcIltcIix6LFwiXTtcIixxLFwifVwiLGsuZXhpdCk7Yi5uZWVkc0NvbnRleHQmJmVhKGUscSxiLmNvbnRleHQpO2IubmVlZHNGcmFtZWJ1ZmZlciYmTyhlLHEsYi5mcmFtZWJ1ZmZlcik7UShlLHEsYi5zdGF0ZSxoKTtiLnByb2ZpbGUmJmgoYi5wcm9maWxlKSYmVihlLHEsYiwhMSwhMCk7Yz8oWChlLGssYixjLmF0dHJpYnV0ZXMsZyksWChlLHEsYixjLmF0dHJpYnV0ZXMsaCksVChlLGssYixjLnVuaWZvcm1zLGcpLFQoZSxxLGIsYy51bmlmb3JtcyxoKSx1YShlLGsscSxiKSk6KGE9ZS5nbG9iYWwuZGVmKFwie31cIiksYz1iLnNoYWRlci5wcm9nVmFyLmFwcGVuZChlLFxucSksbT1xLmRlZihjLFwiLmlkXCIpLGs9cS5kZWYoYSxcIltcIixtLFwiXVwiKSxxKGUuc2hhcmVkLmdsLFwiLnVzZVByb2dyYW0oXCIsYyxcIi5wcm9ncmFtKTtcIixcImlmKCFcIixrLFwiKXtcIixrLFwiPVwiLGEsXCJbXCIsbSxcIl09XCIsZS5saW5rKGZ1bmN0aW9uKGEpe3JldHVybiBFYShJYSxlLGIsYSwyKX0pLFwiKFwiLGMsXCIpO31cIixrLFwiLmNhbGwodGhpcyxhMFtcIix6LFwiXSxcIix6LFwiKTtcIikpfWZ1bmN0aW9uIERhKGUsYSl7ZnVuY3Rpb24gYihlKXtyZXR1cm4gZS5jb250ZXh0RGVwJiZofHxlLnByb3BEZXB9dmFyIGM9ZS5wcm9jKFwiYmF0Y2hcIiwyKTtlLmJhdGNoSWQ9XCIwXCI7cGEoZSxjKTt2YXIgaD0hMSxnPSEwO09iamVjdC5rZXlzKGEuY29udGV4dCkuZm9yRWFjaChmdW5jdGlvbihlKXtoPWh8fGEuY29udGV4dFtlXS5wcm9wRGVwfSk7aHx8KGVhKGUsYyxhLmNvbnRleHQpLGc9ITEpO3ZhciB3PWEuZnJhbWVidWZmZXIsej0hMTt3Pyh3LnByb3BEZXA/aD16PSEwOncuY29udGV4dERlcCYmaCYmKHo9ITApLFxuenx8TyhlLGMsdykpOk8oZSxjLG51bGwpO2Euc3RhdGUudmlld3BvcnQmJmEuc3RhdGUudmlld3BvcnQucHJvcERlcCYmKGg9ITApO2hhKGUsYyxhKTtRKGUsYyxhLnN0YXRlLGZ1bmN0aW9uKGUpe3JldHVybiFiKGUpfSk7YS5wcm9maWxlJiZiKGEucHJvZmlsZSl8fFYoZSxjLGEsITEsXCJhMVwiKTthLmNvbnRleHREZXA9aDthLm5lZWRzQ29udGV4dD1nO2EubmVlZHNGcmFtZWJ1ZmZlcj16O2c9YS5zaGFkZXIucHJvZ1ZhcjtpZihnLmNvbnRleHREZXAmJmh8fGcucHJvcERlcClDYShlLGMsYSxudWxsKTtlbHNlIGlmKGc9Zy5hcHBlbmQoZSxjKSxjKGUuc2hhcmVkLmdsLFwiLnVzZVByb2dyYW0oXCIsZyxcIi5wcm9ncmFtKTtcIiksYS5zaGFkZXIucHJvZ3JhbSlDYShlLGMsYSxhLnNoYWRlci5wcm9ncmFtKTtlbHNle3ZhciB3PWUuZ2xvYmFsLmRlZihcInt9XCIpLHo9Yy5kZWYoZyxcIi5pZFwiKSxxPWMuZGVmKHcsXCJbXCIseixcIl1cIik7YyhlLmNvbmQocSkudGhlbihxLFwiLmNhbGwodGhpcyxhMCxhMSk7XCIpW1wiZWxzZVwiXShxLFxuXCI9XCIsdyxcIltcIix6LFwiXT1cIixlLmxpbmsoZnVuY3Rpb24oYil7cmV0dXJuIEVhKENhLGUsYSxiLDIpfSksXCIoXCIsZyxcIik7XCIscSxcIi5jYWxsKHRoaXMsYTAsYTEpO1wiKSl9MDxPYmplY3Qua2V5cyhhLnN0YXRlKS5sZW5ndGgmJmMoZS5zaGFyZWQuY3VycmVudCxcIi5kaXJ0eT10cnVlO1wiKX1mdW5jdGlvbiBQYShlLGEpe2Z1bmN0aW9uIGIoZyl7dmFyIHc9YS5zaGFkZXJbZ107dyYmYy5zZXQoaC5zaGFkZXIsXCIuXCIrZyx3LmFwcGVuZChlLGMpKX12YXIgYz1lLnByb2MoXCJzY29wZVwiLDMpO2UuYmF0Y2hJZD1cImEyXCI7dmFyIGg9ZS5zaGFyZWQsZz1oLmN1cnJlbnQ7ZWEoZSxjLGEuY29udGV4dCk7YS5mcmFtZWJ1ZmZlciYmYS5mcmFtZWJ1ZmZlci5hcHBlbmQoZSxjKTtrKE9iamVjdC5rZXlzKGEuc3RhdGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBnPWEuc3RhdGVbYl0uYXBwZW5kKGUsYyk7eShnKT9nLmZvckVhY2goZnVuY3Rpb24oYSxoKXtjLnNldChlLm5leHRbYl0sXCJbXCIraCtcIl1cIixcbmEpfSk6Yy5zZXQoaC5uZXh0LFwiLlwiK2IsZyl9KTtWKGUsYyxhLCEwLCEwKTtbXCJlbGVtZW50c1wiLFwib2Zmc2V0XCIsXCJjb3VudFwiLFwiaW5zdGFuY2VzXCIsXCJwcmltaXRpdmVcIl0uZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZz1hLmRyYXdbYl07ZyYmYy5zZXQoaC5kcmF3LFwiLlwiK2IsXCJcIitnLmFwcGVuZChlLGMpKX0pO09iamVjdC5rZXlzKGEudW5pZm9ybXMpLmZvckVhY2goZnVuY3Rpb24oYil7Yy5zZXQoaC51bmlmb3JtcyxcIltcIitmLmlkKGIpK1wiXVwiLGEudW5pZm9ybXNbYl0uYXBwZW5kKGUsYykpfSk7T2JqZWN0LmtleXMoYS5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBoPWEuYXR0cmlidXRlc1tiXS5hcHBlbmQoZSxjKSxnPWUuc2NvcGVBdHRyaWIoYik7T2JqZWN0LmtleXMobmV3IEJhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Muc2V0KGcsXCIuXCIrZSxoW2VdKX0pfSk7YihcInZlcnRcIik7YihcImZyYWdcIik7MDxPYmplY3Qua2V5cyhhLnN0YXRlKS5sZW5ndGgmJihjKGcsXG5cIi5kaXJ0eT10cnVlO1wiKSxjLmV4aXQoZyxcIi5kaXJ0eT10cnVlO1wiKSk7YyhcImExKFwiLGUuc2hhcmVkLmNvbnRleHQsXCIsYTAsXCIsZS5iYXRjaElkLFwiKTtcIil9ZnVuY3Rpb24gTmEoZSl7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBlJiYheShlKSl7Zm9yKHZhciBhPU9iamVjdC5rZXlzKGUpLGI9MDtiPGEubGVuZ3RoOysrYilpZihnLmlzRHluYW1pYyhlW2FbYl1dKSlyZXR1cm4hMDtyZXR1cm4hMX19ZnVuY3Rpb24gSmEoZSxiLGMpe2Z1bmN0aW9uIGgoZSxhKXtxLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGI9d1tkXTtnLmlzRHluYW1pYyhiKSYmKGI9ZS5pbnZva2UoYSxiKSxhKG4sXCIuXCIsZCxcIj1cIixiLFwiO1wiKSl9KX12YXIgdz1iW1wic3RhdGljXCJdW2NdO2lmKHcmJk5hKHcpKXt2YXIgej1lLmdsb2JhbCxxPU9iamVjdC5rZXlzKHcpLGs9ITEsbT0hMSxmPSExLG49ZS5nbG9iYWwuZGVmKFwie31cIik7cS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPXdbYl07aWYoZy5pc0R5bmFtaWMoYykpXCJmdW5jdGlvblwiPT09XG50eXBlb2YgYyYmKGM9d1tiXT1nLnVuYm94KGMpKSxiPWEoYyxudWxsKSxrPWt8fGIudGhpc0RlcCxmPWZ8fGIucHJvcERlcCxtPW18fGIuY29udGV4dERlcDtlbHNle3oobixcIi5cIixiLFwiPVwiKTtzd2l0Y2godHlwZW9mIGMpe2Nhc2UgXCJudW1iZXJcIjp6KGMpO2JyZWFrO2Nhc2UgXCJzdHJpbmdcIjp6KCdcIicsYywnXCInKTticmVhaztjYXNlIFwib2JqZWN0XCI6QXJyYXkuaXNBcnJheShjKSYmeihcIltcIixjLmpvaW4oKSxcIl1cIik7YnJlYWs7ZGVmYXVsdDp6KGUubGluayhjKSl9eihcIjtcIil9fSk7Yi5keW5hbWljW2NdPW5ldyBnLkR5bmFtaWNWYXJpYWJsZSg0LHt0aGlzRGVwOmssY29udGV4dERlcDptLHByb3BEZXA6ZixyZWY6bixhcHBlbmQ6aH0pO2RlbGV0ZSBiW1wic3RhdGljXCJdW2NdfX12YXIgQmE9QWEuUmVjb3JkLGNhPXthZGQ6MzI3NzQsc3VidHJhY3Q6MzI3NzgsXCJyZXZlcnNlIHN1YnRyYWN0XCI6MzI3Nzl9O3QuZXh0X2JsZW5kX21pbm1heCYmKGNhLm1pbj0zMjc3NSxjYS5tYXg9MzI3NzYpO1xudmFyIHRhPXQuYW5nbGVfaW5zdGFuY2VkX2FycmF5cyxvYT10LndlYmdsX2RyYXdfYnVmZmVycyxlPXtkaXJ0eTohMCxwcm9maWxlOmdhLnByb2ZpbGV9LHo9e30sdz1bXSx3YT17fSx4YT17fTtSKFwiZGl0aGVyXCIsMzAyNCk7UihcImJsZW5kLmVuYWJsZVwiLDMwNDIpO0coXCJibGVuZC5jb2xvclwiLFwiYmxlbmRDb2xvclwiLFswLDAsMCwwXSk7RyhcImJsZW5kLmVxdWF0aW9uXCIsXCJibGVuZEVxdWF0aW9uU2VwYXJhdGVcIixbMzI3NzQsMzI3NzRdKTtHKFwiYmxlbmQuZnVuY1wiLFwiYmxlbmRGdW5jU2VwYXJhdGVcIixbMSwwLDEsMF0pO1IoXCJkZXB0aC5lbmFibGVcIiwyOTI5LCEwKTtHKFwiZGVwdGguZnVuY1wiLFwiZGVwdGhGdW5jXCIsNTEzKTtHKFwiZGVwdGgucmFuZ2VcIixcImRlcHRoUmFuZ2VcIixbMCwxXSk7RyhcImRlcHRoLm1hc2tcIixcImRlcHRoTWFza1wiLCEwKTtHKFwiY29sb3JNYXNrXCIsXCJjb2xvck1hc2tcIixbITAsITAsITAsITBdKTtSKFwiY3VsbC5lbmFibGVcIiwyODg0KTtHKFwiY3VsbC5mYWNlXCIsXCJjdWxsRmFjZVwiLFxuMTAyOSk7RyhcImZyb250RmFjZVwiLFwiZnJvbnRGYWNlXCIsMjMwNSk7RyhcImxpbmVXaWR0aFwiLFwibGluZVdpZHRoXCIsMSk7UihcInBvbHlnb25PZmZzZXQuZW5hYmxlXCIsMzI4MjMpO0coXCJwb2x5Z29uT2Zmc2V0Lm9mZnNldFwiLFwicG9seWdvbk9mZnNldFwiLFswLDBdKTtSKFwic2FtcGxlLmFscGhhXCIsMzI5MjYpO1IoXCJzYW1wbGUuZW5hYmxlXCIsMzI5MjgpO0coXCJzYW1wbGUuY292ZXJhZ2VcIixcInNhbXBsZUNvdmVyYWdlXCIsWzEsITFdKTtSKFwic3RlbmNpbC5lbmFibGVcIiwyOTYwKTtHKFwic3RlbmNpbC5tYXNrXCIsXCJzdGVuY2lsTWFza1wiLC0xKTtHKFwic3RlbmNpbC5mdW5jXCIsXCJzdGVuY2lsRnVuY1wiLFs1MTksMCwtMV0pO0coXCJzdGVuY2lsLm9wRnJvbnRcIixcInN0ZW5jaWxPcFNlcGFyYXRlXCIsWzEwMjgsNzY4MCw3NjgwLDc2ODBdKTtHKFwic3RlbmNpbC5vcEJhY2tcIixcInN0ZW5jaWxPcFNlcGFyYXRlXCIsWzEwMjksNzY4MCw3NjgwLDc2ODBdKTtSKFwic2Npc3Nvci5lbmFibGVcIiwzMDg5KTtHKFwic2Npc3Nvci5ib3hcIixcblwic2Npc3NvclwiLFswLDAsaC5kcmF3aW5nQnVmZmVyV2lkdGgsaC5kcmF3aW5nQnVmZmVySGVpZ2h0XSk7RyhcInZpZXdwb3J0XCIsXCJ2aWV3cG9ydFwiLFswLDAsaC5kcmF3aW5nQnVmZmVyV2lkdGgsaC5kcmF3aW5nQnVmZmVySGVpZ2h0XSk7dmFyIFFhPXtnbDpoLGNvbnRleHQ6UyxzdHJpbmdzOmYsbmV4dDp6LGN1cnJlbnQ6ZSxkcmF3OnEsZWxlbWVudHM6dSxidWZmZXI6TSxzaGFkZXI6dmEsYXR0cmlidXRlczpBYS5zdGF0ZSx1bmlmb3JtczpLLGZyYW1lYnVmZmVyOkQsZXh0ZW5zaW9uczp0LHRpbWVyOm1hLGlzQnVmZmVyQXJnczpsfSxNYT17cHJpbVR5cGVzOkUsY29tcGFyZUZ1bmNzOkIsYmxlbmRGdW5jczptLGJsZW5kRXF1YXRpb25zOmNhLHN0ZW5jaWxPcHM6WSxnbFR5cGVzOkMsb3JpZW50YXRpb25UeXBlOkx9O29hJiYoTWEuYmFja0J1ZmZlcj1bMTAyOV0sTWEuZHJhd0J1ZmZlcj1GKHAubWF4RHJhd2J1ZmZlcnMsZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lP1swXTpGKGUsZnVuY3Rpb24oZSl7cmV0dXJuIDM2MDY0K1xuZX0pfSkpO3ZhciBSYT0wO3JldHVybntuZXh0OnosY3VycmVudDplLHByb2NzOmZ1bmN0aW9uKCl7dmFyIGE9YmEoKSxiPWEucHJvYyhcInBvbGxcIiksYz1hLnByb2MoXCJyZWZyZXNoXCIpLGc9YS5ibG9jaygpO2IoZyk7YyhnKTt2YXIgdz1hLnNoYXJlZCx6PXcuZ2wscT13Lm5leHQsaz13LmN1cnJlbnQ7ZyhrLFwiLmRpcnR5PWZhbHNlO1wiKTtPKGEsYik7TyhhLGMsbnVsbCwhMCk7dmFyIG09aC5nZXRFeHRlbnNpb24oXCJhbmdsZV9pbnN0YW5jZWRfYXJyYXlzXCIpLGY7bSYmKGY9YS5saW5rKG0pKTtmb3IodmFyIG49MDtuPHAubWF4QXR0cmlidXRlczsrK24pe3ZhciBsPWMuZGVmKHcuYXR0cmlidXRlcyxcIltcIixuLFwiXVwiKSxCPWEuY29uZChsLFwiLmJ1ZmZlclwiKTtCLnRoZW4oeixcIi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShcIixuLFwiKTtcIix6LFwiLmJpbmRCdWZmZXIoXCIsMzQ5NjIsXCIsXCIsbCxcIi5idWZmZXIuYnVmZmVyKTtcIix6LFwiLnZlcnRleEF0dHJpYlBvaW50ZXIoXCIsbixcIixcIixsLFwiLnNpemUsXCIsXG5sLFwiLnR5cGUsXCIsbCxcIi5ub3JtYWxpemVkLFwiLGwsXCIuc3RyaWRlLFwiLGwsXCIub2Zmc2V0KTtcIilbXCJlbHNlXCJdKHosXCIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KFwiLG4sXCIpO1wiLHosXCIudmVydGV4QXR0cmliNGYoXCIsbixcIixcIixsLFwiLngsXCIsbCxcIi55LFwiLGwsXCIueixcIixsLFwiLncpO1wiLGwsXCIuYnVmZmVyPW51bGw7XCIpO2MoQik7bSYmYyhmLFwiLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRShcIixuLFwiLFwiLGwsXCIuZGl2aXNvcik7XCIpfU9iamVjdC5rZXlzKHdhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBoPXdhW2VdLHc9Zy5kZWYocSxcIi5cIixlKSxtPWEuYmxvY2soKTttKFwiaWYoXCIsdyxcIil7XCIseixcIi5lbmFibGUoXCIsaCxcIil9ZWxzZXtcIix6LFwiLmRpc2FibGUoXCIsaCxcIil9XCIsayxcIi5cIixlLFwiPVwiLHcsXCI7XCIpO2MobSk7YihcImlmKFwiLHcsXCIhPT1cIixrLFwiLlwiLGUsXCIpe1wiLG0sXCJ9XCIpfSk7T2JqZWN0LmtleXMoeGEpLmZvckVhY2goZnVuY3Rpb24oaCl7dmFyIHc9eGFbaF0sbT1lW2hdLGYsXG5uLGw9YS5ibG9jaygpO2woeixcIi5cIix3LFwiKFwiKTt5KG0pPyh3PW0ubGVuZ3RoLGY9YS5nbG9iYWwuZGVmKHEsXCIuXCIsaCksbj1hLmdsb2JhbC5kZWYoayxcIi5cIixoKSxsKEYodyxmdW5jdGlvbihlKXtyZXR1cm4gZitcIltcIitlK1wiXVwifSksXCIpO1wiLEYodyxmdW5jdGlvbihlKXtyZXR1cm4gbitcIltcIitlK1wiXT1cIitmK1wiW1wiK2UrXCJdO1wifSkuam9pbihcIlwiKSksYihcImlmKFwiLEYodyxmdW5jdGlvbihlKXtyZXR1cm4gZitcIltcIitlK1wiXSE9PVwiK24rXCJbXCIrZStcIl1cIn0pLmpvaW4oXCJ8fFwiKSxcIil7XCIsbCxcIn1cIikpOihmPWcuZGVmKHEsXCIuXCIsaCksbj1nLmRlZihrLFwiLlwiLGgpLGwoZixcIik7XCIsayxcIi5cIixoLFwiPVwiLGYsXCI7XCIpLGIoXCJpZihcIixmLFwiIT09XCIsbixcIil7XCIsbCxcIn1cIikpO2MobCl9KTtyZXR1cm4gYS5jb21waWxlKCl9KCksY29tcGlsZTpmdW5jdGlvbihlLGEsYixjLGgpe3ZhciBnPWJhKCk7Zy5zdGF0cz1nLmxpbmsoaCk7T2JqZWN0LmtleXMoYVtcInN0YXRpY1wiXSkuZm9yRWFjaChmdW5jdGlvbihlKXtKYShnLFxuYSxlKX0pO24uZm9yRWFjaChmdW5jdGlvbihhKXtKYShnLGUsYSl9KTtiPWxhKGUsYSxiLGMsZyk7SGEoZyxiKTtQYShnLGIpO0RhKGcsYik7cmV0dXJuIGcuY29tcGlsZSgpfX19fSx7XCIuL2NvbnN0YW50cy9kdHlwZXMuanNvblwiOjQsXCIuL2NvbnN0YW50cy9wcmltaXRpdmVzLmpzb25cIjo1LFwiLi9keW5hbWljXCI6OCxcIi4vdXRpbC9jb2RlZ2VuXCI6MjEsXCIuL3V0aWwvaXMtYXJyYXktbGlrZVwiOjI0LFwiLi91dGlsL2lzLW5kYXJyYXlcIjoyNSxcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiOjI2LFwiLi91dGlsL2xvb3BcIjoyN31dLDg6W2Z1bmN0aW9uKGYscCx1KXtmdW5jdGlvbiBsKGMsYSl7dGhpcy5pZD1yKys7dGhpcy50eXBlPWM7dGhpcy5kYXRhPWF9ZnVuY3Rpb24gayhjKXtpZigwPT09Yy5sZW5ndGgpcmV0dXJuW107dmFyIGE9Yy5jaGFyQXQoMCksYj1jLmNoYXJBdChjLmxlbmd0aC0xKTtpZigxPGMubGVuZ3RoJiZhPT09YiYmKCdcIic9PT1hfHxcIidcIj09PWEpKXJldHVyblsnXCInK2Muc3Vic3RyKDEsXG5jLmxlbmd0aC0yKS5yZXBsYWNlKC9cXFxcL2csXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCdcXFxcXCInKSsnXCInXTtpZihhPS9cXFsoZmFsc2V8dHJ1ZXxudWxsfFxcZCt8J1teJ10qJ3xcIlteXCJdKlwiKVxcXS8uZXhlYyhjKSlyZXR1cm4gayhjLnN1YnN0cigwLGEuaW5kZXgpKS5jb25jYXQoayhhWzFdKSkuY29uY2F0KGsoYy5zdWJzdHIoYS5pbmRleCthWzBdLmxlbmd0aCkpKTthPWMuc3BsaXQoXCIuXCIpO2lmKDE9PT1hLmxlbmd0aClyZXR1cm5bJ1wiJytjLnJlcGxhY2UoL1xcXFwvZyxcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csJ1xcXFxcIicpKydcIiddO2M9W107Zm9yKGI9MDtiPGEubGVuZ3RoOysrYiljPWMuY29uY2F0KGsoYVtiXSkpO3JldHVybiBjfWZ1bmN0aW9uIHgoYyl7cmV0dXJuXCJbXCIrayhjKS5qb2luKFwiXVtcIikrXCJdXCJ9dmFyIHI9MDtwLmV4cG9ydHM9e0R5bmFtaWNWYXJpYWJsZTpsLGRlZmluZTpmdW5jdGlvbihjLGEpe3JldHVybiBuZXcgbChjLHgoYStcIlwiKSl9LGlzRHluYW1pYzpmdW5jdGlvbihjKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT1cbnR5cGVvZiBjJiYhYy5fcmVnbFR5cGV8fGMgaW5zdGFuY2VvZiBsfSx1bmJveDpmdW5jdGlvbihjLGEpe3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBjP25ldyBsKDAsYyk6Y30sYWNjZXNzb3I6eH19LHt9XSw5OltmdW5jdGlvbihmLHAsdSl7dmFyIGw9ZihcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiKSxrPWYoXCIuL3V0aWwvaXMtbmRhcnJheVwiKSx4PWYoXCIuL3V0aWwvdmFsdWVzXCIpLHI9ZihcIi4vY29uc3RhbnRzL3ByaW1pdGl2ZXMuanNvblwiKSxjPWYoXCIuL2NvbnN0YW50cy91c2FnZS5qc29uXCIpO3AuZXhwb3J0cz1mdW5jdGlvbihhLGIsZixwKXtmdW5jdGlvbiB0KGEpe3RoaXMuaWQ9QysrO0VbdGhpcy5pZF09dGhpczt0aGlzLmJ1ZmZlcj1hO3RoaXMucHJpbVR5cGU9NDt0aGlzLnR5cGU9dGhpcy52ZXJ0Q291bnQ9MH1mdW5jdGlvbiB5KGMsZyxuLHIseCxoLHQpe2MuYnVmZmVyLmJpbmQoKTtpZihnKXt2YXIgeT10O3R8fGwoZykmJighayhnKXx8bChnLmRhdGEpKXx8KHk9Yi5vZXNfZWxlbWVudF9pbmRleF91aW50P1xuNTEyNTo1MTIzKTtmLl9pbml0QnVmZmVyKGMuYnVmZmVyLGcsbix5LDMpfWVsc2UgYS5idWZmZXJEYXRhKDM0OTYzLGgsbiksYy5idWZmZXIuZHR5cGU9eXx8NTEyMSxjLmJ1ZmZlci51c2FnZT1uLGMuYnVmZmVyLmRpbWVuc2lvbj0zLGMuYnVmZmVyLmJ5dGVMZW5ndGg9aDt5PXQ7aWYoIXQpe3N3aXRjaChjLmJ1ZmZlci5kdHlwZSl7Y2FzZSA1MTIxOmNhc2UgNTEyMDp5PTUxMjE7YnJlYWs7Y2FzZSA1MTIzOmNhc2UgNTEyMjp5PTUxMjM7YnJlYWs7Y2FzZSA1MTI1OmNhc2UgNTEyNDp5PTUxMjV9Yy5idWZmZXIuZHR5cGU9eX1jLnR5cGU9eTtnPXg7MD5nJiYoZz1jLmJ1ZmZlci5ieXRlTGVuZ3RoLDUxMjM9PT15P2c+Pj0xOjUxMjU9PT15JiYoZz4+PTIpKTtjLnZlcnRDb3VudD1nO2c9cjswPnImJihnPTQscj1jLmJ1ZmZlci5kaW1lbnNpb24sMT09PXImJihnPTApLDI9PT1yJiYoZz0xKSwzPT09ciYmKGc9NCkpO2MucHJpbVR5cGU9Z31mdW5jdGlvbiBnKGEpe3AuZWxlbWVudHNDb3VudC0tO1xuZGVsZXRlIEVbYS5pZF07YS5idWZmZXIuZGVzdHJveSgpO2EuYnVmZmVyPW51bGx9dmFyIEU9e30sQz0wLE49e3VpbnQ4OjUxMjEsdWludDE2OjUxMjN9O2Iub2VzX2VsZW1lbnRfaW5kZXhfdWludCYmKE4udWludDMyPTUxMjUpO3QucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oKXt0aGlzLmJ1ZmZlci5iaW5kKCl9O3ZhciBuPVtdO3JldHVybntjcmVhdGU6ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBuKGEpe2lmKGEpaWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXgoYSksQy5wcmltVHlwZT00LEMudmVydENvdW50PWF8MCxDLnR5cGU9NTEyMTtlbHNle3ZhciBiPW51bGwsZz0zNTA0NCxtPS0xLGY9LTEsdD0wLEI9MDtpZihBcnJheS5pc0FycmF5KGEpfHxsKGEpfHxrKGEpKWI9YTtlbHNlIGlmKFwiZGF0YVwiaW4gYSYmKGI9YS5kYXRhKSxcInVzYWdlXCJpbiBhJiYoZz1jW2EudXNhZ2VdKSxcInByaW1pdGl2ZVwiaW4gYSYmKG09clthLnByaW1pdGl2ZV0pLFwiY291bnRcImluIGEmJihmPWEuY291bnR8MCksXG5cInR5cGVcImluIGEmJihCPU5bYS50eXBlXSksXCJsZW5ndGhcImluIGEpdD1hLmxlbmd0aHwwO2Vsc2UgaWYodD1mLDUxMjM9PT1CfHw1MTIyPT09Qil0Kj0yO2Vsc2UgaWYoNTEyNT09PUJ8fDUxMjQ9PT1CKXQqPTQ7eShDLGIsZyxtLGYsdCxCKX1lbHNlIHgoKSxDLnByaW1UeXBlPTQsQy52ZXJ0Q291bnQ9MCxDLnR5cGU9NTEyMTtyZXR1cm4gbn12YXIgeD1mLmNyZWF0ZShudWxsLDM0OTYzLCEwKSxDPW5ldyB0KHguX2J1ZmZlcik7cC5lbGVtZW50c0NvdW50Kys7bihhKTtuLl9yZWdsVHlwZT1cImVsZW1lbnRzXCI7bi5fZWxlbWVudHM9QztuLnN1YmRhdGE9ZnVuY3Rpb24oYSxiKXt4LnN1YmRhdGEoYSxiKTtyZXR1cm4gbn07bi5kZXN0cm95PWZ1bmN0aW9uKCl7ZyhDKX07cmV0dXJuIG59LGNyZWF0ZVN0cmVhbTpmdW5jdGlvbihhKXt2YXIgYj1uLnBvcCgpO2J8fChiPW5ldyB0KGYuY3JlYXRlKG51bGwsMzQ5NjMsITAsITEpLl9idWZmZXIpKTt5KGIsYSwzNTA0MCwtMSwtMSwwLDApO3JldHVybiBifSxcbmRlc3Ryb3lTdHJlYW06ZnVuY3Rpb24oYSl7bi5wdXNoKGEpfSxnZXRFbGVtZW50czpmdW5jdGlvbihhKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmYS5fZWxlbWVudHMgaW5zdGFuY2VvZiB0P2EuX2VsZW1lbnRzOm51bGx9LGNsZWFyOmZ1bmN0aW9uKCl7eChFKS5mb3JFYWNoKGcpfX19fSx7XCIuL2NvbnN0YW50cy9wcmltaXRpdmVzLmpzb25cIjo1LFwiLi9jb25zdGFudHMvdXNhZ2UuanNvblwiOjYsXCIuL3V0aWwvaXMtbmRhcnJheVwiOjI1LFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCI6MjYsXCIuL3V0aWwvdmFsdWVzXCI6MzF9XSwxMDpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz1mdW5jdGlvbihmLGspe2Z1bmN0aW9uIHgoYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGM7dHJ5e2M9clthXT1mLmdldEV4dGVuc2lvbihhKX1jYXRjaChrKXt9cmV0dXJuISFjfWZvcih2YXIgcj17fSxjPTA7YzxrLmV4dGVuc2lvbnMubGVuZ3RoOysrYyl7dmFyIGE9ay5leHRlbnNpb25zW2NdO2lmKCF4KGEpKXJldHVybiBrLm9uRGVzdHJveSgpLFxuay5vbkRvbmUoJ1wiJythKydcIiBleHRlbnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBXZWJHTCBjb250ZXh0LCB0cnkgdXBncmFkaW5nIHlvdXIgc3lzdGVtIG9yIGEgZGlmZmVyZW50IGJyb3dzZXInKSxudWxsfWsub3B0aW9uYWxFeHRlbnNpb25zLmZvckVhY2goeCk7cmV0dXJue2V4dGVuc2lvbnM6cixyZXN0b3JlOmZ1bmN0aW9uKCl7T2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihhKXtpZigheChhKSl0aHJvdyBFcnJvcihcIihyZWdsKTogZXJyb3IgcmVzdG9yaW5nIGV4dGVuc2lvbiBcIithKTt9KX19fX0se31dLDExOltmdW5jdGlvbihmLHAsdSl7dmFyIGw9ZihcIi4vdXRpbC92YWx1ZXNcIiksaz1mKFwiLi91dGlsL2V4dGVuZFwiKSx4PVtdO3hbNjQwOF09NDt2YXIgcj1bXTtyWzUxMjFdPTE7cls1MTI2XT00O3JbMzYxOTNdPTI7cC5leHBvcnRzPWZ1bmN0aW9uKGMsYSxiLGYscCx0KXtmdW5jdGlvbiB5KGEsYyxiKXt0aGlzLnRhcmdldD1hO3RoaXMudGV4dHVyZT1cbmM7dGhpcy5yZW5kZXJidWZmZXI9Yjt2YXIgaD1hPTA7Yz8oYT1jLndpZHRoLGg9Yy5oZWlnaHQpOmImJihhPWIud2lkdGgsaD1iLmhlaWdodCk7dGhpcy53aWR0aD1hO3RoaXMuaGVpZ2h0PWh9ZnVuY3Rpb24gZyhhKXthJiYoYS50ZXh0dXJlJiZhLnRleHR1cmUuX3RleHR1cmUuZGVjUmVmKCksYS5yZW5kZXJidWZmZXImJmEucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZGVjUmVmKCkpfWZ1bmN0aW9uIEUoYSxjLGIpe2EmJihhLnRleHR1cmU/YS50ZXh0dXJlLl90ZXh0dXJlLnJlZkNvdW50Kz0xOmEucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIucmVmQ291bnQrPTEpfWZ1bmN0aW9uIEMoYSxiKXtiJiYoYi50ZXh0dXJlP2MuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsYSxiLnRhcmdldCxiLnRleHR1cmUuX3RleHR1cmUudGV4dHVyZSwwKTpjLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKDM2MTYwLGEsMzYxNjEsYi5yZW5kZXJidWZmZXIuX3JlbmRlcmJ1ZmZlci5yZW5kZXJidWZmZXIpKX1cbmZ1bmN0aW9uIE4oYSl7dmFyIGI9MzU1MyxjPW51bGwsaD1udWxsLGc9YTtcIm9iamVjdFwiPT09dHlwZW9mIGEmJihnPWEuZGF0YSxcInRhcmdldFwiaW4gYSYmKGI9YS50YXJnZXR8MCkpO2E9Zy5fcmVnbFR5cGU7XCJ0ZXh0dXJlMmRcIj09PWE/Yz1nOlwidGV4dHVyZUN1YmVcIj09PWE/Yz1nOlwicmVuZGVyYnVmZmVyXCI9PT1hJiYoaD1nLGI9MzYxNjEpO3JldHVybiBuZXcgeShiLGMsaCl9ZnVuY3Rpb24gbihhLGIsYyxoLGcpe2lmKGMpcmV0dXJuIGE9Zi5jcmVhdGUyRCh7d2lkdGg6YSxoZWlnaHQ6Yixmb3JtYXQ6aCx0eXBlOmd9KSxhLl90ZXh0dXJlLnJlZkNvdW50PTAsbmV3IHkoMzU1MyxhLG51bGwpO2E9cC5jcmVhdGUoe3dpZHRoOmEsaGVpZ2h0OmIsZm9ybWF0Omh9KTthLl9yZW5kZXJidWZmZXIucmVmQ291bnQ9MDtyZXR1cm4gbmV3IHkoMzYxNjEsbnVsbCxhKX1mdW5jdGlvbiBtKGEpe3JldHVybiBhJiYoYS50ZXh0dXJlfHxhLnJlbmRlcmJ1ZmZlcil9ZnVuY3Rpb24gQihhLGIsYyl7YSYmXG4oYS50ZXh0dXJlP2EudGV4dHVyZS5yZXNpemUoYixjKTphLnJlbmRlcmJ1ZmZlciYmYS5yZW5kZXJidWZmZXIucmVzaXplKGIsYykpfWZ1bmN0aW9uIHUoKXt0aGlzLmlkPVorKztEW3RoaXMuaWRdPXRoaXM7dGhpcy5mcmFtZWJ1ZmZlcj1jLmNyZWF0ZUZyYW1lYnVmZmVyKCk7dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD0wO3RoaXMuY29sb3JBdHRhY2htZW50cz1bXTt0aGlzLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ9dGhpcy5zdGVuY2lsQXR0YWNobWVudD10aGlzLmRlcHRoQXR0YWNobWVudD1udWxsfWZ1bmN0aW9uIEwoYSl7YS5jb2xvckF0dGFjaG1lbnRzLmZvckVhY2goZyk7ZyhhLmRlcHRoQXR0YWNobWVudCk7ZyhhLnN0ZW5jaWxBdHRhY2htZW50KTtnKGEuZGVwdGhTdGVuY2lsQXR0YWNobWVudCl9ZnVuY3Rpb24gSChhKXtjLmRlbGV0ZUZyYW1lYnVmZmVyKGEuZnJhbWVidWZmZXIpO2EuZnJhbWVidWZmZXI9bnVsbDt0LmZyYW1lYnVmZmVyQ291bnQtLTtkZWxldGUgRFthLmlkXX1cbmZ1bmN0aW9uIGgoYSl7dmFyIGg7Yy5iaW5kRnJhbWVidWZmZXIoMzYxNjAsYS5mcmFtZWJ1ZmZlcik7dmFyIGc9YS5jb2xvckF0dGFjaG1lbnRzO2ZvcihoPTA7aDxnLmxlbmd0aDsrK2gpQygzNjA2NCtoLGdbaF0pO2ZvcihoPWcubGVuZ3RoO2g8Yi5tYXhDb2xvckF0dGFjaG1lbnRzOysraCljLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0K2gsMzU1MyxudWxsLDApO2MuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzMzMDYsMzU1MyxudWxsLDApO2MuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwOTYsMzU1MyxudWxsLDApO2MuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYxMjgsMzU1MyxudWxsLDApO0MoMzYwOTYsYS5kZXB0aEF0dGFjaG1lbnQpO0MoMzYxMjgsYS5zdGVuY2lsQXR0YWNobWVudCk7QygzMzMwNixhLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQpO2MuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cygzNjE2MCk7Yy5iaW5kRnJhbWVidWZmZXIoMzYxNjAsXG5LYS5uZXh0KTtLYS5jdXI9S2EubmV4dDtjLmdldEVycm9yKCl9ZnVuY3Rpb24gZmEoYSxiKXtmdW5jdGlvbiBjKGEsYil7dmFyIGssZj0wLGw9MCx0PSEwLHk9ITA7az1udWxsO3ZhciBCPSEwLEM9XCJyZ2JhXCIsRj1cInVpbnQ4XCIscD0xLE09bnVsbCxIPW51bGwsdT1udWxsLFk9ITE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWY9YXwwLGw9YnwwfHxmO2Vsc2UgaWYoYSl7XCJzaGFwZVwiaW4gYT8obD1hLnNoYXBlLGY9bFswXSxsPWxbMV0pOihcInJhZGl1c1wiaW4gYSYmKGY9bD1hLnJhZGl1cyksXCJ3aWR0aFwiaW4gYSYmKGY9YS53aWR0aCksXCJoZWlnaHRcImluIGEmJihsPWEuaGVpZ2h0KSk7aWYoXCJjb2xvclwiaW4gYXx8XCJjb2xvcnNcImluIGEpaz1hLmNvbG9yfHxhLmNvbG9ycyxBcnJheS5pc0FycmF5KGspO2lmKCFrKXtcImNvbG9yQ291bnRcImluIGEmJihwPWEuY29sb3JDb3VudHwwKTtcImNvbG9yVGV4dHVyZVwiaW4gYSYmKEI9ISFhLmNvbG9yVGV4dHVyZSxDPVwicmdiYTRcIik7aWYoXCJjb2xvclR5cGVcImluXG5hJiYoRj1hLmNvbG9yVHlwZSwhQikpaWYoXCJoYWxmIGZsb2F0XCI9PT1GfHxcImZsb2F0MTZcIj09PUYpQz1cInJnYmExNmZcIjtlbHNlIGlmKFwiZmxvYXRcIj09PUZ8fFwiZmxvYXQzMlwiPT09RilDPVwicmdiYTMyZlwiO1wiY29sb3JGb3JtYXRcImluIGEmJihDPWEuY29sb3JGb3JtYXQsMDw9TGEuaW5kZXhPZihDKT9CPSEwOjA8PXphLmluZGV4T2YoQykmJihCPSExKSl9aWYoXCJkZXB0aFRleHR1cmVcImluIGF8fFwiZGVwdGhTdGVuY2lsVGV4dHVyZVwiaW4gYSlZPSEoIWEuZGVwdGhUZXh0dXJlJiYhYS5kZXB0aFN0ZW5jaWxUZXh0dXJlKTtcImRlcHRoXCJpbiBhJiYoXCJib29sZWFuXCI9PT10eXBlb2YgYS5kZXB0aD90PWEuZGVwdGg6KE09YS5kZXB0aCx5PSExKSk7XCJzdGVuY2lsXCJpbiBhJiYoXCJib29sZWFuXCI9PT10eXBlb2YgYS5zdGVuY2lsP3k9YS5zdGVuY2lsOihIPWEuc3RlbmNpbCx0PSExKSk7XCJkZXB0aFN0ZW5jaWxcImluIGEmJihcImJvb2xlYW5cIj09PXR5cGVvZiBhLmRlcHRoU3RlbmNpbD90PXk9YS5kZXB0aFN0ZW5jaWw6XG4odT1hLmRlcHRoU3RlbmNpbCx5PXQ9ITEpKX1lbHNlIGY9bD0xO3ZhciBEPW51bGwsZmE9bnVsbCxLPW51bGwsTz1udWxsO2lmKEFycmF5LmlzQXJyYXkoaykpRD1rLm1hcChOKTtlbHNlIGlmKGspRD1bTihrKV07ZWxzZSBmb3IoRD1BcnJheShwKSxrPTA7azxwOysraylEW2tdPW4oZixsLEIsQyxGKTtmPWZ8fERbMF0ud2lkdGg7bD1sfHxEWzBdLmhlaWdodDtNP2ZhPU4oTSk6dCYmIXkmJihmYT1uKGYsbCxZLFwiZGVwdGhcIixcInVpbnQzMlwiKSk7SD9LPU4oSCk6eSYmIXQmJihLPW4oZixsLCExLFwic3RlbmNpbFwiLFwidWludDhcIikpO3U/Tz1OKHUpOiFNJiYhSCYmeSYmdCYmKE89bihmLGwsWSxcImRlcHRoIHN0ZW5jaWxcIixcImRlcHRoIHN0ZW5jaWxcIikpO3Q9bnVsbDtmb3Ioaz0wO2s8RC5sZW5ndGg7KytrKUUoRFtrXSxmLGwpLERba10mJkRba10udGV4dHVyZSYmKHk9eFtEW2tdLnRleHR1cmUuX3RleHR1cmUuZm9ybWF0XSpyW0Rba10udGV4dHVyZS5fdGV4dHVyZS50eXBlXSxudWxsPT09XG50JiYodD15KSk7RShmYSxmLGwpO0UoSyxmLGwpO0UoTyxmLGwpO0woZyk7Zy53aWR0aD1mO2cuaGVpZ2h0PWw7Zy5jb2xvckF0dGFjaG1lbnRzPUQ7Zy5kZXB0aEF0dGFjaG1lbnQ9ZmE7Zy5zdGVuY2lsQXR0YWNobWVudD1LO2cuZGVwdGhTdGVuY2lsQXR0YWNobWVudD1PO2MuY29sb3I9RC5tYXAobSk7Yy5kZXB0aD1tKGZhKTtjLnN0ZW5jaWw9bShLKTtjLmRlcHRoU3RlbmNpbD1tKE8pO2Mud2lkdGg9Zy53aWR0aDtjLmhlaWdodD1nLmhlaWdodDtoKGcpO3JldHVybiBjfXZhciBnPW5ldyB1O3QuZnJhbWVidWZmZXJDb3VudCsrO2MoYSxiKTtyZXR1cm4gayhjLHtyZXNpemU6ZnVuY3Rpb24oYSxiKXt2YXIgaz1hfDAsZj1ifDB8fGs7aWYoaz09PWcud2lkdGgmJmY9PT1nLmhlaWdodClyZXR1cm4gYztmb3IodmFyIG09Zy5jb2xvckF0dGFjaG1lbnRzLGw9MDtsPG0ubGVuZ3RoOysrbClCKG1bbF0sayxmKTtCKGcuZGVwdGhBdHRhY2htZW50LGssZik7QihnLnN0ZW5jaWxBdHRhY2htZW50LFxuayxmKTtCKGcuZGVwdGhTdGVuY2lsQXR0YWNobWVudCxrLGYpO2cud2lkdGg9Yy53aWR0aD1rO2cuaGVpZ2h0PWMuaGVpZ2h0PWY7aChnKTtyZXR1cm4gY30sX3JlZ2xUeXBlOlwiZnJhbWVidWZmZXJcIixfZnJhbWVidWZmZXI6ZyxkZXN0cm95OmZ1bmN0aW9uKCl7SChnKTtMKGcpfX0pfXZhciBLYT17Y3VyOm51bGwsbmV4dDpudWxsLGRpcnR5OiExfSxMYT1bXCJyZ2JhXCJdLHphPVtcInJnYmE0XCIsXCJyZ2I1NjVcIixcInJnYjUgYTFcIl07YS5leHRfc3JnYiYmemEucHVzaChcInNyZ2JhXCIpO2EuZXh0X2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JiZ6YS5wdXNoKFwicmdiYTE2ZlwiLFwicmdiMTZmXCIpO2Eud2ViZ2xfY29sb3JfYnVmZmVyX2Zsb2F0JiZ6YS5wdXNoKFwicmdiYTMyZlwiKTt2YXIgR2E9W1widWludDhcIl07YS5vZXNfdGV4dHVyZV9oYWxmX2Zsb2F0JiZHYS5wdXNoKFwiaGFsZiBmbG9hdFwiLFwiZmxvYXQxNlwiKTthLm9lc190ZXh0dXJlX2Zsb2F0JiZHYS5wdXNoKFwiZmxvYXRcIixcImZsb2F0MzJcIik7dmFyIFo9XG4wLEQ9e307cmV0dXJuIGsoS2Ese2dldEZyYW1lYnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhJiZcImZyYW1lYnVmZmVyXCI9PT1hLl9yZWdsVHlwZSYmKGE9YS5fZnJhbWVidWZmZXIsYSBpbnN0YW5jZW9mIHUpP2E6bnVsbH0sY3JlYXRlOmZhLGNyZWF0ZUN1YmU6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhKXt2YXIgZyxoPXtjb2xvcjpudWxsfSxtPTAsbD1udWxsO2c9XCJyZ2JhXCI7dmFyIG49XCJ1aW50OFwiLHI9MTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpbT1hfDA7ZWxzZSBpZihhKXtcInNoYXBlXCJpbiBhP209YS5zaGFwZVswXTooXCJyYWRpdXNcImluIGEmJihtPWEucmFkaXVzfDApLFwid2lkdGhcImluIGE/bT1hLndpZHRofDA6XCJoZWlnaHRcImluIGEmJihtPWEuaGVpZ2h0fDApKTtpZihcImNvbG9yXCJpbiBhfHxcImNvbG9yc1wiaW4gYSlsPWEuY29sb3J8fGEuY29sb3JzLEFycmF5LmlzQXJyYXkobCk7bHx8KFwiY29sb3JDb3VudFwiaW4gYSYmKHI9YS5jb2xvckNvdW50fFxuMCksXCJjb2xvclR5cGVcImluIGEmJihuPWEuY29sb3JUeXBlKSxcImNvbG9yRm9ybWF0XCJpbiBhJiYoZz1hLmNvbG9yRm9ybWF0KSk7XCJkZXB0aFwiaW4gYSYmKGguZGVwdGg9YS5kZXB0aCk7XCJzdGVuY2lsXCJpbiBhJiYoaC5zdGVuY2lsPWEuc3RlbmNpbCk7XCJkZXB0aFN0ZW5jaWxcImluIGEmJihoLmRlcHRoU3RlbmNpbD1hLmRlcHRoU3RlbmNpbCl9ZWxzZSBtPTE7aWYobClpZihBcnJheS5pc0FycmF5KGwpKWZvcihhPVtdLGc9MDtnPGwubGVuZ3RoOysrZylhW2ddPWxbZ107ZWxzZSBhPVtsXTtlbHNlIGZvcihhPUFycmF5KHIpLGw9e3JhZGl1czptLGZvcm1hdDpnLHR5cGU6bn0sZz0wO2c8cjsrK2cpYVtnXT1mLmNyZWF0ZUN1YmUobCk7aC5jb2xvcj1BcnJheShhLmxlbmd0aCk7Zm9yKGc9MDtnPGEubGVuZ3RoOysrZylyPWFbZ10sbT1tfHxyLndpZHRoLGguY29sb3JbZ109e3RhcmdldDozNDA2OSxkYXRhOmFbZ119O2ZvcihnPTA7Nj5nOysrZyl7Zm9yKHI9MDtyPGEubGVuZ3RoOysrciloLmNvbG9yW3JdLnRhcmdldD1cbjM0MDY5K2c7MDxnJiYoaC5kZXB0aD1iWzBdLmRlcHRoLGguc3RlbmNpbD1iWzBdLnN0ZW5jaWwsaC5kZXB0aFN0ZW5jaWw9YlswXS5kZXB0aFN0ZW5jaWwpO2lmKGJbZ10pYltnXShoKTtlbHNlIGJbZ109ZmEoaCl9cmV0dXJuIGsoYyx7d2lkdGg6bSxoZWlnaHQ6bSxjb2xvcjphfSl9dmFyIGI9QXJyYXkoNik7YyhhKTtyZXR1cm4gayhjLHtmYWNlczpiLHJlc2l6ZTpmdW5jdGlvbihhKXt2YXIgZz1hfDA7aWYoZz09PWMud2lkdGgpcmV0dXJuIGM7dmFyIGg9Yy5jb2xvcjtmb3IoYT0wO2E8aC5sZW5ndGg7KythKWhbYV0ucmVzaXplKGcpO2ZvcihhPTA7Nj5hOysrYSliW2FdLnJlc2l6ZShnKTtjLndpZHRoPWMuaGVpZ2h0PWc7cmV0dXJuIGN9LF9yZWdsVHlwZTpcImZyYW1lYnVmZmVyQ3ViZVwiLGRlc3Ryb3k6ZnVuY3Rpb24oKXtiLmZvckVhY2goZnVuY3Rpb24oYSl7YS5kZXN0cm95KCl9KX19KX0sY2xlYXI6ZnVuY3Rpb24oKXtsKEQpLmZvckVhY2goSCl9LHJlc3RvcmU6ZnVuY3Rpb24oKXtsKEQpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5mcmFtZWJ1ZmZlcj1cbmMuY3JlYXRlRnJhbWVidWZmZXIoKTtoKGEpfSl9fSl9fSx7XCIuL3V0aWwvZXh0ZW5kXCI6MjIsXCIuL3V0aWwvdmFsdWVzXCI6MzF9XSwxMjpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz1mdW5jdGlvbihmLGspe3ZhciB4PTE7ay5leHRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMmJih4PWYuZ2V0UGFyYW1ldGVyKDM0MDQ3KSk7dmFyIHI9MSxjPTE7ay53ZWJnbF9kcmF3X2J1ZmZlcnMmJihyPWYuZ2V0UGFyYW1ldGVyKDM0ODUyKSxjPWYuZ2V0UGFyYW1ldGVyKDM2MDYzKSk7cmV0dXJue2NvbG9yQml0czpbZi5nZXRQYXJhbWV0ZXIoMzQxMCksZi5nZXRQYXJhbWV0ZXIoMzQxMSksZi5nZXRQYXJhbWV0ZXIoMzQxMiksZi5nZXRQYXJhbWV0ZXIoMzQxMyldLGRlcHRoQml0czpmLmdldFBhcmFtZXRlcigzNDE0KSxzdGVuY2lsQml0czpmLmdldFBhcmFtZXRlcigzNDE1KSxzdWJwaXhlbEJpdHM6Zi5nZXRQYXJhbWV0ZXIoMzQwOCksZXh0ZW5zaW9uczpPYmplY3Qua2V5cyhrKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFrW2FdfSksXG5tYXhBbmlzb3Ryb3BpYzp4LG1heERyYXdidWZmZXJzOnIsbWF4Q29sb3JBdHRhY2htZW50czpjLHBvaW50U2l6ZURpbXM6Zi5nZXRQYXJhbWV0ZXIoMzM5MDEpLGxpbmVXaWR0aERpbXM6Zi5nZXRQYXJhbWV0ZXIoMzM5MDIpLG1heFZpZXdwb3J0RGltczpmLmdldFBhcmFtZXRlcigzMzg2KSxtYXhDb21iaW5lZFRleHR1cmVVbml0czpmLmdldFBhcmFtZXRlcigzNTY2MSksbWF4Q3ViZU1hcFNpemU6Zi5nZXRQYXJhbWV0ZXIoMzQwNzYpLG1heFJlbmRlcmJ1ZmZlclNpemU6Zi5nZXRQYXJhbWV0ZXIoMzQwMjQpLG1heFRleHR1cmVVbml0czpmLmdldFBhcmFtZXRlcigzNDkzMCksbWF4VGV4dHVyZVNpemU6Zi5nZXRQYXJhbWV0ZXIoMzM3OSksbWF4QXR0cmlidXRlczpmLmdldFBhcmFtZXRlcigzNDkyMSksbWF4VmVydGV4VW5pZm9ybXM6Zi5nZXRQYXJhbWV0ZXIoMzYzNDcpLG1heFZlcnRleFRleHR1cmVVbml0czpmLmdldFBhcmFtZXRlcigzNTY2MCksbWF4VmFyeWluZ1ZlY3RvcnM6Zi5nZXRQYXJhbWV0ZXIoMzYzNDgpLFxubWF4RnJhZ21lbnRVbmlmb3JtczpmLmdldFBhcmFtZXRlcigzNjM0OSksZ2xzbDpmLmdldFBhcmFtZXRlcigzNTcyNCkscmVuZGVyZXI6Zi5nZXRQYXJhbWV0ZXIoNzkzNyksdmVuZG9yOmYuZ2V0UGFyYW1ldGVyKDc5MzYpLHZlcnNpb246Zi5nZXRQYXJhbWV0ZXIoNzkzOCl9fX0se31dLDEzOltmdW5jdGlvbihmLHAsdSl7dmFyIGw9ZihcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiKTtwLmV4cG9ydHM9ZnVuY3Rpb24oayxmLHIsYyxhLGIpe3JldHVybiBmdW5jdGlvbihhKXt2YXIgYjtiPW51bGw9PT1mLm5leHQ/NTEyMTpmLm5leHQuY29sb3JBdHRhY2htZW50c1swXS50ZXh0dXJlLl90ZXh0dXJlLnR5cGU7dmFyIHQ9MCx5PTAsZz1jLmZyYW1lYnVmZmVyV2lkdGgscD1jLmZyYW1lYnVmZmVySGVpZ2h0LEM9bnVsbDtsKGEpP0M9YTphJiYodD1hLnh8MCx5PWEueXwwLGc9KGEud2lkdGh8fGMuZnJhbWVidWZmZXJXaWR0aC10KXwwLHA9KGEuaGVpZ2h0fHxjLmZyYW1lYnVmZmVySGVpZ2h0LVxueSl8MCxDPWEuZGF0YXx8bnVsbCk7cigpO2E9ZypwKjQ7Q3x8KDUxMjE9PT1iP0M9bmV3IFVpbnQ4QXJyYXkoYSk6NTEyNj09PWImJihDPUN8fG5ldyBGbG9hdDMyQXJyYXkoYSkpKTtrLnBpeGVsU3RvcmVpKDMzMzMsNCk7ay5yZWFkUGl4ZWxzKHQseSxnLHAsNjQwOCxiLEMpO3JldHVybiBDfX19LHtcIi4vdXRpbC9pcy10eXBlZC1hcnJheVwiOjI2fV0sMTQ6W2Z1bmN0aW9uKGYscCx1KXt2YXIgbD1mKFwiLi91dGlsL3ZhbHVlc1wiKSxrPVtdO2tbMzI4NTRdPTI7a1szMjg1NV09MjtrWzM2MTk0XT0yO2tbMzMxODldPTI7a1szNjE2OF09MTtrWzM0MDQxXT00O2tbMzU5MDddPTQ7a1szNDgzNl09MTY7a1szNDg0Ml09ODtrWzM0ODQzXT02O3AuZXhwb3J0cz1mdW5jdGlvbihmLHIsYyxhLGIpe2Z1bmN0aW9uIHAoYSl7dGhpcy5pZD1nKys7dGhpcy5yZWZDb3VudD0xO3RoaXMucmVuZGVyYnVmZmVyPWE7dGhpcy5mb3JtYXQ9MzI4NTQ7dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD0wO2IucHJvZmlsZSYmXG4odGhpcy5zdGF0cz17c2l6ZTowfSl9ZnVuY3Rpb24gTShiKXt2YXIgYz1iLnJlbmRlcmJ1ZmZlcjtmLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbnVsbCk7Zi5kZWxldGVSZW5kZXJidWZmZXIoYyk7Yi5yZW5kZXJidWZmZXI9bnVsbDtiLnJlZkNvdW50PTA7ZGVsZXRlIEVbYi5pZF07YS5yZW5kZXJidWZmZXJDb3VudC0tfXZhciB0PXtyZ2JhNDozMjg1NCxyZ2I1NjU6MzYxOTQsXCJyZ2I1IGExXCI6MzI4NTUsZGVwdGg6MzMxODksc3RlbmNpbDozNjE2OCxcImRlcHRoIHN0ZW5jaWxcIjozNDA0MX07ci5leHRfc3JnYiYmKHQuc3JnYmE9MzU5MDcpO3IuZXh0X2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JiYodC5yZ2JhMTZmPTM0ODQyLHQucmdiMTZmPTM0ODQzKTtyLndlYmdsX2NvbG9yX2J1ZmZlcl9mbG9hdCYmKHQucmdiYTMyZj0zNDgzNik7dmFyIHk9W107T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihhKXt5W3RbYV1dPWF9KTt2YXIgZz0wLEU9e307cC5wcm90b3R5cGUuZGVjUmVmPVxuZnVuY3Rpb24oKXswPj0tLXRoaXMucmVmQ291bnQmJk0odGhpcyl9O2IucHJvZmlsZSYmKGEuZ2V0VG90YWxSZW5kZXJidWZmZXJTaXplPWZ1bmN0aW9uKCl7dmFyIGE9MDtPYmplY3Qua2V5cyhFKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2ErPUVbYl0uc3RhdHMuc2l6ZX0pO3JldHVybiBhfSk7cmV0dXJue2NyZWF0ZTpmdW5jdGlvbihjLGcpe2Z1bmN0aW9uIG4oYSxjKXt2YXIgZz0wLGw9MCxoPTMyODU0O1wib2JqZWN0XCI9PT10eXBlb2YgYSYmYT8oXCJzaGFwZVwiaW4gYT8obD1hLnNoYXBlLGc9bFswXXwwLGw9bFsxXXwwKTooXCJyYWRpdXNcImluIGEmJihnPWw9YS5yYWRpdXN8MCksXCJ3aWR0aFwiaW4gYSYmKGc9YS53aWR0aHwwKSxcImhlaWdodFwiaW4gYSYmKGw9YS5oZWlnaHR8MCkpLFwiZm9ybWF0XCJpbiBhJiYoaD10W2EuZm9ybWF0XSkpOlwibnVtYmVyXCI9PT10eXBlb2YgYT8oZz1hfDAsbD1cIm51bWJlclwiPT09dHlwZW9mIGM/Y3wwOmcpOmF8fChnPWw9MSk7aWYoZyE9PW0ud2lkdGh8fGwhPT1cbm0uaGVpZ2h0fHxoIT09bS5mb3JtYXQpcmV0dXJuIG4ud2lkdGg9bS53aWR0aD1nLG4uaGVpZ2h0PW0uaGVpZ2h0PWwsbS5mb3JtYXQ9aCxmLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbS5yZW5kZXJidWZmZXIpLGYucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxoLGcsbCksYi5wcm9maWxlJiYobS5zdGF0cy5zaXplPWtbbS5mb3JtYXRdKm0ud2lkdGgqbS5oZWlnaHQpLG4uZm9ybWF0PXlbbS5mb3JtYXRdLG59dmFyIG09bmV3IHAoZi5jcmVhdGVSZW5kZXJidWZmZXIoKSk7RVttLmlkXT1tO2EucmVuZGVyYnVmZmVyQ291bnQrKztuKGMsZyk7bi5yZXNpemU9ZnVuY3Rpb24oYSxjKXt2YXIgZz1hfDAsbD1jfDB8fGc7aWYoZz09PW0ud2lkdGgmJmw9PT1tLmhlaWdodClyZXR1cm4gbjtuLndpZHRoPW0ud2lkdGg9ZztuLmhlaWdodD1tLmhlaWdodD1sO2YuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxtLnJlbmRlcmJ1ZmZlcik7Zi5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLG0uZm9ybWF0LFxuZyxsKTtiLnByb2ZpbGUmJihtLnN0YXRzLnNpemU9a1ttLmZvcm1hdF0qbS53aWR0aCptLmhlaWdodCk7cmV0dXJuIG59O24uX3JlZ2xUeXBlPVwicmVuZGVyYnVmZmVyXCI7bi5fcmVuZGVyYnVmZmVyPW07Yi5wcm9maWxlJiYobi5zdGF0cz1tLnN0YXRzKTtuLmRlc3Ryb3k9ZnVuY3Rpb24oKXttLmRlY1JlZigpfTtyZXR1cm4gbn0sY2xlYXI6ZnVuY3Rpb24oKXtsKEUpLmZvckVhY2goTSl9LHJlc3RvcmU6ZnVuY3Rpb24oKXtsKEUpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5yZW5kZXJidWZmZXI9Zi5jcmVhdGVSZW5kZXJidWZmZXIoKTtmLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsYS5yZW5kZXJidWZmZXIpO2YucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxhLmZvcm1hdCxhLndpZHRoLGEuaGVpZ2h0KX0pO2YuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX19fX0se1wiLi91dGlsL3ZhbHVlc1wiOjMxfV0sMTU6W2Z1bmN0aW9uKGYscCx1KXt2YXIgbD1mKFwiLi91dGlsL3ZhbHVlc1wiKTtcbnAuZXhwb3J0cz1mdW5jdGlvbihmLHgscixjKXtmdW5jdGlvbiBhKGEsYyxiLGcpe3RoaXMubmFtZT1hO3RoaXMuaWQ9Yzt0aGlzLmxvY2F0aW9uPWI7dGhpcy5pbmZvPWd9ZnVuY3Rpb24gYihhLGMpe2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7KytiKWlmKGFbYl0uaWQ9PT1jLmlkKXthW2JdLmxvY2F0aW9uPWMubG9jYXRpb247cmV0dXJufWEucHVzaChjKX1mdW5jdGlvbiBwKGEsYyxiKXtiPTM1NjMyPT09YT95Omc7dmFyIGw9YltjXTtpZighbCl7dmFyIHI9eC5zdHIoYyksbD1mLmNyZWF0ZVNoYWRlcihhKTtmLnNoYWRlclNvdXJjZShsLHIpO2YuY29tcGlsZVNoYWRlcihsKTtiW2NdPWx9cmV0dXJuIGx9ZnVuY3Rpb24gTShhLGIpe3RoaXMuaWQ9dSsrO3RoaXMuZnJhZ0lkPWE7dGhpcy52ZXJ0SWQ9Yjt0aGlzLnByb2dyYW09bnVsbDt0aGlzLnVuaWZvcm1zPVtdO3RoaXMuYXR0cmlidXRlcz1bXTtjLnByb2ZpbGUmJih0aGlzLnN0YXRzPXt1bmlmb3Jtc0NvdW50OjAsYXR0cmlidXRlc0NvdW50OjB9KX1cbmZ1bmN0aW9uIHQoZyxtKXt2YXIgbCxyO2w9cCgzNTYzMixnLmZyYWdJZCk7cj1wKDM1NjMzLGcudmVydElkKTt2YXIgdD1nLnByb2dyYW09Zi5jcmVhdGVQcm9ncmFtKCk7Zi5hdHRhY2hTaGFkZXIodCxsKTtmLmF0dGFjaFNoYWRlcih0LHIpO2YubGlua1Byb2dyYW0odCk7dmFyIHk9Zi5nZXRQcm9ncmFtUGFyYW1ldGVyKHQsMzU3MTgpO2MucHJvZmlsZSYmKGcuc3RhdHMudW5pZm9ybXNDb3VudD15KTt2YXIgaD1nLnVuaWZvcm1zO2ZvcihsPTA7bDx5OysrbClpZihyPWYuZ2V0QWN0aXZlVW5pZm9ybSh0LGwpKWlmKDE8ci5zaXplKWZvcih2YXIgQz0wO0M8ci5zaXplOysrQyl7dmFyIEU9ci5uYW1lLnJlcGxhY2UoXCJbMF1cIixcIltcIitDK1wiXVwiKTtiKGgsbmV3IGEoRSx4LmlkKEUpLGYuZ2V0VW5pZm9ybUxvY2F0aW9uKHQsRSkscikpfWVsc2UgYihoLG5ldyBhKHIubmFtZSx4LmlkKHIubmFtZSksZi5nZXRVbmlmb3JtTG9jYXRpb24odCxyLm5hbWUpLHIpKTt5PWYuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0LFxuMzU3MjEpO2MucHJvZmlsZSYmKGcuc3RhdHMuYXR0cmlidXRlc0NvdW50PXkpO2g9Zy5hdHRyaWJ1dGVzO2ZvcihsPTA7bDx5OysrbCkocj1mLmdldEFjdGl2ZUF0dHJpYih0LGwpKSYmYihoLG5ldyBhKHIubmFtZSx4LmlkKHIubmFtZSksZi5nZXRBdHRyaWJMb2NhdGlvbih0LHIubmFtZSkscikpfXZhciB5PXt9LGc9e30sRT17fSxDPVtdLHU9MDtjLnByb2ZpbGUmJihyLmdldE1heFVuaWZvcm1zQ291bnQ9ZnVuY3Rpb24oKXt2YXIgYT0wO0MuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0YXRzLnVuaWZvcm1zQ291bnQ+YSYmKGE9Yi5zdGF0cy51bmlmb3Jtc0NvdW50KX0pO3JldHVybiBhfSxyLmdldE1heEF0dHJpYnV0ZXNDb3VudD1mdW5jdGlvbigpe3ZhciBhPTA7Qy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2Iuc3RhdHMuYXR0cmlidXRlc0NvdW50PmEmJihhPWIuc3RhdHMuYXR0cmlidXRlc0NvdW50KX0pO3JldHVybiBhfSk7cmV0dXJue2NsZWFyOmZ1bmN0aW9uKCl7dmFyIGE9Zi5kZWxldGVTaGFkZXIuYmluZChmKTtcbmwoeSkuZm9yRWFjaChhKTt5PXt9O2woZykuZm9yRWFjaChhKTtnPXt9O0MuZm9yRWFjaChmdW5jdGlvbihhKXtmLmRlbGV0ZVByb2dyYW0oYS5wcm9ncmFtKX0pO0MubGVuZ3RoPTA7RT17fTtyLnNoYWRlckNvdW50PTB9LHByb2dyYW06ZnVuY3Rpb24oYSxiLGMpe3Iuc2hhZGVyQ291bnQrKzt2YXIgZz1FW2JdO2d8fChnPUVbYl09e30pO3ZhciBmPWdbYV07Znx8KGY9bmV3IE0oYixhKSx0KGYsYyksZ1thXT1mLEMucHVzaChmKSk7cmV0dXJuIGZ9LHJlc3RvcmU6ZnVuY3Rpb24oKXt5PXt9O2c9e307Zm9yKHZhciBhPTA7YTxDLmxlbmd0aDsrK2EpdChDW2FdKX0sc2hhZGVyOnAsZnJhZzotMSx2ZXJ0Oi0xfX19LHtcIi4vdXRpbC92YWx1ZXNcIjozMX1dLDE2OltmdW5jdGlvbihmLHAsdSl7cC5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJue2J1ZmZlckNvdW50OjAsZWxlbWVudHNDb3VudDowLGZyYW1lYnVmZmVyQ291bnQ6MCxzaGFkZXJDb3VudDowLHRleHR1cmVDb3VudDowLGN1YmVDb3VudDowLFxucmVuZGVyYnVmZmVyQ291bnQ6MCxtYXhUZXh0dXJlVW5pdHM6MH19fSx7fV0sMTc6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgZj17XCJcIjowfSxrPVtcIlwiXTtyZXR1cm57aWQ6ZnVuY3Rpb24oeCl7dmFyIHI9Zlt4XTtpZihyKXJldHVybiByO3I9Zlt4XT1rLmxlbmd0aDtrLnB1c2goeCk7cmV0dXJuIHJ9LHN0cjpmdW5jdGlvbihmKXtyZXR1cm4ga1tmXX19fX0se31dLDE4OltmdW5jdGlvbihmLHAsdSl7ZnVuY3Rpb24gbChhKXtyZXR1cm4gQXJyYXkuaXNBcnJheShhKSYmKDA9PT1hLmxlbmd0aHx8XCJudW1iZXJcIj09PXR5cGVvZiBhWzBdKX1mdW5jdGlvbiBrKGEpe3JldHVybiBBcnJheS5pc0FycmF5KGEpJiYwIT09YS5sZW5ndGgmJkUoYVswXSk/ITA6ITF9ZnVuY3Rpb24geChhKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfWZ1bmN0aW9uIHIoYSl7aWYoIWEpcmV0dXJuITE7dmFyIGI9eChhKTtyZXR1cm4gMDw9WS5pbmRleE9mKGIpP1xuITA6bChhKXx8ayhhKXx8dChhKX1mdW5jdGlvbiBjKGEsYil7MzYxOTM9PT1hLnR5cGU/KGEuZGF0YT1nKGIpLHkuZnJlZVR5cGUoYikpOmEuZGF0YT1ifWZ1bmN0aW9uIGEoYSxiLGMsZyxmLGspe2E9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBIW2FdP0hbYV06QlthXSpMW2JdO2smJihhKj02KTtpZihmKXtmb3IoZz0wOzE8PWM7KWcrPWEqYypjLGMvPTI7cmV0dXJuIGd9cmV0dXJuIGEqYypnfXZhciBiPWYoXCIuL3V0aWwvZXh0ZW5kXCIpLEY9ZihcIi4vdXRpbC92YWx1ZXNcIiksTT1mKFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCIpLHQ9ZihcIi4vdXRpbC9pcy1uZGFycmF5XCIpLHk9ZihcIi4vdXRpbC9wb29sXCIpLGc9ZihcIi4vdXRpbC90by1oYWxmLWZsb2F0XCIpLEU9ZihcIi4vdXRpbC9pcy1hcnJheS1saWtlXCIpLEM9ZihcIi4vdXRpbC9mbGF0dGVuXCIpO3U9ZihcIi4vY29uc3RhbnRzL2FycmF5dHlwZXMuanNvblwiKTt2YXIgTj1mKFwiLi9jb25zdGFudHMvYXJyYXl0eXBlcy5qc29uXCIpLG49Wzk5ODQsOTk4Nixcbjk5ODUsOTk4N10sbT1bMCw2NDA5LDY0MTAsNjQwNyw2NDA4XSxCPXt9O0JbNjQwOV09Qls2NDA2XT1CWzY0MDJdPTE7QlszNDA0MV09Qls2NDEwXT0yO0JbNjQwN109QlszNTkwNF09MztCWzY0MDhdPUJbMzU5MDZdPTQ7dmFyIFk9T2JqZWN0LmtleXModSkuY29uY2F0KFtcIltvYmplY3QgSFRNTENhbnZhc0VsZW1lbnRdXCIsXCJbb2JqZWN0IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRF1cIixcIltvYmplY3QgSFRNTEltYWdlRWxlbWVudF1cIixcIltvYmplY3QgSFRNTFZpZGVvRWxlbWVudF1cIl0pLEw9W107TFs1MTIxXT0xO0xbNTEyNl09NDtMWzM2MTkzXT0yO0xbNTEyM109MjtMWzUxMjVdPTQ7dmFyIEg9W107SFszMjg1NF09MjtIWzMyODU1XT0yO0hbMzYxOTRdPTI7SFszNDA0MV09NDtIWzMzNzc2XT0uNTtIWzMzNzc3XT0uNTtIWzMzNzc4XT0xO0hbMzM3NzldPTE7SFszNTk4Nl09LjU7SFszNTk4N109MTtIWzM0Nzk4XT0xO0hbMzU4NDBdPS41O0hbMzU4NDFdPS4yNTtIWzM1ODQyXT0uNTtcbkhbMzU4NDNdPS4yNTtIWzM2MTk2XT0uNTtwLmV4cG9ydHM9ZnVuY3Rpb24oaCxmLHAsdSxILEwsWil7ZnVuY3Rpb24gRCgpe3RoaXMuZm9ybWF0PXRoaXMuaW50ZXJuYWxmb3JtYXQ9NjQwODt0aGlzLnR5cGU9NTEyMTt0aGlzLmZsaXBZPXRoaXMucHJlbXVsdGlwbHlBbHBoYT10aGlzLmNvbXByZXNzZWQ9ITE7dGhpcy51bnBhY2tBbGlnbm1lbnQ9MTt0aGlzLmNoYW5uZWxzPXRoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5jb2xvclNwYWNlPTB9ZnVuY3Rpb24gSyhhLGIpe2EuaW50ZXJuYWxmb3JtYXQ9Yi5pbnRlcm5hbGZvcm1hdDthLmZvcm1hdD1iLmZvcm1hdDthLnR5cGU9Yi50eXBlO2EuY29tcHJlc3NlZD1iLmNvbXByZXNzZWQ7YS5wcmVtdWx0aXBseUFscGhhPWIucHJlbXVsdGlwbHlBbHBoYTthLmZsaXBZPWIuZmxpcFk7YS51bnBhY2tBbGlnbm1lbnQ9Yi51bnBhY2tBbGlnbm1lbnQ7YS5jb2xvclNwYWNlPWIuY29sb3JTcGFjZTthLndpZHRoPWIud2lkdGg7YS5oZWlnaHQ9XG5iLmhlaWdodDthLmNoYW5uZWxzPWIuY2hhbm5lbHN9ZnVuY3Rpb24gWShhLGIpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYiYmYil7XCJwcmVtdWx0aXBseUFscGhhXCJpbiBiJiYoYS5wcmVtdWx0aXBseUFscGhhPWIucHJlbXVsdGlwbHlBbHBoYSk7XCJmbGlwWVwiaW4gYiYmKGEuZmxpcFk9Yi5mbGlwWSk7XCJhbGlnbm1lbnRcImluIGImJihhLnVucGFja0FsaWdubWVudD1iLmFsaWdubWVudCk7XCJjb2xvclNwYWNlXCJpbiBiJiYoYS5jb2xvclNwYWNlPXBhW2IuY29sb3JTcGFjZV0pO1widHlwZVwiaW4gYiYmKGEudHlwZT1WW2IudHlwZV0pO3ZhciBjPWEud2lkdGgsZz1hLmhlaWdodCxoPWEuY2hhbm5lbHMsZj0hMTtcInNoYXBlXCJpbiBiPyhjPWIuc2hhcGVbMF0sZz1iLnNoYXBlWzFdLDM9PT1iLnNoYXBlLmxlbmd0aCYmKGg9Yi5zaGFwZVsyXSxmPSEwKSk6KFwicmFkaXVzXCJpbiBiJiYoYz1nPWIucmFkaXVzKSxcIndpZHRoXCJpbiBiJiYoYz1iLndpZHRoKSxcImhlaWdodFwiaW4gYiYmKGc9Yi5oZWlnaHQpLFxuXCJjaGFubmVsc1wiaW4gYiYmKGg9Yi5jaGFubmVscyxmPSEwKSk7YS53aWR0aD1jfDA7YS5oZWlnaHQ9Z3wwO2EuY2hhbm5lbHM9aHwwO2M9ITE7XCJmb3JtYXRcImluIGImJihjPWIuZm9ybWF0LGc9YS5pbnRlcm5hbGZvcm1hdD1YW2NdLGEuZm9ybWF0PVBhW2ddLGMgaW4gViYmIShcInR5cGVcImluIGIpJiYoYS50eXBlPVZbY10pLGMgaW4gVCYmKGEuY29tcHJlc3NlZD0hMCksYz0hMCk7IWYmJmM/YS5jaGFubmVscz1CW2EuZm9ybWF0XTpmJiYhYyYmYS5jaGFubmVscyE9PW1bYS5mb3JtYXRdJiYoYS5mb3JtYXQ9YS5pbnRlcm5hbGZvcm1hdD1tW2EuY2hhbm5lbHNdKX19ZnVuY3Rpb24gdmEoYSl7aC5waXhlbFN0b3JlaSgzNzQ0MCxhLmZsaXBZKTtoLnBpeGVsU3RvcmVpKDM3NDQxLGEucHJlbXVsdGlwbHlBbHBoYSk7aC5waXhlbFN0b3JlaSgzNzQ0MyxhLmNvbG9yU3BhY2UpO2gucGl4ZWxTdG9yZWkoMzMxNyxhLnVucGFja0FsaWdubWVudCl9ZnVuY3Rpb24gcSgpe0QuY2FsbCh0aGlzKTtcbnRoaXMueU9mZnNldD10aGlzLnhPZmZzZXQ9MDt0aGlzLmRhdGE9bnVsbDt0aGlzLm5lZWRzRnJlZT0hMTt0aGlzLmVsZW1lbnQ9bnVsbDt0aGlzLm5lZWRzQ29weT0hMX1mdW5jdGlvbiBTKGEsYil7dmFyIGg9bnVsbDtyKGIpP2g9YjpiJiYoWShhLGIpLFwieFwiaW4gYiYmKGEueE9mZnNldD1iLnh8MCksXCJ5XCJpbiBiJiYoYS55T2Zmc2V0PWIueXwwKSxyKGIuZGF0YSkmJihoPWIuZGF0YSkpO2lmKGIuY29weSl7dmFyIGY9SC52aWV3cG9ydFdpZHRoLG49SC52aWV3cG9ydEhlaWdodDthLndpZHRoPWEud2lkdGh8fGYtYS54T2Zmc2V0O2EuaGVpZ2h0PWEuaGVpZ2h0fHxuLWEueU9mZnNldDthLm5lZWRzQ29weT0hMH1lbHNlIGlmKCFoKWEud2lkdGg9YS53aWR0aHx8MSxhLmhlaWdodD1hLmhlaWdodHx8MSxhLmNoYW5uZWxzPWEuY2hhbm5lbHN8fDQ7ZWxzZSBpZihNKGgpKWEuY2hhbm5lbHM9YS5jaGFubmVsc3x8NCxhLmRhdGE9aCxcInR5cGVcImluIGJ8fDUxMjEhPT1hLnR5cGV8fChhLnR5cGU9XG5OW09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChoKV18MCk7ZWxzZSBpZihsKGgpKXthLmNoYW5uZWxzPWEuY2hhbm5lbHN8fDQ7Zj1oO249Zi5sZW5ndGg7c3dpdGNoKGEudHlwZSl7Y2FzZSA1MTIxOmNhc2UgNTEyMzpjYXNlIDUxMjU6Y2FzZSA1MTI2Om49eS5hbGxvY1R5cGUoYS50eXBlLG4pO24uc2V0KGYpO2EuZGF0YT1uO2JyZWFrO2Nhc2UgMzYxOTM6YS5kYXRhPWcoZil9YS5hbGlnbm1lbnQ9MTthLm5lZWRzRnJlZT0hMH1lbHNlIGlmKHQoaCkpe2Y9aC5kYXRhO0FycmF5LmlzQXJyYXkoZil8fDUxMjEhPT1hLnR5cGV8fChhLnR5cGU9TltPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZildfDApO3ZhciBuPWguc2hhcGUscT1oLnN0cmlkZSxwLEYsZCx2OzM9PT1uLmxlbmd0aD8oZD1uWzJdLHY9cVsyXSk6dj1kPTE7cD1uWzBdO0Y9blsxXTtuPXFbMF07cT1xWzFdO2EuYWxpZ25tZW50PTE7YS53aWR0aD1wO2EuaGVpZ2h0PUY7YS5jaGFubmVscz1kO2EuZm9ybWF0PVxuYS5pbnRlcm5hbGZvcm1hdD1tW2RdO2EubmVlZHNGcmVlPSEwO3A9djtoPWgub2Zmc2V0O2Q9YS53aWR0aDt2PWEuaGVpZ2h0O0Y9YS5jaGFubmVscztmb3IodmFyIHU9eS5hbGxvY1R5cGUoMzYxOTM9PT1hLnR5cGU/NTEyNjphLnR5cGUsZCp2KkYpLEI9MCxBPTA7QTx2OysrQSlmb3IodmFyIEQ9MDtEPGQ7KytEKWZvcih2YXIgdWE9MDt1YTxGOysrdWEpdVtCKytdPWZbbipEK3EqQStwKnVhK2hdO2MoYSx1KX1lbHNlIGlmKFwiW29iamVjdCBIVE1MQ2FudmFzRWxlbWVudF1cIj09PXgoaCl8fFwiW29iamVjdCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRdXCI9PT14KGgpKVwiW29iamVjdCBIVE1MQ2FudmFzRWxlbWVudF1cIj09PXgoaCk/YS5lbGVtZW50PWg6YS5lbGVtZW50PWguY2FudmFzLGEud2lkdGg9YS5lbGVtZW50LndpZHRoLGEuaGVpZ2h0PWEuZWxlbWVudC5oZWlnaHQsYS5jaGFubmVscz00O2Vsc2UgaWYoXCJbb2JqZWN0IEhUTUxJbWFnZUVsZW1lbnRdXCI9PT14KGgpKWEuZWxlbWVudD1cbmgsYS53aWR0aD1oLm5hdHVyYWxXaWR0aCxhLmhlaWdodD1oLm5hdHVyYWxIZWlnaHQsYS5jaGFubmVscz00O2Vsc2UgaWYoXCJbb2JqZWN0IEhUTUxWaWRlb0VsZW1lbnRdXCI9PT14KGgpKWEuZWxlbWVudD1oLGEud2lkdGg9aC52aWRlb1dpZHRoLGEuaGVpZ2h0PWgudmlkZW9IZWlnaHQsYS5jaGFubmVscz00O2Vsc2UgaWYoayhoKSl7Zj1hLndpZHRofHxoWzBdLmxlbmd0aDtuPWEuaGVpZ2h0fHxoLmxlbmd0aDtxPWEuY2hhbm5lbHM7cT1FKGhbMF1bMF0pP3F8fGhbMF1bMF0ubGVuZ3RoOnF8fDE7cD1DLnNoYXBlKGgpO2Q9MTtmb3Iodj0wO3Y8cC5sZW5ndGg7Kyt2KWQqPXBbdl07ZD15LmFsbG9jVHlwZSgzNjE5Mz09PWEudHlwZT81MTI2OmEudHlwZSxkKTtDLmZsYXR0ZW4oaCxwLFwiXCIsZCk7YyhhLGQpO2EuYWxpZ25tZW50PTE7YS53aWR0aD1mO2EuaGVpZ2h0PW47YS5jaGFubmVscz1xO2EuZm9ybWF0PWEuaW50ZXJuYWxmb3JtYXQ9bVtxXTthLm5lZWRzRnJlZT0hMH19ZnVuY3Rpb24gbWEoYSxcbmIsYyxnLGYpe3ZhciBrPWEuZWxlbWVudCxsPWEuZGF0YSxtPWEuaW50ZXJuYWxmb3JtYXQsZD1hLmZvcm1hdCxyPWEudHlwZSxuPWEud2lkdGgscT1hLmhlaWdodDt2YShhKTtrP2gudGV4U3ViSW1hZ2UyRChiLGYsYyxnLGQscixrKTphLmNvbXByZXNzZWQ/aC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChiLGYsYyxnLG0sbixxLGwpOmEubmVlZHNDb3B5Pyh1KCksaC5jb3B5VGV4U3ViSW1hZ2UyRChiLGYsYyxnLGEueE9mZnNldCxhLnlPZmZzZXQsbixxKSk6aC50ZXhTdWJJbWFnZTJEKGIsZixjLGcsbixxLGQscixsKX1mdW5jdGlvbiBnYSgpe3JldHVybiBOYS5wb3AoKXx8bmV3IHF9ZnVuY3Rpb24gVyhhKXthLm5lZWRzRnJlZSYmeS5mcmVlVHlwZShhLmRhdGEpO3EuY2FsbChhKTtOYS5wdXNoKGEpfWZ1bmN0aW9uIFIoKXtELmNhbGwodGhpcyk7dGhpcy5nZW5NaXBtYXBzPSExO3RoaXMubWlwbWFwSGludD00MzUyO3RoaXMubWlwbWFzaz0wO3RoaXMuaW1hZ2VzPUFycmF5KDE2KX1cbmZ1bmN0aW9uIEcoYSxiLGMpe3ZhciBnPWEuaW1hZ2VzWzBdPWdhKCk7YS5taXBtYXNrPTE7Zy53aWR0aD1hLndpZHRoPWI7Zy5oZWlnaHQ9YS5oZWlnaHQ9YztnLmNoYW5uZWxzPWEuY2hhbm5lbHM9NH1mdW5jdGlvbiBiYShhLGIpe3ZhciBjPW51bGw7aWYocihiKSljPWEuaW1hZ2VzWzBdPWdhKCksSyhjLGEpLFMoYyxiKSxhLm1pcG1hc2s9MTtlbHNlIGlmKFkoYSxiKSxBcnJheS5pc0FycmF5KGIubWlwbWFwKSlmb3IodmFyIGc9Yi5taXBtYXAsaD0wO2g8Zy5sZW5ndGg7KytoKWM9YS5pbWFnZXNbaF09Z2EoKSxLKGMsYSksYy53aWR0aD4+PWgsYy5oZWlnaHQ+Pj1oLFMoYyxnW2hdKSxhLm1pcG1hc2t8PTE8PGg7ZWxzZSBjPWEuaW1hZ2VzWzBdPWdhKCksSyhjLGEpLFMoYyxiKSxhLm1pcG1hc2s9MTtLKGEsYS5pbWFnZXNbMF0pfWZ1bmN0aW9uIG5hKGEsYil7Zm9yKHZhciBjPWEuaW1hZ2VzLGc9MDtnPGMubGVuZ3RoJiZjW2ddOysrZyl7dmFyIGY9Y1tnXSxrPWIsbD1nLG09Zi5lbGVtZW50LFxuZD1mLmRhdGEscj1mLmludGVybmFsZm9ybWF0LG49Zi5mb3JtYXQscT1mLnR5cGUsdD1mLndpZHRoLHk9Zi5oZWlnaHQ7dmEoZik7bT9oLnRleEltYWdlMkQoayxsLG4sbixxLG0pOmYuY29tcHJlc3NlZD9oLmNvbXByZXNzZWRUZXhJbWFnZTJEKGssbCxyLHQseSwwLGQpOmYubmVlZHNDb3B5Pyh1KCksaC5jb3B5VGV4SW1hZ2UyRChrLGwsbixmLnhPZmZzZXQsZi55T2Zmc2V0LHQseSwwKSk6aC50ZXhJbWFnZTJEKGssbCxuLHQseSwwLG4scSxkKX19ZnVuY3Rpb24geWEoKXt2YXIgYT1KYS5wb3AoKXx8bmV3IFI7RC5jYWxsKGEpO2Zvcih2YXIgYj1hLm1pcG1hc2s9MDsxNj5iOysrYilhLmltYWdlc1tiXT1udWxsO3JldHVybiBhfWZ1bmN0aW9uIFUoYSl7Zm9yKHZhciBiPWEuaW1hZ2VzLGM9MDtjPGIubGVuZ3RoOysrYyliW2NdJiZXKGJbY10pLGJbY109bnVsbDtKYS5wdXNoKGEpfWZ1bmN0aW9uIGlhKCl7dGhpcy5tYWdGaWx0ZXI9dGhpcy5taW5GaWx0ZXI9OTcyODt0aGlzLndyYXBUPVxudGhpcy53cmFwUz0zMzA3MTt0aGlzLmFuaXNvdHJvcGljPTE7dGhpcy5nZW5NaXBtYXBzPSExO3RoaXMubWlwbWFwSGludD00MzUyfWZ1bmN0aW9uIGthKGEsYil7XCJtaW5cImluIGImJihhLm1pbkZpbHRlcj1RW2IubWluXSwwPD1uLmluZGV4T2YoYS5taW5GaWx0ZXIpJiYoYS5nZW5NaXBtYXBzPSEwKSk7XCJtYWdcImluIGImJihhLm1hZ0ZpbHRlcj1oYVtiLm1hZ10pO3ZhciBjPWEud3JhcFMsZz1hLndyYXBUO2lmKFwid3JhcFwiaW4gYil7dmFyIGg9Yi53cmFwO1wic3RyaW5nXCI9PT10eXBlb2YgaD9jPWc9T1toXTpBcnJheS5pc0FycmF5KGgpJiYoYz1PW2hbMF1dLGc9T1toWzFdXSl9ZWxzZVwid3JhcFNcImluIGImJihjPU9bYi53cmFwU10pLFwid3JhcFRcImluIGImJihnPU9bYi53cmFwVF0pO2Eud3JhcFM9YzthLndyYXBUPWc7XCJhbmlzb3Ryb3BpY1wiaW4gYiYmKGEuYW5pc290cm9waWM9Yi5hbmlzb3Ryb3BpYyk7aWYoXCJtaXBtYXBcImluIGIpe2M9ITE7c3dpdGNoKHR5cGVvZiBiLm1pcG1hcCl7Y2FzZSBcInN0cmluZ1wiOmEubWlwbWFwSGludD1cbmVhW2IubWlwbWFwXTtjPWEuZ2VuTWlwbWFwcz0hMDticmVhaztjYXNlIFwiYm9vbGVhblwiOmM9YS5nZW5NaXBtYXBzPWIubWlwbWFwO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjphLmdlbk1pcG1hcHM9ITEsYz0hMH0hY3x8XCJtaW5cImluIGJ8fChhLm1pbkZpbHRlcj05OTg0KX19ZnVuY3Rpb24gcmEoYSxiKXtoLnRleFBhcmFtZXRlcmkoYiwxMDI0MSxhLm1pbkZpbHRlcik7aC50ZXhQYXJhbWV0ZXJpKGIsMTAyNDAsYS5tYWdGaWx0ZXIpO2gudGV4UGFyYW1ldGVyaShiLDEwMjQyLGEud3JhcFMpO2gudGV4UGFyYW1ldGVyaShiLDEwMjQzLGEud3JhcFQpO2YuZXh0X3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJiZoLnRleFBhcmFtZXRlcmkoYiwzNDA0NixhLmFuaXNvdHJvcGljKTthLmdlbk1pcG1hcHMmJihoLmhpbnQoMzMxNzAsYS5taXBtYXBIaW50KSxoLmdlbmVyYXRlTWlwbWFwKGIpKX1mdW5jdGlvbiBzYShhKXtELmNhbGwodGhpcyk7dGhpcy5taXBtYXNrPTA7dGhpcy5pbnRlcm5hbGZvcm1hdD1cbjY0MDg7dGhpcy5pZD1CYSsrO3RoaXMucmVmQ291bnQ9MTt0aGlzLnRhcmdldD1hO3RoaXMudGV4dHVyZT1oLmNyZWF0ZVRleHR1cmUoKTt0aGlzLnVuaXQ9LTE7dGhpcy5iaW5kQ291bnQ9MDt0aGlzLnRleEluZm89bmV3IGlhO1oucHJvZmlsZSYmKHRoaXMuc3RhdHM9e3NpemU6MH0pfWZ1bmN0aW9uIGRhKGEpe2guYWN0aXZlVGV4dHVyZSgzMzk4NCk7aC5iaW5kVGV4dHVyZShhLnRhcmdldCxhLnRleHR1cmUpfWZ1bmN0aW9uIGphKCl7dmFyIGE9b2FbMF07YT9oLmJpbmRUZXh0dXJlKGEudGFyZ2V0LGEudGV4dHVyZSk6aC5iaW5kVGV4dHVyZSgzNTUzLG51bGwpfWZ1bmN0aW9uIGxhKGEpe3ZhciBiPWEudGV4dHVyZSxjPWEudW5pdCxnPWEudGFyZ2V0OzA8PWMmJihoLmFjdGl2ZVRleHR1cmUoMzM5ODQrYyksaC5iaW5kVGV4dHVyZShnLG51bGwpLG9hW2NdPW51bGwpO2guZGVsZXRlVGV4dHVyZShiKTthLnRleHR1cmU9bnVsbDthLnBhcmFtcz1udWxsO2EucGl4ZWxzPW51bGw7YS5yZWZDb3VudD1cbjA7ZGVsZXRlIGNhW2EuaWRdO0wudGV4dHVyZUNvdW50LS19dmFyIGVhPXtcImRvbid0IGNhcmVcIjo0MzUyLFwiZG9udCBjYXJlXCI6NDM1MixuaWNlOjQzNTQsZmFzdDo0MzUzfSxPPXtyZXBlYXQ6MTA0OTcsY2xhbXA6MzMwNzEsbWlycm9yOjMzNjQ4fSxoYT17bmVhcmVzdDo5NzI4LGxpbmVhcjo5NzI5fSxRPWIoe21pcG1hcDo5OTg3LFwibmVhcmVzdCBtaXBtYXAgbmVhcmVzdFwiOjk5ODQsXCJsaW5lYXIgbWlwbWFwIG5lYXJlc3RcIjo5OTg1LFwibmVhcmVzdCBtaXBtYXAgbGluZWFyXCI6OTk4NixcImxpbmVhciBtaXBtYXAgbGluZWFyXCI6OTk4N30saGEpLHBhPXtub25lOjAsYnJvd3NlcjozNzQ0NH0sVj17dWludDg6NTEyMSxyZ2JhNDozMjgxOSxyZ2I1NjU6MzM2MzUsXCJyZ2I1IGExXCI6MzI4MjB9LFg9e2FscGhhOjY0MDYsbHVtaW5hbmNlOjY0MDksXCJsdW1pbmFuY2UgYWxwaGFcIjo2NDEwLHJnYjo2NDA3LHJnYmE6NjQwOCxyZ2JhNDozMjg1NCxcInJnYjUgYTFcIjozMjg1NSxyZ2I1NjU6MzYxOTR9LFxuVD17fTtmLmV4dF9zcmdiJiYoWC5zcmdiPTM1OTA0LFguc3JnYmE9MzU5MDYpO2Yub2VzX3RleHR1cmVfZmxvYXQmJihWLmZsb2F0MzI9VltcImZsb2F0XCJdPTUxMjYpO2Yub2VzX3RleHR1cmVfaGFsZl9mbG9hdCYmKFYuZmxvYXQxNj1WW1wiaGFsZiBmbG9hdFwiXT0zNjE5Myk7Zi53ZWJnbF9kZXB0aF90ZXh0dXJlJiYoYihYLHtkZXB0aDo2NDAyLFwiZGVwdGggc3RlbmNpbFwiOjM0MDQxfSksYihWLHt1aW50MTY6NTEyMyx1aW50MzI6NTEyNSxcImRlcHRoIHN0ZW5jaWxcIjozNDA0Mn0pKTtmLndlYmdsX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJiZiKFQse1wicmdiIHMzdGMgZHh0MVwiOjMzNzc2LFwicmdiYSBzM3RjIGR4dDFcIjozMzc3NyxcInJnYmEgczN0YyBkeHQzXCI6MzM3NzgsXCJyZ2JhIHMzdGMgZHh0NVwiOjMzNzc5fSk7Zi53ZWJnbF9jb21wcmVzc2VkX3RleHR1cmVfYXRjJiZiKFQse1wicmdiIGF0Y1wiOjM1OTg2LFwicmdiYSBhdGMgZXhwbGljaXQgYWxwaGFcIjozNTk4NyxcInJnYmEgYXRjIGludGVycG9sYXRlZCBhbHBoYVwiOjM0Nzk4fSk7XG5mLndlYmdsX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyYmYihULHtcInJnYiBwdnJ0YyA0YnBwdjFcIjozNTg0MCxcInJnYiBwdnJ0YyAyYnBwdjFcIjozNTg0MSxcInJnYmEgcHZydGMgNGJwcHYxXCI6MzU4NDIsXCJyZ2JhIHB2cnRjIDJicHB2MVwiOjM1ODQzfSk7Zi53ZWJnbF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSYmKFRbXCJyZ2IgZXRjMVwiXT0zNjE5Nik7dmFyIHVhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGguZ2V0UGFyYW1ldGVyKDM0NDY3KSk7T2JqZWN0LmtleXMoVCkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1UW2FdOzA8PXVhLmluZGV4T2YoYikmJihYW2FdPWIpfSk7dmFyIEVhPU9iamVjdC5rZXlzKFgpO3AudGV4dHVyZUZvcm1hdHM9RWE7dmFyIEZhPVtdO09iamVjdC5rZXlzKFgpLmZvckVhY2goZnVuY3Rpb24oYSl7RmFbWFthXV09YX0pO3ZhciBIYT1bXTtPYmplY3Qua2V5cyhWKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0hhW1ZbYV1dPWF9KTt2YXIgSWE9W107T2JqZWN0LmtleXMoaGEpLmZvckVhY2goZnVuY3Rpb24oYSl7SWFbaGFbYV1dPVxuYX0pO3ZhciBDYT1bXTtPYmplY3Qua2V5cyhRKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0NhW1FbYV1dPWF9KTt2YXIgRGE9W107T2JqZWN0LmtleXMoTykuZm9yRWFjaChmdW5jdGlvbihhKXtEYVtPW2FdXT1hfSk7dmFyIFBhPUVhLnJlZHVjZShmdW5jdGlvbihhLGIpe3ZhciBjPVhbYl07NjQwOT09PWN8fDY0MDY9PT1jfHw2NDA5PT09Y3x8NjQxMD09PWN8fDY0MDI9PT1jfHwzNDA0MT09PWM/YVtjXT1jOjMyODU1PT09Y3x8MDw9Yi5pbmRleE9mKFwicmdiYVwiKT9hW2NdPTY0MDg6YVtjXT02NDA3O3JldHVybiBhfSx7fSksTmE9W10sSmE9W10sQmE9MCxjYT17fSx0YT1wLm1heFRleHR1cmVVbml0cyxvYT1BcnJheSh0YSkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9KTtiKHNhLnByb3RvdHlwZSx7YmluZDpmdW5jdGlvbigpe3RoaXMuYmluZENvdW50Kz0xO3ZhciBhPXRoaXMudW5pdDtpZigwPmEpe2Zvcih2YXIgYj0wO2I8dGE7KytiKXt2YXIgYz1vYVtiXTtpZihjKXtpZigwPGMuYmluZENvdW50KWNvbnRpbnVlO1xuYy51bml0PS0xfW9hW2JdPXRoaXM7YT1iO2JyZWFrfVoucHJvZmlsZSYmTC5tYXhUZXh0dXJlVW5pdHM8YSsxJiYoTC5tYXhUZXh0dXJlVW5pdHM9YSsxKTt0aGlzLnVuaXQ9YTtoLmFjdGl2ZVRleHR1cmUoMzM5ODQrYSk7aC5iaW5kVGV4dHVyZSh0aGlzLnRhcmdldCx0aGlzLnRleHR1cmUpfXJldHVybiBhfSx1bmJpbmQ6ZnVuY3Rpb24oKXstLXRoaXMuYmluZENvdW50fSxkZWNSZWY6ZnVuY3Rpb24oKXswPj0tLXRoaXMucmVmQ291bnQmJmxhKHRoaXMpfX0pO1oucHJvZmlsZSYmKEwuZ2V0VG90YWxUZXh0dXJlU2l6ZT1mdW5jdGlvbigpe3ZhciBhPTA7T2JqZWN0LmtleXMoY2EpLmZvckVhY2goZnVuY3Rpb24oYil7YSs9Y2FbYl0uc3RhdHMuc2l6ZX0pO3JldHVybiBhfSk7cmV0dXJue2NyZWF0ZTJEOmZ1bmN0aW9uKGIsYyl7ZnVuY3Rpb24gZyhiLGMpe3ZhciBlPWYudGV4SW5mbztpYS5jYWxsKGUpO3ZhciBoPXlhKCk7XCJudW1iZXJcIj09PXR5cGVvZiBiP1wibnVtYmVyXCI9PT10eXBlb2YgYz9cbkcoaCxifDAsY3wwKTpHKGgsYnwwLGJ8MCk6Yj8oa2EoZSxiKSxiYShoLGIpKTpHKGgsMSwxKTtlLmdlbk1pcG1hcHMmJihoLm1pcG1hc2s9KGgud2lkdGg8PDEpLTEpO2YubWlwbWFzaz1oLm1pcG1hc2s7SyhmLGgpO2YuaW50ZXJuYWxmb3JtYXQ9aC5pbnRlcm5hbGZvcm1hdDtnLndpZHRoPWgud2lkdGg7Zy5oZWlnaHQ9aC5oZWlnaHQ7ZGEoZik7bmEoaCwzNTUzKTtyYShlLDM1NTMpO2phKCk7VShoKTtaLnByb2ZpbGUmJihmLnN0YXRzLnNpemU9YShmLmludGVybmFsZm9ybWF0LGYudHlwZSxoLndpZHRoLGguaGVpZ2h0LGUuZ2VuTWlwbWFwcywhMSkpO2cuZm9ybWF0PUZhW2YuaW50ZXJuYWxmb3JtYXRdO2cudHlwZT1IYVtmLnR5cGVdO2cubWFnPUlhW2UubWFnRmlsdGVyXTtnLm1pbj1DYVtlLm1pbkZpbHRlcl07Zy53cmFwUz1EYVtlLndyYXBTXTtnLndyYXBUPURhW2Uud3JhcFRdO3JldHVybiBnfXZhciBmPW5ldyBzYSgzNTUzKTtjYVtmLmlkXT1mO0wudGV4dHVyZUNvdW50Kys7XG5nKGIsYyk7Zy5zdWJpbWFnZT1mdW5jdGlvbihhLGIsYyxlKXtifD0wO2N8PTA7ZXw9MDt2YXIgZD1nYSgpO0soZCxmKTtkLndpZHRoPTA7ZC5oZWlnaHQ9MDtTKGQsYSk7ZC53aWR0aD1kLndpZHRofHwoZi53aWR0aD4+ZSktYjtkLmhlaWdodD1kLmhlaWdodHx8KGYuaGVpZ2h0Pj5lKS1jO2RhKGYpO21hKGQsMzU1MyxiLGMsZSk7amEoKTtXKGQpO3JldHVybiBnfTtnLnJlc2l6ZT1mdW5jdGlvbihiLGMpe3ZhciBlPWJ8MCxrPWN8MHx8ZTtpZihlPT09Zi53aWR0aCYmaz09PWYuaGVpZ2h0KXJldHVybiBnO2cud2lkdGg9Zi53aWR0aD1lO2cuaGVpZ2h0PWYuaGVpZ2h0PWs7ZGEoZik7Zm9yKHZhciBkPTA7Zi5taXBtYXNrPj5kOysrZCloLnRleEltYWdlMkQoMzU1MyxkLGYuZm9ybWF0LGU+PmQsaz4+ZCwwLGYuZm9ybWF0LGYudHlwZSxudWxsKTtqYSgpO1oucHJvZmlsZSYmKGYuc3RhdHMuc2l6ZT1hKGYuaW50ZXJuYWxmb3JtYXQsZi50eXBlLGUsaywhMSwhMSkpO3JldHVybiBnfTtcbmcuX3JlZ2xUeXBlPVwidGV4dHVyZTJkXCI7Zy5fdGV4dHVyZT1mO1oucHJvZmlsZSYmKGcuc3RhdHM9Zi5zdGF0cyk7Zy5kZXN0cm95PWZ1bmN0aW9uKCl7Zi5kZWNSZWYoKX07cmV0dXJuIGd9LGNyZWF0ZUN1YmU6ZnVuY3Rpb24oYixjLGcsZixrLGwpe2Z1bmN0aW9uIG0oYixjLGUsZyxoLGYpe3ZhciBrLGw9bi50ZXhJbmZvO2lhLmNhbGwobCk7Zm9yKGs9MDs2Pms7KytrKWRba109eWEoKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGJ8fCFiKWZvcihiPWJ8MHx8MSxrPTA7Nj5rOysraylHKGRba10sYixiKTtlbHNlIGlmKFwib2JqZWN0XCI9PT10eXBlb2YgYilpZihjKWJhKGRbMF0sYiksYmEoZFsxXSxjKSxiYShkWzJdLGUpLGJhKGRbM10sZyksYmEoZFs0XSxoKSxiYShkWzVdLGYpO2Vsc2UgaWYoa2EobCxiKSxZKG4sYiksXCJmYWNlc1wiaW4gYilmb3IoYj1iLmZhY2VzLGs9MDs2Pms7KytrKUsoZFtrXSxuKSxiYShkW2tdLGJba10pO2Vsc2UgZm9yKGs9MDs2Pms7KytrKWJhKGRba10sYik7XG5LKG4sZFswXSk7bi5taXBtYXNrPWwuZ2VuTWlwbWFwcz8oZFswXS53aWR0aDw8MSktMTpkWzBdLm1pcG1hc2s7bi5pbnRlcm5hbGZvcm1hdD1kWzBdLmludGVybmFsZm9ybWF0O20ud2lkdGg9ZFswXS53aWR0aDttLmhlaWdodD1kWzBdLmhlaWdodDtkYShuKTtmb3Ioaz0wOzY+azsrK2spbmEoZFtrXSwzNDA2OStrKTtyYShsLDM0MDY3KTtqYSgpO1oucHJvZmlsZSYmKG4uc3RhdHMuc2l6ZT1hKG4uaW50ZXJuYWxmb3JtYXQsbi50eXBlLG0ud2lkdGgsbS5oZWlnaHQsbC5nZW5NaXBtYXBzLCEwKSk7bS5mb3JtYXQ9RmFbbi5pbnRlcm5hbGZvcm1hdF07bS50eXBlPUhhW24udHlwZV07bS5tYWc9SWFbbC5tYWdGaWx0ZXJdO20ubWluPUNhW2wubWluRmlsdGVyXTttLndyYXBTPURhW2wud3JhcFNdO20ud3JhcFQ9RGFbbC53cmFwVF07Zm9yKGs9MDs2Pms7KytrKVUoZFtrXSk7cmV0dXJuIG19dmFyIG49bmV3IHNhKDM0MDY3KTtjYVtuLmlkXT1uO0wuY3ViZUNvdW50Kys7dmFyIGQ9QXJyYXkoNik7XG5tKGIsYyxnLGYsayxsKTttLnN1YmltYWdlPWZ1bmN0aW9uKGEsYixjLGQsZSl7Y3w9MDtkfD0wO2V8PTA7dmFyIGc9Z2EoKTtLKGcsbik7Zy53aWR0aD0wO2cuaGVpZ2h0PTA7UyhnLGIpO2cud2lkdGg9Zy53aWR0aHx8KG4ud2lkdGg+PmUpLWM7Zy5oZWlnaHQ9Zy5oZWlnaHR8fChuLmhlaWdodD4+ZSktZDtkYShuKTttYShnLDM0MDY5K2EsYyxkLGUpO2phKCk7VyhnKTtyZXR1cm4gbX07bS5yZXNpemU9ZnVuY3Rpb24oYil7Ynw9MDtpZihiIT09bi53aWR0aCl7bS53aWR0aD1uLndpZHRoPWI7bS5oZWlnaHQ9bi5oZWlnaHQ9YjtkYShuKTtmb3IodmFyIGM9MDs2PmM7KytjKWZvcih2YXIgZD0wO24ubWlwbWFzaz4+ZDsrK2QpaC50ZXhJbWFnZTJEKDM0MDY5K2MsZCxuLmZvcm1hdCxiPj5kLGI+PmQsMCxuLmZvcm1hdCxuLnR5cGUsbnVsbCk7amEoKTtaLnByb2ZpbGUmJihuLnN0YXRzLnNpemU9YShuLmludGVybmFsZm9ybWF0LG4udHlwZSxtLndpZHRoLG0uaGVpZ2h0LCExLCEwKSk7XG5yZXR1cm4gbX19O20uX3JlZ2xUeXBlPVwidGV4dHVyZUN1YmVcIjttLl90ZXh0dXJlPW47Wi5wcm9maWxlJiYobS5zdGF0cz1uLnN0YXRzKTttLmRlc3Ryb3k9ZnVuY3Rpb24oKXtuLmRlY1JlZigpfTtyZXR1cm4gbX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRhOysrYSloLmFjdGl2ZVRleHR1cmUoMzM5ODQrYSksaC5iaW5kVGV4dHVyZSgzNTUzLG51bGwpLG9hW2FdPW51bGw7RihjYSkuZm9yRWFjaChsYSk7TC5jdWJlQ291bnQ9MDtMLnRleHR1cmVDb3VudD0wfSxnZXRUZXh0dXJlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsfSxyZXN0b3JlOmZ1bmN0aW9uKCl7RihjYSkuZm9yRWFjaChmdW5jdGlvbihhKXthLnRleHR1cmU9aC5jcmVhdGVUZXh0dXJlKCk7aC5iaW5kVGV4dHVyZShhLnRhcmdldCxhLnRleHR1cmUpO2Zvcih2YXIgYj0wOzMyPmI7KytiKWlmKDAhPT0oYS5taXBtYXNrJjE8PGIpKWlmKDM1NTM9PT1hLnRhcmdldCloLnRleEltYWdlMkQoMzU1MyxiLGEuaW50ZXJuYWxmb3JtYXQsXG5hLndpZHRoPj5iLGEuaGVpZ2h0Pj5iLDAsYS5pbnRlcm5hbGZvcm1hdCxhLnR5cGUsbnVsbCk7ZWxzZSBmb3IodmFyIGM9MDs2PmM7KytjKWgudGV4SW1hZ2UyRCgzNDA2OStjLGIsYS5pbnRlcm5hbGZvcm1hdCxhLndpZHRoPj5iLGEuaGVpZ2h0Pj5iLDAsYS5pbnRlcm5hbGZvcm1hdCxhLnR5cGUsbnVsbCk7cmEoYS50ZXhJbmZvLGEudGFyZ2V0KX0pfX19fSx7XCIuL2NvbnN0YW50cy9hcnJheXR5cGVzLmpzb25cIjozLFwiLi91dGlsL2V4dGVuZFwiOjIyLFwiLi91dGlsL2ZsYXR0ZW5cIjoyMyxcIi4vdXRpbC9pcy1hcnJheS1saWtlXCI6MjQsXCIuL3V0aWwvaXMtbmRhcnJheVwiOjI1LFwiLi91dGlsL2lzLXR5cGVkLWFycmF5XCI6MjYsXCIuL3V0aWwvcG9vbFwiOjI4LFwiLi91dGlsL3RvLWhhbGYtZmxvYXRcIjozMCxcIi4vdXRpbC92YWx1ZXNcIjozMX1dLDE5OltmdW5jdGlvbihmLHAsdSl7cC5leHBvcnRzPWZ1bmN0aW9uKGYsayl7ZnVuY3Rpb24gcCgpe3RoaXMuZW5kUXVlcnlJbmRleD10aGlzLnN0YXJ0UXVlcnlJbmRleD1cbi0xO3RoaXMuc3VtPTA7dGhpcy5zdGF0cz1udWxsfWZ1bmN0aW9uIHIoYSxiLGMpe3ZhciBmPUYucG9wKCl8fG5ldyBwO2Yuc3RhcnRRdWVyeUluZGV4PWE7Zi5lbmRRdWVyeUluZGV4PWI7Zi5zdW09MDtmLnN0YXRzPWM7dS5wdXNoKGYpfXZhciBjPWsuZXh0X2Rpc2pvaW50X3RpbWVyX3F1ZXJ5O2lmKCFjKXJldHVybiBudWxsO3ZhciBhPVtdLGI9W10sRj1bXSx1PVtdLHQ9W10seT1bXTtyZXR1cm57YmVnaW5RdWVyeTpmdW5jdGlvbihnKXt2YXIgZj1hLnBvcCgpfHxjLmNyZWF0ZVF1ZXJ5RVhUKCk7Yy5iZWdpblF1ZXJ5RVhUKDM1MDA3LGYpO2IucHVzaChmKTtyKGIubGVuZ3RoLTEsYi5sZW5ndGgsZyl9LGVuZFF1ZXJ5OmZ1bmN0aW9uKCl7Yy5lbmRRdWVyeUVYVCgzNTAwNyl9LHB1c2hTY29wZVN0YXRzOnIsdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGcsZjtnPWIubGVuZ3RoO2lmKDAhPT1nKXt5Lmxlbmd0aD1NYXRoLm1heCh5Lmxlbmd0aCxnKzEpO3QubGVuZ3RoPU1hdGgubWF4KHQubGVuZ3RoLFxuZysxKTt0WzBdPTA7dmFyIGs9eVswXT0wO2ZvcihmPWc9MDtmPGIubGVuZ3RoOysrZil7dmFyIGw9YltmXTtjLmdldFF1ZXJ5T2JqZWN0RVhUKGwsMzQ5MTkpPyhrKz1jLmdldFF1ZXJ5T2JqZWN0RVhUKGwsMzQ5MTgpLGEucHVzaChsKSk6YltnKytdPWw7dFtmKzFdPWs7eVtmKzFdPWd9Yi5sZW5ndGg9Zztmb3IoZj1nPTA7Zjx1Lmxlbmd0aDsrK2Ype3ZhciBrPXVbZl0sbj1rLnN0YXJ0UXVlcnlJbmRleCxsPWsuZW5kUXVlcnlJbmRleDtrLnN1bSs9dFtsXS10W25dO249eVtuXTtsPXlbbF07bD09PW4/KGsuc3RhdHMuZ3B1VGltZSs9ay5zdW0vMUU2LEYucHVzaChrKSk6KGsuc3RhcnRRdWVyeUluZGV4PW4say5lbmRRdWVyeUluZGV4PWwsdVtnKytdPWspfXUubGVuZ3RoPWd9fSxnZXROdW1QZW5kaW5nUXVlcmllczpmdW5jdGlvbigpe3JldHVybiBiLmxlbmd0aH0sY2xlYXI6ZnVuY3Rpb24oKXthLnB1c2guYXBwbHkoYSxiKTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyljLmRlbGV0ZVF1ZXJ5RVhUKGFbZ10pO1xuYi5sZW5ndGg9MDthLmxlbmd0aD0wfSxyZXN0b3JlOmZ1bmN0aW9uKCl7Yi5sZW5ndGg9MDthLmxlbmd0aD0wfX19fSx7fV0sMjA6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P2Z1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX19LHt9XSwyMTpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoZil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGYpfWZ1bmN0aW9uIGsoZil7cmV0dXJuIGwoZikuam9pbihcIlwiKX12YXIgeD1mKFwiLi9leHRlbmRcIik7cC5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZigpe3ZhciBiPVtdLGM9W107cmV0dXJuIHgoZnVuY3Rpb24oKXtiLnB1c2guYXBwbHkoYixsKGFyZ3VtZW50cykpfSx7ZGVmOmZ1bmN0aW9uKCl7dmFyIGY9XCJ2XCIrYSsrO2MucHVzaChmKTswPGFyZ3VtZW50cy5sZW5ndGgmJlxuKGIucHVzaChmLFwiPVwiKSxiLnB1c2guYXBwbHkoYixsKGFyZ3VtZW50cykpLGIucHVzaChcIjtcIikpO3JldHVybiBmfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiBrKFswPGMubGVuZ3RoP1widmFyIFwiK2MrXCI7XCI6XCJcIixrKGIpXSl9fSl9ZnVuY3Rpb24gYygpe2Z1bmN0aW9uIGEoZixrKXtjKGYsayxcIj1cIixiLmRlZihmLGspLFwiO1wiKX12YXIgYj1mKCksYz1mKCksaz1iLnRvU3RyaW5nLHQ9Yy50b1N0cmluZztyZXR1cm4geChmdW5jdGlvbigpe2IuYXBwbHkoYixsKGFyZ3VtZW50cykpfSx7ZGVmOmIuZGVmLGVudHJ5OmIsZXhpdDpjLHNhdmU6YSxzZXQ6ZnVuY3Rpb24oYyxmLGspe2EoYyxmKTtiKGMsZixcIj1cIixrLFwiO1wiKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gaygpK3QoKX19KX12YXIgYT0wLGI9W10scD1bXSx1PWYoKSx0PXt9O3JldHVybntnbG9iYWw6dSxsaW5rOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZz0wO2c8cC5sZW5ndGg7KytnKWlmKHBbZ109PT1jKXJldHVybiBiW2ddO1xuZz1cImdcIithKys7Yi5wdXNoKGcpO3AucHVzaChjKTtyZXR1cm4gZ30sYmxvY2s6Zixwcm9jOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZigpe3ZhciBhPVwiYVwiK2wubGVuZ3RoO2wucHVzaChhKTtyZXR1cm4gYX12YXIgbD1bXTtiPWJ8fDA7Zm9yKHZhciByPTA7cjxiOysrcilmKCk7dmFyIHI9YygpLG49ci50b1N0cmluZztyZXR1cm4gdFthXT14KHIse2FyZzpmLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIGsoW1wiZnVuY3Rpb24oXCIsbC5qb2luKCksXCIpe1wiLG4oKSxcIn1cIl0pfX0pfSxzY29wZTpjLGNvbmQ6ZnVuY3Rpb24oKXt2YXIgYT1rKGFyZ3VtZW50cyksYj1jKCksZj1jKCkscj1iLnRvU3RyaW5nLHQ9Zi50b1N0cmluZztyZXR1cm4geChiLHt0aGVuOmZ1bmN0aW9uKCl7Yi5hcHBseShiLGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LFwiZWxzZVwiOmZ1bmN0aW9uKCl7Zi5hcHBseShmLGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGI9XG50KCk7YiYmKGI9XCJlbHNle1wiK2IrXCJ9XCIpO3JldHVybiBrKFtcImlmKFwiLGEsXCIpe1wiLHIoKSxcIn1cIixiXSl9fSl9LGNvbXBpbGU6ZnVuY3Rpb24oKXt2YXIgYT1bJ1widXNlIHN0cmljdFwiOycsdSxcInJldHVybiB7XCJdO09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24oYil7YS5wdXNoKCdcIicsYiwnXCI6Jyx0W2JdLnRvU3RyaW5nKCksXCIsXCIpfSk7YS5wdXNoKFwifVwiKTt2YXIgYz1rKGEpLnJlcGxhY2UoLzsvZyxcIjtcXG5cIikucmVwbGFjZSgvfS9nLFwifVxcblwiKS5yZXBsYWNlKC97L2csXCJ7XFxuXCIpO3JldHVybiBGdW5jdGlvbi5hcHBseShudWxsLGIuY29uY2F0KGMpKS5hcHBseShudWxsLHApfX19fSx7XCIuL2V4dGVuZFwiOjIyfV0sMjI6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9ZnVuY3Rpb24oZixrKXtmb3IodmFyIHA9T2JqZWN0LmtleXMoaykscj0wO3I8cC5sZW5ndGg7KytyKWZbcFtyXV09a1twW3JdXTtyZXR1cm4gZn19LHt9XSwyMzpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoZixcbmMsYSxiLGssbCl7Zm9yKHZhciB0PTA7dDxjOysrdClmb3IodmFyIHA9Zlt0XSxnPTA7ZzxhOysrZylmb3IodmFyIHg9cFtnXSx1PTA7dTxiOysrdSlrW2wrK109eFt1XX1mdW5jdGlvbiBrKGYsYyxhLGIscCl7Zm9yKHZhciB4PTEsdD1hKzE7dDxjLmxlbmd0aDsrK3QpeCo9Y1t0XTt2YXIgeT1jW2FdO2lmKDQ9PT1jLmxlbmd0aC1hKXt2YXIgZz1jW2ErMV0sdT1jW2ErMl07Yz1jW2ErM107Zm9yKHQ9MDt0PHk7Kyt0KWwoZlt0XSxnLHUsYyxiLHApLHArPXh9ZWxzZSBmb3IodD0wO3Q8eTsrK3QpayhmW3RdLGMsYSsxLGIscCkscCs9eH12YXIgeD1mKFwiLi9wb29sXCIpO3AuZXhwb3J0cz17c2hhcGU6ZnVuY3Rpb24oZil7Zm9yKHZhciBjPVtdO2YubGVuZ3RoO2Y9ZlswXSljLnB1c2goZi5sZW5ndGgpO3JldHVybiBjfSxmbGF0dGVuOmZ1bmN0aW9uKGYsYyxhLGIpe3ZhciBwPTE7aWYoYy5sZW5ndGgpZm9yKHZhciB1PTA7dTxjLmxlbmd0aDsrK3UpcCo9Y1t1XTtlbHNlIHA9MDthPWJ8fFxueC5hbGxvY1R5cGUoYSxwKTtzd2l0Y2goYy5sZW5ndGgpe2Nhc2UgMDpicmVhaztjYXNlIDE6Yj1jWzBdO2ZvcihjPTA7YzxiOysrYylhW2NdPWZbY107YnJlYWs7Y2FzZSAyOmI9Y1swXTtjPWNbMV07Zm9yKHU9cD0wO3U8YjsrK3UpZm9yKHZhciB0PWZbdV0seT0wO3k8YzsrK3kpYVtwKytdPXRbeV07YnJlYWs7Y2FzZSAzOmwoZixjWzBdLGNbMV0sY1syXSxhLDApO2JyZWFrO2RlZmF1bHQ6ayhmLGMsMCxhLDApfXJldHVybiBhfX19LHtcIi4vcG9vbFwiOjI4fV0sMjQ6W2Z1bmN0aW9uKGYscCx1KXt2YXIgbD1mKFwiLi9pcy10eXBlZC1hcnJheVwiKTtwLmV4cG9ydHM9ZnVuY3Rpb24oZil7cmV0dXJuIEFycmF5LmlzQXJyYXkoZil8fGwoZil9fSx7XCIuL2lzLXR5cGVkLWFycmF5XCI6MjZ9XSwyNTpbZnVuY3Rpb24oZixwLHUpe3ZhciBsPWYoXCIuL2lzLXR5cGVkLWFycmF5XCIpO3AuZXhwb3J0cz1mdW5jdGlvbihmKXtyZXR1cm4hIWYmJlwib2JqZWN0XCI9PT10eXBlb2YgZiYmQXJyYXkuaXNBcnJheShmLnNoYXBlKSYmXG5BcnJheS5pc0FycmF5KGYuc3RyaWRlKSYmXCJudW1iZXJcIj09PXR5cGVvZiBmLm9mZnNldCYmZi5zaGFwZS5sZW5ndGg9PT1mLnN0cmlkZS5sZW5ndGgmJihBcnJheS5pc0FycmF5KGYuZGF0YSl8fGwoZi5kYXRhKSl9fSx7XCIuL2lzLXR5cGVkLWFycmF5XCI6MjZ9XSwyNjpbZnVuY3Rpb24oZixwLHUpe3ZhciBsPWYoXCIuLi9jb25zdGFudHMvYXJyYXl0eXBlcy5qc29uXCIpO3AuZXhwb3J0cz1mdW5jdGlvbihmKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGYpaW4gbH19LHtcIi4uL2NvbnN0YW50cy9hcnJheXR5cGVzLmpzb25cIjozfV0sMjc6W2Z1bmN0aW9uKGYscCx1KXtwLmV4cG9ydHM9ZnVuY3Rpb24oZixrKXtmb3IodmFyIHA9QXJyYXkoZikscj0wO3I8ZjsrK3IpcFtyXT1rKHIpO3JldHVybiBwfX0se31dLDI4OltmdW5jdGlvbihmLHAsdSl7ZnVuY3Rpb24gbChjKXt2YXIgYSxiO2E9KDY1NTM1PGMpPDw0O2M+Pj49YTtiPSgyNTU8Yyk8PDM7Yz4+Pj1iO2F8PVxuYjtiPSgxNTxjKTw8MjtjPj4+PWI7YXw9YjtiPSgzPGMpPDwxO3JldHVybiBhfGJ8Yz4+PmI+PjF9ZnVuY3Rpb24gayhjKXthOntmb3IodmFyIGE9MTY7MjY4NDM1NDU2Pj1hO2EqPTE2KWlmKGM8PWEpe2M9YTticmVhayBhfWM9MH1hPXJbbChjKT4+Ml07cmV0dXJuIDA8YS5sZW5ndGg/YS5wb3AoKTpuZXcgQXJyYXlCdWZmZXIoYyl9ZnVuY3Rpb24geChjKXtyW2woYy5ieXRlTGVuZ3RoKT4+Ml0ucHVzaChjKX12YXIgcj1mKFwiLi9sb29wXCIpKDgsZnVuY3Rpb24oKXtyZXR1cm5bXX0pO3AuZXhwb3J0cz17YWxsb2M6ayxmcmVlOngsYWxsb2NUeXBlOmZ1bmN0aW9uKGMsYSl7dmFyIGI9bnVsbDtzd2l0Y2goYyl7Y2FzZSA1MTIwOmI9bmV3IEludDhBcnJheShrKGEpLDAsYSk7YnJlYWs7Y2FzZSA1MTIxOmI9bmV3IFVpbnQ4QXJyYXkoayhhKSwwLGEpO2JyZWFrO2Nhc2UgNTEyMjpiPW5ldyBJbnQxNkFycmF5KGsoMiphKSwwLGEpO2JyZWFrO2Nhc2UgNTEyMzpiPW5ldyBVaW50MTZBcnJheShrKDIqXG5hKSwwLGEpO2JyZWFrO2Nhc2UgNTEyNDpiPW5ldyBJbnQzMkFycmF5KGsoNCphKSwwLGEpO2JyZWFrO2Nhc2UgNTEyNTpiPW5ldyBVaW50MzJBcnJheShrKDQqYSksMCxhKTticmVhaztjYXNlIDUxMjY6Yj1uZXcgRmxvYXQzMkFycmF5KGsoNCphKSwwLGEpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIG51bGx9cmV0dXJuIGIubGVuZ3RoIT09YT9iLnN1YmFycmF5KDAsYSk6Yn0sZnJlZVR5cGU6ZnVuY3Rpb24oYyl7eChjLmJ1ZmZlcil9fX0se1wiLi9sb29wXCI6Mjd9XSwyOTpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz1cImZ1bmN0aW9uXCI9PT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWU/e25leHQ6ZnVuY3Rpb24oZil7cmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShmKX0sY2FuY2VsOmZ1bmN0aW9uKGYpe3JldHVybiBjYW5jZWxBbmltYXRpb25GcmFtZShmKX19OntuZXh0OmZ1bmN0aW9uKGYpe3JldHVybiBzZXRUaW1lb3V0KGYsXG4xNil9LGNhbmNlbDpjbGVhclRpbWVvdXR9fSx7fV0sMzA6W2Z1bmN0aW9uKGYscCx1KXt2YXIgbD1mKFwiLi9wb29sXCIpLGs9bmV3IEZsb2F0MzJBcnJheSgxKSx4PW5ldyBVaW50MzJBcnJheShrLmJ1ZmZlcik7cC5leHBvcnRzPWZ1bmN0aW9uKGYpe2Zvcih2YXIgYz1sLmFsbG9jVHlwZSg1MTIzLGYubGVuZ3RoKSxhPTA7YTxmLmxlbmd0aDsrK2EpaWYoaXNOYU4oZlthXSkpY1thXT02NTUzNTtlbHNlIGlmKEluZmluaXR5PT09ZlthXSljW2FdPTMxNzQ0O2Vsc2UgaWYoLUluZmluaXR5PT09ZlthXSljW2FdPTY0NTEyO2Vsc2V7a1swXT1mW2FdO3ZhciBiPXhbMF0scD1iPj4+MzE8PDE1LHU9KGI8PDE+Pj4yNCktMTI3LGI9Yj4+MTMmMTAyMztjW2FdPS0yND51P3A6LTE0PnU/cCsoYisxMDI0Pj4tMTQtdSk6MTU8dT9wKzMxNzQ0OnArKHUrMTU8PDEwKStifXJldHVybiBjfX0se1wiLi9wb29sXCI6Mjh9XSwzMTpbZnVuY3Rpb24oZixwLHUpe3AuZXhwb3J0cz1mdW5jdGlvbihmKXtyZXR1cm4gT2JqZWN0LmtleXMoZikubWFwKGZ1bmN0aW9uKGspe3JldHVybiBmW2tdfSl9fSxcbnt9XSwzMjpbZnVuY3Rpb24oZixwLHUpe2Z1bmN0aW9uIGwoYSxiLGYpe2Z1bmN0aW9uIGsoKXt2YXIgYj13aW5kb3cuaW5uZXJXaWR0aCxnPXdpbmRvdy5pbm5lckhlaWdodDthIT09ZG9jdW1lbnQuYm9keSYmKGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxiPWcucmlnaHQtZy5sZWZ0LGc9Zy50b3AtZy5ib3R0b20pO2wud2lkdGg9ZipiO2wuaGVpZ2h0PWYqZztjKGwuc3R5bGUse3dpZHRoOmIrXCJweFwiLGhlaWdodDpnK1wicHhcIn0pfXZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7YyhsLnN0eWxlLHtib3JkZXI6MCxtYXJnaW46MCxwYWRkaW5nOjAsdG9wOjAsbGVmdDowfSk7YS5hcHBlbmRDaGlsZChsKTthPT09ZG9jdW1lbnQuYm9keSYmKGwuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLGMoYS5zdHlsZSx7bWFyZ2luOjAscGFkZGluZzowfSkpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsaywhMSk7aygpO3JldHVybntjYW52YXM6bCxvbkRlc3Ryb3k6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLFxuayk7YS5yZW1vdmVDaGlsZChsKX19fWZ1bmN0aW9uIGsoYSxiKXtmdW5jdGlvbiBjKGYpe3RyeXtyZXR1cm4gYS5nZXRDb250ZXh0KGYsYil9Y2F0Y2goayl7cmV0dXJuIG51bGx9fXJldHVybiBjKFwid2ViZ2xcIil8fGMoXCJleHBlcmltZW50YWwtd2ViZ2xcIil8fGMoXCJ3ZWJnbC1leHBlcmltZW50YWxcIil9ZnVuY3Rpb24geChhKXtyZXR1cm5cInN0cmluZ1wiPT09dHlwZW9mIGE/YS5zcGxpdCgpOmF9ZnVuY3Rpb24gcihhKXtyZXR1cm5cInN0cmluZ1wiPT09dHlwZW9mIGE/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhKTphfXZhciBjPWYoXCIuL3V0aWwvZXh0ZW5kXCIpO3AuZXhwb3J0cz1mdW5jdGlvbihhKXt2YXIgYj1hfHx7fSxjLGYscCx1O2E9e307dmFyIGc9W10sRT1bXSxDPVwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93PzE6d2luZG93LmRldmljZVBpeGVsUmF0aW8sTj0hMSxuPWZ1bmN0aW9uKGEpe30sbT1mdW5jdGlvbigpe307XCJzdHJpbmdcIj09PXR5cGVvZiBiP2M9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihiKTpcblwib2JqZWN0XCI9PT10eXBlb2YgYiYmKFwic3RyaW5nXCI9PT10eXBlb2YgYi5ub2RlTmFtZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIuYXBwZW5kQ2hpbGQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD9jPWI6XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuZHJhd0FycmF5c3x8XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuZHJhd0VsZW1lbnRzPyh1PWIscD11LmNhbnZhcyk6KFwiZ2xcImluIGI/dT1iLmdsOlwiY2FudmFzXCJpbiBiP3A9cihiLmNhbnZhcyk6XCJjb250YWluZXJcImluIGImJihmPXIoYi5jb250YWluZXIpKSxcImF0dHJpYnV0ZXNcImluIGImJihhPWIuYXR0cmlidXRlcyksXCJleHRlbnNpb25zXCJpbiBiJiYoZz14KGIuZXh0ZW5zaW9ucykpLFwib3B0aW9uYWxFeHRlbnNpb25zXCJpbiBiJiYoRT14KGIub3B0aW9uYWxFeHRlbnNpb25zKSksXCJvbkRvbmVcImluIGImJihuPWIub25Eb25lKSxcInByb2ZpbGVcImluIGImJihOPSEhYi5wcm9maWxlKSxcInBpeGVsUmF0aW9cImluIGImJlxuKEM9K2IucGl4ZWxSYXRpbykpKTtjJiYoXCJjYW52YXNcIj09PWMubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9wPWM6Zj1jKTtpZighdSl7aWYoIXApe2M9bChmfHxkb2N1bWVudC5ib2R5LG4sQyk7aWYoIWMpcmV0dXJuIG51bGw7cD1jLmNhbnZhczttPWMub25EZXN0cm95fXU9ayhwLGEpfXJldHVybiB1P3tnbDp1LGNhbnZhczpwLGNvbnRhaW5lcjpmLGV4dGVuc2lvbnM6ZyxvcHRpb25hbEV4dGVuc2lvbnM6RSxwaXhlbFJhdGlvOkMscHJvZmlsZTpOLG9uRG9uZTpuLG9uRGVzdHJveTptfToobSgpLG4oXCJ3ZWJnbCBub3Qgc3VwcG9ydGVkLCB0cnkgdXBncmFkaW5nIHlvdXIgYnJvd3NlciBvciBncmFwaGljcyBkcml2ZXJzIGh0dHA6Ly9nZXQud2ViZ2wub3JnXCIpLG51bGwpfX0se1wiLi91dGlsL2V4dGVuZFwiOjIyfV0sMzM6W2Z1bmN0aW9uKGYscCx1KXtmdW5jdGlvbiBsKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDsrK2MpaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9dmFyIGs9XG5mKFwiLi9saWIvdXRpbC9leHRlbmRcIikseD1mKFwiLi9saWIvZHluYW1pY1wiKSxyPWYoXCIuL2xpYi91dGlsL3JhZlwiKSxjPWYoXCIuL2xpYi91dGlsL2Nsb2NrXCIpLGE9ZihcIi4vbGliL3N0cmluZ3NcIiksYj1mKFwiLi9saWIvd2ViZ2xcIiksRj1mKFwiLi9saWIvZXh0ZW5zaW9uXCIpLE09ZihcIi4vbGliL2xpbWl0c1wiKSx0PWYoXCIuL2xpYi9idWZmZXJcIikseT1mKFwiLi9saWIvZWxlbWVudHNcIiksZz1mKFwiLi9saWIvdGV4dHVyZVwiKSxFPWYoXCIuL2xpYi9yZW5kZXJidWZmZXJcIiksQz1mKFwiLi9saWIvZnJhbWVidWZmZXJcIiksTj1mKFwiLi9saWIvYXR0cmlidXRlXCIpLG49ZihcIi4vbGliL3NoYWRlclwiKSxtPWYoXCIuL2xpYi9yZWFkXCIpLEI9ZihcIi4vbGliL2NvcmVcIiksWT1mKFwiLi9saWIvc3RhdHNcIiksTD1mKFwiLi9saWIvdGltZXJcIik7cC5leHBvcnRzPWZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgoKXtpZigwPT09US5sZW5ndGgpRyYmRy51cGRhdGUoKSxUPW51bGw7ZWxzZXtUPXIubmV4dChoKTtLKCk7Zm9yKHZhciBhPVxuUS5sZW5ndGgtMTswPD1hOy0tYSl7dmFyIGI9UVthXTtiJiZiKFUsbnVsbCwwKX1xLmZsdXNoKCk7RyYmRy51cGRhdGUoKX19ZnVuY3Rpb24gcCgpeyFUJiYwPFEubGVuZ3RoJiYoVD1yLm5leHQoaCkpfWZ1bmN0aW9uIHUoKXtUJiYoci5jYW5jZWwoaCksVD1udWxsKX1mdW5jdGlvbiBMYShhKXthLnByZXZlbnREZWZhdWx0KCk7dSgpO3BhLmZvckVhY2goZnVuY3Rpb24oYSl7YSgpfSl9ZnVuY3Rpb24gemEoYSl7cS5nZXRFcnJvcigpO21hLnJlc3RvcmUoKTtzYS5yZXN0b3JlKCk7a2EucmVzdG9yZSgpO2RhLnJlc3RvcmUoKTtqYS5yZXN0b3JlKCk7bGEucmVzdG9yZSgpO0cmJkcucmVzdG9yZSgpO2VhLnByb2NzLnJlZnJlc2goKTtwKCk7Vi5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pfWZ1bmN0aW9uIEdhKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9e30sZj17fTtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBnPWFbYl07eC5pc0R5bmFtaWMoZyk/ZltiXT14LnVuYm94KGcsXG5iKTpjW2JdPWd9KTtyZXR1cm57ZHluYW1pYzpmLFwic3RhdGljXCI6Y319ZnVuY3Rpb24gYyhhKXtmb3IoO3EubGVuZ3RoPGE7KXEucHVzaChudWxsKTtyZXR1cm4gcX12YXIgZj1iKGEuY29udGV4dHx8e30pLGc9YihhLnVuaWZvcm1zfHx7fSksaD1iKGEuYXR0cmlidXRlc3x8e30pLGw9YihmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe2lmKGEgaW4gYyl7dmFyIGY9Y1thXTtkZWxldGUgY1thXTtPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2NbYStcIi5cIitiXT1mW2JdfSl9fXZhciBjPWsoe30sYSk7ZGVsZXRlIGMudW5pZm9ybXM7ZGVsZXRlIGMuYXR0cmlidXRlcztkZWxldGUgYy5jb250ZXh0O1wic3RlbmNpbFwiaW4gYyYmYy5zdGVuY2lsLm9wJiYoYy5zdGVuY2lsLm9wQmFjaz1jLnN0ZW5jaWwub3BGcm9udD1jLnN0ZW5jaWwub3AsZGVsZXRlIGMuc3RlbmNpbC5vcCk7YihcImJsZW5kXCIpO2IoXCJkZXB0aFwiKTtiKFwiY3VsbFwiKTtiKFwic3RlbmNpbFwiKTtiKFwicG9seWdvbk9mZnNldFwiKTtcbmIoXCJzY2lzc29yXCIpO2IoXCJzYW1wbGVcIik7cmV0dXJuIGN9KGEpKTthPXtncHVUaW1lOjAsY3B1VGltZTowLGNvdW50OjB9O3ZhciBmPWVhLmNvbXBpbGUobCxoLGcsZixhKSxtPWYuZHJhdyxuPWYuYmF0Y2gscD1mLnNjb3BlLHE9W107cmV0dXJuIGsoZnVuY3Rpb24oYSxiKXt2YXIgZjtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gcC5jYWxsKHRoaXMsbnVsbCxhLDApO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKWlmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlmb3IoZj0wO2Y8YTsrK2YpcC5jYWxsKHRoaXMsbnVsbCxiLGYpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShhKSlmb3IoZj0wO2Y8YS5sZW5ndGg7KytmKXAuY2FsbCh0aGlzLGFbZl0sYixmKTtlbHNlIHJldHVybiBwLmNhbGwodGhpcyxhLGIsMCk7ZWxzZSBpZihcIm51bWJlclwiPT09dHlwZW9mIGEpe2lmKDA8YSlyZXR1cm4gbi5jYWxsKHRoaXMsYyhhfDApLGF8MCl9ZWxzZSBpZihBcnJheS5pc0FycmF5KGEpKXtpZihhLmxlbmd0aClyZXR1cm4gbi5jYWxsKHRoaXMsXG5hLGEubGVuZ3RoKX1lbHNlIHJldHVybiBtLmNhbGwodGhpcyxhKX0se3N0YXRzOmF9KX1mdW5jdGlvbiBaKGEpe1EucHVzaChhKTtwKCk7cmV0dXJue2NhbmNlbDpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYT1sKFEsYik7UVthXT1RW1EubGVuZ3RoLTFdOy0tUS5sZW5ndGg7MD49US5sZW5ndGgmJnUoKX12YXIgYz1sKFEsYSk7UVtjXT1ifX19ZnVuY3Rpb24gRCgpe3ZhciBhPU8udmlld3BvcnQsYj1PLnNjaXNzb3JfYm94O2FbMF09YVsxXT1iWzBdPWJbMV09MDtVLnZpZXdwb3J0V2lkdGg9VS5mcmFtZWJ1ZmZlcldpZHRoPVUuZHJhd2luZ0J1ZmZlcldpZHRoPWFbMl09YlsyXT1xLmRyYXdpbmdCdWZmZXJXaWR0aDtVLnZpZXdwb3J0SGVpZ2h0PVUuZnJhbWVidWZmZXJIZWlnaHQ9VS5kcmF3aW5nQnVmZmVySGVpZ2h0PWFbM109YlszXT1xLmRyYXdpbmdCdWZmZXJIZWlnaHR9ZnVuY3Rpb24gSygpe1UudGljays9MTtVLnRpbWU9dmEoKTtEKCk7ZWEucHJvY3MucG9sbCgpfWZ1bmN0aW9uIEFhKCl7RCgpO1xuZWEucHJvY3MucmVmcmVzaCgpO0cmJkcudXBkYXRlKCl9ZnVuY3Rpb24gdmEoKXtyZXR1cm4oYygpLWJhKS8xRTN9Zj1iKGYpO2lmKCFmKXJldHVybiBudWxsO3ZhciBxPWYuZ2wsUz1xLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7cS5pc0NvbnRleHRMb3N0KCk7dmFyIG1hPUYocSxmKTtpZighbWEpcmV0dXJuIG51bGw7dmFyIGdhPWEoKSxXPVkoKSxSPW1hLmV4dGVuc2lvbnMsRz1MKHEsUiksYmE9YygpLG5hPXEuZHJhd2luZ0J1ZmZlcldpZHRoLHlhPXEuZHJhd2luZ0J1ZmZlckhlaWdodCxVPXt0aWNrOjAsdGltZTowLHZpZXdwb3J0V2lkdGg6bmEsdmlld3BvcnRIZWlnaHQ6eWEsZnJhbWVidWZmZXJXaWR0aDpuYSxmcmFtZWJ1ZmZlckhlaWdodDp5YSxkcmF3aW5nQnVmZmVyV2lkdGg6bmEsZHJhd2luZ0J1ZmZlckhlaWdodDp5YSxwaXhlbFJhdGlvOmYucGl4ZWxSYXRpb30saWE9TShxLFIpLGthPXQocSxXLGYpLHJhPXkocSxSLGthLFcpLG5hPU4ocSxSLGlhLGthLGdhKSxzYT1uKHEsXG5nYSxXLGYpLGRhPWcocSxSLGlhLGZ1bmN0aW9uKCl7ZWEucHJvY3MucG9sbCgpfSxVLFcsZiksamE9RShxLFIsaWEsVyxmKSxsYT1DKHEsUixpYSxkYSxqYSxXKSxlYT1CKHEsZ2EsUixpYSxrYSxyYSxkYSxsYSx7fSxuYSxzYSx7ZWxlbWVudHM6bnVsbCxwcmltaXRpdmU6NCxjb3VudDotMSxvZmZzZXQ6MCxpbnN0YW5jZXM6LTF9LFUsRyxmKSxnYT1tKHEsbGEsZWEucHJvY3MucG9sbCxVLFMsUiksTz1lYS5uZXh0LGhhPXEuY2FudmFzLFE9W10scGE9W10sVj1bXSxYPVtmLm9uRGVzdHJveV0sVD1udWxsO2hhJiYoaGEuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dGxvc3RcIixMYSwhMSksaGEuYWRkRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dHJlc3RvcmVkXCIsemEsITEpKTtBYSgpO1M9ayhHYSx7Y2xlYXI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtlYS5wcm9jcy5wb2xsKCk7dmFyIGM9YS5jb2xvcjtjJiYocS5jbGVhckNvbG9yKCtjWzBdfHwwLCtjWzFdfHwwLCtjWzJdfHwwLFxuK2NbM118fDApLGJ8PTE2Mzg0KTtcImRlcHRoXCJpbiBhJiYocS5jbGVhckRlcHRoKCthLmRlcHRoKSxifD0yNTYpO1wic3RlbmNpbFwiaW4gYSYmKHEuY2xlYXJTdGVuY2lsKGEuc3RlbmNpbHwwKSxifD0xMDI0KTtxLmNsZWFyKGIpfSxwcm9wOnguZGVmaW5lLmJpbmQobnVsbCwxKSxjb250ZXh0OnguZGVmaW5lLmJpbmQobnVsbCwyKSxcInRoaXNcIjp4LmRlZmluZS5iaW5kKG51bGwsMyksZHJhdzpHYSh7fSksYnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVybiBrYS5jcmVhdGUoYSwzNDk2MiwhMSwhMSl9LGVsZW1lbnRzOmZ1bmN0aW9uKGEpe3JldHVybiByYS5jcmVhdGUoYSwhMSl9LHRleHR1cmU6ZGEuY3JlYXRlMkQsY3ViZTpkYS5jcmVhdGVDdWJlLHJlbmRlcmJ1ZmZlcjpqYS5jcmVhdGUsZnJhbWVidWZmZXI6bGEuY3JlYXRlLGZyYW1lYnVmZmVyQ3ViZTpsYS5jcmVhdGVDdWJlLGF0dHJpYnV0ZXM6UyxmcmFtZTpaLG9uOmZ1bmN0aW9uKGEsYil7dmFyIGM7c3dpdGNoKGEpe2Nhc2UgXCJmcmFtZVwiOnJldHVybiBaKGIpO1xuY2FzZSBcImxvc3RcIjpjPXBhO2JyZWFrO2Nhc2UgXCJyZXN0b3JlXCI6Yz1WO2JyZWFrO2Nhc2UgXCJkZXN0cm95XCI6Yz1YfWMucHVzaChiKTtyZXR1cm57Y2FuY2VsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aDsrK2EpaWYoY1thXT09PWIpe2NbYV09Y1tjLmxlbmd0aC0xXTtjLnBvcCgpO2JyZWFrfX19fSxsaW1pdHM6aWEsaGFzRXh0ZW5zaW9uOmZ1bmN0aW9uKGEpe3JldHVybiAwPD1pYS5leHRlbnNpb25zLmluZGV4T2YoYS50b0xvd2VyQ2FzZSgpKX0scmVhZDpnYSxkZXN0cm95OmZ1bmN0aW9uKCl7US5sZW5ndGg9MDt1KCk7aGEmJihoYS5yZW1vdmVFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0bG9zdFwiLExhKSxoYS5yZW1vdmVFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0cmVzdG9yZWRcIix6YSkpO3NhLmNsZWFyKCk7bGEuY2xlYXIoKTtqYS5jbGVhcigpO2RhLmNsZWFyKCk7cmEuY2xlYXIoKTtrYS5jbGVhcigpO0cmJkcuY2xlYXIoKTtYLmZvckVhY2goZnVuY3Rpb24oYSl7YSgpfSl9LFxuX2dsOnEsX3JlZnJlc2g6QWEscG9sbDpmdW5jdGlvbigpe0soKTtHJiZHLnVwZGF0ZSgpfSxub3c6dmEsc3RhdHM6V30pO2Yub25Eb25lKG51bGwsUyk7cmV0dXJuIFN9fSx7XCIuL2xpYi9hdHRyaWJ1dGVcIjoxLFwiLi9saWIvYnVmZmVyXCI6MixcIi4vbGliL2NvcmVcIjo3LFwiLi9saWIvZHluYW1pY1wiOjgsXCIuL2xpYi9lbGVtZW50c1wiOjksXCIuL2xpYi9leHRlbnNpb25cIjoxMCxcIi4vbGliL2ZyYW1lYnVmZmVyXCI6MTEsXCIuL2xpYi9saW1pdHNcIjoxMixcIi4vbGliL3JlYWRcIjoxMyxcIi4vbGliL3JlbmRlcmJ1ZmZlclwiOjE0LFwiLi9saWIvc2hhZGVyXCI6MTUsXCIuL2xpYi9zdGF0c1wiOjE2LFwiLi9saWIvc3RyaW5nc1wiOjE3LFwiLi9saWIvdGV4dHVyZVwiOjE4LFwiLi9saWIvdGltZXJcIjoxOSxcIi4vbGliL3V0aWwvY2xvY2tcIjoyMCxcIi4vbGliL3V0aWwvZXh0ZW5kXCI6MjIsXCIuL2xpYi91dGlsL3JhZlwiOjI5LFwiLi9saWIvd2ViZ2xcIjozMn1dfSx7fSxbMzNdKSgzMyl9KTtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbkpsWjJ3dWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWlobWRXNWpkR2x2YmloUFlTbDdYQ0p2WW1wbFkzUmNJajA5UFhSNWNHVnZaaUJsZUhCdmNuUnpKaVpjSW5WdVpHVm1hVzVsWkZ3aUlUMDlkSGx3Wlc5bUlHMXZaSFZzWlQ5dGIyUjFiR1V1Wlhod2IzSjBjejFQWVNncE9sd2lablZ1WTNScGIyNWNJajA5UFhSNWNHVnZaaUJrWldacGJtVW1KbVJsWm1sdVpTNWhiV1EvWkdWbWFXNWxLRnRkTEU5aEtUb29YQ0oxYm1SbFptbHVaV1JjSWlFOVBYUjVjR1Z2WmlCM2FXNWtiM2MvZDJsdVpHOTNPbHdpZFc1a1pXWnBibVZrWENJaFBUMTBlWEJsYjJZZ1oyeHZZbUZzUDJkc2IySmhiRHBjSW5WdVpHVm1hVzVsWkZ3aUlUMDlkSGx3Wlc5bUlITmxiR1kvYzJWc1pqcDBhR2x6S1M1amNtVmhkR1ZTUlVkTVBVOWhLQ2w5S1NobWRXNWpkR2x2YmlncGUzSmxkSFZ5YmlCbWRXNWpkR2x2YmlCbUtIQXNkU3hzS1h0bWRXNWpkR2x2YmlCcktHTXNZU2w3YVdZb0lYVmJZMTBwZTJsbUtDRndXMk5kS1h0MllYSWdZajFjSW1aMWJtTjBhVzl1WENJOVBYUjVjR1Z2WmlCeVpYRjFhWEpsSmlaeVpYRjFhWEpsTzJsbUtDRmhKaVppS1hKbGRIVnliaUJpS0dNc0lUQXBPMmxtS0hncGNtVjBkWEp1SUhnb1l5d2hNQ2s3WWoxRmNuSnZjaWhjSWtOaGJtNXZkQ0JtYVc1a0lHMXZaSFZzWlNBblhDSXJZeXRjSWlkY0lpazdkR2h5YjNjZ1lpNWpiMlJsUFZ3aVRVOUVWVXhGWDA1UFZGOUdUMVZPUkZ3aUxHSTdmV0k5WEc1MVcyTmRQWHRsZUhCdmNuUnpPbnQ5ZlR0d1cyTmRXekJkTG1OaGJHd29ZaTVsZUhCdmNuUnpMR1oxYm1OMGFXOXVLR0VwZTNaaGNpQmlQWEJiWTExYk1WMWJZVjA3Y21WMGRYSnVJR3NvWWo5aU9tRXBmU3hpTEdJdVpYaHdiM0owY3l4bUxIQXNkU3hzS1gxeVpYUjFjbTRnZFZ0alhTNWxlSEJ2Y25SemZXWnZjaWgyWVhJZ2VEMWNJbVoxYm1OMGFXOXVYQ0k5UFhSNWNHVnZaaUJ5WlhGMWFYSmxKaVp5WlhGMWFYSmxMSEk5TUR0eVBHd3ViR1Z1WjNSb08zSXJLeWxyS0d4YmNsMHBPM0psZEhWeWJpQnJmU2g3TVRwYlpuVnVZM1JwYjI0b1ppeHdMSFVwZTJaMWJtTjBhVzl1SUd3b0tYdDBhR2x6TG5jOWRHaHBjeTU2UFhSb2FYTXVlVDEwYUdsekxuZzlkR2hwY3k1emRHRjBaVDB3TzNSb2FYTXVZblZtWm1WeVBXNTFiR3c3ZEdocGN5NXphWHBsUFRBN2RHaHBjeTV1YjNKdFlXeHBlbVZrUFNFeE8zUm9hWE11ZEhsd1pUMDFNVEkyTzNSb2FYTXVaR2wyYVhOdmNqMTBhR2x6TG5OMGNtbGtaVDEwYUdsekxtOW1abk5sZEQwd2ZYQXVaWGh3YjNKMGN6MW1kVzVqZEdsdmJpaHJMSGdzY2l4akxHRXBlMnM5Y2k1dFlYaEJkSFJ5YVdKMWRHVnpPM2c5UVhKeVlYa29heWs3Wm05eUtISTlNRHR5UEdzN0t5dHlLWGhiY2wwOWJtVjNJR3c3Y21WMGRYSnVlMUpsWTI5eVpEcHNMSE5qYjNCbE9udDlMSE4wWVhSbE9uaDlmWDBzWEc1N2ZWMHNNanBiWm5WdVkzUnBiMjRvWml4d0xIVXBlMloxYm1OMGFXOXVJR3dvWXlsN2NtVjBkWEp1SUhSYlQySnFaV04wTG5CeWIzUnZkSGx3WlM1MGIxTjBjbWx1Wnk1allXeHNLR01wWFh3d2ZXWjFibU4wYVc5dUlHc29ZeXhoS1h0bWIzSW9kbUZ5SUdJOU1EdGlQR0V1YkdWdVozUm9PeXNyWWlsalcySmRQV0ZiWWwxOVpuVnVZM1JwYjI0Z2VDaGpMR0VzWWl4ckxHd3NjaXg0S1h0bWIzSW9kbUZ5SUdjOU1DeG9QVEE3YUR4aU95c3JhQ2xtYjNJb2RtRnlJR1k5TUR0bVBHczdLeXRtS1dOYlp5c3JYVDFoVzJ3cWFDdHlLbVlyZUYxOWRtRnlJSEk5WmloY0lpNHZkWFJwYkM5cGN5MTBlWEJsWkMxaGNuSmhlVndpS1N4alBXWW9YQ0l1TDNWMGFXd3ZhWE10Ym1SaGNuSmhlVndpS1N4aFBXWW9YQ0l1TDNWMGFXd3ZkbUZzZFdWelhDSXBMR0k5WmloY0lpNHZkWFJwYkM5d2IyOXNYQ0lwTzNVOVppaGNJaTR2ZFhScGJDOW1iR0YwZEdWdVhDSXBPM1poY2lCR1BYVXVabXhoZEhSbGJpeE5QWFV1YzJoaGNHVXNkRDFtS0Z3aUxpOWpiMjV6ZEdGdWRITXZZWEp5WVhsMGVYQmxjeTVxYzI5dVhDSXBMSGs5WmloY0lpNHZZMjl1YzNSaGJuUnpMMlIwZVhCbGN5NXFjMjl1WENJcExHYzlaaWhjSWk0dlkyOXVjM1JoYm5SekwzVnpZV2RsTG1wemIyNWNJaWtzUlQxYlhUdEZXelV4TWpCZFBURTdSVnMxTVRJeVhUMHlPMFZiTlRFeU5GMDlYRzQwTzBWYk5URXlNVjA5TVR0Rld6VXhNak5kUFRJN1JWczFNVEkxWFQwME8wVmJOVEV5TmwwOU5EdHdMbVY0Y0c5eWRITTlablZ1WTNScGIyNG9aaXgwTEc0cGUyWjFibU4wYVc5dUlHMG9ZeWw3ZEdocGN5NXBaRDFJS3lzN2RHaHBjeTVpZFdabVpYSTlaaTVqY21WaGRHVkNkV1ptWlhJb0tUdDBhR2x6TG5SNWNHVTlZenQwYUdsekxuVnpZV2RsUFRNMU1EUTBPM1JvYVhNdVlubDBaVXhsYm1kMGFEMHdPM1JvYVhNdVpHbHRaVzV6YVc5dVBURTdkR2hwY3k1a2RIbHdaVDAxTVRJeE8zUm9hWE11Y0dWeWMybHpkR1Z1ZEVSaGRHRTliblZzYkR0dUxuQnliMlpwYkdVbUppaDBhR2x6TG5OMFlYUnpQWHR6YVhwbE9qQjlLWDFtZFc1amRHbHZiaUJDS0dNc1lTeGlLWHRqTG1KNWRHVk1aVzVuZEdnOVlTNWllWFJsVEdWdVozUm9PMll1WW5WbVptVnlSR0YwWVNoakxuUjVjR1VzWVN4aUtYMW1kVzVqZEdsdmJpQndLR0VzYUN4dExHWXNaeXh1S1h0aExuVnpZV2RsUFcwN2FXWW9RWEp5WVhrdWFYTkJjbkpoZVNob0tTbDdhV1lvWVM1a2RIbHdaVDFtZkh3MU1USTJMREE4YUM1c1pXNW5kR2dwYVdZb1FYSnlZWGt1YVhOQmNuSmhlU2hvV3pCZEtTbDdaejFOS0dncE8yWnZjaWgyWVhJZ1N6MW1QVEU3U3p4bkxteGxibWQwYURzckswc3BaaW85WjF0TFhUdGhMbVJwYldWdWMybHZiajFtTzJnOVJpaG9MRnh1Wnl4aExtUjBlWEJsS1R0Q0tHRXNhQ3h0S1R0dVAyRXVjR1Z5YzJsemRHVnVkRVJoZEdFOWFEcGlMbVp5WldWVWVYQmxLR2dwZldWc2MyVmNJbTUxYldKbGNsd2lQVDA5ZEhsd1pXOW1JR2hiTUYwL0tHRXVaR2x0Wlc1emFXOXVQV2NzWnoxaUxtRnNiRzlqVkhsd1pTaGhMbVIwZVhCbExHZ3ViR1Z1WjNSb0tTeHJLR2NzYUNrc1FpaGhMR2NzYlNrc2JqOWhMbkJsY25OcGMzUmxiblJFWVhSaFBXYzZZaTVtY21WbFZIbHdaU2huS1NrNmNpaG9XekJkS1NZbUtHRXVaR2x0Wlc1emFXOXVQV2hiTUYwdWJHVnVaM1JvTEdFdVpIUjVjR1U5Wm54OGJDaG9XekJkS1h4OE5URXlOaXhvUFVZb2FDeGJhQzVzWlc1bmRHZ3NhRnN3WFM1c1pXNW5kR2hkTEdFdVpIUjVjR1VwTEVJb1lTeG9MRzBwTEc0L1lTNXdaWEp6YVhOMFpXNTBSR0YwWVQxb09tSXVabkpsWlZSNWNHVW9hQ2twZldWc2MyVWdhV1lvY2lob0tTbGhMbVIwZVhCbFBXWjhmR3dvYUNrc1lTNWthVzFsYm5OcGIyNDlaeXhDS0dFc2FDeHRLU3h1SmlZb1lTNXdaWEp6YVhOMFpXNTBSR0YwWVQxdVpYY2dWV2x1ZERoQmNuSmhlU2h1WlhjZ1ZXbHVkRGhCY25KaGVTaG9MbUoxWm1abGNpa3BLVHRsYkhObElHbG1LR01vYUNrcGUyYzlhQzV6YUdGd1pUdDJZWElnUXoxb0xuTjBjbWxrWlN4TFBXZ3ViMlptYzJWMExIazlNQ3h4UFRBc1V6MHdMSFE5WEc0d096RTlQVDFuTG14bGJtZDBhRDhvZVQxbld6QmRMSEU5TVN4VFBVTmJNRjBzZEQwd0tUb3lQVDA5Wnk1c1pXNW5kR2dtSmloNVBXZGJNRjBzY1Qxbld6RmRMRk05UTFzd1hTeDBQVU5iTVYwcE8yRXVaSFI1Y0dVOVpueDhiQ2hvTG1SaGRHRXBmSHcxTVRJMk8yRXVaR2x0Wlc1emFXOXVQWEU3WnoxaUxtRnNiRzlqVkhsd1pTaGhMbVIwZVhCbExIa3FjU2s3ZUNobkxHZ3VaR0YwWVN4NUxIRXNVeXgwTEVzcE8wSW9ZU3huTEcwcE8yNC9ZUzV3WlhKemFYTjBaVzUwUkdGMFlUMW5PbUl1Wm5KbFpWUjVjR1VvWnlsOWZXWjFibU4wYVc5dUlFd29ZeWw3ZEM1aWRXWm1aWEpEYjNWdWRDMHRPMll1WkdWc1pYUmxRblZtWm1WeUtHTXVZblZtWm1WeUtUdGpMbUoxWm1abGNqMXVkV3hzTzJSbGJHVjBaU0JvVzJNdWFXUmRmWFpoY2lCSVBUQXNhRDE3ZlR0dExuQnliM1J2ZEhsd1pTNWlhVzVrUFdaMWJtTjBhVzl1S0NsN1ppNWlhVzVrUW5WbVptVnlLSFJvYVhNdWRIbHdaU3gwYUdsekxtSjFabVpsY2lsOU8yMHVjSEp2ZEc5MGVYQmxMbVJsYzNSeWIzazlablZ1WTNScGIyNG9LWHRNS0hSb2FYTXBmVHQyWVhJZ1ptRTlXMTA3Ymk1d2NtOW1hV3hsSmlZb2RDNW5aWFJVYjNSaGJFSjFabVpsY2xOcGVtVTlablZ1WTNScGIyNG9LWHQyWVhJZ1l6MHdPMDlpYW1WamRDNXJaWGx6S0dncExtWnZja1ZoWTJnb1puVnVZM1JwYjI0b1lTbDdZeXM5WEc1b1cyRmRMbk4wWVhSekxuTnBlbVY5S1R0eVpYUjFjbTRnWTMwcE8zSmxkSFZ5Ym50amNtVmhkR1U2Wm5WdVkzUnBiMjRvWVN4Q0xFZ3NabUVwZTJaMWJtTjBhVzl1SUhVb1lTbDdkbUZ5SUdnOU16VXdORFFzWWoxdWRXeHNMSEU5TUN4clBUQXNiVDB4TzBGeWNtRjVMbWx6UVhKeVlYa29ZU2w4ZkhJb1lTbDhmR01vWVNrL1lqMWhPbHdpYm5WdFltVnlYQ0k5UFQxMGVYQmxiMllnWVQ5eFBXRjhNRHBoSmlZb1hDSmtZWFJoWENKcGJpQmhKaVlvWWoxaExtUmhkR0VwTEZ3aWRYTmhaMlZjSW1sdUlHRW1KaWhvUFdkYllTNTFjMkZuWlYwcExGd2lkSGx3WlZ3aWFXNGdZU1ltS0dzOWVWdGhMblI1Y0dWZEtTeGNJbVJwYldWdWMybHZibHdpYVc0Z1lTWW1LRzA5WVM1a2FXMWxibk5wYjI1OE1Da3NYQ0pzWlc1bmRHaGNJbWx1SUdFbUppaHhQV0V1YkdWdVozUm9mREFwS1R0RUxtSnBibVFvS1R0aVAzQW9SQ3hpTEdnc2F5eHRMR1poS1Rvb1ppNWlkV1ptWlhKRVlYUmhLRVF1ZEhsd1pTeHhMR2dwTEVRdVpIUjVjR1U5YTN4OE5URXlNU3hFTG5WellXZGxQV2dzUkM1a2FXMWxibk5wYjI0OWJTeEVMbUo1ZEdWTVpXNW5kR2c5Y1NrN2JpNXdjbTltYVd4bEppWW9SQzV6ZEdGMGN5NXphWHBsUFVRdVlubDBaVXhsYm1kMGFDcEZXMFF1WkhSNWNHVmRLVHR5WlhSMWNtNGdkWDEwTG1KMVptWmxja052ZFc1MEt5czdkbUZ5SUVROVhHNXVaWGNnYlNoQ0tUdG9XMFF1YVdSZFBVUTdTSHg4ZFNoaEtUdDFMbDl5Wldkc1ZIbHdaVDFjSW1KMVptWmxjbHdpTzNVdVgySjFabVpsY2oxRU8zVXVjM1ZpWkdGMFlUMW1kVzVqZEdsdmJpaGhMR2dwZTNaaGNpQnRQU2hvZkh3d0tYd3dMSEU3UkM1aWFXNWtLQ2s3YVdZb1FYSnlZWGt1YVhOQmNuSmhlU2hoS1NsN2FXWW9NRHhoTG14bGJtZDBhQ2xwWmloY0ltNTFiV0psY2x3aVBUMDlkSGx3Wlc5bUlHRmJNRjBwZTNaaGNpQm5QV0l1WVd4c2IyTlVlWEJsS0VRdVpIUjVjR1VzWVM1c1pXNW5kR2dwTzJzb1p5eGhLVHRtTG1KMVptWmxjbE4xWWtSaGRHRW9SQzUwZVhCbExHMHNaeWs3WWk1bWNtVmxWSGx3WlNobktYMWxiSE5sSUdsbUtFRnljbUY1TG1selFYSnlZWGtvWVZzd1hTbDhmSElvWVZzd1hTa3BjVDFOS0dFcExHYzlSaWhoTEhFc1JDNWtkSGx3WlNrc1ppNWlkV1ptWlhKVGRXSkVZWFJoS0VRdWRIbHdaU3h0TEdjcExHSXVabkpsWlZSNWNHVW9aeWw5Wld4elpTQnBaaWh5S0dFcEtXWXVZblZtWm1WeVUzVmlSR0YwWVNoRUxuUjVjR1VzYlN4aEtUdGxiSE5sSUdsbUtHTW9ZU2twZTNFOVlTNXphR0Z3WlR0MllYSWdiajFoTG5OMGNtbGtaU3hDUFdjOU1DeDVQVEFzZEQwd096RTlQVDF4TG14bGJtZDBhRDhvWnoxeFd6QmRMRUk5TVN4NVBXNWJNRjBzZEQwd0tUb3lQVDA5Y1M1c1pXNW5kR2dtSmx4dUtHYzljVnN3WFN4Q1BYRmJNVjBzZVQxdVd6QmRMSFE5YmxzeFhTazdjVDFCY25KaGVTNXBjMEZ5Y21GNUtHRXVaR0YwWVNrL1JDNWtkSGx3WlRwc0tHRXVaR0YwWVNrN2NUMWlMbUZzYkc5alZIbHdaU2h4TEdjcVFpazdlQ2h4TEdFdVpHRjBZU3huTEVJc2VTeDBMR0V1YjJabWMyVjBLVHRtTG1KMVptWmxjbE4xWWtSaGRHRW9SQzUwZVhCbExHMHNjU2s3WWk1bWNtVmxWSGx3WlNoeEtYMXlaWFIxY200Z2RYMDdiaTV3Y205bWFXeGxKaVlvZFM1emRHRjBjejFFTG5OMFlYUnpLVHQxTG1SbGMzUnliM2s5Wm5WdVkzUnBiMjRvS1h0TUtFUXBmVHR5WlhSMWNtNGdkWDBzWTNKbFlYUmxVM1J5WldGdE9tWjFibU4wYVc5dUtHRXNZeWw3ZG1GeUlHZzlabUV1Y0c5d0tDazdhSHg4S0dnOWJtVjNJRzBvWVNrcE8yZ3VZbWx1WkNncE8zQW9hQ3hqTERNMU1EUXdMREFzTVN3aE1TazdjbVYwZFhKdUlHaDlMR1JsYzNSeWIzbFRkSEpsWVcwNlpuVnVZM1JwYjI0b1lTbDdabUV1Y0hWemFDaGhLWDBzWTJ4bFlYSTZablZ1WTNScGIyNG9LWHRoS0dncExtWnZja1ZoWTJnb1RDazdabUV1Wm05eVJXRmphQ2hNS1gwc1oyVjBRblZtWm1WeU9tWjFibU4wYVc5dUtHRXBlM0psZEhWeWJpQmhKaVpoTGw5aWRXWm1aWElnYVc1emRHRnVZMlZ2WmlCdFAyRXVYMkoxWm1abGNqcHVkV3hzZlN4eVpYTjBiM0psT21aMWJtTjBhVzl1S0NsN1lTaG9LUzVtYjNKRllXTm9LR1oxYm1OMGFXOXVLR0VwZTJFdVluVm1abVZ5UFZ4dVppNWpjbVZoZEdWQ2RXWm1aWElvS1R0bUxtSnBibVJDZFdabVpYSW9ZUzUwZVhCbExHRXVZblZtWm1WeUtUdG1MbUoxWm1abGNrUmhkR0VvWVM1MGVYQmxMR0V1Y0dWeWMybHpkR1Z1ZEVSaGRHRjhmR0V1WW5sMFpVeGxibWQwYUN4aExuVnpZV2RsS1gwcGZTeGZhVzVwZEVKMVptWmxjanB3ZlgxOUxIdGNJaTR2WTI5dWMzUmhiblJ6TDJGeWNtRjVkSGx3WlhNdWFuTnZibHdpT2pNc1hDSXVMMk52Ym5OMFlXNTBjeTlrZEhsd1pYTXVhbk52Ymx3aU9qUXNYQ0l1TDJOdmJuTjBZVzUwY3k5MWMyRm5aUzVxYzI5dVhDSTZOaXhjSWk0dmRYUnBiQzltYkdGMGRHVnVYQ0k2TWpNc1hDSXVMM1YwYVd3dmFYTXRibVJoY25KaGVWd2lPakkxTEZ3aUxpOTFkR2xzTDJsekxYUjVjR1ZrTFdGeWNtRjVYQ0k2TWpZc1hDSXVMM1YwYVd3dmNHOXZiRndpT2pJNExGd2lMaTkxZEdsc0wzWmhiSFZsYzF3aU9qTXhmVjBzTXpwYlpuVnVZM1JwYjI0b1ppeHdMSFVwZTNBdVpYaHdiM0owY3oxN1hDSmJiMkpxWldOMElFbHVkRGhCY25KaGVWMWNJam8xTVRJd0xGd2lXMjlpYW1WamRDQkpiblF4TmtGeWNtRjVYVndpT2pVeE1qSXNYQ0piYjJKcVpXTjBJRWx1ZERNeVFYSnlZWGxkWENJNk5URXlOQ3hjSWx0dlltcGxZM1FnVldsdWREaEJjbkpoZVYxY0lqbzFNVEl4TEZ3aVcyOWlhbVZqZENCVmFXNTBPRU5zWVcxd1pXUkJjbkpoZVYxY0lqbzFNVEl4TEZ3aVcyOWlhbVZqZENCVmFXNTBNVFpCY25KaGVWMWNJam8xTVRJekxGeHVYQ0piYjJKcVpXTjBJRlZwYm5Rek1rRnljbUY1WFZ3aU9qVXhNalVzWENKYmIySnFaV04wSUVac2IyRjBNekpCY25KaGVWMWNJam8xTVRJMkxGd2lXMjlpYW1WamRDQkdiRzloZERZMFFYSnlZWGxkWENJNk5URXlNU3hjSWx0dlltcGxZM1FnUVhKeVlYbENkV1ptWlhKZFhDSTZOVEV5TVgxOUxIdDlYU3cwT2x0bWRXNWpkR2x2YmlobUxIQXNkU2w3Y0M1bGVIQnZjblJ6UFh0cGJuUTRPalV4TWpBc2FXNTBNVFk2TlRFeU1peHBiblF6TWpvMU1USTBMSFZwYm5RNE9qVXhNakVzZFdsdWRERTJPalV4TWpNc2RXbHVkRE15T2pVeE1qVXNYQ0ptYkc5aGRGd2lPalV4TWpZc1pteHZZWFF6TWpvMU1USTJmWDBzZTMxZExEVTZXMloxYm1OMGFXOXVLR1lzY0N4MUtYdHdMbVY0Y0c5eWRITTllM0J2YVc1MGN6b3dMSEJ2YVc1ME9qQXNiR2x1WlhNNk1TeHNhVzVsT2pFc1hDSnNhVzVsSUd4dmIzQmNJam95TEZ3aWJHbHVaU0J6ZEhKcGNGd2lPak1zZEhKcFlXNW5iR1Z6T2pRc2RISnBZVzVuYkdVNk5DeGNJblJ5YVdGdVoyeGxJSE4wY21sd1hDSTZOU3hjSW5SeWFXRnVaMnhsSUdaaGJsd2lPalo5ZlN4N2ZWMHNOanBiWm5WdVkzUnBiMjRvWml4d0xIVXBlM0F1Wlhod2IzSjBjejE3WENKemRHRjBhV05jSWpvek5UQTBOQ3hrZVc1aGJXbGpPak0xTURRNExITjBjbVZoYlRvek5UQTBNSDE5TEh0OVhTdzNPbHRtZFc1amRHbHZiaWhtTEhBc2RTbDdablZ1WTNScGIyNGdiQ2hoS1h0eVpYUjFjbTRnUVhKeVlYa3VhWE5CY25KaGVTaGhLWHg4WEc1TktHRXBmSHgwS0dFcGZXWjFibU4wYVc5dUlHc29ZU2w3Y21WMGRYSnVJR0V1YzI5eWRDaG1kVzVqZEdsdmJpaGhMR01wZTNKbGRIVnlibHdpZG1sbGQzQnZjblJjSWowOVBXRS9MVEU2WENKMmFXVjNjRzl5ZEZ3aVBUMDlZejh4T21FOFl6OHRNVG94ZlNsOVpuVnVZM1JwYjI0Z2VDaGhMR01zWWl4cktYdDBhR2x6TG5Sb2FYTkVaWEE5WVR0MGFHbHpMbU52Ym5SbGVIUkVaWEE5WXp0MGFHbHpMbkJ5YjNCRVpYQTlZanQwYUdsekxtRndjR1Z1WkQxcmZXWjFibU4wYVc5dUlISW9ZU2w3Y21WMGRYSnVJR0VtSmlFb1lTNTBhR2x6UkdWd2ZIeGhMbU52Ym5SbGVIUkVaWEI4ZkdFdWNISnZjRVJsY0NsOVpuVnVZM1JwYjI0Z1l5aGhLWHR5WlhSMWNtNGdibVYzSUhnb0lURXNJVEVzSVRFc1lTbDlablZ1WTNScGIyNGdZU2hoTEdNcGUzWmhjaUJpUFdFdWRIbHdaVHR5WlhSMWNtNGdNRDA5UFdJL0tHSTlZUzVrWVhSaExteGxibWQwYUN4dVpYY2dlQ2doTUN3eFBEMWlMREk4UFdJc1l5a3BPalE5UFQxaVB5aGlQV0V1WkdGMFlTeHVaWGNnZUNoaUxuUm9hWE5FWlhBc1lpNWpiMjUwWlhoMFJHVndMR0l1Y0hKdmNFUmxjQ3hqS1NrNmJtVjNJSGdvTXowOVBXSXNNajA5UFdJc01UMDlQV0lzWXlsOWRtRnlJR0k5WmloY0lpNHZkWFJwYkM5amIyUmxaMlZ1WENJcExFWTlaaWhjSWk0dmRYUnBiQzlzYjI5d1hDSXBMRnh1VFQxbUtGd2lMaTkxZEdsc0wybHpMWFI1Y0dWa0xXRnljbUY1WENJcExIUTlaaWhjSWk0dmRYUnBiQzlwY3kxdVpHRnljbUY1WENJcExIazlaaWhjSWk0dmRYUnBiQzlwY3kxaGNuSmhlUzFzYVd0bFhDSXBMR2M5WmloY0lpNHZaSGx1WVcxcFkxd2lLU3hGUFdZb1hDSXVMMk52Ym5OMFlXNTBjeTl3Y21sdGFYUnBkbVZ6TG1wemIyNWNJaWtzUXoxbUtGd2lMaTlqYjI1emRHRnVkSE12WkhSNWNHVnpMbXB6YjI1Y0lpa3NUajFiWENKNFhDSXNYQ0o1WENJc1hDSjZYQ0lzWENKM1hDSmRMRzQ5WENKaWJHVnVaQzVtZFc1aklHSnNaVzVrTG1WeGRXRjBhVzl1SUhOMFpXNWphV3d1Wm5WdVl5QnpkR1Z1WTJsc0xtOXdSbkp2Ym5RZ2MzUmxibU5wYkM1dmNFSmhZMnNnYzJGdGNHeGxMbU52ZG1WeVlXZGxJSFpwWlhkd2IzSjBJSE5qYVhOemIzSXVZbTk0SUhCdmJIbG5iMjVQWm1aelpYUXViMlptYzJWMFhDSXVjM0JzYVhRb1hDSWdYQ0lwTEcwOWV6QTZNQ3d4T2pFc2VtVnliem93TEc5dVpUb3hMRndpYzNKaklHTnZiRzl5WENJNk56WTRMRndpYjI1bElHMXBiblZ6SUhOeVl5QmpiMnh2Y2x3aU9qYzJPU3hjSW5OeVl5QmhiSEJvWVZ3aU9qYzNNQ3hjSW05dVpTQnRhVzUxY3lCemNtTWdZV3h3YUdGY0lqbzNOekVzWENKa2MzUWdZMjlzYjNKY0lqbzNOelFzWENKdmJtVWdiV2x1ZFhNZ1pITjBJR052Ykc5eVhDSTZOemMxTEZ3aVpITjBJR0ZzY0doaFhDSTZOemN5TEZ3aWIyNWxJRzFwYm5WeklHUnpkQ0JoYkhCb1lWd2lPamMzTXl4Y2Jsd2lZMjl1YzNSaGJuUWdZMjlzYjNKY0lqb3pNamMyT1N4Y0ltOXVaU0J0YVc1MWN5QmpiMjV6ZEdGdWRDQmpiMnh2Y2x3aU9qTXlOemN3TEZ3aVkyOXVjM1JoYm5RZ1lXeHdhR0ZjSWpvek1qYzNNU3hjSW05dVpTQnRhVzUxY3lCamIyNXpkR0Z1ZENCaGJIQm9ZVndpT2pNeU56Y3lMRndpYzNKaklHRnNjR2hoSUhOaGRIVnlZWFJsWENJNk56YzJmU3hDUFh0dVpYWmxjam8xTVRJc2JHVnpjem8xTVRNc1hDSThYQ0k2TlRFekxHVnhkV0ZzT2pVeE5DeGNJajFjSWpvMU1UUXNYQ0k5UFZ3aU9qVXhOQ3hjSWowOVBWd2lPalV4TkN4c1pYRjFZV3c2TlRFMUxGd2lQRDFjSWpvMU1UVXNaM0psWVhSbGNqbzFNVFlzWENJK1hDSTZOVEUyTEc1dmRHVnhkV0ZzT2pVeE55eGNJaUU5WENJNk5URTNMRndpSVQwOVhDSTZOVEUzTEdkbGNYVmhiRG8xTVRnc1hDSStQVndpT2pVeE9DeGhiSGRoZVhNNk5URTVmU3haUFhzd09qQXNlbVZ5Ynpvd0xHdGxaWEE2TnpZNE1DeHlaWEJzWVdObE9qYzJPREVzYVc1amNtVnRaVzUwT2pjMk9ESXNaR1ZqY21WdFpXNTBPamMyT0RNc1hDSnBibU55WlcxbGJuUWdkM0poY0Z3aU9qTTBNRFUxTEZ3aVpHVmpjbVZ0Wlc1MElIZHlZWEJjSWpvek5EQTFOaXhwYm5abGNuUTZOVE00Tm4wc1REMTdZM2M2TWpNd05DeGpZM2M2TWpNd05YMHNTRDF1WlhjZ2VDZ2hNU3doTVN3aE1TeG1kVzVqZEdsdmJpZ3BlMzBwTzNBdVpYaHdiM0owY3oxbWRXNWpkR2x2Ymlob0xGeHVaaXgwTEhBc1RTeDFMRm9zUkN4TExFRmhMSFpoTEhFc1V5eHRZU3huWVNsN1puVnVZM1JwYjI0Z1Z5aGtLWHR5WlhSMWNtNGdaQzV5WlhCc1lXTmxLRndpTGx3aUxGd2lYMXdpS1gxbWRXNWpkR2x2YmlCU0tHUXNZU3hqS1h0MllYSWdZajFYS0dRcE8zY3VjSFZ6YUNoa0tUdDZXMkpkUFdWYllsMDlJU0ZqTzNkaFcySmRQV0Y5Wm5WdVkzUnBiMjRnUnloa0xHRXNZeWw3ZG1GeUlHSTlWeWhrS1R0M0xuQjFjMmdvWkNrN1FYSnlZWGt1YVhOQmNuSmhlU2hqS1Q4b1pWdGlYVDFqTG5Oc2FXTmxLQ2tzZWx0aVhUMWpMbk5zYVdObEtDa3BPbVZiWWwwOWVsdGlYVDFqTzNoaFcySmRQV0Y5Wm5WdVkzUnBiMjRnWW1Fb0tYdDJZWElnWkQxaUtDa3NZVDFrTG14cGJtc3NZejFrTG1kc2IySmhiRHRrTG1sa1BWSmhLeXM3WkM1aVlYUmphRWxrUFZ3aU1Gd2lPM1poY2lCb1BXRW9VV0VwTEVFOVpDNXphR0Z5WldROWUzQnliM0J6T2x3aVlUQmNJbjA3VDJKcVpXTjBMbXRsZVhNb1VXRXBMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9aQ2w3UVZ0a1hUMWpMbVJsWmlob0xGd2lMbHdpTEdRcGZTazdkbUZ5SUVvOVpDNXVaWGgwUFh0OUxGQTlaQzVqZFhKeVpXNTBQWHQ5TzA5aWFtVmpkQzVyWlhsektIaGhLUzVtYjNKRllXTm9LR1oxYm1OMGFXOXVLR1FwZTBGeWNtRjVMbWx6UVhKeVlYa29aVnRrWFNrbUppaEtXMlJkUFdNdVpHVm1LRUV1Ym1WNGRDeGNibHdpTGx3aUxHUXBMRkJiWkYwOVl5NWtaV1lvUVM1amRYSnlaVzUwTEZ3aUxsd2lMR1FwS1gwcE8zWmhjaUJUWVQxa0xtTnZibk4wWVc1MGN6MTdmVHRQWW1wbFkzUXVhMlY1Y3loTllTa3VabTl5UldGamFDaG1kVzVqZEdsdmJpaGtLWHRUWVZ0a1hUMWpMbVJsWmloS1UwOU9Mbk4wY21sdVoybG1lU2hOWVZ0a1hTa3BmU2s3WkM1cGJuWnZhMlU5Wm5WdVkzUnBiMjRvWlN4SktYdHpkMmwwWTJnb1NTNTBlWEJsS1h0allYTmxJREE2ZG1GeUlHTTlXMXdpZEdocGMxd2lMRUV1WTI5dWRHVjRkQ3hCTG5CeWIzQnpMR1F1WW1GMFkyaEpaRjA3Y21WMGRYSnVJR1V1WkdWbUtHRW9TUzVrWVhSaEtTeGNJaTVqWVd4c0tGd2lMR011YzJ4cFkyVW9NQ3hOWVhSb0xtMWhlQ2hKTG1SaGRHRXViR1Z1WjNSb0t6RXNOQ2twTEZ3aUtWd2lLVHRqWVhObElERTZjbVYwZFhKdUlHVXVaR1ZtS0VFdWNISnZjSE1zU1M1a1lYUmhLVHRqWVhObElESTZjbVYwZFhKdUlHVXVaR1ZtS0VFdVkyOXVkR1Y0ZEN4SkxtUmhkR0VwTzJOaGMyVWdNenB5WlhSMWNtNGdaUzVrWldZb1hDSjBhR2x6WENJc1NTNWtZWFJoS1R0allYTmxJRFE2Y21WMGRYSnVJRWt1WkdGMFlTNWhjSEJsYm1Rb1pDeGxLU3hKTG1SaGRHRXVjbVZtZlgwN1pDNWhkSFJ5YVdKRFlXTm9aVDE3ZlR0MllYSWdTVDE3ZlR0a0xuTmpiM0JsUVhSMGNtbGlQV1oxYm1OMGFXOXVLR1FwZTJROVhHNW1MbWxrS0dRcE8ybG1LR1FnYVc0Z1NTbHlaWFIxY200Z1NWdGtYVHQyWVhJZ1pUMUJZUzV6WTI5d1pWdGtYVHRsZkh3b1pUMUJZUzV6WTI5d1pWdGtYVDF1WlhjZ1FtRXBPM0psZEhWeWJpQkpXMlJkUFdFb1pTbDlPM0psZEhWeWJpQmtmV1oxYm1OMGFXOXVJRzVoS0dRcGUzWmhjaUJsUFdSYlhDSnpkR0YwYVdOY0lsMDdaRDFrTG1SNWJtRnRhV003ZG1GeUlHSTdhV1lvWENKd2NtOW1hV3hsWENKcGJpQmxLWHQyWVhJZ2FEMGhJV1V1Y0hKdlptbHNaVHRpUFdNb1puVnVZM1JwYjI0b1pDeGxLWHR5WlhSMWNtNGdhSDBwTzJJdVpXNWhZbXhsUFdoOVpXeHpaU0JwWmloY0luQnliMlpwYkdWY0ltbHVJR1FwZTNaaGNpQkJQV1F1Y0hKdlptbHNaVHRpUFdFb1FTeG1kVzVqZEdsdmJpaGtMR1VwZTNKbGRIVnliaUJrTG1sdWRtOXJaU2hsTEVFcGZTbDljbVYwZFhKdUlHSjlablZ1WTNScGIyNGdlV0VvWkN4bEtYdDJZWElnWWoxa1cxd2ljM1JoZEdsalhDSmRMR2c5WkM1a2VXNWhiV2xqTzJsbUtGd2labkpoYldWaWRXWm1aWEpjSW1sdUlHSXBlM1poY2lCQlBXSXVabkpoYldWaWRXWm1aWEk3Y21WMGRYSnVJRUUvS0VFOVJDNW5aWFJHY21GdFpXSjFabVpsY2loQktTeGpLR1oxYm1OMGFXOXVLR1FzWlNsN2RtRnlJR0U5WkM1c2FXNXJLRUVwTEhZOVpDNXphR0Z5WldRN1pTNXpaWFFvZGk1bWNtRnRaV0oxWm1abGNpeGNibHdpTG01bGVIUmNJaXhoS1R0MlBYWXVZMjl1ZEdWNGREdGxMbk5sZENoMkxGd2lMbVp5WVcxbFluVm1abVZ5VjJsa2RHaGNJaXhoSzF3aUxuZHBaSFJvWENJcE8yVXVjMlYwS0hZc1hDSXVabkpoYldWaWRXWm1aWEpJWldsbmFIUmNJaXhoSzF3aUxtaGxhV2RvZEZ3aUtUdHlaWFIxY200Z1lYMHBLVHBqS0daMWJtTjBhVzl1S0dRc1pTbDdkbUZ5SUdFOVpDNXphR0Z5WldRN1pTNXpaWFFvWVM1bWNtRnRaV0oxWm1abGNpeGNJaTV1WlhoMFhDSXNYQ0p1ZFd4c1hDSXBPMkU5WVM1amIyNTBaWGgwTzJVdWMyVjBLR0VzWENJdVpuSmhiV1ZpZFdabVpYSlhhV1IwYUZ3aUxHRXJYQ0l1WkhKaGQybHVaMEoxWm1abGNsZHBaSFJvWENJcE8yVXVjMlYwS0dFc1hDSXVabkpoYldWaWRXWm1aWEpJWldsbmFIUmNJaXhoSzF3aUxtUnlZWGRwYm1kQ2RXWm1aWEpJWldsbmFIUmNJaWs3Y21WMGRYSnVYQ0p1ZFd4c1hDSjlLWDFwWmloY0ltWnlZVzFsWW5WbVptVnlYQ0pwYmlCb0tYdDJZWElnU2oxb0xtWnlZVzFsWW5WbVptVnlPM0psZEhWeWJpQmhLRW9zWm5WdVkzUnBiMjRvWkN4bEtYdDJZWElnWVQxa0xtbHVkbTlyWlNobExFb3BMSFk5WkM1emFHRnlaV1FzWXoxMkxtWnlZVzFsWW5WbVptVnlMR0U5WlM1a1pXWW9ZeXhjSWk1blpYUkdjbUZ0WldKMVptWmxjaWhjSWl4aExGd2lLVndpS1R0bExuTmxkQ2hqTEZ3aUxtNWxlSFJjSWl4aEtUdDJQWFl1WTI5dWRHVjRkRHRsTG5ObGRDaDJMRnh1WENJdVpuSmhiV1ZpZFdabVpYSlhhV1IwYUZ3aUxHRXJYQ0kvWENJcllTdGNJaTUzYVdSMGFEcGNJaXQySzF3aUxtUnlZWGRwYm1kQ2RXWm1aWEpYYVdSMGFGd2lLVHRsTG5ObGRDaDJMRndpTG1aeVlXMWxZblZtWm1WeVNHVnBaMmgwWENJc1lTdGNJajljSWl0aEsxd2lMbWhsYVdkb2REcGNJaXQySzF3aUxtUnlZWGRwYm1kQ2RXWm1aWEpJWldsbmFIUmNJaWs3Y21WMGRYSnVJR0Y5S1gxeVpYUjFjbTRnYm5Wc2JIMW1kVzVqZEdsdmJpQlZLR1FzWlN4aktYdG1kVzVqZEdsdmJpQmlLR1FwZTJsbUtHUWdhVzRnYUNsN2RtRnlJRWs5YUZ0a1hUdGtQU0V3TzNaaGNpQmpQVWt1ZUh3d0xIRmhQVWt1ZVh3d0xGQXNZV0U3WENKM2FXUjBhRndpYVc0Z1NUOVFQVWt1ZDJsa2RHaDhNRHBrUFNFeE8xd2lhR1ZwWjJoMFhDSnBiaUJKUDJGaFBVa3VhR1ZwWjJoMGZEQTZaRDBoTVR0eVpYUjFjbTRnYm1WM0lIZ29JV1FtSm1VbUptVXVkR2hwYzBSbGNDd2haQ1ltWlNZbVpTNWpiMjUwWlhoMFJHVndMQ0ZrSmlabEppWmxMbkJ5YjNCRVpYQXNablZ1WTNScGIyNG9aQ3hsS1h0MllYSWdZVDFrTG5Ob1lYSmxaQzVqYjI1MFpYaDBMSFk5VUR0Y0luZHBaSFJvWENKcGJpQkpmSHdvZGoxbExtUmxaaWhoTEZ3aUxsd2lMRndpWm5KaGJXVmlkV1ptWlhKWGFXUjBhRndpTEZ3aUxWd2lMR01wS1R0MllYSWdZajFoWVR0Y0ltaGxhV2RvZEZ3aWFXNGdTWHg4S0dJOVpTNWtaV1lvWVN4Y2Jsd2lMbHdpTEZ3aVpuSmhiV1ZpZFdabVpYSklaV2xuYUhSY0lpeGNJaTFjSWl4eFlTa3BPM0psZEhWeWJsdGpMSEZoTEhZc1lsMTlLWDFwWmloa0lHbHVJRW9wZTNaaGNpQjNQVXBiWkYwN1pEMWhLSGNzWm5WdVkzUnBiMjRvWkN4bEtYdDJZWElnWVQxa0xtbHVkbTlyWlNobExIY3BMRWs5WkM1emFHRnlaV1F1WTI5dWRHVjRkQ3hqUFdVdVpHVm1LR0VzWENJdWVId3dYQ0lwTEhZOVpTNWtaV1lvWVN4Y0lpNTVmREJjSWlrc2NXRTlaUzVrWldZb0oxd2lkMmxrZEdoY0lpQnBiaUFuTEdFc1hDSS9YQ0lzWVN4Y0lpNTNhV1IwYUh3d09sd2lMRndpS0Z3aUxFa3NYQ0l1WENJc1hDSm1jbUZ0WldKMVptWmxjbGRwWkhSb1hDSXNYQ0l0WENJc1l5eGNJaWxjSWlrc1lUMWxMbVJsWmlnblhDSm9aV2xuYUhSY0lpQnBiaUFuTEdFc1hDSS9YQ0lzWVN4Y0lpNW9aV2xuYUhSOE1EcGNJaXhjSWloY0lpeEpMRndpTGx3aUxGd2labkpoYldWaWRXWm1aWEpJWldsbmFIUmNJaXhjSWkxY0lpeDJMRndpS1Z3aUtUdHlaWFIxY201Yll5eDJMSEZoTEdGZGZTazdaU1ltS0dRdWRHaHBjMFJsY0Qxa0xuUm9hWE5FWlhCOGZHVXVkR2hwYzBSbGNDeGtMbU52Ym5SbGVIUkVaWEE5WkM1amIyNTBaWGgwUkdWd2ZIeGxMbU52Ym5SbGVIUkVaWEFzWkM1d2NtOXdSR1Z3UFdRdWNISnZjRVJsY0h4OFpTNXdjbTl3UkdWd0tUdHlaWFIxY200Z1pIMXlaWFIxY200Z1pUOXVaWGNnZUNobExuUm9hWE5FWlhBc1pTNWpiMjUwWlhoMFJHVndMRnh1WlM1d2NtOXdSR1Z3TEdaMWJtTjBhVzl1S0dRc1pTbDdkbUZ5SUdFOVpDNXphR0Z5WldRdVkyOXVkR1Y0ZER0eVpYUjFjbTViTUN3d0xHVXVaR1ZtS0dFc1hDSXVYQ0lzWENKbWNtRnRaV0oxWm1abGNsZHBaSFJvWENJcExHVXVaR1ZtS0dFc1hDSXVYQ0lzWENKbWNtRnRaV0oxWm1abGNraGxhV2RvZEZ3aUtWMTlLVHB1ZFd4c2ZYWmhjaUJvUFdSYlhDSnpkR0YwYVdOY0lsMHNTajFrTG1SNWJtRnRhV003YVdZb1pEMWlLRndpZG1sbGQzQnZjblJjSWlrcGUzWmhjaUJRUFdRN1pEMXVaWGNnZUNoa0xuUm9hWE5FWlhBc1pDNWpiMjUwWlhoMFJHVndMR1F1Y0hKdmNFUmxjQ3htZFc1amRHbHZiaWhrTEdVcGUzWmhjaUJoUFZBdVlYQndaVzVrS0dRc1pTa3NZejFrTG5Ob1lYSmxaQzVqYjI1MFpYaDBPMlV1YzJWMEtHTXNYQ0l1ZG1sbGQzQnZjblJYYVdSMGFGd2lMR0ZiTWwwcE8yVXVjMlYwS0dNc1hDSXVkbWxsZDNCdmNuUklaV2xuYUhSY0lpeGhXek5kS1R0eVpYUjFjbTRnWVgwcGZYSmxkSFZ5Ym50MmFXVjNjRzl5ZERwa0xITmphWE56YjNKZlltOTRPbUlvWENKelkybHpjMjl5TG1KdmVGd2lLWDE5Wm5WdVkzUnBiMjRnYVdFb1pDbDdablZ1WTNScGIyNGdaU2hrS1h0cFppaGtJR2x1SUdJcGUzWmhjaUJKUFdZdWFXUW9ZbHRrWFNrN1pEMWpLR1oxYm1OMGFXOXVLQ2w3Y21WMGRYSnVJRWw5S1R0a0xtbGtQVWs3Y21WMGRYSnVJR1I5YVdZb1pDQnBibHh1YUNsN2RtRnlJSFk5YUZ0a1hUdHlaWFIxY200Z1lTaDJMR1oxYm1OMGFXOXVLR1FzWlNsN2RtRnlJR0U5WkM1cGJuWnZhMlVvWlN4MktUdHlaWFIxY200Z1pTNWtaV1lvWkM1emFHRnlaV1F1YzNSeWFXNW5jeXhjSWk1cFpDaGNJaXhoTEZ3aUtWd2lLWDBwZlhKbGRIVnliaUJ1ZFd4c2ZYWmhjaUJpUFdSYlhDSnpkR0YwYVdOY0lsMHNhRDFrTG1SNWJtRnRhV01zUVQxbEtGd2labkpoWjF3aUtTeEtQV1VvWENKMlpYSjBYQ0lwTEZBOWJuVnNiRHR5S0VFcEppWnlLRW9wUHloUVBYWmhMbkJ5YjJkeVlXMG9TaTVwWkN4QkxtbGtLU3hrUFdNb1puVnVZM1JwYjI0b1pDeGxLWHR5WlhSMWNtNGdaQzVzYVc1cktGQXBmU2twT21ROWJtVjNJSGdvUVNZbVFTNTBhR2x6UkdWd2ZIeEtKaVpLTG5Sb2FYTkVaWEFzUVNZbVFTNWpiMjUwWlhoMFJHVndmSHhLSmlaS0xtTnZiblJsZUhSRVpYQXNRU1ltUVM1d2NtOXdSR1Z3Zkh4S0ppWktMbkJ5YjNCRVpYQXNablZ1WTNScGIyNG9aQ3hsS1h0MllYSWdZVDFrTG5Ob1lYSmxaQzV6YUdGa1pYSXNZenRqUFVFL1FTNWhjSEJsYm1Rb1pDeGxLVHBsTG1SbFppaGhMRndpTGx3aUxGd2labkpoWjF3aUtUdDJZWElnZGp0MlBVby9TaTVoY0hCbGJtUW9aQ3hsS1RwbExtUmxaaWhoTEZ3aUxsd2lMRndpZG1WeWRGd2lLVHR5WlhSMWNtNGdaUzVrWldZb1lTdGNJaTV3Y205bmNtRnRLRndpSzNZclhDSXNYQ0lyWXl0Y2Jsd2lLVndpS1gwcE8zSmxkSFZ5Ym50bWNtRm5Pa0VzZG1WeWREcEtMSEJ5YjJkV1lYSTZaQ3h3Y205bmNtRnRPbEI5ZldaMWJtTjBhVzl1SUd0aEtHUXNaU2w3Wm5WdVkzUnBiMjRnWWloa0xHVXBlMmxtS0dRZ2FXNGdhQ2w3ZG1GeUlIWTlhRnRrWFh3d08zSmxkSFZ5YmlCaktHWjFibU4wYVc5dUtHUXNZU2w3WlNZbUtHUXVUMFpHVTBWVVBYWXBPM0psZEhWeWJpQjJmU2w5YVdZb1pDQnBiaUJCS1h0MllYSWdjV0U5UVZ0a1hUdHlaWFIxY200Z1lTaHhZU3htZFc1amRHbHZiaWhrTEdFcGUzWmhjaUJqUFdRdWFXNTJiMnRsS0dFc2NXRXBPMlVtSmloa0xrOUdSbE5GVkQxaktUdHlaWFIxY200Z1kzMHBmWEpsZEhWeWJpQmxKaVpLUDJNb1puVnVZM1JwYjI0b1pDeGxLWHRrTGs5R1JsTkZWRDFjSWpCY0lqdHlaWFIxY200Z01IMHBPbTUxYkd4OWRtRnlJR2c5WkZ0Y0luTjBZWFJwWTF3aVhTeEJQV1F1WkhsdVlXMXBZeXhLUFdaMWJtTjBhVzl1S0NsN2FXWW9YQ0psYkdWdFpXNTBjMXdpYVc0Z2FDbDdkbUZ5SUdROWFDNWxiR1Z0Wlc1MGN6dHNLR1FwUDJROWRTNW5aWFJGYkdWdFpXNTBjeWgxTG1OeVpXRjBaU2hrTENFd0tTazZaQ1ltS0dROWRTNW5aWFJGYkdWdFpXNTBjeWhrS1NrN2RtRnlJR1U5WXlobWRXNWpkR2x2YmlobExHRXBlMmxtS0dRcGUzWmhjaUJqUFdVdWJHbHVheWhrS1R0eVpYUjFjbTRnWlM1RlRFVk5SVTVVVXoxY2JtTjljbVYwZFhKdUlHVXVSVXhGVFVWT1ZGTTliblZzYkgwcE8yVXVkbUZzZFdVOVpEdHlaWFIxY200Z1pYMXBaaWhjSW1Wc1pXMWxiblJ6WENKcGJpQkJLWHQyWVhJZ2RqMUJMbVZzWlcxbGJuUnpPM0psZEhWeWJpQmhLSFlzWm5WdVkzUnBiMjRvWkN4bEtYdDJZWElnWVQxa0xuTm9ZWEpsWkN4alBXRXVhWE5DZFdabVpYSkJjbWR6TEdFOVlTNWxiR1Z0Wlc1MGN5eEpQV1F1YVc1MmIydGxLR1VzZGlrc1lqMWxMbVJsWmloY0ltNTFiR3hjSWlrc1l6MWxMbVJsWmloakxGd2lLRndpTEVrc1hDSXBYQ0lwTEVrOVpDNWpiMjVrS0dNcExuUm9aVzRvWWl4Y0lqMWNJaXhoTEZ3aUxtTnlaV0YwWlZOMGNtVmhiU2hjSWl4SkxGd2lLVHRjSWlsYlhDSmxiSE5sWENKZEtHSXNYQ0k5WENJc1lTeGNJaTVuWlhSRmJHVnRaVzUwY3loY0lpeEpMRndpS1R0Y0lpazdaUzVsYm5SeWVTaEpLVHRsTG1WNGFYUW9aQzVqYjI1a0tHTXBMblJvWlc0b1lTeGNJaTVrWlhOMGNtOTVVM1J5WldGdEtGd2lMR0lzWENJcE8xd2lLU2s3Y21WMGRYSnVJR1F1UlV4RlRVVk9WRk05WW4wcGZYSmxkSFZ5YmlCdWRXeHNmU2dwTEZBOVlpaGNJbTltWm5ObGRGd2lMQ0V3S1R0eVpYUjFjbTU3Wld4bGJXVnVkSE02U2l4d2NtbHRhWFJwZG1VNlpuVnVZM1JwYjI0b0tYdHBaaWhjSW5CeWFXMXBkR2wyWlZ3aWFXNGdhQ2w3ZG1GeUlHUTlhQzV3Y21sdGFYUnBkbVU3Y21WMGRYSnVJR01vWm5WdVkzUnBiMjRvWlN4Y2JtRXBlM0psZEhWeWJpQkZXMlJkZlNsOWFXWW9YQ0p3Y21sdGFYUnBkbVZjSW1sdUlFRXBlM1poY2lCbFBVRXVjSEpwYldsMGFYWmxPM0psZEhWeWJpQmhLR1VzWm5WdVkzUnBiMjRvWkN4aEtYdDJZWElnWXoxa0xtTnZibk4wWVc1MGN5NXdjbWx0Vkhsd1pYTXNkajFrTG1sdWRtOXJaU2hoTEdVcE8zSmxkSFZ5YmlCaExtUmxaaWhqTEZ3aVcxd2lMSFlzWENKZFhDSXBmU2w5Y21WMGRYSnVJRW8vY2loS0tUOUtMblpoYkhWbFAyTW9ablZ1WTNScGIyNG9aQ3hsS1h0eVpYUjFjbTRnWlM1a1pXWW9aQzVGVEVWTlJVNVVVeXhjSWk1d2NtbHRWSGx3WlZ3aUtYMHBPbU1vWm5WdVkzUnBiMjRvS1h0eVpYUjFjbTRnTkgwcE9tNWxkeUI0S0VvdWRHaHBjMFJsY0N4S0xtTnZiblJsZUhSRVpYQXNTaTV3Y205d1JHVndMR1oxYm1OMGFXOXVLR1FzWlNsN2RtRnlJR0U5WkM1RlRFVk5SVTVVVXp0eVpYUjFjbTRnWlM1a1pXWW9ZU3hjSWo5Y0lpeGhMRndpTG5CeWFXMVVlWEJsT2x3aUxEUXBmU2s2Ym5Wc2JIMG9LU3hqYjNWdWREcG1kVzVqZEdsdmJpZ3BlMmxtS0Z3aVkyOTFiblJjSW1sdUlHZ3BlM1poY2lCa1BXZ3VZMjkxYm5SOE1EdHlaWFIxY200Z1l5aG1kVzVqZEdsdmJpZ3BlM0psZEhWeWJpQmtmU2w5YVdZb1hDSmpiM1Z1ZEZ3aWFXNGdRU2w3ZG1GeUlHVTlRUzVqYjNWdWREdHlaWFIxY200Z1lTaGxMR1oxYm1OMGFXOXVLR1FzWEc1aEtYdHlaWFIxY200Z1pDNXBiblp2YTJVb1lTeGxLWDBwZlhKbGRIVnliaUJLUDNJb1Npay9TajlRUDI1bGR5QjRLRkF1ZEdocGMwUmxjQ3hRTG1OdmJuUmxlSFJFWlhBc1VDNXdjbTl3UkdWd0xHWjFibU4wYVc5dUtHUXNaU2w3Y21WMGRYSnVJR1V1WkdWbUtHUXVSVXhGVFVWT1ZGTXNYQ0l1ZG1WeWRFTnZkVzUwTFZ3aUxHUXVUMFpHVTBWVUtYMHBPbU1vWm5WdVkzUnBiMjRvWkN4bEtYdHlaWFIxY200Z1pTNWtaV1lvWkM1RlRFVk5SVTVVVXl4Y0lpNTJaWEowUTI5MWJuUmNJaWw5S1RwaktHWjFibU4wYVc5dUtDbDdjbVYwZFhKdUxURjlLVHB1WlhjZ2VDaEtMblJvYVhORVpYQjhmRkF1ZEdocGMwUmxjQ3hLTG1OdmJuUmxlSFJFWlhCOGZGQXVZMjl1ZEdWNGRFUmxjQ3hLTG5CeWIzQkVaWEI4ZkZBdWNISnZjRVJsY0N4bWRXNWpkR2x2Ymloa0xHVXBlM1poY2lCaFBXUXVSVXhGVFVWT1ZGTTdjbVYwZFhKdUlHUXVUMFpHVTBWVVAyVXVaR1ZtS0dFc1hDSS9YQ0lzWVN4Y0lpNTJaWEowUTI5MWJuUXRYQ0lzWkM1UFJrWlRSVlFzWENJNkxURmNJaWs2WlM1a1pXWW9ZU3hjSWo5Y0lpeGhMRndpTG5abGNuUkRiM1Z1ZERvdE1Wd2lLWDBwT201MWJHeDlLQ2tzYVc1emRHRnVZMlZ6T21Jb1hDSnBibk4wWVc1alpYTmNJaXdoTVNrc2IyWm1jMlYwT2xCOWZXWjFibU4wYVc5dUlISmhLR1FzWlNsN2RtRnlJR0k5WkZ0Y0luTjBZWFJwWTF3aVhTeGNibWc5WkM1a2VXNWhiV2xqTEVFOWUzMDdkeTVtYjNKRllXTm9LR1oxYm1OMGFXOXVLR1FwZTJaMWJtTjBhVzl1SUdVb1NTeDNLWHRwWmloa0lHbHVJR0lwZTNaaGNpQnhZVDFKS0dKYlpGMHBPMEZiZGwwOVl5aG1kVzVqZEdsdmJpZ3BlM0psZEhWeWJpQnhZWDBwZldWc2MyVWdhV1lvWkNCcGJpQm9LWHQyWVhJZ1VEMW9XMlJkTzBGYmRsMDlZU2hRTEdaMWJtTjBhVzl1S0dRc1pTbDdjbVYwZFhKdUlIY29aQ3hsTEdRdWFXNTJiMnRsS0dVc1VDa3BmU2w5ZlhaaGNpQjJQVmNvWkNrN2MzZHBkR05vS0dRcGUyTmhjMlVnWENKamRXeHNMbVZ1WVdKc1pWd2lPbU5oYzJVZ1hDSmliR1Z1WkM1bGJtRmliR1ZjSWpwallYTmxJRndpWkdsMGFHVnlYQ0k2WTJGelpTQmNJbk4wWlc1amFXd3VaVzVoWW14bFhDSTZZMkZ6WlNCY0ltUmxjSFJvTG1WdVlXSnNaVndpT21OaGMyVWdYQ0p6WTJsemMyOXlMbVZ1WVdKc1pWd2lPbU5oYzJVZ1hDSndiMng1WjI5dVQyWm1jMlYwTG1WdVlXSnNaVndpT21OaGMyVWdYQ0p6WVcxd2JHVXVZV3h3YUdGY0lqcGpZWE5sSUZ3aWMyRnRjR3hsTG1WdVlXSnNaVndpT21OaGMyVWdYQ0prWlhCMGFDNXRZWE5yWENJNmNtVjBkWEp1SUdVb1puVnVZM1JwYjI0b1pDbDdjbVYwZFhKdUlHUjlMR1oxYm1OMGFXOXVLR1FzWlN4aEtYdHlaWFIxY200Z1lYMHBPMk5oYzJVZ1hDSmtaWEIwYUM1bWRXNWpYQ0k2Y21WMGRYSnVJR1VvWm5WdVkzUnBiMjRvWkNsN2NtVjBkWEp1SUVKYlpGMTlMRnh1Wm5WdVkzUnBiMjRvWkN4bExHRXBlM0psZEhWeWJpQmxMbVJsWmloa0xtTnZibk4wWVc1MGN5NWpiMjF3WVhKbFJuVnVZM01zWENKYlhDSXNZU3hjSWwxY0lpbDlLVHRqWVhObElGd2laR1Z3ZEdndWNtRnVaMlZjSWpweVpYUjFjbTRnWlNobWRXNWpkR2x2Ymloa0tYdHlaWFIxY200Z1pIMHNablZ1WTNScGIyNG9aQ3hsTEdFcGUyUTlaUzVrWldZb1hDSXJYQ0lzWVN4Y0lsc3dYVndpS1R0bFBXVXVaR1ZtS0Z3aUsxd2lMR0VzWENKYk1WMWNJaWs3Y21WMGRYSnVXMlFzWlYxOUtUdGpZWE5sSUZ3aVlteGxibVF1Wm5WdVkxd2lPbkpsZEhWeWJpQmxLR1oxYm1OMGFXOXVLR1FwZTNKbGRIVnlibHR0VzF3aWMzSmpVa2RDWENKcGJpQmtQMlF1YzNKalVrZENPbVF1YzNKalhTeHRXMXdpWkhOMFVrZENYQ0pwYmlCa1AyUXVaSE4wVWtkQ09tUXVaSE4wWFN4dFcxd2ljM0pqUVd4d2FHRmNJbWx1SUdRL1pDNXpjbU5CYkhCb1lUcGtMbk55WTEwc2JWdGNJbVJ6ZEVGc2NHaGhYQ0pwYmlCa1AyUXVaSE4wUVd4d2FHRTZaQzVrYzNSZFhYMHNablZ1WTNScGIyNG9aQ3hsTEdFcGUyWjFibU4wYVc5dUlHTW9aQ3gyS1h0eVpYUjFjbTRnWlM1a1pXWW9KMXdpSnl4a0xIWXNKMXdpSUdsdUlDY3NZU3hjSWo5Y0lpeGhMRndpTGx3aUxHUXNkaXhjSWpwY0lpeGhMRndpTGx3aUxHUXBmV1E5WkM1amIyNXpkR0Z1ZEhNdVlteGxibVJHZFc1amN6dDJZWElnZGoxaktGd2ljM0pqWENJc1hDSlNSMEpjSWlrc1hHNWlQV01vWENKa2MzUmNJaXhjSWxKSFFsd2lLU3gyUFdVdVpHVm1LR1FzWENKYlhDSXNkaXhjSWwxY0lpa3NhRDFsTG1SbFppaGtMRndpVzF3aUxHTW9YQ0p6Y21OY0lpeGNJa0ZzY0doaFhDSXBMRndpWFZ3aUtTeGlQV1V1WkdWbUtHUXNYQ0piWENJc1lpeGNJbDFjSWlrN1pEMWxMbVJsWmloa0xGd2lXMXdpTEdNb1hDSmtjM1JjSWl4Y0lrRnNjR2hoWENJcExGd2lYVndpS1R0eVpYUjFjbTViZGl4aUxHZ3NaRjE5S1R0allYTmxJRndpWW14bGJtUXVaWEYxWVhScGIyNWNJanB5WlhSMWNtNGdaU2htZFc1amRHbHZiaWhrS1h0cFppaGNJbk4wY21sdVoxd2lQVDA5ZEhsd1pXOW1JR1FwY21WMGRYSnVXMk5oVzJSZExHTmhXMlJkWFR0cFppaGNJbTlpYW1WamRGd2lQVDA5ZEhsd1pXOW1JR1FwY21WMGRYSnVXMk5oVzJRdWNtZGlYU3hqWVZ0a0xtRnNjR2hoWFYxOUxHWjFibU4wYVc5dUtHUXNaU3hoS1h0MllYSWdZejFrTG1OdmJuTjBZVzUwY3k1aWJHVnVaRVZ4ZFdGMGFXOXVjeXgyUFdVdVpHVm1LQ2tzWWoxbExtUmxaaWdwTzJROVpDNWpiMjVrS0Z3aWRIbHdaVzltSUZ3aUxHRXNKejA5UFZ3aWMzUnlhVzVuWENJbktUdGtMblJvWlc0b2RpeGNJajFjSWl4aUxGd2lQVndpTEdNc1hDSmJYQ0lzWVN4Y0lsMDdYQ0lwTzJSYlhDSmxiSE5sWENKZEtIWXNYQ0k5WENJc1l5eGNJbHRjSWl4aExGd2lMbkpuWWwwN1hDSXNZaXhjSWoxY0lpeGpMRndpVzF3aUxHRXNYQ0l1WVd4d2FHRmRPMXdpS1R0bEtHUXBPM0psZEhWeWJsdDJMR0pkZlNrN1hHNWpZWE5sSUZ3aVlteGxibVF1WTI5c2IzSmNJanB5WlhSMWNtNGdaU2htZFc1amRHbHZiaWhrS1h0eVpYUjFjbTRnUmlnMExHWjFibU4wYVc5dUtHVXBlM0psZEhWeWJpdGtXMlZkZlNsOUxHWjFibU4wYVc5dUtHUXNaU3hoS1h0eVpYUjFjbTRnUmlnMExHWjFibU4wYVc5dUtHUXBlM0psZEhWeWJpQmxMbVJsWmloY0lpdGNJaXhoTEZ3aVcxd2lMR1FzWENKZFhDSXBmU2w5S1R0allYTmxJRndpYzNSbGJtTnBiQzV0WVhOclhDSTZjbVYwZFhKdUlHVW9ablZ1WTNScGIyNG9aQ2w3Y21WMGRYSnVJR1I4TUgwc1puVnVZM1JwYjI0b1pDeGxMR0VwZTNKbGRIVnliaUJsTG1SbFppaGhMRndpZkRCY0lpbDlLVHRqWVhObElGd2ljM1JsYm1OcGJDNW1kVzVqWENJNmNtVjBkWEp1SUdVb1puVnVZM1JwYjI0b1pDbDdjbVYwZFhKdVcwSmJaQzVqYlhCOGZGd2lhMlZsY0Z3aVhTeGtMbkpsWm54OE1DeGNJbTFoYzJ0Y0ltbHVJR1EvWkM1dFlYTnJPaTB4WFgwc1puVnVZM1JwYjI0b1pDeGxMR0VwZTJROVpTNWtaV1lvSjF3aVkyMXdYQ0lnYVc0Z0p5eGhMRndpUDF3aUxHUXVZMjl1YzNSaGJuUnpMbU52YlhCaGNtVkdkVzVqY3l4Y0lsdGNJaXhoTEZ3aUxtTnRjRjFjSWl4Y0lqcGNJaXczTmpnd0tUdDJZWElnWXoxbExtUmxaaWhoTEZ3aUxuSmxabnd3WENJcE8yVTlaUzVrWldZb0oxd2liV0Z6YTF3aUlHbHVJQ2NzWVN4Y0lqOWNJaXhoTEZ3aUxtMWhjMnQ4TURvdE1Wd2lLVHR5WlhSMWNtNWJaQ3hjYm1Nc1pWMTlLVHRqWVhObElGd2ljM1JsYm1OcGJDNXZjRVp5YjI1MFhDSTZZMkZ6WlNCY0luTjBaVzVqYVd3dWIzQkNZV05yWENJNmNtVjBkWEp1SUdVb1puVnVZM1JwYjI0b1pTbDdjbVYwZFhKdVcxd2ljM1JsYm1OcGJDNXZjRUpoWTJ0Y0lqMDlQV1EvTVRBeU9Ub3hNREk0TEZsYlpTNW1ZV2xzZkh4Y0ltdGxaWEJjSWwwc1dWdGxMbnBtWVdsc2ZIeGNJbXRsWlhCY0lsMHNXVnRsTG5wd1lYTnpmSHhjSW10bFpYQmNJbDFkZlN4bWRXNWpkR2x2YmlobExHRXNZeWw3Wm5WdVkzUnBiMjRnZGloa0tYdHlaWFIxY200Z1lTNWtaV1lvSjF3aUp5eGtMQ2RjSWlCcGJpQW5MR01zWENJL1hDSXNZaXhjSWx0Y0lpeGpMRndpTGx3aUxHUXNYQ0pkT2x3aUxEYzJPREFwZlhaaGNpQmlQV1V1WTI5dWMzUmhiblJ6TG5OMFpXNWphV3hQY0hNN2NtVjBkWEp1VzF3aWMzUmxibU5wYkM1dmNFSmhZMnRjSWowOVBXUS9NVEF5T1RveE1ESTRMSFlvWENKbVlXbHNYQ0lwTEhZb1hDSjZabUZwYkZ3aUtTeDJLRndpZW5CaGMzTmNJaWxkZlNrN1kyRnpaU0JjSW5CdmJIbG5iMjVQWm1aelpYUXViMlptYzJWMFhDSTZjbVYwZFhKdUlHVW9ablZ1WTNScGIyNG9aQ2w3Y21WMGRYSnVXMlF1Wm1GamRHOXlmREFzWkM1MWJtbDBjM3d3WFgwc1puVnVZM1JwYjI0b1pDeGxMR0VwZTJROVpTNWtaV1lvWVN4Y0lpNW1ZV04wYjNKOE1Gd2lLVHRsUFdVdVpHVm1LR0VzWENJdWRXNXBkSE44TUZ3aUtUdHlaWFIxY201YlpDeGNibVZkZlNrN1kyRnpaU0JjSW1OMWJHd3VabUZqWlZ3aU9uSmxkSFZ5YmlCbEtHWjFibU4wYVc5dUtHUXBlM1poY2lCbFBUQTdYQ0ptY205dWRGd2lQVDA5WkQ5bFBURXdNamc2WENKaVlXTnJYQ0k5UFQxa0ppWW9aVDB4TURJNUtUdHlaWFIxY200Z1pYMHNablZ1WTNScGIyNG9aQ3hsTEdFcGUzSmxkSFZ5YmlCbExtUmxaaWhoTENjOVBUMWNJbVp5YjI1MFhDSS9KeXd4TURJNExGd2lPbHdpTERFd01qa3BmU2s3WTJGelpTQmNJbXhwYm1WWGFXUjBhRndpT25KbGRIVnliaUJsS0daMWJtTjBhVzl1S0dRcGUzSmxkSFZ5YmlCa2ZTeG1kVzVqZEdsdmJpaGtMR1VzWVNsN2NtVjBkWEp1SUdGOUtUdGpZWE5sSUZ3aVpuSnZiblJHWVdObFhDSTZjbVYwZFhKdUlHVW9ablZ1WTNScGIyNG9aQ2w3Y21WMGRYSnVJRXhiWkYxOUxHWjFibU4wYVc5dUtHUXNaU3hoS1h0eVpYUjFjbTRnWlM1a1pXWW9ZU3NuUFQwOVhDSmpkMXdpUHpJek1EUTZNak13TlNjcGZTazdZMkZ6WlNCY0ltTnZiRzl5VFdGemExd2lPbkpsZEhWeWJpQmxLR1oxYm1OMGFXOXVLR1FwZTNKbGRIVnliaUJrTG0xaGNDaG1kVzVqZEdsdmJpaGtLWHR5WlhSMWNtNGhJV1I5S1gwc1puVnVZM1JwYjI0b1pDeGxMR0VwZTNKbGRIVnliaUJHS0RRc1puVnVZM1JwYjI0b1pDbDdjbVYwZFhKdVhDSWhJVndpSzJFclhDSmJYQ0lyWkN0Y0lsMWNJbjBwZlNrN1kyRnpaU0JjSW5OaGJYQnNaUzVqYjNabGNtRm5aVndpT25KbGRIVnliaUJsS0daMWJtTjBhVzl1S0dRcGUzSmxkSFZ5Ymx0Y0luWmhiSFZsWENKcGJseHVaRDlrTG5aaGJIVmxPakVzSVNGa0xtbHVkbVZ5ZEYxOUxHWjFibU4wYVc5dUtHUXNaU3hoS1h0a1BXVXVaR1ZtS0NkY0luWmhiSFZsWENJZ2FXNGdKeXhoTEZ3aVB5dGNJaXhoTEZ3aUxuWmhiSFZsT2pGY0lpazdaVDFsTG1SbFppaGNJaUVoWENJc1lTeGNJaTVwYm5abGNuUmNJaWs3Y21WMGRYSnVXMlFzWlYxOUtYMTlLVHR5WlhSMWNtNGdRWDFtZFc1amRHbHZiaUJ6WVNoa0xHVXBlM1poY2lCaVBXUmJYQ0p6ZEdGMGFXTmNJbDBzYUQxa0xtUjVibUZ0YVdNc1FUMTdmVHRQWW1wbFkzUXVhMlY1Y3loaUtTNW1iM0pGWVdOb0tHWjFibU4wYVc5dUtHUXBlM1poY2lCbFBXSmJaRjBzWVR0cFppaGNJbTUxYldKbGNsd2lQVDA5ZEhsd1pXOW1JR1Y4ZkZ3aVltOXZiR1ZoYmx3aVBUMDlkSGx3Wlc5bUlHVXBZVDFqS0daMWJtTjBhVzl1S0NsN2NtVjBkWEp1SUdWOUtUdGxiSE5sSUdsbUtGd2lablZ1WTNScGIyNWNJajA5UFhSNWNHVnZaaUJsS1h0MllYSWdkajFsTGw5eVpXZHNWSGx3WlR0cFppaGNJblJsZUhSMWNtVXlaRndpUFQwOWRueDhYQ0owWlhoMGRYSmxRM1ZpWlZ3aVBUMDlkaWxoUFdNb1puVnVZM1JwYjI0b1pDbDdjbVYwZFhKdUlHUXViR2x1YXlobEtYMHBPMlZzYzJVZ2FXWW9YQ0ptY21GdFpXSjFabVpsY2x3aVBUMDlkbng4WENKbWNtRnRaV0oxWm1abGNrTjFZbVZjSWowOVBYWXBZVDFqS0daMWJtTjBhVzl1S0dRcGUzSmxkSFZ5YmlCa0xteHBibXNvWlM1amIyeHZjbHN3WFNsOUtYMWxiSE5sSUhrb1pTa21KbHh1S0dFOVl5aG1kVzVqZEdsdmJpaGtLWHR5WlhSMWNtNGdaQzVuYkc5aVlXd3VaR1ZtS0Z3aVcxd2lMRVlvWlM1c1pXNW5kR2dzWm5WdVkzUnBiMjRvWkNsN2NtVjBkWEp1SUdWYlpGMTlLU3hjSWwxY0lpbDlLU2s3WVM1MllXeDFaVDFsTzBGYlpGMDlZWDBwTzA5aWFtVmpkQzVyWlhsektHZ3BMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9aQ2w3ZG1GeUlHVTlhRnRrWFR0QlcyUmRQV0VvWlN4bWRXNWpkR2x2Ymloa0xHRXBlM0psZEhWeWJpQmtMbWx1ZG05clpTaGhMR1VwZlNsOUtUdHlaWFIxY200Z1FYMW1kVzVqZEdsdmJpQmtZU2hrTEdVcGUzWmhjaUJpUFdSYlhDSnpkR0YwYVdOY0lsMHNhRDFrTG1SNWJtRnRhV01zUVQxN2ZUdFBZbXBsWTNRdWEyVjVjeWhpS1M1bWIzSkZZV05vS0daMWJtTjBhVzl1S0dRcGUzWmhjaUJsUFdKYlpGMHNZVDFtTG1sa0tHUXBMSFk5Ym1WM0lFSmhPMmxtS0d3b1pTa3BkaTV6ZEdGMFpUMHhMSFl1WW5WbVptVnlQVTB1WjJWMFFuVm1abVZ5S0UwdVkzSmxZWFJsS0dVc016UTVOaklzSVRFc0lUQXBLU3gyTG5SNWNHVTlNRHRsYkhObGUzWmhjaUJvUFUwdVoyVjBRblZtWm1WeUtHVXBPMmxtS0dncGRpNXpkR0YwWlQweExIWXVZblZtWm1WeVBXZ3NkaTUwZVhCbFBUQTdaV3h6WlNCcFppaGxMbU52Ym5OMFlXNTBLWHQyWVhJZ2R6MWxMbU52Ym5OMFlXNTBPM1l1WW5WbVptVnlQVnh1WENKdWRXeHNYQ0k3ZGk1emRHRjBaVDB5TzF3aWJuVnRZbVZ5WENJOVBUMTBlWEJsYjJZZ2R6OTJMbmc5ZHpwT0xtWnZja1ZoWTJnb1puVnVZM1JwYjI0b1pDeGxLWHRsUEhjdWJHVnVaM1JvSmlZb2RsdGtYVDEzVzJWZEtYMHBmV1ZzYzJWN2RtRnlJR2c5YkNobExtSjFabVpsY2lrL1RTNW5aWFJDZFdabVpYSW9UUzVqY21WaGRHVW9aUzVpZFdabVpYSXNNelE1TmpJc0lURXNJVEFwS1RwTkxtZGxkRUoxWm1abGNpaGxMbUoxWm1abGNpa3NlajFsTG05bVpuTmxkSHd3TEhFOVpTNXpkSEpwWkdWOE1DeHJQV1V1YzJsNlpYd3dMR2M5SVNGbExtNXZjbTFoYkdsNlpXUXNiVDB3TzF3aWRIbHdaVndpYVc0Z1pTWW1LRzA5UTF0bExuUjVjR1ZkS1R0bFBXVXVaR2wyYVhOdmNud3dPM1l1WW5WbVptVnlQV2c3ZGk1emRHRjBaVDB4TzNZdWMybDZaVDFyTzNZdWJtOXliV0ZzYVhwbFpEMW5PM1l1ZEhsd1pUMXRmSHhvTG1SMGVYQmxPM1l1YjJabWMyVjBQWG83ZGk1emRISnBaR1U5Y1R0MkxtUnBkbWx6YjNJOVpYMTlRVnRrWFQxaktHWjFibU4wYVc5dUtHUXNaU2w3ZG1GeUlHTTlaQzVoZEhSeWFXSkRZV05vWlR0cFppaGhJR2x1SUdNcGNtVjBkWEp1SUdOYllWMDdkbUZ5SUdJOWUybHpVM1J5WldGdE9pRXhmVHRQWW1wbFkzUXVhMlY1Y3loMktTNW1iM0pGWVdOb0tHWjFibU4wYVc5dUtHUXBlMkpiWkYwOVhHNTJXMlJkZlNrN2RpNWlkV1ptWlhJbUppaGlMbUoxWm1abGNqMWtMbXhwYm1zb2RpNWlkV1ptWlhJcExHSXVkSGx3WlQxaUxuUjVjR1Y4ZkdJdVluVm1abVZ5SzF3aUxtUjBlWEJsWENJcE8zSmxkSFZ5YmlCalcyRmRQV0o5S1gwcE8wOWlhbVZqZEM1clpYbHpLR2dwTG1admNrVmhZMmdvWm5WdVkzUnBiMjRvWkNsN2RtRnlJR1U5YUZ0a1hUdEJXMlJkUFdFb1pTeG1kVzVqZEdsdmJpaGtMR0VwZTJaMWJtTjBhVzl1SUhZb1pDbDdZU2hCVzJSZExGd2lQVndpTEdNc1hDSXVYQ0lzWkN4Y0lud3dPMXdpS1gxMllYSWdZejFrTG1sdWRtOXJaU2hoTEdVcExHSTlaQzV6YUdGeVpXUXNhRDFpTG1selFuVm1abVZ5UVhKbmN5eDNQV0l1WW5WbVptVnlMRUU5ZTJselUzUnlaV0Z0T21FdVpHVm1LQ0V4S1gwc2VqMXVaWGNnUW1FN2VpNXpkR0YwWlQweE8wOWlhbVZqZEM1clpYbHpLSG9wTG1admNrVmhZMmdvWm5WdVkzUnBiMjRvWkNsN1FWdGtYVDFoTG1SbFppaGNJbHdpSzNwYlpGMHBmU2s3ZG1GeUlHRmhQVUV1WW5WbVptVnlMSEU5UVM1MGVYQmxPMkVvWENKcFppaGNJaXhvTEZ3aUtGd2lMR01zWENJcEtYdGNJaXhCTG1selUzUnlaV0Z0TEZ3aVBYUnlkV1U3WENJc1lXRXNYQ0k5WENJc2R5eGNJaTVqY21WaGRHVlRkSEpsWVcwb1hDSXNNelE1TmpJc1hDSXNYQ0lzWXl4Y0lpazdYQ0lzY1N4Y0lqMWNJaXhoWVN4Y0lpNWtkSGx3WlR0Y0lpeGNJbjFsYkhObGUxd2lMRnh1WVdFc1hDSTlYQ0lzZHl4Y0lpNW5aWFJDZFdabVpYSW9YQ0lzWXl4Y0lpazdYQ0lzWENKcFppaGNJaXhoWVN4Y0lpbDdYQ0lzY1N4Y0lqMWNJaXhoWVN4Y0lpNWtkSGx3WlR0Y0lpd25mV1ZzYzJVZ2FXWW9YQ0pqYjI1emRHRnVkRndpSUdsdUlDY3NZeXhjSWlsN1hDSXNRUzV6ZEdGMFpTeGNJajFjSWl3eUxGd2lPMXdpTEZ3aWFXWW9kSGx3Wlc5bUlGd2lLMk1ySnk1amIyNXpkR0Z1ZENBOVBUMGdYQ0p1ZFcxaVpYSmNJaWw3Snl4QlcwNWJNRjFkTEZ3aVBWd2lMR01zWENJdVkyOXVjM1JoYm5RN1hDSXNUaTV6YkdsalpTZ3hLUzV0WVhBb1puVnVZM1JwYjI0b1pDbDdjbVYwZFhKdUlFRmJaRjE5S1M1cWIybHVLRndpUFZ3aUtTeGNJajB3TzF3aUxGd2lmV1ZzYzJWN1hDSXNUaTV0WVhBb1puVnVZM1JwYjI0b1pDeGxLWHR5WlhSMWNtNGdRVnRrWFN0Y0lqMWNJaXRqSzF3aUxtTnZibk4wWVc1MExteGxibWQwYUQ0OVhDSXJaU3RjSWo5Y0lpdGpLMXdpTG1OdmJuTjBZVzUwVzF3aUsyVXJYQ0pkT2pBN1hDSjlLUzVxYjJsdUtGd2lYQ0lwTEZ3aWZYMWxiSE5sZTF3aUxGd2lhV1lvWENJc2FDeGNJaWhjSWl4akxGd2lMbUoxWm1abGNpa3BlMXdpTEdGaExGd2lQVndpTEhjc1hDSXVZM0psWVhSbFUzUnlaV0Z0S0Z3aUxETTBPVFl5TEZ3aUxGd2lMR01zWENJdVluVm1abVZ5S1R0Y0lpeGNJbjFsYkhObGUxd2lMR0ZoTEZ3aVBWd2lMSGNzWENJdVoyVjBRblZtWm1WeUtGd2lMR01zWENJdVluVm1abVZ5S1R0Y0lpeGNJbjFjSWl4eExDYzlYQ0owZVhCbFhDSWdhVzRnSnl4Y2JtTXNYQ0kvWENJc1lpNW5iRlI1Y0dWekxGd2lXMXdpTEdNc1hDSXVkSGx3WlYwNlhDSXNZV0VzWENJdVpIUjVjR1U3WENJc1FTNXViM0p0WVd4cGVtVmtMRndpUFNFaFhDSXNZeXhjSWk1dWIzSnRZV3hwZW1Wa08xd2lLVHQyS0Z3aWMybDZaVndpS1R0MktGd2liMlptYzJWMFhDSXBPM1lvWENKemRISnBaR1ZjSWlrN2RpaGNJbVJwZG1semIzSmNJaWs3WVNoY0luMTlYQ0lwTzJFdVpYaHBkQ2hjSW1sbUtGd2lMRUV1YVhOVGRISmxZVzBzWENJcGUxd2lMSGNzWENJdVpHVnpkSEp2ZVZOMGNtVmhiU2hjSWl4aFlTeGNJaWs3WENJc1hDSjlYQ0lwTzNKbGRIVnliaUJCZlNsOUtUdHlaWFIxY200Z1FYMW1kVzVqZEdsdmJpQnFZU2hrS1h0MllYSWdaVDFrVzF3aWMzUmhkR2xqWENKZExHSTlaQzVrZVc1aGJXbGpMR2c5ZTMwN1QySnFaV04wTG10bGVYTW9aU2t1Wm05eVJXRmphQ2htZFc1amRHbHZiaWhrS1h0MllYSWdZVDFsVzJSZE8yaGJaRjA5WXlobWRXNWpkR2x2Ymloa0xHVXBlM0psZEhWeWJsd2liblZ0WW1WeVhDSTlQVDEwZVhCbGIyWWdZWHg4WENKaWIyOXNaV0Z1WENJOVBUMTBlWEJsYjJZZ1lUOWNJbHdpSzJFNlpDNXNhVzVyS0dFcGZTbDlLVHRQWW1wbFkzUXVhMlY1Y3loaUtTNW1iM0pGWVdOb0tHWjFibU4wYVc5dUtHUXBlM1poY2lCbFBXSmJaRjA3YUZ0a1hUMWhLR1VzWm5WdVkzUnBiMjRvWkN4aEtYdHlaWFIxY200Z1pDNXBiblp2YTJVb1lTeGxLWDBwZlNrN2NtVjBkWEp1SUdoOVhHNW1kVzVqZEdsdmJpQnNZU2hrTEdVc1lTeGpMR0lwZTNaaGNpQm9QWGxoS0dRc1lpa3NkejFWS0dRc2FDeGlLU3g2UFd0aEtHUXNZaWtzY1QxeVlTaGtMR0lwTEdzOWFXRW9aQ3hpS1N4blBYY3VkbWxsZDNCdmNuUTdaeVltS0hFdWRtbGxkM0J2Y25ROVp5azdaejFYS0Z3aWMyTnBjM052Y2k1aWIzaGNJaWs3S0hjOWQxdG5YU2ttSmloeFcyZGRQWGNwTzNjOU1EeFBZbXBsWTNRdWEyVjVjeWh4S1M1c1pXNW5kR2c3YUQxN1puSmhiV1ZpZFdabVpYSTZhQ3hrY21GM09ub3NjMmhoWkdWeU9tc3NjM1JoZEdVNmNTeGthWEowZVRwM2ZUdG9MbkJ5YjJacGJHVTlibUVvWkN4aUtUdG9MblZ1YVdadmNtMXpQWE5oS0dFc1lpazdhQzVoZEhSeWFXSjFkR1Z6UFdSaEtHVXNZaWs3YUM1amIyNTBaWGgwUFdwaEtHTXNZaWs3Y21WMGRYSnVJR2g5Wm5WdVkzUnBiMjRnWldFb1pDeGxMR0VwZTNaaGNpQmpQV1F1YzJoaGNtVmtMbU52Ym5SbGVIUXNZajFrTG5OamIzQmxLQ2s3VDJKcVpXTjBMbXRsZVhNb1lTa3VabTl5UldGamFDaG1kVzVqZEdsdmJpaG9LWHRsTG5OaGRtVW9ZeXhjSWk1Y0lpdG9LVHRpS0dNc1hDSXVYQ0lzYUN4Y0lqMWNJaXhoVzJoZExtRndjR1Z1WkNoa0xHVXBMRndpTzF3aUtYMHBPMlVvWWlsOVpuVnVZM1JwYjI0Z1R5aGtMR1VzWVN4aktYdDJZWElnWWoxa0xuTm9ZWEpsWkN4b1BXSXVaMndzZHoxaUxtWnlZVzFsWW5WbVptVnlMRnh1ZWp0dllTWW1LSG85WlM1a1pXWW9ZaTVsZUhSbGJuTnBiMjV6TEZ3aUxuZGxZbWRzWDJSeVlYZGZZblZtWm1WeWMxd2lLU2s3ZG1GeUlIRTlaQzVqYjI1emRHRnVkSE1zWWoxeExtUnlZWGRDZFdabVpYSXNjVDF4TG1KaFkydENkV1ptWlhJN1pEMWhQMkV1WVhCd1pXNWtLR1FzWlNrNlpTNWtaV1lvZHl4Y0lpNXVaWGgwWENJcE8yTjhmR1VvWENKcFppaGNJaXhrTEZ3aUlUMDlYQ0lzZHl4Y0lpNWpkWElwZTF3aUtUdGxLRndpYVdZb1hDSXNaQ3hjSWlsN1hDSXNhQ3hjSWk1aWFXNWtSbkpoYldWaWRXWm1aWElvWENJc016WXhOakFzWENJc1hDSXNaQ3hjSWk1bWNtRnRaV0oxWm1abGNpazdYQ0lwTzI5aEppWmxLSG9zWENJdVpISmhkMEoxWm1abGNuTlhSVUpIVENoY0lpeGlMRndpVzF3aUxHUXNYQ0l1WTI5c2IzSkJkSFJoWTJodFpXNTBjeTVzWlc1bmRHaGRLVHRjSWlrN1pTaGNJbjFsYkhObGUxd2lMR2dzWENJdVltbHVaRVp5WVcxbFluVm1abVZ5S0Z3aUxETTJNVFl3TEZ3aUxHNTFiR3dwTzF3aUtUdHZZU1ltWlNoNkxGd2lMbVJ5WVhkQ2RXWm1aWEp6VjBWQ1Iwd29YQ0lzY1N4Y0lpazdYQ0lwTzJVb1hDSjlYQ0lzZHl4Y0lpNWpkWEk5WENJc1pDeGNJanRjSWlrN1kzeDhaU2hjSW4xY0lpbDlablZ1WTNScGIyNGdhR0VvWkN4aExHTXBlM1poY2lCaVBXUXVjMmhoY21Wa0xHZzlZaTVuYkN4NlBXUXVZM1Z5Y21WdWRDeHhQV1F1Ym1WNGRDeG5QV0l1WTNWeWNtVnVkQ3hyUFdJdWJtVjRkQ3hjYm0wOVpDNWpiMjVrS0djc1hDSXVaR2x5ZEhsY0lpazdkeTVtYjNKRllXTm9LR1oxYm1OMGFXOXVLR0VwZTJFOVZ5aGhLVHRwWmlnaEtHRWdhVzRnWXk1emRHRjBaU2twZTNaaGNpQjJMR0k3YVdZb1lTQnBiaUJ4S1h0MlBYRmJZVjA3WWoxNlcyRmRPM1poY2lCM1BVWW9aVnRoWFM1c1pXNW5kR2dzWm5WdVkzUnBiMjRvWkNsN2NtVjBkWEp1SUcwdVpHVm1LSFlzWENKYlhDSXNaQ3hjSWwxY0lpbDlLVHR0S0dRdVkyOXVaQ2gzTG0xaGNDaG1kVzVqZEdsdmJpaGtMR1VwZTNKbGRIVnliaUJrSzF3aUlUMDlYQ0lyWWl0Y0lsdGNJaXRsSzF3aVhWd2lmU2t1YW05cGJpaGNJbng4WENJcEtTNTBhR1Z1S0dnc1hDSXVYQ0lzZUdGYllWMHNYQ0lvWENJc2R5eGNJaWs3WENJc2R5NXRZWEFvWm5WdVkzUnBiMjRvWkN4bEtYdHlaWFIxY200Z1lpdGNJbHRjSWl0bEsxd2lYVDFjSWl0a2ZTa3VhbTlwYmloY0lqdGNJaWtzWENJN1hDSXBLWDFsYkhObElIWTliUzVrWldZb2F5eGNJaTVjSWl4aEtTeDNQV1F1WTI5dVpDaDJMRndpSVQwOVhDSXNaeXhjSWk1Y0lpeGhLU3h0S0hjcExHRWdhVzRnZDJFL2R5aGtMbU52Ym1Rb2Rpa3VkR2hsYmlob0xGd2lMbVZ1WVdKc1pTaGNJaXgzWVZ0aFhTeGNJaWs3WENJcFcxd2laV3h6WlZ3aVhTaG9MRndpTG1ScGMyRmliR1VvWENJc2QyRmJZVjBzWENJcE8xd2lLU3huTEZ3aUxsd2lMR0VzWENJOVhDSXNkaXhjSWp0Y0lpazZkeWhvTEZ3aUxsd2lMSGhoVzJGZExGd2lLRndpTEhZc1hDSXBPMXdpTEZ4dVp5eGNJaTVjSWl4aExGd2lQVndpTEhZc1hDSTdYQ0lwZlgwcE96QTlQVDFQWW1wbFkzUXVhMlY1Y3loakxuTjBZWFJsS1M1c1pXNW5kR2dtSm0wb1p5eGNJaTVrYVhKMGVUMW1ZV3h6WlR0Y0lpazdZU2h0S1gxbWRXNWpkR2x2YmlCUktHUXNaU3hoTEdNcGUzWmhjaUJpUFdRdWMyaGhjbVZrTEdnOVpDNWpkWEp5Wlc1MExIYzlZaTVqZFhKeVpXNTBMSEU5WWk1bmJEdHJLRTlpYW1WamRDNXJaWGx6S0dFcEtTNW1iM0pGWVdOb0tHWjFibU4wYVc5dUtHSXBlM1poY2lCNlBXRmJZbDA3YVdZb0lXTjhmR01vZWlrcGUzWmhjaUJuUFhvdVlYQndaVzVrS0dRc1pTazdhV1lvZDJGYllsMHBlM1poY2lCclBYZGhXMkpkTzNJb2Vpay9aejlsS0hFc1hDSXVaVzVoWW14bEtGd2lMR3NzWENJcE8xd2lLVHBsS0hFc1hDSXVaR2x6WVdKc1pTaGNJaXhyTEZ3aUtUdGNJaWs2WlNoa0xtTnZibVFvWnlrdWRHaGxiaWh4TEZ3aUxtVnVZV0pzWlNoY0lpeHJMRndpS1R0Y0lpbGJYQ0psYkhObFhDSmRLSEVzWENJdVpHbHpZV0pzWlNoY0lpeHJMRndpS1R0Y0lpa3BPMlVvZHl4Y0lpNWNJaXhpTEZ3aVBWd2lMR2NzWENJN1hDSXBmV1ZzYzJVZ2FXWW9lU2huS1NsN2RtRnlJRzA5YUZ0aVhUdGxLSEVzWENJdVhDSXNlR0ZiWWwwc1hDSW9YQ0lzWnl4Y0lpazdYQ0lzWnk1dFlYQW9ablZ1WTNScGIyNG9aQ3hsS1h0eVpYUjFjbTRnYlN0Y0lsdGNJaXRsSzF3aVhUMWNJaXRrZlNrdWFtOXBiaWhjSWp0Y0lpa3NYQ0k3WENJcGZXVnNjMlVnWlNoeExGeHVYQ0l1WENJc2VHRmJZbDBzWENJb1hDSXNaeXhjSWlrN1hDSXNkeXhjSWk1Y0lpeGlMRndpUFZ3aUxHY3NYQ0k3WENJcGZYMHBmV1oxYm1OMGFXOXVJSEJoS0dRc1pTbDdkR0VtSmloa0xtbHVjM1JoYm1OcGJtYzlaUzVrWldZb1pDNXphR0Z5WldRdVpYaDBaVzV6YVc5dWN5eGNJaTVoYm1kc1pWOXBibk4wWVc1alpXUmZZWEp5WVhselhDSXBLWDFtZFc1amRHbHZiaUJXS0dRc1pTeGhMR01zWWlsN1puVnVZM1JwYjI0Z2FDZ3BlM0psZEhWeWJsd2lkVzVrWldacGJtVmtYQ0k5UFQxMGVYQmxiMllnY0dWeVptOXliV0Z1WTJVL1hDSkVZWFJsTG01dmR5Z3BYQ0k2WENKd1pYSm1iM0p0WVc1alpTNXViM2NvS1Z3aWZXWjFibU4wYVc5dUlIY29aQ2w3YkQxbExtUmxaaWdwTzJRb2JDeGNJajFjSWl4b0tDa3NYQ0k3WENJcE8xd2ljM1J5YVc1blhDSTlQVDEwZVhCbGIyWWdZajlrS0dzc1hDSXVZMjkxYm5RclBWd2lMR0lzWENJN1hDSXBPbVFvYXl4Y0lpNWpiM1Z1ZENzck8xd2lLVHR0WVNZbUtHTS9LRzQ5WlM1a1pXWW9LU3hrS0c0c1hDSTlYQ0lzWml4Y0lpNW5aWFJPZFcxUVpXNWthVzVuVVhWbGNtbGxjeWdwTzF3aUtTazZaQ2htTEZ3aUxtSmxaMmx1VVhWbGNua29YQ0lzYXl4Y0lpazdYQ0lwS1gxbWRXNWpkR2x2YmlCeEtHUXBlMlFvYXl4Y0lpNWpjSFZVYVcxbEt6MWNJaXhvS0Nrc1hDSXRYQ0lzYkN4Y0lqdGNJaWs3YldFbUppaGpQMlFvWml4Y0lpNXdkWE5vVTJOdmNHVlRkR0YwY3loY0lpeHVMRnh1WENJc1hDSXNaaXhjSWk1blpYUk9kVzFRWlc1a2FXNW5VWFZsY21sbGN5Z3BMRndpTEdzc1hDSXBPMXdpS1Rwa0tHWXNYQ0l1Wlc1a1VYVmxjbmtvS1R0Y0lpa3BmV1oxYm1OMGFXOXVJSG9vWkNsN2RtRnlJR0U5WlM1a1pXWW9iU3hjSWk1d2NtOW1hV3hsWENJcE8yVW9iU3hjSWk1d2NtOW1hV3hsUFZ3aUxHUXNYQ0k3WENJcE8yVXVaWGhwZENodExGd2lMbkJ5YjJacGJHVTlYQ0lzWVN4Y0lqdGNJaWw5ZG1GeUlHYzlaQzV6YUdGeVpXUXNhejFrTG5OMFlYUnpMRzA5Wnk1amRYSnlaVzUwTEdZOVp5NTBhVzFsY2p0aFBXRXVjSEp2Wm1sc1pUdDJZWElnYkN4dU8ybG1LR0VwZTJsbUtISW9ZU2twZTJFdVpXNWhZbXhsUHloM0tHVXBMSEVvWlM1bGVHbDBLU3g2S0Z3aWRISjFaVndpS1NrNmVpaGNJbVpoYkhObFhDSXBPM0psZEhWeWJuMWhQV0V1WVhCd1pXNWtLR1FzWlNrN2VpaGhLWDFsYkhObElHRTlaUzVrWldZb2JTeGNJaTV3Y205bWFXeGxYQ0lwTzJjOVpDNWliRzlqYXlncE8zY29aeWs3WlNoY0ltbG1LRndpTEdFc1hDSXBlMXdpTEdjc1hDSjlYQ0lwTzJROVpDNWliRzlqYXlncE8zRW9aQ2s3WlM1bGVHbDBLRndpYVdZb1hDSXNZU3hjSWlsN1hDSXNaQ3hjSW4xY0lpbDlablZ1WTNScGIyNGdXQ2hrTEdVc1lTeGpMR0lwZTJaMWJtTjBhVzl1SUdnb1pDbDdjM2RwZEdOb0tHUXBlMk5oYzJVZ016VTJOalE2WTJGelpTQXpOVFkyTnpwallYTmxJRE0xTmpjeE9uSmxkSFZ5YmlBeU8xeHVZMkZ6WlNBek5UWTJOVHBqWVhObElETTFOalk0T21OaGMyVWdNelUyTnpJNmNtVjBkWEp1SURNN1kyRnpaU0F6TlRZMk5qcGpZWE5sSURNMU5qWTVPbU5oYzJVZ016VTJOek02Y21WMGRYSnVJRFE3WkdWbVlYVnNkRHB5WlhSMWNtNGdNWDE5Wm5WdVkzUnBiMjRnZHloaExHTXNZaWw3Wm5WdVkzUnBiMjRnYUNncGUyVW9YQ0pwWmlnaFhDSXNiU3hjSWk1aWRXWm1aWElwZTF3aUxHY3NYQ0l1Wlc1aFlteGxWbVZ5ZEdWNFFYUjBjbWxpUVhKeVlYa29YQ0lzYXl4Y0lpazdmVndpS1R0MllYSWdZVDFpTG5SNWNHVXNkenQzUFdJdWMybDZaVDlsTG1SbFppaGlMbk5wZW1Vc1hDSjhmRndpTEdNcE9tTTdaU2hjSW1sbUtGd2lMRzBzWENJdWRIbHdaU0U5UFZ3aUxHRXNYQ0o4ZkZ3aUxHMHNYQ0l1YzJsNlpTRTlQVndpTEhjc1hDSjhmRndpTEdGaExtMWhjQ2htZFc1amRHbHZiaWhrS1h0eVpYUjFjbTRnYlN0Y0lpNWNJaXRrSzF3aUlUMDlYQ0lyWWx0a1hYMHBMbXB2YVc0b1hDSjhmRndpS1N4Y0lpbDdYQ0lzWnl4Y0lpNWlhVzVrUW5WbVptVnlLRndpTERNME9UWXlMRndpTEZ3aUxHWXNYQ0l1WW5WbVptVnlLVHRjSWl4bkxGd2lMblpsY25SbGVFRjBkSEpwWWxCdmFXNTBaWElvWENJc1cyc3NkeXhoTEdJdWJtOXliV0ZzYVhwbFpDeGlMbk4wY21sa1pTeGlMbTltWm5ObGRGMHNYQ0lwTzF3aUxHMHNYQ0l1ZEhsd1pUMWNJaXhoTEZ3aU8xd2lMRzBzWENJdWMybDZaVDFjSWl4M0xGd2lPMXdpTEdGaExtMWhjQ2htZFc1amRHbHZiaWhrS1h0eVpYUjFjbTRnYlN0Y2Jsd2lMbHdpSzJRclhDSTlYQ0lyWWx0a1hTdGNJanRjSW4wcExtcHZhVzRvWENKY0lpa3NYQ0o5WENJcE8zUmhKaVlvWVQxaUxtUnBkbWx6YjNJc1pTaGNJbWxtS0Z3aUxHMHNYQ0l1WkdsMmFYTnZjaUU5UFZ3aUxHRXNYQ0lwZTF3aUxHUXVhVzV6ZEdGdVkybHVaeXhjSWk1MlpYSjBaWGhCZEhSeWFXSkVhWFpwYzI5eVFVNUhURVVvWENJc1cyc3NZVjBzWENJcE8xd2lMRzBzWENJdVpHbDJhWE52Y2oxY0lpeGhMRndpTzMxY0lpa3BmV1oxYm1OMGFXOXVJSG9vS1h0bEtGd2lhV1lvWENJc2JTeGNJaTVpZFdabVpYSXBlMXdpTEdjc1hDSXVaR2x6WVdKc1pWWmxjblJsZUVGMGRISnBZa0Z5Y21GNUtGd2lMR3NzWENJcE8xd2lMRndpZldsbUtGd2lMRTR1YldGd0tHWjFibU4wYVc5dUtHUXNaU2w3Y21WMGRYSnVJRzByWENJdVhDSXJaQ3RjSWlFOVBWd2lLMEZiWlYxOUtTNXFiMmx1S0Z3aWZIeGNJaWtzWENJcGUxd2lMR2NzWENJdWRtVnlkR1Y0UVhSMGNtbGlOR1lvWENJc2F5eGNJaXhjSWl4QkxGd2lLVHRjSWl4T0xtMWhjQ2htZFc1amRHbHZiaWhrTEdVcGUzSmxkSFZ5YmlCdEsxd2lMbHdpSzJRclhDSTlYQ0lyUVZ0bFhTdGNJanRjSW4wcExtcHZhVzRvWENKY0lpa3NYQ0o5WENJcGZYWmhjaUJuUFhFdVoyd3NhejFsTG1SbFppaGhMRndpTG14dlkyRjBhVzl1WENJcExHMDlaUzVrWldZb2NTNWhkSFJ5YVdKMWRHVnpMRndpVzF3aUxHc3NYQ0pkWENJcE8yRTlZaTV6ZEdGMFpUdDJZWElnWmoxaUxtSjFabVpsY2l4QlBWdGlMbmdzWWk1NUxGeHVZaTU2TEdJdWQxMHNZV0U5VzF3aVluVm1abVZ5WENJc1hDSnViM0p0WVd4cGVtVmtYQ0lzWENKdlptWnpaWFJjSWl4Y0luTjBjbWxrWlZ3aVhUc3hQVDA5WVQ5b0tDazZNajA5UFdFL2VpZ3BPaWhsS0Z3aWFXWW9YQ0lzWVN4Y0lqMDlQVndpTERFc1hDSXBlMXdpS1N4b0tDa3NaU2hjSW4xbGJITmxlMXdpS1N4NktDa3NaU2hjSW4xY0lpa3BmWFpoY2lCeFBXUXVjMmhoY21Wa08yTXVabTl5UldGamFDaG1kVzVqZEdsdmJpaGpLWHQyWVhJZ2NUMWpMbTVoYldVc1p6MWhMbUYwZEhKcFluVjBaWE5iY1Ywc2VqdHBaaWhuS1h0cFppZ2hZaWhuS1NseVpYUjFjbTQ3ZWoxbkxtRndjR1Z1WkNoa0xHVXBmV1ZzYzJWN2FXWW9JV0lvU0NrcGNtVjBkWEp1TzNaaGNpQnRQV1F1YzJOdmNHVkJkSFJ5YVdJb2NTazdlajE3ZlR0UFltcGxZM1F1YTJWNWN5aHVaWGNnUW1FcExtWnZja1ZoWTJnb1puVnVZM1JwYjI0b1pDbDdlbHRrWFQxbExtUmxaaWh0TEZ3aUxsd2lMR1FwZlNsOWR5aGtMbXhwYm1zb1l5a3NhQ2hqTG1sdVptOHVkSGx3WlNrc2VpbDlLWDFtZFc1amRHbHZiaUJVS0dRc1pTeGhMR01zWWlsN1ptOXlLSFpoY2lCb1BXUXVjMmhoY21Wa0xIYzlhQzVuYkN4bkxIRTlNRHR4UEdNdWJHVnVaM1JvT3lzcmNTbDdkbUZ5SUhvOVkxdHhYU3h0UFhvdWJtRnRaU3hyUFhvdWFXNW1ieTUwZVhCbExHdzlZUzUxYm1sbWIzSnRjMXR0WFN4NlBXUXViR2x1YXloNktTdGNibHdpTG14dlkyRjBhVzl1WENJc2JqdHBaaWhzS1h0cFppZ2hZaWhzS1NsamIyNTBhVzUxWlR0cFppaHlLR3dwS1h0dFBXd3VkbUZzZFdVN2FXWW9NelUyTnpnOVBUMXJmSHd6TlRZNE1EMDlQV3NwYXoxa0xteHBibXNvYlM1ZmRHVjRkSFZ5Wlh4OGJTNWpiMnh2Y2xzd1hTNWZkR1Y0ZEhWeVpTa3NaU2gzTEZ3aUxuVnVhV1p2Y20weGFTaGNJaXg2TEZ3aUxGd2lMR3NyWENJdVltbHVaQ2dwS1R0Y0lpa3NaUzVsZUdsMEtHc3NYQ0l1ZFc1aWFXNWtLQ2s3WENJcE8yVnNjMlVnYVdZb016VTJOelE5UFQxcmZId3pOVFkzTlQwOVBXdDhmRE0xTmpjMlBUMDlheWx0UFdRdVoyeHZZbUZzTG1SbFppaGNJbTVsZHlCR2JHOWhkRE15UVhKeVlYa29XMXdpSzBGeWNtRjVMbkJ5YjNSdmRIbHdaUzV6YkdsalpTNWpZV3hzS0cwcEsxd2lYU2xjSWlrc2JEMHlMRE0xTmpjMVBUMDlhejlzUFRNNk16VTJOelk5UFQxckppWW9iRDAwS1N4bEtIY3NYQ0l1ZFc1cFptOXliVTFoZEhKcGVGd2lMR3dzWENKbWRpaGNJaXg2TEZ3aUxHWmhiSE5sTEZ3aUxHMHNYQ0lwTzF3aUtUdGxiSE5sZTNOM2FYUmphQ2hyS1h0allYTmxJRFV4TWpZNlp6MWNJakZtWENJN1luSmxZV3M3WTJGelpTQXpOVFkyTkRwblBWd2lNbVpjSWp0aWNtVmhhenRqWVhObElETTFOalkxT21jOVhDSXpabHdpTzJKeVpXRnJPMk5oYzJVZ016VTJOalk2WnoxY0lqUm1YQ0k3WW5KbFlXczdZMkZ6WlNBek5UWTNNRHBuUFZ4dVhDSXhhVndpTzJKeVpXRnJPMk5oYzJVZ05URXlORHBuUFZ3aU1XbGNJanRpY21WaGF6dGpZWE5sSURNMU5qY3hPbWM5WENJeWFWd2lPMkp5WldGck8yTmhjMlVnTXpVMk5qYzZaejFjSWpKcFhDSTdZbkpsWVdzN1kyRnpaU0F6TlRZM01qcG5QVndpTTJsY0lqdGljbVZoYXp0allYTmxJRE0xTmpZNE9tYzlYQ0l6YVZ3aU8ySnlaV0ZyTzJOaGMyVWdNelUyTnpNNlp6MWNJalJwWENJN1luSmxZV3M3WTJGelpTQXpOVFkyT1RwblBWd2lOR2xjSW4xbEtIY3NYQ0l1ZFc1cFptOXliVndpTEdjc1hDSW9YQ0lzZWl4Y0lpeGNJaXg1S0cwcFAwRnljbUY1TG5CeWIzUnZkSGx3WlM1emJHbGpaUzVqWVd4c0tHMHBPbTBzWENJcE8xd2lLWDFqYjI1MGFXNTFaWDFsYkhObElHNDliQzVoY0hCbGJtUW9aQ3hsS1gxbGJITmxlMmxtS0NGaUtFZ3BLV052Ym5ScGJuVmxPMjQ5WlM1a1pXWW9hQzUxYm1sbWIzSnRjeXhjSWx0Y0lpeG1MbWxrS0cwcExGd2lYVndpS1gwek5UWTNPRDA5UFdzL1pTaGNJbWxtS0Z3aUxHNHNYQ0ltSmx3aUxHNHNKeTVmY21WbmJGUjVjR1U5UFQxY0ltWnlZVzFsWW5WbVptVnlYQ0lwZXljc2JpeGNJajFjSWl4dUxGd2lMbU52Ykc5eVd6QmRPMXdpTEZ3aWZWd2lLVG96TlRZNE1EMDlQV3NtSm1Vb1hDSnBaaWhjSWl4dUxGd2lKaVpjSWl4dUxDY3VYM0psWjJ4VWVYQmxQVDA5WENKbWNtRnRaV0oxWm1abGNrTjFZbVZjSWlsN0p5eHVMRndpUFZ3aUxHNHNYQ0l1WTI5c2IzSmJNRjA3WENJc1hDSjlYQ0lwTzF4dWJUMHhPM04zYVhSamFDaHJLWHRqWVhObElETTFOamM0T21OaGMyVWdNelUyT0RBNmF6MWxMbVJsWmlodUxGd2lMbDkwWlhoMGRYSmxYQ0lwTzJVb2R5eGNJaTUxYm1sbWIzSnRNV2tvWENJc2VpeGNJaXhjSWl4ckxGd2lMbUpwYm1Rb0tTazdYQ0lwTzJVdVpYaHBkQ2hyTEZ3aUxuVnVZbWx1WkNncE8xd2lLVHRqYjI1MGFXNTFaVHRqWVhObElEVXhNalE2WTJGelpTQXpOVFkzTURwblBWd2lNV2xjSWp0aWNtVmhhenRqWVhObElETTFOalkzT21OaGMyVWdNelUyTnpFNlp6MWNJakpwWENJN2JUMHlPMkp5WldGck8yTmhjMlVnTXpVMk5qZzZZMkZ6WlNBek5UWTNNanBuUFZ3aU0ybGNJanR0UFRNN1luSmxZV3M3WTJGelpTQXpOVFkyT1RwallYTmxJRE0xTmpjek9tYzlYQ0kwYVZ3aU8yMDlORHRpY21WaGF6dGpZWE5sSURVeE1qWTZaejFjSWpGbVhDSTdZbkpsWVdzN1kyRnpaU0F6TlRZMk5EcG5QVndpTW1aY0lqdHRQVEk3WW5KbFlXczdZMkZ6WlNBek5UWTJOVHBuUFZ3aU0yWmNJanR0UFRNN1luSmxZV3M3WTJGelpTQXpOVFkyTmpwblBWd2lOR1pjSWp0dFBUUTdZbkpsWVdzN1kyRnpaU0F6TlRZM05EcG5QVndpVFdGMGNtbDRNbVoyWENJN1luSmxZV3M3WTJGelpTQXpOVFkzTlRwblBWd2lUV0YwY21sNE0yWjJYQ0k3WW5KbFlXczdZMkZ6WlNBek5UWTNOanBuUFZ3aVRXRjBjbWw0TkdaMlhDSjlaU2gzTEZ3aUxuVnVhV1p2Y20xY0lpeG5MRndpS0Z3aUxIb3NYQ0lzWENJcE8xeHVhV1lvWENKTlhDSTlQVDFuTG1Ob1lYSkJkQ2d3S1NsN2RtRnlJSG85VFdGMGFDNXdiM2NvYXkwek5UWTNOQ3N5TERJcExFSTlaQzVuYkc5aVlXd3VaR1ZtS0Z3aWJtVjNJRVpzYjJGME16SkJjbkpoZVNoY0lpeDZMRndpS1Z3aUtUdGxLRndpWm1Gc2MyVXNLRUZ5Y21GNUxtbHpRWEp5WVhrb1hDSXNiaXhjSWlsOGZGd2lMRzRzWENJZ2FXNXpkR0Z1WTJWdlppQkdiRzloZERNeVFYSnlZWGtwUDF3aUxHNHNYQ0k2S0Z3aUxFWW9laXhtZFc1amRHbHZiaWhrS1h0eVpYUjFjbTRnUWl0Y0lsdGNJaXRrSzF3aVhUMWNJaXR1SzF3aVcxd2lLMlFyWENKZFhDSjlLU3hjSWl4Y0lpeENMRndpS1Z3aUtYMWxiSE5sSURFOGJUOWxLRVlvYlN4bWRXNWpkR2x2Ymloa0tYdHlaWFIxY200Z2JpdGNJbHRjSWl0a0sxd2lYVndpZlNrcE9tVW9iaWs3WlNoY0lpazdYQ0lwZlgxbWRXNWpkR2x2YmlCMVlTaGtMR1VzWVN4aktYdG1kVzVqZEdsdmJpQmlLR2dwZTNaaGNpQm5QV3RiYUYwN2NtVjBkWEp1SUdjL1p5NWpiMjUwWlhoMFJHVndKaVpqTG1OdmJuUmxlSFJFZVc1aGJXbGpmSHhuTG5CeWIzQkVaWEEvWnk1aGNIQmxibVFvWkN4aEtUcG5MbUZ3Y0dWdVpDaGtMR1VwT21VdVpHVm1LRzBzWENJdVhDSXNhQ2w5Wm5WdVkzUnBiMjRnYUNncGUyWjFibU4wYVc5dUlHUW9LWHRoS0hnc1hDSXVaSEpoZDBWc1pXMWxiblJ6U1c1emRHRnVZMlZrUVU1SFRFVW9YQ0lzVzJZc2JpeExMR3dyWENJOFBDZ29YQ0lyWEc1TEsxd2lMVFV4TWpFcFBqNHhLVndpTEVKZExGd2lLVHRjSWlsOVpuVnVZM1JwYjI0Z1pTZ3BlMkVvZUN4Y0lpNWtjbUYzUVhKeVlYbHpTVzV6ZEdGdVkyVmtRVTVIVEVVb1hDSXNXMllzYkN4dUxFSmRMRndpS1R0Y0lpbDljVDlUUDJRb0tUb29ZU2hjSW1sbUtGd2lMSEVzWENJcGUxd2lLU3hrS0Nrc1lTaGNJbjFsYkhObGUxd2lLU3hsS0Nrc1lTaGNJbjFjSWlrcE9tVW9LWDFtZFc1amRHbHZiaUJuS0NsN1puVnVZM1JwYjI0Z1pDZ3BlMkVvZWl0Y0lpNWtjbUYzUld4bGJXVnVkSE1vWENJclcyWXNiaXhMTEd3clhDSThQQ2dvWENJclN5dGNJaTAxTVRJeEtUNCtNU2xjSWwwclhDSXBPMXdpS1gxbWRXNWpkR2x2YmlCbEtDbDdZU2g2SzF3aUxtUnlZWGRCY25KaGVYTW9YQ0lyVzJZc2JDeHVYU3RjSWlrN1hDSXBmWEUvVXo5a0tDazZLR0VvWENKcFppaGNJaXh4TEZ3aUtYdGNJaWtzWkNncExHRW9YQ0o5Wld4elpYdGNJaWtzWlNncExHRW9YQ0o5WENJcEtUcGxLQ2w5ZG1GeUlIYzlaQzV6YUdGeVpXUXNlajEzTG1kc0xHMDlkeTVrY21GM0xHczlZeTVrY21GM0xIRTlablZ1WTNScGIyNG9LWHQyWVhJZ1lqMXJMbVZzWlcxbGJuUnpMR2c5WlR0cFppaGlLWHRwWmloaUxtTnZiblJsZUhSRVpYQW1KbU11WTI5dWRHVjRkRVI1Ym1GdGFXTjhmR0l1Y0hKdmNFUmxjQ2xvUFdFN1lqMWlMbUZ3Y0dWdVpDaGtMR2dwZldWc2MyVWdZajFvTG1SbFppaHRMRndpTGx3aUxGd2laV3hsYldWdWRITmNJaWs3WEc1aUppWm9LRndpYVdZb1hDSXJZaXRjSWlsY0lpdDZLMXdpTG1KcGJtUkNkV1ptWlhJb016UTVOak1zWENJcllpdGNJaTVpZFdabVpYSXVZblZtWm1WeUtUdGNJaWs3Y21WMGRYSnVJR0o5S0Nrc1pqMWlLRndpY0hKcGJXbDBhWFpsWENJcExHdzlZaWhjSW05bVpuTmxkRndpS1N4dVBXWjFibU4wYVc5dUtDbDdkbUZ5SUdJOWF5NWpiM1Z1ZEN4b1BXVTdhV1lvWWlsN2FXWW9ZaTVqYjI1MFpYaDBSR1Z3SmlaakxtTnZiblJsZUhSRWVXNWhiV2xqZkh4aUxuQnliM0JFWlhBcGFEMWhPMkk5WWk1aGNIQmxibVFvWkN4b0tYMWxiSE5sSUdJOWFDNWtaV1lvYlN4Y0lpNWNJaXhjSW1OdmRXNTBYQ0lwTzNKbGRIVnliaUJpZlNncE8ybG1LRndpYm5WdFltVnlYQ0k5UFQxMGVYQmxiMllnYmlsN2FXWW9NRDA5UFc0cGNtVjBkWEp1ZldWc2MyVWdZU2hjSW1sbUtGd2lMRzRzWENJcGUxd2lLU3hoTG1WNGFYUW9YQ0o5WENJcE8zWmhjaUJDTEhnN2RHRW1KaWhDUFdJb1hDSnBibk4wWVc1alpYTmNJaWtzZUQxa0xtbHVjM1JoYm1OcGJtY3BPM1poY2lCTFBYRXJYQ0l1ZEhsd1pWd2lMRk05YXk1bGJHVnRaVzUwY3lZbWNpaHJMbVZzWlcxbGJuUnpLVHQwWVNZbUtGd2liblZ0WW1WeVhDSWhQVDEwZVhCbGIyWWdRbng4TUR3OVFpay9YQ0p6ZEhKcGJtZGNJajA5UFhSNWNHVnZaaUJDUHloaEtGd2lhV1lvWENJc1FpeGNJajR3S1h0Y0lpa3NhQ2dwTEdFb1hDSjlaV3h6WlNCcFppaGNJaXhDTEZ4dVhDSThNQ2w3WENJcExHY29LU3hoS0Z3aWZWd2lLU2s2YUNncE9tY29LWDFtZFc1amRHbHZiaUJGWVNoa0xHVXNZU3hpTEdNcGUyVTlZbUVvS1R0alBXVXVjSEp2WXloY0ltSnZaSGxjSWl4aktUdDBZU1ltS0dVdWFXNXpkR0Z1WTJsdVp6MWpMbVJsWmlobExuTm9ZWEpsWkM1bGVIUmxibk5wYjI1ekxGd2lMbUZ1WjJ4bFgybHVjM1JoYm1ObFpGOWhjbkpoZVhOY0lpa3BPMlFvWlN4akxHRXNZaWs3Y21WMGRYSnVJR1V1WTI5dGNHbHNaU2dwTG1KdlpIbDlablZ1WTNScGIyNGdSbUVvWkN4bExHRXNZaWw3Y0dFb1pDeGxLVHRZS0dRc1pTeGhMR0l1WVhSMGNtbGlkWFJsY3l4bWRXNWpkR2x2YmlncGUzSmxkSFZ5YmlFd2ZTazdWQ2hrTEdVc1lTeGlMblZ1YVdadmNtMXpMR1oxYm1OMGFXOXVLQ2w3Y21WMGRYSnVJVEI5S1R0MVlTaGtMR1VzWlN4aEtYMW1kVzVqZEdsdmJpQklZU2hrTEdVcGUzWmhjaUJoUFdRdWNISnZZeWhjSW1SeVlYZGNJaXd4S1R0d1lTaGtMR0VwTzJWaEtHUXNZU3hsTG1OdmJuUmxlSFFwTzA4b1pDeGhMR1V1Wm5KaGJXVmlkV1ptWlhJcE8yaGhLR1FzWVN4bEtUdFJLR1FzWVN4bExuTjBZWFJsS1R0V0tHUXNZU3hsTENFeExDRXdLVHQyWVhJZ1lqMWxMbk5vWVdSbGNpNXdjbTluVm1GeUxtRndjR1Z1WkNoa0xHRXBPMkVvWkM1emFHRnlaV1F1WjJ3c1hDSXVkWE5sVUhKdlozSmhiU2hjSWl4aUxGeHVYQ0l1Y0hKdlozSmhiU2s3WENJcE8ybG1LR1V1YzJoaFpHVnlMbkJ5YjJkeVlXMHBSbUVvWkN4aExHVXNaUzV6YUdGa1pYSXVjSEp2WjNKaGJTazdaV3h6Wlh0MllYSWdZejFrTG1kc2IySmhiQzVrWldZb1hDSjdmVndpS1N4b1BXRXVaR1ZtS0dJc1hDSXVhV1JjSWlrc1p6MWhMbVJsWmloakxGd2lXMXdpTEdnc1hDSmRYQ0lwTzJFb1pDNWpiMjVrS0djcExuUm9aVzRvWnl4Y0lpNWpZV3hzS0hSb2FYTXNZVEFwTzF3aUtWdGNJbVZzYzJWY0lsMG9aeXhjSWoxY0lpeGpMRndpVzF3aUxHZ3NYQ0pkUFZ3aUxHUXViR2x1YXlobWRXNWpkR2x2YmloaEtYdHlaWFIxY200Z1JXRW9SbUVzWkN4bExHRXNNU2w5S1N4Y0lpaGNJaXhpTEZ3aUtUdGNJaXhuTEZ3aUxtTmhiR3dvZEdocGN5eGhNQ2s3WENJcEtYMHdQRTlpYW1WamRDNXJaWGx6S0dVdWMzUmhkR1VwTG14bGJtZDBhQ1ltWVNoa0xuTm9ZWEpsWkM1amRYSnlaVzUwTEZ3aUxtUnBjblI1UFhSeWRXVTdYQ0lwZldaMWJtTjBhVzl1SUVsaEtHUXNaU3hoTEdJcGUyWjFibU4wYVc5dUlHTW9LWHR5WlhSMWNtNGhNSDFrTG1KaGRHTm9TV1E5WENKaE1Wd2lPM0JoS0dRc1pTazdXQ2hrTEdVc1lTeGlMbUYwZEhKcFluVjBaWE1zWXlrN1ZDaGtMR1VzWVN4aUxuVnVhV1p2Y20xekxHTXBPM1ZoS0dRc1pTeGxMR0VwZldaMWJtTjBhVzl1SUVOaEtHVXNZU3hpTEdNcGUyWjFibU4wYVc5dUlHZ29aU2w3Y21WMGRYSnVJR1V1WTI5dWRHVjRkRVJsY0NZbVhHNTNmSHhsTG5CeWIzQkVaWEI5Wm5WdVkzUnBiMjRnWnlobEtYdHlaWFIxY200aGFDaGxLWDF3WVNobExHRXBPM1poY2lCM1BXSXVZMjl1ZEdWNGRFUmxjQ3g2UFdFdVpHVm1LQ2tzYlQxaExtUmxaaWdwTzJVdWMyaGhjbVZrTG5CeWIzQnpQVzA3WlM1aVlYUmphRWxrUFhvN2RtRnlJR3M5WlM1elkyOXdaU2dwTEhFOVpTNXpZMjl3WlNncE8yRW9heTVsYm5SeWVTeGNJbVp2Y2loY0lpeDZMRndpUFRBN1hDSXNlaXhjSWp4Y0lpeGNJbUV4WENJc1hDSTdLeXRjSWl4NkxGd2lLWHRjSWl4dExGd2lQVndpTEZ3aVlUQmNJaXhjSWx0Y0lpeDZMRndpWFR0Y0lpeHhMRndpZlZ3aUxHc3VaWGhwZENrN1lpNXVaV1ZrYzBOdmJuUmxlSFFtSm1WaEtHVXNjU3hpTG1OdmJuUmxlSFFwTzJJdWJtVmxaSE5HY21GdFpXSjFabVpsY2lZbVR5aGxMSEVzWWk1bWNtRnRaV0oxWm1abGNpazdVU2hsTEhFc1lpNXpkR0YwWlN4b0tUdGlMbkJ5YjJacGJHVW1KbWdvWWk1d2NtOW1hV3hsS1NZbVZpaGxMSEVzWWl3aE1Td2hNQ2s3WXo4b1dDaGxMR3NzWWl4akxtRjBkSEpwWW5WMFpYTXNaeWtzV0NobExIRXNZaXhqTG1GMGRISnBZblYwWlhNc2FDa3NWQ2hsTEdzc1lpeGpMblZ1YVdadmNtMXpMR2NwTEZRb1pTeHhMR0lzWXk1MWJtbG1iM0p0Y3l4b0tTeDFZU2hsTEdzc2NTeGlLU2s2S0dFOVpTNW5iRzlpWVd3dVpHVm1LRndpZTMxY0lpa3NZejFpTG5Ob1lXUmxjaTV3Y205blZtRnlMbUZ3Y0dWdVpDaGxMRnh1Y1Nrc2JUMXhMbVJsWmloakxGd2lMbWxrWENJcExHczljUzVrWldZb1lTeGNJbHRjSWl4dExGd2lYVndpS1N4eEtHVXVjMmhoY21Wa0xtZHNMRndpTG5WelpWQnliMmR5WVcwb1hDSXNZeXhjSWk1d2NtOW5jbUZ0S1R0Y0lpeGNJbWxtS0NGY0lpeHJMRndpS1h0Y0lpeHJMRndpUFZ3aUxHRXNYQ0piWENJc2JTeGNJbDA5WENJc1pTNXNhVzVyS0daMWJtTjBhVzl1S0dFcGUzSmxkSFZ5YmlCRllTaEpZU3hsTEdJc1lTd3lLWDBwTEZ3aUtGd2lMR01zWENJcE8zMWNJaXhyTEZ3aUxtTmhiR3dvZEdocGN5eGhNRnRjSWl4NkxGd2lYU3hjSWl4NkxGd2lLVHRjSWlrcGZXWjFibU4wYVc5dUlFUmhLR1VzWVNsN1puVnVZM1JwYjI0Z1lpaGxLWHR5WlhSMWNtNGdaUzVqYjI1MFpYaDBSR1Z3Smlab2ZIeGxMbkJ5YjNCRVpYQjlkbUZ5SUdNOVpTNXdjbTlqS0Z3aVltRjBZMmhjSWl3eUtUdGxMbUpoZEdOb1NXUTlYQ0l3WENJN2NHRW9aU3hqS1R0MllYSWdhRDBoTVN4blBTRXdPMDlpYW1WamRDNXJaWGx6S0dFdVkyOXVkR1Y0ZENrdVptOXlSV0ZqYUNobWRXNWpkR2x2YmlobEtYdG9QV2g4ZkdFdVkyOXVkR1Y0ZEZ0bFhTNXdjbTl3UkdWd2ZTazdhSHg4S0dWaEtHVXNZeXhoTG1OdmJuUmxlSFFwTEdjOUlURXBPM1poY2lCM1BXRXVabkpoYldWaWRXWm1aWElzZWowaE1UdDNQeWgzTG5CeWIzQkVaWEEvYUQxNlBTRXdPbmN1WTI5dWRHVjRkRVJsY0NZbWFDWW1LSG85SVRBcExGeHVlbng4VHlobExHTXNkeWtwT2s4b1pTeGpMRzUxYkd3cE8yRXVjM1JoZEdVdWRtbGxkM0J2Y25RbUptRXVjM1JoZEdVdWRtbGxkM0J2Y25RdWNISnZjRVJsY0NZbUtHZzlJVEFwTzJoaEtHVXNZeXhoS1R0UktHVXNZeXhoTG5OMFlYUmxMR1oxYm1OMGFXOXVLR1VwZTNKbGRIVnliaUZpS0dVcGZTazdZUzV3Y205bWFXeGxKaVppS0dFdWNISnZabWxzWlNsOGZGWW9aU3hqTEdFc0lURXNYQ0poTVZ3aUtUdGhMbU52Ym5SbGVIUkVaWEE5YUR0aExtNWxaV1J6UTI5dWRHVjRkRDFuTzJFdWJtVmxaSE5HY21GdFpXSjFabVpsY2oxNk8yYzlZUzV6YUdGa1pYSXVjSEp2WjFaaGNqdHBaaWhuTG1OdmJuUmxlSFJFWlhBbUptaDhmR2N1Y0hKdmNFUmxjQ2xEWVNobExHTXNZU3h1ZFd4c0tUdGxiSE5sSUdsbUtHYzlaeTVoY0hCbGJtUW9aU3hqS1N4aktHVXVjMmhoY21Wa0xtZHNMRndpTG5WelpWQnliMmR5WVcwb1hDSXNaeXhjSWk1d2NtOW5jbUZ0S1R0Y0lpa3NZUzV6YUdGa1pYSXVjSEp2WjNKaGJTbERZU2hsTEdNc1lTeGhMbk5vWVdSbGNpNXdjbTluY21GdEtUdGxiSE5sZTNaaGNpQjNQV1V1WjJ4dlltRnNMbVJsWmloY0ludDlYQ0lwTEhvOVl5NWtaV1lvWnl4Y0lpNXBaRndpS1N4eFBXTXVaR1ZtS0hjc1hDSmJYQ0lzZWl4Y0lsMWNJaWs3WXlobExtTnZibVFvY1NrdWRHaGxiaWh4TEZ3aUxtTmhiR3dvZEdocGN5eGhNQ3hoTVNrN1hDSXBXMXdpWld4elpWd2lYU2h4TEZ4dVhDSTlYQ0lzZHl4Y0lsdGNJaXg2TEZ3aVhUMWNJaXhsTG14cGJtc29ablZ1WTNScGIyNG9ZaWw3Y21WMGRYSnVJRVZoS0VOaExHVXNZU3hpTERJcGZTa3NYQ0lvWENJc1p5eGNJaWs3WENJc2NTeGNJaTVqWVd4c0tIUm9hWE1zWVRBc1lURXBPMXdpS1NsOU1EeFBZbXBsWTNRdWEyVjVjeWhoTG5OMFlYUmxLUzVzWlc1bmRHZ21KbU1vWlM1emFHRnlaV1F1WTNWeWNtVnVkQ3hjSWk1a2FYSjBlVDEwY25WbE8xd2lLWDFtZFc1amRHbHZiaUJRWVNobExHRXBlMloxYm1OMGFXOXVJR0lvWnlsN2RtRnlJSGM5WVM1emFHRmtaWEpiWjEwN2R5WW1ZeTV6WlhRb2FDNXphR0ZrWlhJc1hDSXVYQ0lyWnl4M0xtRndjR1Z1WkNobExHTXBLWDEyWVhJZ1l6MWxMbkJ5YjJNb1hDSnpZMjl3WlZ3aUxETXBPMlV1WW1GMFkyaEpaRDFjSW1FeVhDSTdkbUZ5SUdnOVpTNXphR0Z5WldRc1p6MW9MbU4xY25KbGJuUTdaV0VvWlN4akxHRXVZMjl1ZEdWNGRDazdZUzVtY21GdFpXSjFabVpsY2lZbVlTNW1jbUZ0WldKMVptWmxjaTVoY0hCbGJtUW9aU3hqS1R0cktFOWlhbVZqZEM1clpYbHpLR0V1YzNSaGRHVXBLUzVtYjNKRllXTm9LR1oxYm1OMGFXOXVLR0lwZTNaaGNpQm5QV0V1YzNSaGRHVmJZbDB1WVhCd1pXNWtLR1VzWXlrN2VTaG5LVDluTG1admNrVmhZMmdvWm5WdVkzUnBiMjRvWVN4b0tYdGpMbk5sZENobExtNWxlSFJiWWwwc1hDSmJYQ0lyYUN0Y0lsMWNJaXhjYm1FcGZTazZZeTV6WlhRb2FDNXVaWGgwTEZ3aUxsd2lLMklzWnlsOUtUdFdLR1VzWXl4aExDRXdMQ0V3S1R0YlhDSmxiR1Z0Wlc1MGMxd2lMRndpYjJabWMyVjBYQ0lzWENKamIzVnVkRndpTEZ3aWFXNXpkR0Z1WTJWelhDSXNYQ0p3Y21sdGFYUnBkbVZjSWwwdVptOXlSV0ZqYUNobWRXNWpkR2x2YmloaUtYdDJZWElnWnoxaExtUnlZWGRiWWwwN1p5WW1ZeTV6WlhRb2FDNWtjbUYzTEZ3aUxsd2lLMklzWENKY0lpdG5MbUZ3Y0dWdVpDaGxMR01wS1gwcE8wOWlhbVZqZEM1clpYbHpLR0V1ZFc1cFptOXliWE1wTG1admNrVmhZMmdvWm5WdVkzUnBiMjRvWWlsN1l5NXpaWFFvYUM1MWJtbG1iM0p0Y3l4Y0lsdGNJaXRtTG1sa0tHSXBLMXdpWFZ3aUxHRXVkVzVwWm05eWJYTmJZbDB1WVhCd1pXNWtLR1VzWXlrcGZTazdUMkpxWldOMExtdGxlWE1vWVM1aGRIUnlhV0oxZEdWektTNW1iM0pGWVdOb0tHWjFibU4wYVc5dUtHSXBlM1poY2lCb1BXRXVZWFIwY21saWRYUmxjMXRpWFM1aGNIQmxibVFvWlN4aktTeG5QV1V1YzJOdmNHVkJkSFJ5YVdJb1lpazdUMkpxWldOMExtdGxlWE1vYm1WM0lFSmhLUzVtYjNKRllXTm9LR1oxYm1OMGFXOXVLR1VwZTJNdWMyVjBLR2NzWENJdVhDSXJaU3hvVzJWZEtYMHBmU2s3WWloY0luWmxjblJjSWlrN1lpaGNJbVp5WVdkY0lpazdNRHhQWW1wbFkzUXVhMlY1Y3loaExuTjBZWFJsS1M1c1pXNW5kR2dtSmloaktHY3NYRzVjSWk1a2FYSjBlVDEwY25WbE8xd2lLU3hqTG1WNGFYUW9aeXhjSWk1a2FYSjBlVDEwY25WbE8xd2lLU2s3WXloY0ltRXhLRndpTEdVdWMyaGhjbVZrTG1OdmJuUmxlSFFzWENJc1lUQXNYQ0lzWlM1aVlYUmphRWxrTEZ3aUtUdGNJaWw5Wm5WdVkzUnBiMjRnVG1Fb1pTbDdhV1lvWENKdlltcGxZM1JjSWowOVBYUjVjR1Z2WmlCbEppWWhlU2hsS1NsN1ptOXlLSFpoY2lCaFBVOWlhbVZqZEM1clpYbHpLR1VwTEdJOU1EdGlQR0V1YkdWdVozUm9PeXNyWWlscFppaG5MbWx6UkhsdVlXMXBZeWhsVzJGYllsMWRLU2x5WlhSMWNtNGhNRHR5WlhSMWNtNGhNWDE5Wm5WdVkzUnBiMjRnU21Fb1pTeGlMR01wZTJaMWJtTjBhVzl1SUdnb1pTeGhLWHR4TG1admNrVmhZMmdvWm5WdVkzUnBiMjRvWkNsN2RtRnlJR0k5ZDF0a1hUdG5MbWx6UkhsdVlXMXBZeWhpS1NZbUtHSTlaUzVwYm5admEyVW9ZU3hpS1N4aEtHNHNYQ0l1WENJc1pDeGNJajFjSWl4aUxGd2lPMXdpS1NsOUtYMTJZWElnZHoxaVcxd2ljM1JoZEdsalhDSmRXMk5kTzJsbUtIY21KazVoS0hjcEtYdDJZWElnZWoxbExtZHNiMkpoYkN4eFBVOWlhbVZqZEM1clpYbHpLSGNwTEdzOUlURXNiVDBoTVN4bVBTRXhMRzQ5WlM1bmJHOWlZV3d1WkdWbUtGd2llMzFjSWlrN2NTNW1iM0pGWVdOb0tHWjFibU4wYVc5dUtHSXBlM1poY2lCalBYZGJZbDA3YVdZb1p5NXBjMFI1Ym1GdGFXTW9ZeWtwWENKbWRXNWpkR2x2Ymx3aVBUMDlYRzUwZVhCbGIyWWdZeVltS0dNOWQxdGlYVDFuTG5WdVltOTRLR01wS1N4aVBXRW9ZeXh1ZFd4c0tTeHJQV3Q4ZkdJdWRHaHBjMFJsY0N4bVBXWjhmR0l1Y0hKdmNFUmxjQ3h0UFcxOGZHSXVZMjl1ZEdWNGRFUmxjRHRsYkhObGUzb29iaXhjSWk1Y0lpeGlMRndpUFZ3aUtUdHpkMmwwWTJnb2RIbHdaVzltSUdNcGUyTmhjMlVnWENKdWRXMWlaWEpjSWpwNktHTXBPMkp5WldGck8yTmhjMlVnWENKemRISnBibWRjSWpwNktDZGNJaWNzWXl3blhDSW5LVHRpY21WaGF6dGpZWE5sSUZ3aWIySnFaV04wWENJNlFYSnlZWGt1YVhOQmNuSmhlU2hqS1NZbWVpaGNJbHRjSWl4akxtcHZhVzRvS1N4Y0lsMWNJaWs3WW5KbFlXczdaR1ZtWVhWc2REcDZLR1V1YkdsdWF5aGpLU2w5ZWloY0lqdGNJaWw5ZlNrN1lpNWtlVzVoYldsalcyTmRQVzVsZHlCbkxrUjVibUZ0YVdOV1lYSnBZV0pzWlNnMExIdDBhR2x6UkdWd09tc3NZMjl1ZEdWNGRFUmxjRHB0TEhCeWIzQkVaWEE2Wml4eVpXWTZiaXhoY0hCbGJtUTZhSDBwTzJSbGJHVjBaU0JpVzF3aWMzUmhkR2xqWENKZFcyTmRmWDEyWVhJZ1FtRTlRV0V1VW1WamIzSmtMR05oUFh0aFpHUTZNekkzTnpRc2MzVmlkSEpoWTNRNk16STNOemdzWENKeVpYWmxjbk5sSUhOMVluUnlZV04wWENJNk16STNOemw5TzNRdVpYaDBYMkpzWlc1a1gyMXBibTFoZUNZbUtHTmhMbTFwYmowek1qYzNOU3hqWVM1dFlYZzlNekkzTnpZcE8xeHVkbUZ5SUhSaFBYUXVZVzVuYkdWZmFXNXpkR0Z1WTJWa1gyRnljbUY1Y3l4dllUMTBMbmRsWW1kc1gyUnlZWGRmWW5WbVptVnljeXhsUFh0a2FYSjBlVG9oTUN4d2NtOW1hV3hsT21kaExuQnliMlpwYkdWOUxIbzllMzBzZHoxYlhTeDNZVDE3ZlN4NFlUMTdmVHRTS0Z3aVpHbDBhR1Z5WENJc016QXlOQ2s3VWloY0ltSnNaVzVrTG1WdVlXSnNaVndpTERNd05ESXBPMGNvWENKaWJHVnVaQzVqYjJ4dmNsd2lMRndpWW14bGJtUkRiMnh2Y2x3aUxGc3dMREFzTUN3d1hTazdSeWhjSW1Kc1pXNWtMbVZ4ZFdGMGFXOXVYQ0lzWENKaWJHVnVaRVZ4ZFdGMGFXOXVVMlZ3WVhKaGRHVmNJaXhiTXpJM056UXNNekkzTnpSZEtUdEhLRndpWW14bGJtUXVablZ1WTF3aUxGd2lZbXhsYm1SR2RXNWpVMlZ3WVhKaGRHVmNJaXhiTVN3d0xERXNNRjBwTzFJb1hDSmtaWEIwYUM1bGJtRmliR1ZjSWl3eU9USTVMQ0V3S1R0SEtGd2laR1Z3ZEdndVpuVnVZMXdpTEZ3aVpHVndkR2hHZFc1alhDSXNOVEV6S1R0SEtGd2laR1Z3ZEdndWNtRnVaMlZjSWl4Y0ltUmxjSFJvVW1GdVoyVmNJaXhiTUN3eFhTazdSeWhjSW1SbGNIUm9MbTFoYzJ0Y0lpeGNJbVJsY0hSb1RXRnphMXdpTENFd0tUdEhLRndpWTI5c2IzSk5ZWE5yWENJc1hDSmpiMnh2Y2sxaGMydGNJaXhiSVRBc0lUQXNJVEFzSVRCZEtUdFNLRndpWTNWc2JDNWxibUZpYkdWY0lpd3lPRGcwS1R0SEtGd2lZM1ZzYkM1bVlXTmxYQ0lzWENKamRXeHNSbUZqWlZ3aUxGeHVNVEF5T1NrN1J5aGNJbVp5YjI1MFJtRmpaVndpTEZ3aVpuSnZiblJHWVdObFhDSXNNak13TlNrN1J5aGNJbXhwYm1WWGFXUjBhRndpTEZ3aWJHbHVaVmRwWkhSb1hDSXNNU2s3VWloY0luQnZiSGxuYjI1UFptWnpaWFF1Wlc1aFlteGxYQ0lzTXpJNE1qTXBPMGNvWENKd2IyeDVaMjl1VDJabWMyVjBMbTltWm5ObGRGd2lMRndpY0c5c2VXZHZiazltWm5ObGRGd2lMRnN3TERCZEtUdFNLRndpYzJGdGNHeGxMbUZzY0doaFhDSXNNekk1TWpZcE8xSW9YQ0p6WVcxd2JHVXVaVzVoWW14bFhDSXNNekk1TWpncE8wY29YQ0p6WVcxd2JHVXVZMjkyWlhKaFoyVmNJaXhjSW5OaGJYQnNaVU52ZG1WeVlXZGxYQ0lzV3pFc0lURmRLVHRTS0Z3aWMzUmxibU5wYkM1bGJtRmliR1ZjSWl3eU9UWXdLVHRIS0Z3aWMzUmxibU5wYkM1dFlYTnJYQ0lzWENKemRHVnVZMmxzVFdGemExd2lMQzB4S1R0SEtGd2ljM1JsYm1OcGJDNW1kVzVqWENJc1hDSnpkR1Z1WTJsc1JuVnVZMXdpTEZzMU1Ua3NNQ3d0TVYwcE8wY29YQ0p6ZEdWdVkybHNMbTl3Um5KdmJuUmNJaXhjSW5OMFpXNWphV3hQY0ZObGNHRnlZWFJsWENJc1d6RXdNamdzTnpZNE1DdzNOamd3TERjMk9EQmRLVHRIS0Z3aWMzUmxibU5wYkM1dmNFSmhZMnRjSWl4Y0luTjBaVzVqYVd4UGNGTmxjR0Z5WVhSbFhDSXNXekV3TWprc056WTRNQ3czTmpnd0xEYzJPREJkS1R0U0tGd2ljMk5wYzNOdmNpNWxibUZpYkdWY0lpd3pNRGc1S1R0SEtGd2ljMk5wYzNOdmNpNWliM2hjSWl4Y2Jsd2ljMk5wYzNOdmNsd2lMRnN3TERBc2FDNWtjbUYzYVc1blFuVm1abVZ5VjJsa2RHZ3NhQzVrY21GM2FXNW5RblZtWm1WeVNHVnBaMmgwWFNrN1J5aGNJblpwWlhkd2IzSjBYQ0lzWENKMmFXVjNjRzl5ZEZ3aUxGc3dMREFzYUM1a2NtRjNhVzVuUW5WbVptVnlWMmxrZEdnc2FDNWtjbUYzYVc1blFuVm1abVZ5U0dWcFoyaDBYU2s3ZG1GeUlGRmhQWHRuYkRwb0xHTnZiblJsZUhRNlV5eHpkSEpwYm1kek9tWXNibVY0ZERwNkxHTjFjbkpsYm5RNlpTeGtjbUYzT25Fc1pXeGxiV1Z1ZEhNNmRTeGlkV1ptWlhJNlRTeHphR0ZrWlhJNmRtRXNZWFIwY21saWRYUmxjenBCWVM1emRHRjBaU3gxYm1sbWIzSnRjenBMTEdaeVlXMWxZblZtWm1WeU9rUXNaWGgwWlc1emFXOXVjenAwTEhScGJXVnlPbTFoTEdselFuVm1abVZ5UVhKbmN6cHNmU3hOWVQxN2NISnBiVlI1Y0dWek9rVXNZMjl0Y0dGeVpVWjFibU56T2tJc1lteGxibVJHZFc1amN6cHRMR0pzWlc1a1JYRjFZWFJwYjI1ek9tTmhMSE4wWlc1amFXeFBjSE02V1N4bmJGUjVjR1Z6T2tNc2IzSnBaVzUwWVhScGIyNVVlWEJsT2t4OU8yOWhKaVlvVFdFdVltRmphMEoxWm1abGNqMWJNVEF5T1Ywc1RXRXVaSEpoZDBKMVptWmxjajFHS0hBdWJXRjRSSEpoZDJKMVptWmxjbk1zWm5WdVkzUnBiMjRvWlNsN2NtVjBkWEp1SURBOVBUMWxQMXN3WFRwR0tHVXNablZ1WTNScGIyNG9aU2w3Y21WMGRYSnVJRE0yTURZMEsxeHVaWDBwZlNrcE8zWmhjaUJTWVQwd08zSmxkSFZ5Ym50dVpYaDBPbm9zWTNWeWNtVnVkRHBsTEhCeWIyTnpPbVoxYm1OMGFXOXVLQ2w3ZG1GeUlHRTlZbUVvS1N4aVBXRXVjSEp2WXloY0luQnZiR3hjSWlrc1l6MWhMbkJ5YjJNb1hDSnlaV1p5WlhOb1hDSXBMR2M5WVM1aWJHOWpheWdwTzJJb1p5azdZeWhuS1R0MllYSWdkejFoTG5Ob1lYSmxaQ3g2UFhjdVoyd3NjVDEzTG01bGVIUXNhejEzTG1OMWNuSmxiblE3WnlockxGd2lMbVJwY25SNVBXWmhiSE5sTzF3aUtUdFBLR0VzWWlrN1R5aGhMR01zYm5Wc2JDd2hNQ2s3ZG1GeUlHMDlhQzVuWlhSRmVIUmxibk5wYjI0b1hDSmhibWRzWlY5cGJuTjBZVzVqWldSZllYSnlZWGx6WENJcExHWTdiU1ltS0dZOVlTNXNhVzVyS0cwcEtUdG1iM0lvZG1GeUlHNDlNRHR1UEhBdWJXRjRRWFIwY21saWRYUmxjenNySzI0cGUzWmhjaUJzUFdNdVpHVm1LSGN1WVhSMGNtbGlkWFJsY3l4Y0lsdGNJaXh1TEZ3aVhWd2lLU3hDUFdFdVkyOXVaQ2hzTEZ3aUxtSjFabVpsY2x3aUtUdENMblJvWlc0b2VpeGNJaTVsYm1GaWJHVldaWEowWlhoQmRIUnlhV0pCY25KaGVTaGNJaXh1TEZ3aUtUdGNJaXg2TEZ3aUxtSnBibVJDZFdabVpYSW9YQ0lzTXpRNU5qSXNYQ0lzWENJc2JDeGNJaTVpZFdabVpYSXVZblZtWm1WeUtUdGNJaXg2TEZ3aUxuWmxjblJsZUVGMGRISnBZbEJ2YVc1MFpYSW9YQ0lzYml4Y0lpeGNJaXhzTEZ3aUxuTnBlbVVzWENJc1hHNXNMRndpTG5SNWNHVXNYQ0lzYkN4Y0lpNXViM0p0WVd4cGVtVmtMRndpTEd3c1hDSXVjM1J5YVdSbExGd2lMR3dzWENJdWIyWm1jMlYwS1R0Y0lpbGJYQ0psYkhObFhDSmRLSG9zWENJdVpHbHpZV0pzWlZabGNuUmxlRUYwZEhKcFlrRnljbUY1S0Z3aUxHNHNYQ0lwTzF3aUxIb3NYQ0l1ZG1WeWRHVjRRWFIwY21saU5HWW9YQ0lzYml4Y0lpeGNJaXhzTEZ3aUxuZ3NYQ0lzYkN4Y0lpNTVMRndpTEd3c1hDSXVlaXhjSWl4c0xGd2lMbmNwTzF3aUxHd3NYQ0l1WW5WbVptVnlQVzUxYkd3N1hDSXBPMk1vUWlrN2JTWW1ZeWhtTEZ3aUxuWmxjblJsZUVGMGRISnBZa1JwZG1semIzSkJUa2RNUlNoY0lpeHVMRndpTEZ3aUxHd3NYQ0l1WkdsMmFYTnZjaWs3WENJcGZVOWlhbVZqZEM1clpYbHpLSGRoS1M1bWIzSkZZV05vS0daMWJtTjBhVzl1S0dVcGUzWmhjaUJvUFhkaFcyVmRMSGM5Wnk1a1pXWW9jU3hjSWk1Y0lpeGxLU3h0UFdFdVlteHZZMnNvS1R0dEtGd2lhV1lvWENJc2R5eGNJaWw3WENJc2VpeGNJaTVsYm1GaWJHVW9YQ0lzYUN4Y0lpbDlaV3h6Wlh0Y0lpeDZMRndpTG1ScGMyRmliR1VvWENJc2FDeGNJaWw5WENJc2F5eGNJaTVjSWl4bExGd2lQVndpTEhjc1hDSTdYQ0lwTzJNb2JTazdZaWhjSW1sbUtGd2lMSGNzWENJaFBUMWNJaXhyTEZ3aUxsd2lMR1VzWENJcGUxd2lMRzBzWENKOVhDSXBmU2s3VDJKcVpXTjBMbXRsZVhNb2VHRXBMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9hQ2w3ZG1GeUlIYzllR0ZiYUYwc2JUMWxXMmhkTEdZc1hHNXVMR3c5WVM1aWJHOWpheWdwTzJ3b2VpeGNJaTVjSWl4M0xGd2lLRndpS1R0NUtHMHBQeWgzUFcwdWJHVnVaM1JvTEdZOVlTNW5iRzlpWVd3dVpHVm1LSEVzWENJdVhDSXNhQ2tzYmoxaExtZHNiMkpoYkM1a1pXWW9heXhjSWk1Y0lpeG9LU3hzS0VZb2R5eG1kVzVqZEdsdmJpaGxLWHR5WlhSMWNtNGdaaXRjSWx0Y0lpdGxLMXdpWFZ3aWZTa3NYQ0lwTzF3aUxFWW9keXhtZFc1amRHbHZiaWhsS1h0eVpYUjFjbTRnYml0Y0lsdGNJaXRsSzF3aVhUMWNJaXRtSzF3aVcxd2lLMlVyWENKZE8xd2lmU2t1YW05cGJpaGNJbHdpS1Nrc1lpaGNJbWxtS0Z3aUxFWW9keXhtZFc1amRHbHZiaWhsS1h0eVpYUjFjbTRnWml0Y0lsdGNJaXRsSzF3aVhTRTlQVndpSzI0clhDSmJYQ0lyWlN0Y0lsMWNJbjBwTG1wdmFXNG9YQ0o4ZkZ3aUtTeGNJaWw3WENJc2JDeGNJbjFjSWlrcE9paG1QV2N1WkdWbUtIRXNYQ0l1WENJc2FDa3NiajFuTG1SbFppaHJMRndpTGx3aUxHZ3BMR3dvWml4Y0lpazdYQ0lzYXl4Y0lpNWNJaXhvTEZ3aVBWd2lMR1lzWENJN1hDSXBMR0lvWENKcFppaGNJaXhtTEZ3aUlUMDlYQ0lzYml4Y0lpbDdYQ0lzYkN4Y0luMWNJaWtwTzJNb2JDbDlLVHR5WlhSMWNtNGdZUzVqYjIxd2FXeGxLQ2w5S0Nrc1kyOXRjR2xzWlRwbWRXNWpkR2x2YmlobExHRXNZaXhqTEdncGUzWmhjaUJuUFdKaEtDazdaeTV6ZEdGMGN6MW5MbXhwYm1zb2FDazdUMkpxWldOMExtdGxlWE1vWVZ0Y0luTjBZWFJwWTF3aVhTa3VabTl5UldGamFDaG1kVzVqZEdsdmJpaGxLWHRLWVNobkxGeHVZU3hsS1gwcE8yNHVabTl5UldGamFDaG1kVzVqZEdsdmJpaGhLWHRLWVNobkxHVXNZU2w5S1R0aVBXeGhLR1VzWVN4aUxHTXNaeWs3U0dFb1p5eGlLVHRRWVNobkxHSXBPMFJoS0djc1lpazdjbVYwZFhKdUlHY3VZMjl0Y0dsc1pTZ3BmWDE5ZlN4N1hDSXVMMk52Ym5OMFlXNTBjeTlrZEhsd1pYTXVhbk52Ymx3aU9qUXNYQ0l1TDJOdmJuTjBZVzUwY3k5d2NtbHRhWFJwZG1WekxtcHpiMjVjSWpvMUxGd2lMaTlrZVc1aGJXbGpYQ0k2T0N4Y0lpNHZkWFJwYkM5amIyUmxaMlZ1WENJNk1qRXNYQ0l1TDNWMGFXd3ZhWE10WVhKeVlYa3RiR2xyWlZ3aU9qSTBMRndpTGk5MWRHbHNMMmx6TFc1a1lYSnlZWGxjSWpveU5TeGNJaTR2ZFhScGJDOXBjeTEwZVhCbFpDMWhjbkpoZVZ3aU9qSTJMRndpTGk5MWRHbHNMMnh2YjNCY0lqb3lOMzFkTERnNlcyWjFibU4wYVc5dUtHWXNjQ3gxS1h0bWRXNWpkR2x2YmlCc0tHTXNZU2w3ZEdocGN5NXBaRDF5S3lzN2RHaHBjeTUwZVhCbFBXTTdkR2hwY3k1a1lYUmhQV0Y5Wm5WdVkzUnBiMjRnYXloaktYdHBaaWd3UFQwOVl5NXNaVzVuZEdncGNtVjBkWEp1VzEwN2RtRnlJR0U5WXk1amFHRnlRWFFvTUNrc1lqMWpMbU5vWVhKQmRDaGpMbXhsYm1kMGFDMHhLVHRwWmlneFBHTXViR1Z1WjNSb0ppWmhQVDA5WWlZbUtDZGNJaWM5UFQxaGZIeGNJaWRjSWowOVBXRXBLWEpsZEhWeWJsc25YQ0luSzJNdWMzVmljM1J5S0RFc1hHNWpMbXhsYm1kMGFDMHlLUzV5WlhCc1lXTmxLQzljWEZ4Y0wyY3NYQ0pjWEZ4Y1hGeGNYRndpS1M1eVpYQnNZV05sS0M5Y0lpOW5MQ2RjWEZ4Y1hDSW5LU3NuWENJblhUdHBaaWhoUFM5Y1hGc29abUZzYzJWOGRISjFaWHh1ZFd4c2ZGeGNaQ3Q4SjF0ZUoxMHFKM3hjSWx0ZVhDSmRLbHdpS1Z4Y1hTOHVaWGhsWXloaktTbHlaWFIxY200Z2F5aGpMbk4xWW5OMGNpZ3dMR0V1YVc1a1pYZ3BLUzVqYjI1allYUW9heWhoV3pGZEtTa3VZMjl1WTJGMEtHc29ZeTV6ZFdKemRISW9ZUzVwYm1SbGVDdGhXekJkTG14bGJtZDBhQ2twS1R0aFBXTXVjM0JzYVhRb1hDSXVYQ0lwTzJsbUtERTlQVDFoTG14bGJtZDBhQ2x5WlhSMWNtNWJKMXdpSnl0akxuSmxjR3hoWTJVb0wxeGNYRnd2Wnl4Y0lseGNYRnhjWEZ4Y1hDSXBMbkpsY0d4aFkyVW9MMXdpTDJjc0oxeGNYRnhjSWljcEt5ZGNJaWRkTzJNOVcxMDdabTl5S0dJOU1EdGlQR0V1YkdWdVozUm9PeXNyWWlsalBXTXVZMjl1WTJGMEtHc29ZVnRpWFNrcE8zSmxkSFZ5YmlCamZXWjFibU4wYVc5dUlIZ29ZeWw3Y21WMGRYSnVYQ0piWENJcmF5aGpLUzVxYjJsdUtGd2lYVnRjSWlrclhDSmRYQ0o5ZG1GeUlISTlNRHR3TG1WNGNHOXlkSE05ZTBSNWJtRnRhV05XWVhKcFlXSnNaVHBzTEdSbFptbHVaVHBtZFc1amRHbHZiaWhqTEdFcGUzSmxkSFZ5YmlCdVpYY2diQ2hqTEhnb1lTdGNJbHdpS1NsOUxHbHpSSGx1WVcxcFl6cG1kVzVqZEdsdmJpaGpLWHR5WlhSMWNtNWNJbVoxYm1OMGFXOXVYQ0k5UFQxY2JuUjVjR1Z2WmlCakppWWhZeTVmY21WbmJGUjVjR1Y4ZkdNZ2FXNXpkR0Z1WTJWdlppQnNmU3gxYm1KdmVEcG1kVzVqZEdsdmJpaGpMR0VwZTNKbGRIVnlibHdpWm5WdVkzUnBiMjVjSWowOVBYUjVjR1Z2WmlCalAyNWxkeUJzS0RBc1l5azZZMzBzWVdOalpYTnpiM0k2ZUgxOUxIdDlYU3c1T2x0bWRXNWpkR2x2YmlobUxIQXNkU2w3ZG1GeUlHdzlaaWhjSWk0dmRYUnBiQzlwY3kxMGVYQmxaQzFoY25KaGVWd2lLU3hyUFdZb1hDSXVMM1YwYVd3dmFYTXRibVJoY25KaGVWd2lLU3g0UFdZb1hDSXVMM1YwYVd3dmRtRnNkV1Z6WENJcExISTlaaWhjSWk0dlkyOXVjM1JoYm5SekwzQnlhVzFwZEdsMlpYTXVhbk52Ymx3aUtTeGpQV1lvWENJdUwyTnZibk4wWVc1MGN5OTFjMkZuWlM1cWMyOXVYQ0lwTzNBdVpYaHdiM0owY3oxbWRXNWpkR2x2YmloaExHSXNaaXh3S1h0bWRXNWpkR2x2YmlCMEtHRXBlM1JvYVhNdWFXUTlReXNyTzBWYmRHaHBjeTVwWkYwOWRHaHBjenQwYUdsekxtSjFabVpsY2oxaE8zUm9hWE11Y0hKcGJWUjVjR1U5TkR0MGFHbHpMblI1Y0dVOWRHaHBjeTUyWlhKMFEyOTFiblE5TUgxbWRXNWpkR2x2YmlCNUtHTXNaeXh1TEhJc2VDeG9MSFFwZTJNdVluVm1abVZ5TG1KcGJtUW9LVHRwWmlobktYdDJZWElnZVQxME8zUjhmR3dvWnlrbUppZ2hheWhuS1h4OGJDaG5MbVJoZEdFcEtYeDhLSGs5WWk1dlpYTmZaV3hsYldWdWRGOXBibVJsZUY5MWFXNTBQMXh1TlRFeU5UbzFNVEl6S1R0bUxsOXBibWwwUW5WbVptVnlLR011WW5WbVptVnlMR2NzYml4NUxETXBmV1ZzYzJVZ1lTNWlkV1ptWlhKRVlYUmhLRE0wT1RZekxHZ3NiaWtzWXk1aWRXWm1aWEl1WkhSNWNHVTllWHg4TlRFeU1TeGpMbUoxWm1abGNpNTFjMkZuWlQxdUxHTXVZblZtWm1WeUxtUnBiV1Z1YzJsdmJqMHpMR011WW5WbVptVnlMbUo1ZEdWTVpXNW5kR2c5YUR0NVBYUTdhV1lvSVhRcGUzTjNhWFJqYUNoakxtSjFabVpsY2k1a2RIbHdaU2w3WTJGelpTQTFNVEl4T21OaGMyVWdOVEV5TURwNVBUVXhNakU3WW5KbFlXczdZMkZ6WlNBMU1USXpPbU5oYzJVZ05URXlNanA1UFRVeE1qTTdZbkpsWVdzN1kyRnpaU0ExTVRJMU9tTmhjMlVnTlRFeU5EcDVQVFV4TWpWOVl5NWlkV1ptWlhJdVpIUjVjR1U5ZVgxakxuUjVjR1U5ZVR0blBYZzdNRDVuSmlZb1p6MWpMbUoxWm1abGNpNWllWFJsVEdWdVozUm9MRFV4TWpNOVBUMTVQMmMrUGoweE9qVXhNalU5UFQxNUppWW9aejQrUFRJcEtUdGpMblpsY25SRGIzVnVkRDFuTzJjOWNqc3dQbkltSmloblBUUXNjajFqTG1KMVptWmxjaTVrYVcxbGJuTnBiMjRzTVQwOVBYSW1KaWhuUFRBcExESTlQVDF5SmlZb1p6MHhLU3d6UFQwOWNpWW1LR2M5TkNrcE8yTXVjSEpwYlZSNWNHVTlaMzFtZFc1amRHbHZiaUJuS0dFcGUzQXVaV3hsYldWdWRITkRiM1Z1ZEMwdE8xeHVaR1ZzWlhSbElFVmJZUzVwWkYwN1lTNWlkV1ptWlhJdVpHVnpkSEp2ZVNncE8yRXVZblZtWm1WeVBXNTFiR3g5ZG1GeUlFVTllMzBzUXowd0xFNDllM1ZwYm5RNE9qVXhNakVzZFdsdWRERTJPalV4TWpOOU8ySXViMlZ6WDJWc1pXMWxiblJmYVc1a1pYaGZkV2x1ZENZbUtFNHVkV2x1ZERNeVBUVXhNalVwTzNRdWNISnZkRzkwZVhCbExtSnBibVE5Wm5WdVkzUnBiMjRvS1h0MGFHbHpMbUoxWm1abGNpNWlhVzVrS0NsOU8zWmhjaUJ1UFZ0ZE8zSmxkSFZ5Ym50amNtVmhkR1U2Wm5WdVkzUnBiMjRvWVN4aUtYdG1kVzVqZEdsdmJpQnVLR0VwZTJsbUtHRXBhV1lvWENKdWRXMWlaWEpjSWowOVBYUjVjR1Z2WmlCaEtYZ29ZU2tzUXk1d2NtbHRWSGx3WlQwMExFTXVkbVZ5ZEVOdmRXNTBQV0Y4TUN4RExuUjVjR1U5TlRFeU1UdGxiSE5sZTNaaGNpQmlQVzUxYkd3c1p6MHpOVEEwTkN4dFBTMHhMR1k5TFRFc2REMHdMRUk5TUR0cFppaEJjbkpoZVM1cGMwRnljbUY1S0dFcGZIeHNLR0VwZkh4cktHRXBLV0k5WVR0bGJITmxJR2xtS0Z3aVpHRjBZVndpYVc0Z1lTWW1LR0k5WVM1a1lYUmhLU3hjSW5WellXZGxYQ0pwYmlCaEppWW9aejFqVzJFdWRYTmhaMlZkS1N4Y0luQnlhVzFwZEdsMlpWd2lhVzRnWVNZbUtHMDljbHRoTG5CeWFXMXBkR2wyWlYwcExGd2lZMjkxYm5SY0ltbHVJR0VtSmlobVBXRXVZMjkxYm5SOE1Da3NYRzVjSW5SNWNHVmNJbWx1SUdFbUppaENQVTViWVM1MGVYQmxYU2tzWENKc1pXNW5kR2hjSW1sdUlHRXBkRDFoTG14bGJtZDBhSHd3TzJWc2MyVWdhV1lvZEQxbUxEVXhNak05UFQxQ2ZIdzFNVEl5UFQwOVFpbDBLajB5TzJWc2MyVWdhV1lvTlRFeU5UMDlQVUo4ZkRVeE1qUTlQVDFDS1hRcVBUUTdlU2hETEdJc1p5eHRMR1lzZEN4Q0tYMWxiSE5sSUhnb0tTeERMbkJ5YVcxVWVYQmxQVFFzUXk1MlpYSjBRMjkxYm5ROU1DeERMblI1Y0dVOU5URXlNVHR5WlhSMWNtNGdibjEyWVhJZ2VEMW1MbU55WldGMFpTaHVkV3hzTERNME9UWXpMQ0V3S1N4RFBXNWxkeUIwS0hndVgySjFabVpsY2lrN2NDNWxiR1Z0Wlc1MGMwTnZkVzUwS3lzN2JpaGhLVHR1TGw5eVpXZHNWSGx3WlQxY0ltVnNaVzFsYm5SelhDSTdiaTVmWld4bGJXVnVkSE05UXp0dUxuTjFZbVJoZEdFOVpuVnVZM1JwYjI0b1lTeGlLWHQ0TG5OMVltUmhkR0VvWVN4aUtUdHlaWFIxY200Z2JuMDdiaTVrWlhOMGNtOTVQV1oxYm1OMGFXOXVLQ2w3WnloREtYMDdjbVYwZFhKdUlHNTlMR055WldGMFpWTjBjbVZoYlRwbWRXNWpkR2x2YmloaEtYdDJZWElnWWoxdUxuQnZjQ2dwTzJKOGZDaGlQVzVsZHlCMEtHWXVZM0psWVhSbEtHNTFiR3dzTXpRNU5qTXNJVEFzSVRFcExsOWlkV1ptWlhJcEtUdDVLR0lzWVN3ek5UQTBNQ3d0TVN3dE1Td3dMREFwTzNKbGRIVnliaUJpZlN4Y2JtUmxjM1J5YjNsVGRISmxZVzA2Wm5WdVkzUnBiMjRvWVNsN2JpNXdkWE5vS0dFcGZTeG5aWFJGYkdWdFpXNTBjenBtZFc1amRHbHZiaWhoS1h0eVpYUjFjbTVjSW1aMWJtTjBhVzl1WENJOVBUMTBlWEJsYjJZZ1lTWW1ZUzVmWld4bGJXVnVkSE1nYVc1emRHRnVZMlZ2WmlCMFAyRXVYMlZzWlcxbGJuUnpPbTUxYkd4OUxHTnNaV0Z5T21aMWJtTjBhVzl1S0NsN2VDaEZLUzVtYjNKRllXTm9LR2NwZlgxOWZTeDdYQ0l1TDJOdmJuTjBZVzUwY3k5d2NtbHRhWFJwZG1WekxtcHpiMjVjSWpvMUxGd2lMaTlqYjI1emRHRnVkSE12ZFhOaFoyVXVhbk52Ymx3aU9qWXNYQ0l1TDNWMGFXd3ZhWE10Ym1SaGNuSmhlVndpT2pJMUxGd2lMaTkxZEdsc0wybHpMWFI1Y0dWa0xXRnljbUY1WENJNk1qWXNYQ0l1TDNWMGFXd3ZkbUZzZFdWelhDSTZNekY5WFN3eE1EcGJablZ1WTNScGIyNG9aaXh3TEhVcGUzQXVaWGh3YjNKMGN6MW1kVzVqZEdsdmJpaG1MR3NwZTJaMWJtTjBhVzl1SUhnb1lTbDdZVDFoTG5SdlRHOTNaWEpEWVhObEtDazdkbUZ5SUdNN2RISjVlMk05Y2x0aFhUMW1MbWRsZEVWNGRHVnVjMmx2YmloaEtYMWpZWFJqYUNocktYdDljbVYwZFhKdUlTRmpmV1p2Y2loMllYSWdjajE3ZlN4alBUQTdZenhyTG1WNGRHVnVjMmx2Ym5NdWJHVnVaM1JvT3lzcll5bDdkbUZ5SUdFOWF5NWxlSFJsYm5OcGIyNXpXMk5kTzJsbUtDRjRLR0VwS1hKbGRIVnliaUJyTG05dVJHVnpkSEp2ZVNncExGeHVheTV2YmtSdmJtVW9KMXdpSnl0aEt5ZGNJaUJsZUhSbGJuTnBiMjRnYVhNZ2JtOTBJSE4xY0hCdmNuUmxaQ0JpZVNCMGFHVWdZM1Z5Y21WdWRDQlhaV0pIVENCamIyNTBaWGgwTENCMGNua2dkWEJuY21Ga2FXNW5JSGx2ZFhJZ2MzbHpkR1Z0SUc5eUlHRWdaR2xtWm1WeVpXNTBJR0p5YjNkelpYSW5LU3h1ZFd4c2ZXc3ViM0IwYVc5dVlXeEZlSFJsYm5OcGIyNXpMbVp2Y2tWaFkyZ29lQ2s3Y21WMGRYSnVlMlY0ZEdWdWMybHZibk02Y2l4eVpYTjBiM0psT21aMWJtTjBhVzl1S0NsN1QySnFaV04wTG10bGVYTW9jaWt1Wm05eVJXRmphQ2htZFc1amRHbHZiaWhoS1h0cFppZ2hlQ2hoS1NsMGFISnZkeUJGY25KdmNpaGNJaWh5Wldkc0tUb2daWEp5YjNJZ2NtVnpkRzl5YVc1bklHVjRkR1Z1YzJsdmJpQmNJaXRoS1R0OUtYMTlmWDBzZTMxZExERXhPbHRtZFc1amRHbHZiaWhtTEhBc2RTbDdkbUZ5SUd3OVppaGNJaTR2ZFhScGJDOTJZV3gxWlhOY0lpa3NhejFtS0Z3aUxpOTFkR2xzTDJWNGRHVnVaRndpS1N4NFBWdGRPM2hiTmpRd09GMDlORHQyWVhJZ2NqMWJYVHR5V3pVeE1qRmRQVEU3Y2xzMU1USTJYVDAwTzNKYk16WXhPVE5kUFRJN2NDNWxlSEJ2Y25SelBXWjFibU4wYVc5dUtHTXNZU3hpTEdZc2NDeDBLWHRtZFc1amRHbHZiaUI1S0dFc1l5eGlLWHQwYUdsekxuUmhjbWRsZEQxaE8zUm9hWE11ZEdWNGRIVnlaVDFjYm1NN2RHaHBjeTV5Wlc1a1pYSmlkV1ptWlhJOVlqdDJZWElnYUQxaFBUQTdZejhvWVQxakxuZHBaSFJvTEdnOVl5NW9aV2xuYUhRcE9tSW1KaWhoUFdJdWQybGtkR2dzYUQxaUxtaGxhV2RvZENrN2RHaHBjeTUzYVdSMGFEMWhPM1JvYVhNdWFHVnBaMmgwUFdoOVpuVnVZM1JwYjI0Z1p5aGhLWHRoSmlZb1lTNTBaWGgwZFhKbEppWmhMblJsZUhSMWNtVXVYM1JsZUhSMWNtVXVaR1ZqVW1WbUtDa3NZUzV5Wlc1a1pYSmlkV1ptWlhJbUptRXVjbVZ1WkdWeVluVm1abVZ5TGw5eVpXNWtaWEppZFdabVpYSXVaR1ZqVW1WbUtDa3BmV1oxYm1OMGFXOXVJRVVvWVN4akxHSXBlMkVtSmloaExuUmxlSFIxY21VL1lTNTBaWGgwZFhKbExsOTBaWGgwZFhKbExuSmxaa052ZFc1MEt6MHhPbUV1Y21WdVpHVnlZblZtWm1WeUxsOXlaVzVrWlhKaWRXWm1aWEl1Y21WbVEyOTFiblFyUFRFcGZXWjFibU4wYVc5dUlFTW9ZU3hpS1h0aUppWW9ZaTUwWlhoMGRYSmxQMk11Wm5KaGJXVmlkV1ptWlhKVVpYaDBkWEpsTWtRb016WXhOakFzWVN4aUxuUmhjbWRsZEN4aUxuUmxlSFIxY21VdVgzUmxlSFIxY21VdWRHVjRkSFZ5WlN3d0tUcGpMbVp5WVcxbFluVm1abVZ5VW1WdVpHVnlZblZtWm1WeUtETTJNVFl3TEdFc016WXhOakVzWWk1eVpXNWtaWEppZFdabVpYSXVYM0psYm1SbGNtSjFabVpsY2k1eVpXNWtaWEppZFdabVpYSXBLWDFjYm1aMWJtTjBhVzl1SUU0b1lTbDdkbUZ5SUdJOU16VTFNeXhqUFc1MWJHd3NhRDF1ZFd4c0xHYzlZVHRjSW05aWFtVmpkRndpUFQwOWRIbHdaVzltSUdFbUppaG5QV0V1WkdGMFlTeGNJblJoY21kbGRGd2lhVzRnWVNZbUtHSTlZUzUwWVhKblpYUjhNQ2twTzJFOVp5NWZjbVZuYkZSNWNHVTdYQ0owWlhoMGRYSmxNbVJjSWowOVBXRS9ZejFuT2x3aWRHVjRkSFZ5WlVOMVltVmNJajA5UFdFL1l6MW5PbHdpY21WdVpHVnlZblZtWm1WeVhDSTlQVDFoSmlZb2FEMW5MR0k5TXpZeE5qRXBPM0psZEhWeWJpQnVaWGNnZVNoaUxHTXNhQ2w5Wm5WdVkzUnBiMjRnYmloaExHSXNZeXhvTEdjcGUybG1LR01wY21WMGRYSnVJR0U5Wmk1amNtVmhkR1V5UkNoN2QybGtkR2c2WVN4b1pXbG5hSFE2WWl4bWIzSnRZWFE2YUN4MGVYQmxPbWQ5S1N4aExsOTBaWGgwZFhKbExuSmxaa052ZFc1MFBUQXNibVYzSUhrb016VTFNeXhoTEc1MWJHd3BPMkU5Y0M1amNtVmhkR1VvZTNkcFpIUm9PbUVzYUdWcFoyaDBPbUlzWm05eWJXRjBPbWg5S1R0aExsOXlaVzVrWlhKaWRXWm1aWEl1Y21WbVEyOTFiblE5TUR0eVpYUjFjbTRnYm1WM0lIa29Nell4TmpFc2JuVnNiQ3hoS1gxbWRXNWpkR2x2YmlCdEtHRXBlM0psZEhWeWJpQmhKaVlvWVM1MFpYaDBkWEpsZkh4aExuSmxibVJsY21KMVptWmxjaWw5Wm5WdVkzUnBiMjRnUWloaExHSXNZeWw3WVNZbVhHNG9ZUzUwWlhoMGRYSmxQMkV1ZEdWNGRIVnlaUzV5WlhOcGVtVW9ZaXhqS1RwaExuSmxibVJsY21KMVptWmxjaVltWVM1eVpXNWtaWEppZFdabVpYSXVjbVZ6YVhwbEtHSXNZeWtwZldaMWJtTjBhVzl1SUhVb0tYdDBhR2x6TG1sa1BWb3JLenRFVzNSb2FYTXVhV1JkUFhSb2FYTTdkR2hwY3k1bWNtRnRaV0oxWm1abGNqMWpMbU55WldGMFpVWnlZVzFsWW5WbVptVnlLQ2s3ZEdocGN5NW9aV2xuYUhROWRHaHBjeTUzYVdSMGFEMHdPM1JvYVhNdVkyOXNiM0pCZEhSaFkyaHRaVzUwY3oxYlhUdDBhR2x6TG1SbGNIUm9VM1JsYm1OcGJFRjBkR0ZqYUcxbGJuUTlkR2hwY3k1emRHVnVZMmxzUVhSMFlXTm9iV1Z1ZEQxMGFHbHpMbVJsY0hSb1FYUjBZV05vYldWdWREMXVkV3hzZldaMWJtTjBhVzl1SUV3b1lTbDdZUzVqYjJ4dmNrRjBkR0ZqYUcxbGJuUnpMbVp2Y2tWaFkyZ29aeWs3WnloaExtUmxjSFJvUVhSMFlXTm9iV1Z1ZENrN1p5aGhMbk4wWlc1amFXeEJkSFJoWTJodFpXNTBLVHRuS0dFdVpHVndkR2hUZEdWdVkybHNRWFIwWVdOb2JXVnVkQ2w5Wm5WdVkzUnBiMjRnU0NoaEtYdGpMbVJsYkdWMFpVWnlZVzFsWW5WbVptVnlLR0V1Wm5KaGJXVmlkV1ptWlhJcE8yRXVabkpoYldWaWRXWm1aWEk5Ym5Wc2JEdDBMbVp5WVcxbFluVm1abVZ5UTI5MWJuUXRMVHRrWld4bGRHVWdSRnRoTG1sa1hYMWNibVoxYm1OMGFXOXVJR2dvWVNsN2RtRnlJR2c3WXk1aWFXNWtSbkpoYldWaWRXWm1aWElvTXpZeE5qQXNZUzVtY21GdFpXSjFabVpsY2lrN2RtRnlJR2M5WVM1amIyeHZja0YwZEdGamFHMWxiblJ6TzJadmNpaG9QVEE3YUR4bkxteGxibWQwYURzcksyZ3BReWd6TmpBMk5DdG9MR2RiYUYwcE8yWnZjaWhvUFdjdWJHVnVaM1JvTzJnOFlpNXRZWGhEYjJ4dmNrRjBkR0ZqYUcxbGJuUnpPeXNyYUNsakxtWnlZVzFsWW5WbVptVnlWR1Y0ZEhWeVpUSkVLRE0yTVRZd0xETTJNRFkwSzJnc016VTFNeXh1ZFd4c0xEQXBPMk11Wm5KaGJXVmlkV1ptWlhKVVpYaDBkWEpsTWtRb016WXhOakFzTXpNek1EWXNNelUxTXl4dWRXeHNMREFwTzJNdVpuSmhiV1ZpZFdabVpYSlVaWGgwZFhKbE1rUW9Nell4TmpBc016WXdPVFlzTXpVMU15eHVkV3hzTERBcE8yTXVabkpoYldWaWRXWm1aWEpVWlhoMGRYSmxNa1FvTXpZeE5qQXNNell4TWpnc016VTFNeXh1ZFd4c0xEQXBPME1vTXpZd09UWXNZUzVrWlhCMGFFRjBkR0ZqYUcxbGJuUXBPME1vTXpZeE1qZ3NZUzV6ZEdWdVkybHNRWFIwWVdOb2JXVnVkQ2s3UXlnek16TXdOaXhoTG1SbGNIUm9VM1JsYm1OcGJFRjBkR0ZqYUcxbGJuUXBPMk11WTJobFkydEdjbUZ0WldKMVptWmxjbE4wWVhSMWN5Z3pOakUyTUNrN1l5NWlhVzVrUm5KaGJXVmlkV1ptWlhJb016WXhOakFzWEc1TFlTNXVaWGgwS1R0TFlTNWpkWEk5UzJFdWJtVjRkRHRqTG1kbGRFVnljbTl5S0NsOVpuVnVZM1JwYjI0Z1ptRW9ZU3hpS1h0bWRXNWpkR2x2YmlCaktHRXNZaWw3ZG1GeUlHc3NaajB3TEd3OU1DeDBQU0V3TEhrOUlUQTdhejF1ZFd4c08zWmhjaUJDUFNFd0xFTTlYQ0p5WjJKaFhDSXNSajFjSW5WcGJuUTRYQ0lzY0QweExFMDliblZzYkN4SVBXNTFiR3dzZFQxdWRXeHNMRms5SVRFN2FXWW9YQ0p1ZFcxaVpYSmNJajA5UFhSNWNHVnZaaUJoS1dZOVlYd3dMR3c5WW53d2ZIeG1PMlZzYzJVZ2FXWW9ZU2w3WENKemFHRndaVndpYVc0Z1lUOG9iRDFoTG5Ob1lYQmxMR1k5YkZzd1hTeHNQV3hiTVYwcE9paGNJbkpoWkdsMWMxd2lhVzRnWVNZbUtHWTliRDFoTG5KaFpHbDFjeWtzWENKM2FXUjBhRndpYVc0Z1lTWW1LR1k5WVM1M2FXUjBhQ2tzWENKb1pXbG5hSFJjSW1sdUlHRW1KaWhzUFdFdWFHVnBaMmgwS1NrN2FXWW9YQ0pqYjJ4dmNsd2lhVzRnWVh4OFhDSmpiMnh2Y25OY0ltbHVJR0VwYXoxaExtTnZiRzl5Zkh4aExtTnZiRzl5Y3l4QmNuSmhlUzVwYzBGeWNtRjVLR3NwTzJsbUtDRnJLWHRjSW1OdmJHOXlRMjkxYm5SY0ltbHVJR0VtSmlod1BXRXVZMjlzYjNKRGIzVnVkSHd3S1R0Y0ltTnZiRzl5VkdWNGRIVnlaVndpYVc0Z1lTWW1LRUk5SVNGaExtTnZiRzl5VkdWNGRIVnlaU3hEUFZ3aWNtZGlZVFJjSWlrN2FXWW9YQ0pqYjJ4dmNsUjVjR1ZjSW1sdVhHNWhKaVlvUmoxaExtTnZiRzl5Vkhsd1pTd2hRaWtwYVdZb1hDSm9ZV3htSUdac2IyRjBYQ0k5UFQxR2ZIeGNJbVpzYjJGME1UWmNJajA5UFVZcFF6MWNJbkpuWW1FeE5tWmNJanRsYkhObElHbG1LRndpWm14dllYUmNJajA5UFVaOGZGd2labXh2WVhRek1sd2lQVDA5UmlsRFBWd2ljbWRpWVRNeVpsd2lPMXdpWTI5c2IzSkdiM0p0WVhSY0ltbHVJR0VtSmloRFBXRXVZMjlzYjNKR2IzSnRZWFFzTUR3OVRHRXVhVzVrWlhoUFppaERLVDlDUFNFd09qQThQWHBoTG1sdVpHVjRUMllvUXlrbUppaENQU0V4S1NsOWFXWW9YQ0prWlhCMGFGUmxlSFIxY21WY0ltbHVJR0Y4ZkZ3aVpHVndkR2hUZEdWdVkybHNWR1Y0ZEhWeVpWd2lhVzRnWVNsWlBTRW9JV0V1WkdWd2RHaFVaWGgwZFhKbEppWWhZUzVrWlhCMGFGTjBaVzVqYVd4VVpYaDBkWEpsS1R0Y0ltUmxjSFJvWENKcGJpQmhKaVlvWENKaWIyOXNaV0Z1WENJOVBUMTBlWEJsYjJZZ1lTNWtaWEIwYUQ5MFBXRXVaR1Z3ZEdnNktFMDlZUzVrWlhCMGFDeDVQU0V4S1NrN1hDSnpkR1Z1WTJsc1hDSnBiaUJoSmlZb1hDSmliMjlzWldGdVhDSTlQVDEwZVhCbGIyWWdZUzV6ZEdWdVkybHNQM2s5WVM1emRHVnVZMmxzT2loSVBXRXVjM1JsYm1OcGJDeDBQU0V4S1NrN1hDSmtaWEIwYUZOMFpXNWphV3hjSW1sdUlHRW1KaWhjSW1KdmIyeGxZVzVjSWowOVBYUjVjR1Z2WmlCaExtUmxjSFJvVTNSbGJtTnBiRDkwUFhrOVlTNWtaWEIwYUZOMFpXNWphV3c2WEc0b2RUMWhMbVJsY0hSb1UzUmxibU5wYkN4NVBYUTlJVEVwS1gxbGJITmxJR1k5YkQweE8zWmhjaUJFUFc1MWJHd3NabUU5Ym5Wc2JDeExQVzUxYkd3c1R6MXVkV3hzTzJsbUtFRnljbUY1TG1selFYSnlZWGtvYXlrcFJEMXJMbTFoY0NoT0tUdGxiSE5sSUdsbUtHc3BSRDFiVGlocktWMDdaV3h6WlNCbWIzSW9SRDFCY25KaGVTaHdLU3hyUFRBN2F6eHdPeXNyYXlsRVcydGRQVzRvWml4c0xFSXNReXhHS1R0bVBXWjhmRVJiTUYwdWQybGtkR2c3YkQxc2ZIeEVXekJkTG1obGFXZG9kRHROUDJaaFBVNG9UU2s2ZENZbUlYa21KaWhtWVQxdUtHWXNiQ3haTEZ3aVpHVndkR2hjSWl4Y0luVnBiblF6TWx3aUtTazdTRDlMUFU0b1NDazZlU1ltSVhRbUppaExQVzRvWml4c0xDRXhMRndpYzNSbGJtTnBiRndpTEZ3aWRXbHVkRGhjSWlrcE8zVS9UejFPS0hVcE9pRk5KaVloU0NZbWVTWW1kQ1ltS0U4OWJpaG1MR3dzV1N4Y0ltUmxjSFJvSUhOMFpXNWphV3hjSWl4Y0ltUmxjSFJvSUhOMFpXNWphV3hjSWlrcE8zUTliblZzYkR0bWIzSW9hejB3TzJzOFJDNXNaVzVuZEdnN0t5dHJLVVVvUkZ0clhTeG1MR3dwTEVSYmExMG1Ka1JiYTEwdWRHVjRkSFZ5WlNZbUtIazllRnRFVzJ0ZExuUmxlSFIxY21VdVgzUmxlSFIxY21VdVptOXliV0YwWFNweVcwUmJhMTB1ZEdWNGRIVnlaUzVmZEdWNGRIVnlaUzUwZVhCbFhTeHVkV3hzUFQwOVhHNTBKaVlvZEQxNUtTazdSU2htWVN4bUxHd3BPMFVvU3l4bUxHd3BPMFVvVHl4bUxHd3BPMHdvWnlrN1p5NTNhV1IwYUQxbU8yY3VhR1ZwWjJoMFBXdzdaeTVqYjJ4dmNrRjBkR0ZqYUcxbGJuUnpQVVE3Wnk1a1pYQjBhRUYwZEdGamFHMWxiblE5Wm1FN1p5NXpkR1Z1WTJsc1FYUjBZV05vYldWdWREMUxPMmN1WkdWd2RHaFRkR1Z1WTJsc1FYUjBZV05vYldWdWREMVBPMk11WTI5c2IzSTlSQzV0WVhBb2JTazdZeTVrWlhCMGFEMXRLR1poS1R0akxuTjBaVzVqYVd3OWJTaExLVHRqTG1SbGNIUm9VM1JsYm1OcGJEMXRLRThwTzJNdWQybGtkR2c5Wnk1M2FXUjBhRHRqTG1obGFXZG9kRDFuTG1obGFXZG9kRHRvS0djcE8zSmxkSFZ5YmlCamZYWmhjaUJuUFc1bGR5QjFPM1F1Wm5KaGJXVmlkV1ptWlhKRGIzVnVkQ3NyTzJNb1lTeGlLVHR5WlhSMWNtNGdheWhqTEh0eVpYTnBlbVU2Wm5WdVkzUnBiMjRvWVN4aUtYdDJZWElnYXoxaGZEQXNaajFpZkRCOGZHczdhV1lvYXowOVBXY3VkMmxrZEdnbUptWTlQVDFuTG1obGFXZG9kQ2x5WlhSMWNtNGdZenRtYjNJb2RtRnlJRzA5Wnk1amIyeHZja0YwZEdGamFHMWxiblJ6TEd3OU1EdHNQRzB1YkdWdVozUm9PeXNyYkNsQ0tHMWJiRjBzYXl4bUtUdENLR2N1WkdWd2RHaEJkSFJoWTJodFpXNTBMR3NzWmlrN1FpaG5Mbk4wWlc1amFXeEJkSFJoWTJodFpXNTBMRnh1YXl4bUtUdENLR2N1WkdWd2RHaFRkR1Z1WTJsc1FYUjBZV05vYldWdWRDeHJMR1lwTzJjdWQybGtkR2c5WXk1M2FXUjBhRDFyTzJjdWFHVnBaMmgwUFdNdWFHVnBaMmgwUFdZN2FDaG5LVHR5WlhSMWNtNGdZMzBzWDNKbFoyeFVlWEJsT2x3aVpuSmhiV1ZpZFdabVpYSmNJaXhmWm5KaGJXVmlkV1ptWlhJNlp5eGtaWE4wY205NU9tWjFibU4wYVc5dUtDbDdTQ2huS1R0TUtHY3BmWDBwZlhaaGNpQkxZVDE3WTNWeU9tNTFiR3dzYm1WNGREcHVkV3hzTEdScGNuUjVPaUV4ZlN4TVlUMWJYQ0p5WjJKaFhDSmRMSHBoUFZ0Y0luSm5ZbUUwWENJc1hDSnlaMkkxTmpWY0lpeGNJbkpuWWpVZ1lURmNJbDA3WVM1bGVIUmZjM0puWWlZbWVtRXVjSFZ6YUNoY0luTnlaMkpoWENJcE8yRXVaWGgwWDJOdmJHOXlYMkoxWm1abGNsOW9ZV3htWDJac2IyRjBKaVo2WVM1d2RYTm9LRndpY21kaVlURTJabHdpTEZ3aWNtZGlNVFptWENJcE8yRXVkMlZpWjJ4ZlkyOXNiM0pmWW5WbVptVnlYMlpzYjJGMEppWjZZUzV3ZFhOb0tGd2ljbWRpWVRNeVpsd2lLVHQyWVhJZ1IyRTlXMXdpZFdsdWREaGNJbDA3WVM1dlpYTmZkR1Y0ZEhWeVpWOW9ZV3htWDJac2IyRjBKaVpIWVM1d2RYTm9LRndpYUdGc1ppQm1iRzloZEZ3aUxGd2labXh2WVhReE5sd2lLVHRoTG05bGMxOTBaWGgwZFhKbFgyWnNiMkYwSmlaSFlTNXdkWE5vS0Z3aVpteHZZWFJjSWl4Y0ltWnNiMkYwTXpKY0lpazdkbUZ5SUZvOVhHNHdMRVE5ZTMwN2NtVjBkWEp1SUdzb1MyRXNlMmRsZEVaeVlXMWxZblZtWm1WeU9tWjFibU4wYVc5dUtHRXBlM0psZEhWeWJsd2lablZ1WTNScGIyNWNJajA5UFhSNWNHVnZaaUJoSmlaY0ltWnlZVzFsWW5WbVptVnlYQ0k5UFQxaExsOXlaV2RzVkhsd1pTWW1LR0U5WVM1ZlpuSmhiV1ZpZFdabVpYSXNZU0JwYm5OMFlXNWpaVzltSUhVcFAyRTZiblZzYkgwc1kzSmxZWFJsT21aaExHTnlaV0YwWlVOMVltVTZablZ1WTNScGIyNG9ZU2w3Wm5WdVkzUnBiMjRnWXloaEtYdDJZWElnWnl4b1BYdGpiMnh2Y2pwdWRXeHNmU3h0UFRBc2JEMXVkV3hzTzJjOVhDSnlaMkpoWENJN2RtRnlJRzQ5WENKMWFXNTBPRndpTEhJOU1UdHBaaWhjSW01MWJXSmxjbHdpUFQwOWRIbHdaVzltSUdFcGJUMWhmREE3Wld4elpTQnBaaWhoS1h0Y0luTm9ZWEJsWENKcGJpQmhQMjA5WVM1emFHRndaVnN3WFRvb1hDSnlZV1JwZFhOY0ltbHVJR0VtSmlodFBXRXVjbUZrYVhWemZEQXBMRndpZDJsa2RHaGNJbWx1SUdFL2JUMWhMbmRwWkhSb2ZEQTZYQ0pvWldsbmFIUmNJbWx1SUdFbUppaHRQV0V1YUdWcFoyaDBmREFwS1R0cFppaGNJbU52Ykc5eVhDSnBiaUJoZkh4Y0ltTnZiRzl5YzF3aWFXNGdZU2xzUFdFdVkyOXNiM0o4ZkdFdVkyOXNiM0p6TEVGeWNtRjVMbWx6UVhKeVlYa29iQ2s3Ykh4OEtGd2lZMjlzYjNKRGIzVnVkRndpYVc0Z1lTWW1LSEk5WVM1amIyeHZja052ZFc1MGZGeHVNQ2tzWENKamIyeHZjbFI1Y0dWY0ltbHVJR0VtSmlodVBXRXVZMjlzYjNKVWVYQmxLU3hjSW1OdmJHOXlSbTl5YldGMFhDSnBiaUJoSmlZb1p6MWhMbU52Ykc5eVJtOXliV0YwS1NrN1hDSmtaWEIwYUZ3aWFXNGdZU1ltS0dndVpHVndkR2c5WVM1a1pYQjBhQ2s3WENKemRHVnVZMmxzWENKcGJpQmhKaVlvYUM1emRHVnVZMmxzUFdFdWMzUmxibU5wYkNrN1hDSmtaWEIwYUZOMFpXNWphV3hjSW1sdUlHRW1KaWhvTG1SbGNIUm9VM1JsYm1OcGJEMWhMbVJsY0hSb1UzUmxibU5wYkNsOVpXeHpaU0J0UFRFN2FXWW9iQ2xwWmloQmNuSmhlUzVwYzBGeWNtRjVLR3dwS1dadmNpaGhQVnRkTEdjOU1EdG5QR3d1YkdWdVozUm9PeXNyWnlsaFcyZGRQV3hiWjEwN1pXeHpaU0JoUFZ0c1hUdGxiSE5sSUdadmNpaGhQVUZ5Y21GNUtISXBMR3c5ZTNKaFpHbDFjenB0TEdadmNtMWhkRHBuTEhSNWNHVTZibjBzWnowd08yYzhjanNySzJjcFlWdG5YVDFtTG1OeVpXRjBaVU4xWW1Vb2JDazdhQzVqYjJ4dmNqMUJjbkpoZVNoaExteGxibWQwYUNrN1ptOXlLR2M5TUR0blBHRXViR1Z1WjNSb095c3JaeWx5UFdGYloxMHNiVDF0Zkh4eUxuZHBaSFJvTEdndVkyOXNiM0piWjEwOWUzUmhjbWRsZERvek5EQTJPU3hrWVhSaE9tRmJaMTE5TzJadmNpaG5QVEE3Tmo1bk95c3JaeWw3Wm05eUtISTlNRHR5UEdFdWJHVnVaM1JvT3lzcmNpbG9MbU52Ykc5eVczSmRMblJoY21kbGREMWNiak0wTURZNUsyYzdNRHhuSmlZb2FDNWtaWEIwYUQxaVd6QmRMbVJsY0hSb0xHZ3VjM1JsYm1OcGJEMWlXekJkTG5OMFpXNWphV3dzYUM1a1pYQjBhRk4wWlc1amFXdzlZbHN3WFM1a1pYQjBhRk4wWlc1amFXd3BPMmxtS0dKYloxMHBZbHRuWFNob0tUdGxiSE5sSUdKYloxMDlabUVvYUNsOWNtVjBkWEp1SUdzb1l5eDdkMmxrZEdnNmJTeG9aV2xuYUhRNmJTeGpiMnh2Y2pwaGZTbDlkbUZ5SUdJOVFYSnlZWGtvTmlrN1l5aGhLVHR5WlhSMWNtNGdheWhqTEh0bVlXTmxjenBpTEhKbGMybDZaVHBtZFc1amRHbHZiaWhoS1h0MllYSWdaejFoZkRBN2FXWW9aejA5UFdNdWQybGtkR2dwY21WMGRYSnVJR003ZG1GeUlHZzlZeTVqYjJ4dmNqdG1iM0lvWVQwd08yRThhQzVzWlc1bmRHZzdLeXRoS1doYllWMHVjbVZ6YVhwbEtHY3BPMlp2Y2loaFBUQTdOajVoT3lzcllTbGlXMkZkTG5KbGMybDZaU2huS1R0akxuZHBaSFJvUFdNdWFHVnBaMmgwUFdjN2NtVjBkWEp1SUdOOUxGOXlaV2RzVkhsd1pUcGNJbVp5WVcxbFluVm1abVZ5UTNWaVpWd2lMR1JsYzNSeWIzazZablZ1WTNScGIyNG9LWHRpTG1admNrVmhZMmdvWm5WdVkzUnBiMjRvWVNsN1lTNWtaWE4wY205NUtDbDlLWDE5S1gwc1kyeGxZWEk2Wm5WdVkzUnBiMjRvS1h0c0tFUXBMbVp2Y2tWaFkyZ29TQ2w5TEhKbGMzUnZjbVU2Wm5WdVkzUnBiMjRvS1h0c0tFUXBMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9ZU2w3WVM1bWNtRnRaV0oxWm1abGNqMWNibU11WTNKbFlYUmxSbkpoYldWaWRXWm1aWElvS1R0b0tHRXBmU2w5ZlNsOWZTeDdYQ0l1TDNWMGFXd3ZaWGgwWlc1a1hDSTZNaklzWENJdUwzVjBhV3d2ZG1Gc2RXVnpYQ0k2TXpGOVhTd3hNanBiWm5WdVkzUnBiMjRvWml4d0xIVXBlM0F1Wlhod2IzSjBjejFtZFc1amRHbHZiaWhtTEdzcGUzWmhjaUI0UFRFN2F5NWxlSFJmZEdWNGRIVnlaVjltYVd4MFpYSmZZVzVwYzI5MGNtOXdhV01tSmloNFBXWXVaMlYwVUdGeVlXMWxkR1Z5S0RNME1EUTNLU2s3ZG1GeUlISTlNU3hqUFRFN2F5NTNaV0puYkY5a2NtRjNYMkoxWm1abGNuTW1KaWh5UFdZdVoyVjBVR0Z5WVcxbGRHVnlLRE0wT0RVeUtTeGpQV1l1WjJWMFVHRnlZVzFsZEdWeUtETTJNRFl6S1NrN2NtVjBkWEp1ZTJOdmJHOXlRbWwwY3pwYlppNW5aWFJRWVhKaGJXVjBaWElvTXpReE1Da3NaaTVuWlhSUVlYSmhiV1YwWlhJb016UXhNU2tzWmk1blpYUlFZWEpoYldWMFpYSW9NelF4TWlrc1ppNW5aWFJRWVhKaGJXVjBaWElvTXpReE15bGRMR1JsY0hSb1FtbDBjenBtTG1kbGRGQmhjbUZ0WlhSbGNpZ3pOREUwS1N4emRHVnVZMmxzUW1sMGN6cG1MbWRsZEZCaGNtRnRaWFJsY2lnek5ERTFLU3h6ZFdKd2FYaGxiRUpwZEhNNlppNW5aWFJRWVhKaGJXVjBaWElvTXpRd09Da3NaWGgwWlc1emFXOXVjenBQWW1wbFkzUXVhMlY1Y3locktTNW1hV3gwWlhJb1puVnVZM1JwYjI0b1lTbDdjbVYwZFhKdUlTRnJXMkZkZlNrc1hHNXRZWGhCYm1semIzUnliM0JwWXpwNExHMWhlRVJ5WVhkaWRXWm1aWEp6T25Jc2JXRjRRMjlzYjNKQmRIUmhZMmh0Wlc1MGN6cGpMSEJ2YVc1MFUybDZaVVJwYlhNNlppNW5aWFJRWVhKaGJXVjBaWElvTXpNNU1ERXBMR3hwYm1WWGFXUjBhRVJwYlhNNlppNW5aWFJRWVhKaGJXVjBaWElvTXpNNU1ESXBMRzFoZUZacFpYZHdiM0owUkdsdGN6cG1MbWRsZEZCaGNtRnRaWFJsY2lnek16ZzJLU3h0WVhoRGIyMWlhVzVsWkZSbGVIUjFjbVZWYm1sMGN6cG1MbWRsZEZCaGNtRnRaWFJsY2lnek5UWTJNU2tzYldGNFEzVmlaVTFoY0ZOcGVtVTZaaTVuWlhSUVlYSmhiV1YwWlhJb016UXdOellwTEcxaGVGSmxibVJsY21KMVptWmxjbE5wZW1VNlppNW5aWFJRWVhKaGJXVjBaWElvTXpRd01qUXBMRzFoZUZSbGVIUjFjbVZWYm1sMGN6cG1MbWRsZEZCaGNtRnRaWFJsY2lnek5Ea3pNQ2tzYldGNFZHVjRkSFZ5WlZOcGVtVTZaaTVuWlhSUVlYSmhiV1YwWlhJb016TTNPU2tzYldGNFFYUjBjbWxpZFhSbGN6cG1MbWRsZEZCaGNtRnRaWFJsY2lnek5Ea3lNU2tzYldGNFZtVnlkR1Y0Vlc1cFptOXliWE02Wmk1blpYUlFZWEpoYldWMFpYSW9Nell6TkRjcExHMWhlRlpsY25SbGVGUmxlSFIxY21WVmJtbDBjenBtTG1kbGRGQmhjbUZ0WlhSbGNpZ3pOVFkyTUNrc2JXRjRWbUZ5ZVdsdVoxWmxZM1J2Y25NNlppNW5aWFJRWVhKaGJXVjBaWElvTXpZek5EZ3BMRnh1YldGNFJuSmhaMjFsYm5SVmJtbG1iM0p0Y3pwbUxtZGxkRkJoY21GdFpYUmxjaWd6TmpNME9Ta3NaMnh6YkRwbUxtZGxkRkJoY21GdFpYUmxjaWd6TlRjeU5Da3NjbVZ1WkdWeVpYSTZaaTVuWlhSUVlYSmhiV1YwWlhJb056a3pOeWtzZG1WdVpHOXlPbVl1WjJWMFVHRnlZVzFsZEdWeUtEYzVNellwTEhabGNuTnBiMjQ2Wmk1blpYUlFZWEpoYldWMFpYSW9Oemt6T0NsOWZYMHNlMzFkTERFek9sdG1kVzVqZEdsdmJpaG1MSEFzZFNsN2RtRnlJR3c5WmloY0lpNHZkWFJwYkM5cGN5MTBlWEJsWkMxaGNuSmhlVndpS1R0d0xtVjRjRzl5ZEhNOVpuVnVZM1JwYjI0b2F5eG1MSElzWXl4aExHSXBlM0psZEhWeWJpQm1kVzVqZEdsdmJpaGhLWHQyWVhJZ1lqdGlQVzUxYkd3OVBUMW1MbTVsZUhRL05URXlNVHBtTG01bGVIUXVZMjlzYjNKQmRIUmhZMmh0Wlc1MGMxc3dYUzUwWlhoMGRYSmxMbDkwWlhoMGRYSmxMblI1Y0dVN2RtRnlJSFE5TUN4NVBUQXNaejFqTG1aeVlXMWxZblZtWm1WeVYybGtkR2dzY0QxakxtWnlZVzFsWW5WbVptVnlTR1ZwWjJoMExFTTliblZzYkR0c0tHRXBQME05WVRwaEppWW9kRDFoTG5oOE1DeDVQV0V1ZVh3d0xHYzlLR0V1ZDJsa2RHaDhmR011Wm5KaGJXVmlkV1ptWlhKWGFXUjBhQzEwS1h3d0xIQTlLR0V1YUdWcFoyaDBmSHhqTG1aeVlXMWxZblZtWm1WeVNHVnBaMmgwTFZ4dWVTbDhNQ3hEUFdFdVpHRjBZWHg4Ym5Wc2JDazdjaWdwTzJFOVp5cHdLalE3UTN4OEtEVXhNakU5UFQxaVAwTTlibVYzSUZWcGJuUTRRWEp5WVhrb1lTazZOVEV5TmowOVBXSW1KaWhEUFVOOGZHNWxkeUJHYkc5aGRETXlRWEp5WVhrb1lTa3BLVHRyTG5CcGVHVnNVM1J2Y21WcEtETXpNek1zTkNrN2F5NXlaV0ZrVUdsNFpXeHpLSFFzZVN4bkxIQXNOalF3T0N4aUxFTXBPM0psZEhWeWJpQkRmWDE5TEh0Y0lpNHZkWFJwYkM5cGN5MTBlWEJsWkMxaGNuSmhlVndpT2pJMmZWMHNNVFE2VzJaMWJtTjBhVzl1S0dZc2NDeDFLWHQyWVhJZ2JEMW1LRndpTGk5MWRHbHNMM1poYkhWbGMxd2lLU3hyUFZ0ZE8ydGJNekk0TlRSZFBUSTdhMXN6TWpnMU5WMDlNanRyV3pNMk1UazBYVDB5TzJ0Yk16TXhPRGxkUFRJN2Exc3pOakUyT0YwOU1UdHJXek0wTURReFhUMDBPMnRiTXpVNU1EZGRQVFE3YTFzek5EZ3pObDA5TVRZN2Exc3pORGcwTWwwOU9EdHJXek0wT0RRelhUMDJPM0F1Wlhod2IzSjBjejFtZFc1amRHbHZiaWhtTEhJc1l5eGhMR0lwZTJaMWJtTjBhVzl1SUhBb1lTbDdkR2hwY3k1cFpEMW5LeXM3ZEdocGN5NXlaV1pEYjNWdWREMHhPM1JvYVhNdWNtVnVaR1Z5WW5WbVptVnlQV0U3ZEdocGN5NW1iM0p0WVhROU16STROVFE3ZEdocGN5NW9aV2xuYUhROWRHaHBjeTUzYVdSMGFEMHdPMkl1Y0hKdlptbHNaU1ltWEc0b2RHaHBjeTV6ZEdGMGN6MTdjMmw2WlRvd2ZTbDlablZ1WTNScGIyNGdUU2hpS1h0MllYSWdZejFpTG5KbGJtUmxjbUoxWm1abGNqdG1MbUpwYm1SU1pXNWtaWEppZFdabVpYSW9Nell4TmpFc2JuVnNiQ2s3Wmk1a1pXeGxkR1ZTWlc1a1pYSmlkV1ptWlhJb1l5azdZaTV5Wlc1a1pYSmlkV1ptWlhJOWJuVnNiRHRpTG5KbFprTnZkVzUwUFRBN1pHVnNaWFJsSUVWYllpNXBaRjA3WVM1eVpXNWtaWEppZFdabVpYSkRiM1Z1ZEMwdGZYWmhjaUIwUFh0eVoySmhORG96TWpnMU5DeHlaMkkxTmpVNk16WXhPVFFzWENKeVoySTFJR0V4WENJNk16STROVFVzWkdWd2RHZzZNek14T0Rrc2MzUmxibU5wYkRvek5qRTJPQ3hjSW1SbGNIUm9JSE4wWlc1amFXeGNJam96TkRBME1YMDdjaTVsZUhSZmMzSm5ZaVltS0hRdWMzSm5ZbUU5TXpVNU1EY3BPM0l1WlhoMFgyTnZiRzl5WDJKMVptWmxjbDlvWVd4bVgyWnNiMkYwSmlZb2RDNXlaMkpoTVRabVBUTTBPRFF5TEhRdWNtZGlNVFptUFRNME9EUXpLVHR5TG5kbFltZHNYMk52Ykc5eVgySjFabVpsY2w5bWJHOWhkQ1ltS0hRdWNtZGlZVE15Wmowek5EZ3pOaWs3ZG1GeUlIazlXMTA3VDJKcVpXTjBMbXRsZVhNb2RDa3VabTl5UldGamFDaG1kVzVqZEdsdmJpaGhLWHQ1VzNSYllWMWRQV0Y5S1R0MllYSWdaejB3TEVVOWUzMDdjQzV3Y205MGIzUjVjR1V1WkdWalVtVm1QVnh1Wm5WdVkzUnBiMjRvS1hzd1BqMHRMWFJvYVhNdWNtVm1RMjkxYm5RbUprMG9kR2hwY3lsOU8ySXVjSEp2Wm1sc1pTWW1LR0V1WjJWMFZHOTBZV3hTWlc1a1pYSmlkV1ptWlhKVGFYcGxQV1oxYm1OMGFXOXVLQ2w3ZG1GeUlHRTlNRHRQWW1wbFkzUXVhMlY1Y3loRktTNW1iM0pGWVdOb0tHWjFibU4wYVc5dUtHSXBlMkVyUFVWYllsMHVjM1JoZEhNdWMybDZaWDBwTzNKbGRIVnliaUJoZlNrN2NtVjBkWEp1ZTJOeVpXRjBaVHBtZFc1amRHbHZiaWhqTEdjcGUyWjFibU4wYVc5dUlHNG9ZU3hqS1h0MllYSWdaejB3TEd3OU1DeG9QVE15T0RVME8xd2liMkpxWldOMFhDSTlQVDEwZVhCbGIyWWdZU1ltWVQ4b1hDSnphR0Z3WlZ3aWFXNGdZVDhvYkQxaExuTm9ZWEJsTEdjOWJGc3dYWHd3TEd3OWJGc3hYWHd3S1Rvb1hDSnlZV1JwZFhOY0ltbHVJR0VtSmloblBXdzlZUzV5WVdScGRYTjhNQ2tzWENKM2FXUjBhRndpYVc0Z1lTWW1LR2M5WVM1M2FXUjBhSHd3S1N4Y0ltaGxhV2RvZEZ3aWFXNGdZU1ltS0d3OVlTNW9aV2xuYUhSOE1Da3BMRndpWm05eWJXRjBYQ0pwYmlCaEppWW9hRDEwVzJFdVptOXliV0YwWFNrcE9sd2liblZ0WW1WeVhDSTlQVDEwZVhCbGIyWWdZVDhvWnoxaGZEQXNiRDFjSW01MWJXSmxjbHdpUFQwOWRIbHdaVzltSUdNL1kzd3dPbWNwT21GOGZDaG5QV3c5TVNrN2FXWW9aeUU5UFcwdWQybGtkR2g4Zkd3aFBUMWNibTB1YUdWcFoyaDBmSHhvSVQwOWJTNW1iM0p0WVhRcGNtVjBkWEp1SUc0dWQybGtkR2c5YlM1M2FXUjBhRDFuTEc0dWFHVnBaMmgwUFcwdWFHVnBaMmgwUFd3c2JTNW1iM0p0WVhROWFDeG1MbUpwYm1SU1pXNWtaWEppZFdabVpYSW9Nell4TmpFc2JTNXlaVzVrWlhKaWRXWm1aWElwTEdZdWNtVnVaR1Z5WW5WbVptVnlVM1J2Y21GblpTZ3pOakUyTVN4b0xHY3NiQ2tzWWk1d2NtOW1hV3hsSmlZb2JTNXpkR0YwY3k1emFYcGxQV3RiYlM1bWIzSnRZWFJkS20wdWQybGtkR2dxYlM1b1pXbG5hSFFwTEc0dVptOXliV0YwUFhsYmJTNW1iM0p0WVhSZExHNTlkbUZ5SUcwOWJtVjNJSEFvWmk1amNtVmhkR1ZTWlc1a1pYSmlkV1ptWlhJb0tTazdSVnR0TG1sa1hUMXRPMkV1Y21WdVpHVnlZblZtWm1WeVEyOTFiblFyS3p0dUtHTXNaeWs3Ymk1eVpYTnBlbVU5Wm5WdVkzUnBiMjRvWVN4aktYdDJZWElnWnoxaGZEQXNiRDFqZkRCOGZHYzdhV1lvWnowOVBXMHVkMmxrZEdnbUptdzlQVDF0TG1obGFXZG9kQ2x5WlhSMWNtNGdianR1TG5kcFpIUm9QVzB1ZDJsa2RHZzlaenR1TG1obGFXZG9kRDF0TG1obGFXZG9kRDFzTzJZdVltbHVaRkpsYm1SbGNtSjFabVpsY2lnek5qRTJNU3h0TG5KbGJtUmxjbUoxWm1abGNpazdaaTV5Wlc1a1pYSmlkV1ptWlhKVGRHOXlZV2RsS0RNMk1UWXhMRzB1Wm05eWJXRjBMRnh1Wnl4c0tUdGlMbkJ5YjJacGJHVW1KaWh0TG5OMFlYUnpMbk5wZW1VOWExdHRMbVp2Y20xaGRGMHFiUzUzYVdSMGFDcHRMbWhsYVdkb2RDazdjbVYwZFhKdUlHNTlPMjR1WDNKbFoyeFVlWEJsUFZ3aWNtVnVaR1Z5WW5WbVptVnlYQ0k3Ymk1ZmNtVnVaR1Z5WW5WbVptVnlQVzA3WWk1d2NtOW1hV3hsSmlZb2JpNXpkR0YwY3oxdExuTjBZWFJ6S1R0dUxtUmxjM1J5YjNrOVpuVnVZM1JwYjI0b0tYdHRMbVJsWTFKbFppZ3BmVHR5WlhSMWNtNGdibjBzWTJ4bFlYSTZablZ1WTNScGIyNG9LWHRzS0VVcExtWnZja1ZoWTJnb1RTbDlMSEpsYzNSdmNtVTZablZ1WTNScGIyNG9LWHRzS0VVcExtWnZja1ZoWTJnb1puVnVZM1JwYjI0b1lTbDdZUzV5Wlc1a1pYSmlkV1ptWlhJOVppNWpjbVZoZEdWU1pXNWtaWEppZFdabVpYSW9LVHRtTG1KcGJtUlNaVzVrWlhKaWRXWm1aWElvTXpZeE5qRXNZUzV5Wlc1a1pYSmlkV1ptWlhJcE8yWXVjbVZ1WkdWeVluVm1abVZ5VTNSdmNtRm5aU2d6TmpFMk1TeGhMbVp2Y20xaGRDeGhMbmRwWkhSb0xHRXVhR1ZwWjJoMEtYMHBPMll1WW1sdVpGSmxibVJsY21KMVptWmxjaWd6TmpFMk1TeHVkV3hzS1gxOWZYMHNlMXdpTGk5MWRHbHNMM1poYkhWbGMxd2lPak14ZlYwc01UVTZXMloxYm1OMGFXOXVLR1lzY0N4MUtYdDJZWElnYkQxbUtGd2lMaTkxZEdsc0wzWmhiSFZsYzF3aUtUdGNibkF1Wlhod2IzSjBjejFtZFc1amRHbHZiaWhtTEhnc2NpeGpLWHRtZFc1amRHbHZiaUJoS0dFc1l5eGlMR2NwZTNSb2FYTXVibUZ0WlQxaE8zUm9hWE11YVdROVl6dDBhR2x6TG14dlkyRjBhVzl1UFdJN2RHaHBjeTVwYm1adlBXZDlablZ1WTNScGIyNGdZaWhoTEdNcGUyWnZjaWgyWVhJZ1lqMHdPMkk4WVM1c1pXNW5kR2c3S3l0aUtXbG1LR0ZiWWwwdWFXUTlQVDFqTG1sa0tYdGhXMkpkTG14dlkyRjBhVzl1UFdNdWJHOWpZWFJwYjI0N2NtVjBkWEp1ZldFdWNIVnphQ2hqS1gxbWRXNWpkR2x2YmlCd0tHRXNZeXhpS1h0aVBUTTFOak15UFQwOVlUOTVPbWM3ZG1GeUlHdzlZbHRqWFR0cFppZ2hiQ2w3ZG1GeUlISTllQzV6ZEhJb1l5a3NiRDFtTG1OeVpXRjBaVk5vWVdSbGNpaGhLVHRtTG5Ob1lXUmxjbE52ZFhKalpTaHNMSElwTzJZdVkyOXRjR2xzWlZOb1lXUmxjaWhzS1R0aVcyTmRQV3g5Y21WMGRYSnVJR3g5Wm5WdVkzUnBiMjRnVFNoaExHSXBlM1JvYVhNdWFXUTlkU3NyTzNSb2FYTXVabkpoWjBsa1BXRTdkR2hwY3k1MlpYSjBTV1E5WWp0MGFHbHpMbkJ5YjJkeVlXMDliblZzYkR0MGFHbHpMblZ1YVdadmNtMXpQVnRkTzNSb2FYTXVZWFIwY21saWRYUmxjejFiWFR0akxuQnliMlpwYkdVbUppaDBhR2x6TG5OMFlYUnpQWHQxYm1sbWIzSnRjME52ZFc1ME9qQXNZWFIwY21saWRYUmxjME52ZFc1ME9qQjlLWDFjYm1aMWJtTjBhVzl1SUhRb1p5eHRLWHQyWVhJZ2JDeHlPMnc5Y0Nnek5UWXpNaXhuTG1aeVlXZEpaQ2s3Y2oxd0tETTFOak16TEdjdWRtVnlkRWxrS1R0MllYSWdkRDFuTG5CeWIyZHlZVzA5Wmk1amNtVmhkR1ZRY205bmNtRnRLQ2s3Wmk1aGRIUmhZMmhUYUdGa1pYSW9kQ3hzS1R0bUxtRjBkR0ZqYUZOb1lXUmxjaWgwTEhJcE8yWXViR2x1YTFCeWIyZHlZVzBvZENrN2RtRnlJSGs5Wmk1blpYUlFjbTluY21GdFVHRnlZVzFsZEdWeUtIUXNNelUzTVRncE8yTXVjSEp2Wm1sc1pTWW1LR2N1YzNSaGRITXVkVzVwWm05eWJYTkRiM1Z1ZEQxNUtUdDJZWElnYUQxbkxuVnVhV1p2Y20xek8yWnZjaWhzUFRBN2JEeDVPeXNyYkNscFppaHlQV1l1WjJWMFFXTjBhWFpsVlc1cFptOXliU2gwTEd3cEtXbG1LREU4Y2k1emFYcGxLV1p2Y2loMllYSWdRejB3TzBNOGNpNXphWHBsT3lzclF5bDdkbUZ5SUVVOWNpNXVZVzFsTG5KbGNHeGhZMlVvWENKYk1GMWNJaXhjSWx0Y0lpdERLMXdpWFZ3aUtUdGlLR2dzYm1WM0lHRW9SU3g0TG1sa0tFVXBMR1l1WjJWMFZXNXBabTl5YlV4dlkyRjBhVzl1S0hRc1JTa3NjaWtwZldWc2MyVWdZaWhvTEc1bGR5QmhLSEl1Ym1GdFpTeDRMbWxrS0hJdWJtRnRaU2tzWmk1blpYUlZibWxtYjNKdFRHOWpZWFJwYjI0b2RDeHlMbTVoYldVcExISXBLVHQ1UFdZdVoyVjBVSEp2WjNKaGJWQmhjbUZ0WlhSbGNpaDBMRnh1TXpVM01qRXBPMk11Y0hKdlptbHNaU1ltS0djdWMzUmhkSE11WVhSMGNtbGlkWFJsYzBOdmRXNTBQWGtwTzJnOVp5NWhkSFJ5YVdKMWRHVnpPMlp2Y2loc1BUQTdiRHg1T3lzcmJDa29jajFtTG1kbGRFRmpkR2wyWlVGMGRISnBZaWgwTEd3cEtTWW1ZaWhvTEc1bGR5QmhLSEl1Ym1GdFpTeDRMbWxrS0hJdWJtRnRaU2tzWmk1blpYUkJkSFJ5YVdKTWIyTmhkR2x2YmloMExISXVibUZ0WlNrc2Npa3BmWFpoY2lCNVBYdDlMR2M5ZTMwc1JUMTdmU3hEUFZ0ZExIVTlNRHRqTG5CeWIyWnBiR1VtSmloeUxtZGxkRTFoZUZWdWFXWnZjbTF6UTI5MWJuUTlablZ1WTNScGIyNG9LWHQyWVhJZ1lUMHdPME11Wm05eVJXRmphQ2htZFc1amRHbHZiaWhpS1h0aUxuTjBZWFJ6TG5WdWFXWnZjbTF6UTI5MWJuUStZU1ltS0dFOVlpNXpkR0YwY3k1MWJtbG1iM0p0YzBOdmRXNTBLWDBwTzNKbGRIVnliaUJoZlN4eUxtZGxkRTFoZUVGMGRISnBZblYwWlhORGIzVnVkRDFtZFc1amRHbHZiaWdwZTNaaGNpQmhQVEE3UXk1bWIzSkZZV05vS0daMWJtTjBhVzl1S0dJcGUySXVjM1JoZEhNdVlYUjBjbWxpZFhSbGMwTnZkVzUwUG1FbUppaGhQV0l1YzNSaGRITXVZWFIwY21saWRYUmxjME52ZFc1MEtYMHBPM0psZEhWeWJpQmhmU2s3Y21WMGRYSnVlMk5zWldGeU9tWjFibU4wYVc5dUtDbDdkbUZ5SUdFOVppNWtaV3hsZEdWVGFHRmtaWEl1WW1sdVpDaG1LVHRjYm13b2VTa3VabTl5UldGamFDaGhLVHQ1UFh0OU8yd29aeWt1Wm05eVJXRmphQ2hoS1R0blBYdDlPME11Wm05eVJXRmphQ2htZFc1amRHbHZiaWhoS1h0bUxtUmxiR1YwWlZCeWIyZHlZVzBvWVM1d2NtOW5jbUZ0S1gwcE8wTXViR1Z1WjNSb1BUQTdSVDE3ZlR0eUxuTm9ZV1JsY2tOdmRXNTBQVEI5TEhCeWIyZHlZVzA2Wm5WdVkzUnBiMjRvWVN4aUxHTXBlM0l1YzJoaFpHVnlRMjkxYm5Rckt6dDJZWElnWnoxRlcySmRPMmQ4ZkNoblBVVmJZbDA5ZTMwcE8zWmhjaUJtUFdkYllWMDdabng4S0dZOWJtVjNJRTBvWWl4aEtTeDBLR1lzWXlrc1oxdGhYVDFtTEVNdWNIVnphQ2htS1NrN2NtVjBkWEp1SUdaOUxISmxjM1J2Y21VNlpuVnVZM1JwYjI0b0tYdDVQWHQ5TzJjOWUzMDdabTl5S0haaGNpQmhQVEE3WVR4RExteGxibWQwYURzcksyRXBkQ2hEVzJGZEtYMHNjMmhoWkdWeU9uQXNabkpoWnpvdE1TeDJaWEowT2kweGZYMTlMSHRjSWk0dmRYUnBiQzkyWVd4MVpYTmNJam96TVgxZExERTJPbHRtZFc1amRHbHZiaWhtTEhBc2RTbDdjQzVsZUhCdmNuUnpQV1oxYm1OMGFXOXVLQ2w3Y21WMGRYSnVlMkoxWm1abGNrTnZkVzUwT2pBc1pXeGxiV1Z1ZEhORGIzVnVkRG93TEdaeVlXMWxZblZtWm1WeVEyOTFiblE2TUN4emFHRmtaWEpEYjNWdWREb3dMSFJsZUhSMWNtVkRiM1Z1ZERvd0xHTjFZbVZEYjNWdWREb3dMRnh1Y21WdVpHVnlZblZtWm1WeVEyOTFiblE2TUN4dFlYaFVaWGgwZFhKbFZXNXBkSE02TUgxOWZTeDdmVjBzTVRjNlcyWjFibU4wYVc5dUtHWXNjQ3gxS1h0d0xtVjRjRzl5ZEhNOVpuVnVZM1JwYjI0b0tYdDJZWElnWmoxN1hDSmNJam93ZlN4clBWdGNJbHdpWFR0eVpYUjFjbTU3YVdRNlpuVnVZM1JwYjI0b2VDbDdkbUZ5SUhJOVpsdDRYVHRwWmloeUtYSmxkSFZ5YmlCeU8zSTlabHQ0WFQxckxteGxibWQwYUR0ckxuQjFjMmdvZUNrN2NtVjBkWEp1SUhKOUxITjBjanBtZFc1amRHbHZiaWhtS1h0eVpYUjFjbTRnYTF0bVhYMTlmWDBzZTMxZExERTRPbHRtZFc1amRHbHZiaWhtTEhBc2RTbDdablZ1WTNScGIyNGdiQ2hoS1h0eVpYUjFjbTRnUVhKeVlYa3VhWE5CY25KaGVTaGhLU1ltS0RBOVBUMWhMbXhsYm1kMGFIeDhYQ0p1ZFcxaVpYSmNJajA5UFhSNWNHVnZaaUJoV3pCZEtYMW1kVzVqZEdsdmJpQnJLR0VwZTNKbGRIVnliaUJCY25KaGVTNXBjMEZ5Y21GNUtHRXBKaVl3SVQwOVlTNXNaVzVuZEdnbUprVW9ZVnN3WFNrL0lUQTZJVEY5Wm5WdVkzUnBiMjRnZUNoaEtYdHlaWFIxY200Z1QySnFaV04wTG5CeWIzUnZkSGx3WlM1MGIxTjBjbWx1Wnk1allXeHNLR0VwZldaMWJtTjBhVzl1SUhJb1lTbDdhV1lvSVdFcGNtVjBkWEp1SVRFN2RtRnlJR0k5ZUNoaEtUdHlaWFIxY200Z01EdzlXUzVwYm1SbGVFOW1LR0lwUDF4dUlUQTZiQ2hoS1h4OGF5aGhLWHg4ZENoaEtYMW1kVzVqZEdsdmJpQmpLR0VzWWlsN016WXhPVE05UFQxaExuUjVjR1UvS0dFdVpHRjBZVDFuS0dJcExIa3VabkpsWlZSNWNHVW9ZaWtwT21FdVpHRjBZVDFpZldaMWJtTjBhVzl1SUdFb1lTeGlMR01zWnl4bUxHc3BlMkU5WENKMWJtUmxabWx1WldSY0lpRTlQWFI1Y0dWdlppQklXMkZkUDBoYllWMDZRbHRoWFNwTVcySmRPMnNtSmloaEtqMDJLVHRwWmlobUtYdG1iM0lvWnowd096RThQV003S1djclBXRXFZeXBqTEdNdlBUSTdjbVYwZFhKdUlHZDljbVYwZFhKdUlHRXFZeXBuZlhaaGNpQmlQV1lvWENJdUwzVjBhV3d2WlhoMFpXNWtYQ0lwTEVZOVppaGNJaTR2ZFhScGJDOTJZV3gxWlhOY0lpa3NUVDFtS0Z3aUxpOTFkR2xzTDJsekxYUjVjR1ZrTFdGeWNtRjVYQ0lwTEhROVppaGNJaTR2ZFhScGJDOXBjeTF1WkdGeWNtRjVYQ0lwTEhrOVppaGNJaTR2ZFhScGJDOXdiMjlzWENJcExHYzlaaWhjSWk0dmRYUnBiQzkwYnkxb1lXeG1MV1pzYjJGMFhDSXBMRVU5WmloY0lpNHZkWFJwYkM5cGN5MWhjbkpoZVMxc2FXdGxYQ0lwTEVNOVppaGNJaTR2ZFhScGJDOW1iR0YwZEdWdVhDSXBPM1U5WmloY0lpNHZZMjl1YzNSaGJuUnpMMkZ5Y21GNWRIbHdaWE11YW5OdmJsd2lLVHQyWVhJZ1RqMW1LRndpTGk5amIyNXpkR0Z1ZEhNdllYSnlZWGwwZVhCbGN5NXFjMjl1WENJcExHNDlXems1T0RRc09UazROaXhjYmprNU9EVXNPVGs0TjEwc2JUMWJNQ3cyTkRBNUxEWTBNVEFzTmpRd055dzJOREE0WFN4Q1BYdDlPMEpiTmpRd09WMDlRbHMyTkRBMlhUMUNXelkwTURKZFBURTdRbHN6TkRBME1WMDlRbHMyTkRFd1hUMHlPMEpiTmpRd04xMDlRbHN6TlRrd05GMDlNenRDV3pZME1EaGRQVUpiTXpVNU1EWmRQVFE3ZG1GeUlGazlUMkpxWldOMExtdGxlWE1vZFNrdVkyOXVZMkYwS0Z0Y0lsdHZZbXBsWTNRZ1NGUk5URU5oYm5aaGMwVnNaVzFsYm5SZFhDSXNYQ0piYjJKcVpXTjBJRU5oYm5aaGMxSmxibVJsY21sdVowTnZiblJsZUhReVJGMWNJaXhjSWx0dlltcGxZM1FnU0ZSTlRFbHRZV2RsUld4bGJXVnVkRjFjSWl4Y0lsdHZZbXBsWTNRZ1NGUk5URlpwWkdWdlJXeGxiV1Z1ZEYxY0lsMHBMRXc5VzEwN1RGczFNVEl4WFQweE8weGJOVEV5TmwwOU5EdE1Xek0yTVRrelhUMHlPMHhiTlRFeU0xMDlNanRNV3pVeE1qVmRQVFE3ZG1GeUlFZzlXMTA3U0Zzek1qZzFORjA5TWp0SVd6TXlPRFUxWFQweU8waGJNell4T1RSZFBUSTdTRnN6TkRBME1WMDlORHRJV3pNek56YzJYVDB1TlR0SVd6TXpOemMzWFQwdU5UdElXek16TnpjNFhUMHhPMGhiTXpNM056bGRQVEU3U0Zzek5UazRObDA5TGpVN1NGc3pOVGs0TjEwOU1UdElXek0wTnprNFhUMHhPMGhiTXpVNE5EQmRQUzQxTzBoYk16VTROREZkUFM0eU5UdElXek0xT0RReVhUMHVOVHRjYmtoYk16VTRORE5kUFM0eU5UdElXek0yTVRrMlhUMHVOVHR3TG1WNGNHOXlkSE05Wm5WdVkzUnBiMjRvYUN4bUxIQXNkU3hJTEV3c1dpbDdablZ1WTNScGIyNGdSQ2dwZTNSb2FYTXVabTl5YldGMFBYUm9hWE11YVc1MFpYSnVZV3htYjNKdFlYUTlOalF3T0R0MGFHbHpMblI1Y0dVOU5URXlNVHQwYUdsekxtWnNhWEJaUFhSb2FYTXVjSEpsYlhWc2RHbHdiSGxCYkhCb1lUMTBhR2x6TG1OdmJYQnlaWE56WldROUlURTdkR2hwY3k1MWJuQmhZMnRCYkdsbmJtMWxiblE5TVR0MGFHbHpMbU5vWVc1dVpXeHpQWFJvYVhNdWFHVnBaMmgwUFhSb2FYTXVkMmxrZEdnOWRHaHBjeTVqYjJ4dmNsTndZV05sUFRCOVpuVnVZM1JwYjI0Z1N5aGhMR0lwZTJFdWFXNTBaWEp1WVd4bWIzSnRZWFE5WWk1cGJuUmxjbTVoYkdadmNtMWhkRHRoTG1admNtMWhkRDFpTG1admNtMWhkRHRoTG5SNWNHVTlZaTUwZVhCbE8yRXVZMjl0Y0hKbGMzTmxaRDFpTG1OdmJYQnlaWE56WldRN1lTNXdjbVZ0ZFd4MGFYQnNlVUZzY0doaFBXSXVjSEpsYlhWc2RHbHdiSGxCYkhCb1lUdGhMbVpzYVhCWlBXSXVabXhwY0ZrN1lTNTFibkJoWTJ0QmJHbG5ibTFsYm5ROVlpNTFibkJoWTJ0QmJHbG5ibTFsYm5RN1lTNWpiMnh2Y2xOd1lXTmxQV0l1WTI5c2IzSlRjR0ZqWlR0aExuZHBaSFJvUFdJdWQybGtkR2c3WVM1b1pXbG5hSFE5WEc1aUxtaGxhV2RvZER0aExtTm9ZVzV1Wld4elBXSXVZMmhoYm01bGJITjlablZ1WTNScGIyNGdXU2hoTEdJcGUybG1LRndpYjJKcVpXTjBYQ0k5UFQxMGVYQmxiMllnWWlZbVlpbDdYQ0p3Y21WdGRXeDBhWEJzZVVGc2NHaGhYQ0pwYmlCaUppWW9ZUzV3Y21WdGRXeDBhWEJzZVVGc2NHaGhQV0l1Y0hKbGJYVnNkR2x3YkhsQmJIQm9ZU2s3WENKbWJHbHdXVndpYVc0Z1lpWW1LR0V1Wm14cGNGazlZaTVtYkdsd1dTazdYQ0poYkdsbmJtMWxiblJjSW1sdUlHSW1KaWhoTG5WdWNHRmphMEZzYVdkdWJXVnVkRDFpTG1Gc2FXZHViV1Z1ZENrN1hDSmpiMnh2Y2xOd1lXTmxYQ0pwYmlCaUppWW9ZUzVqYjJ4dmNsTndZV05sUFhCaFcySXVZMjlzYjNKVGNHRmpaVjBwTzF3aWRIbHdaVndpYVc0Z1lpWW1LR0V1ZEhsd1pUMVdXMkl1ZEhsd1pWMHBPM1poY2lCalBXRXVkMmxrZEdnc1p6MWhMbWhsYVdkb2RDeG9QV0V1WTJoaGJtNWxiSE1zWmowaE1UdGNJbk5vWVhCbFhDSnBiaUJpUHloalBXSXVjMmhoY0dWYk1GMHNaejFpTG5Ob1lYQmxXekZkTERNOVBUMWlMbk5vWVhCbExteGxibWQwYUNZbUtHZzlZaTV6YUdGd1pWc3lYU3htUFNFd0tTazZLRndpY21Ga2FYVnpYQ0pwYmlCaUppWW9ZejFuUFdJdWNtRmthWFZ6S1N4Y0luZHBaSFJvWENKcGJpQmlKaVlvWXoxaUxuZHBaSFJvS1N4Y0ltaGxhV2RvZEZ3aWFXNGdZaVltS0djOVlpNW9aV2xuYUhRcExGeHVYQ0pqYUdGdWJtVnNjMXdpYVc0Z1lpWW1LR2c5WWk1amFHRnVibVZzY3l4bVBTRXdLU2s3WVM1M2FXUjBhRDFqZkRBN1lTNW9aV2xuYUhROVozd3dPMkV1WTJoaGJtNWxiSE05YUh3d08yTTlJVEU3WENKbWIzSnRZWFJjSW1sdUlHSW1KaWhqUFdJdVptOXliV0YwTEdjOVlTNXBiblJsY201aGJHWnZjbTFoZEQxWVcyTmRMR0V1Wm05eWJXRjBQVkJoVzJkZExHTWdhVzRnVmlZbUlTaGNJblI1Y0dWY0ltbHVJR0lwSmlZb1lTNTBlWEJsUFZaYlkxMHBMR01nYVc0Z1ZDWW1LR0V1WTI5dGNISmxjM05sWkQwaE1Da3NZejBoTUNrN0lXWW1KbU0vWVM1amFHRnVibVZzY3oxQ1cyRXVabTl5YldGMFhUcG1KaVloWXlZbVlTNWphR0Z1Ym1Wc2N5RTlQVzFiWVM1bWIzSnRZWFJkSmlZb1lTNW1iM0p0WVhROVlTNXBiblJsY201aGJHWnZjbTFoZEQxdFcyRXVZMmhoYm01bGJITmRLWDE5Wm5WdVkzUnBiMjRnZG1Fb1lTbDdhQzV3YVhobGJGTjBiM0psYVNnek56UTBNQ3hoTG1ac2FYQlpLVHRvTG5CcGVHVnNVM1J2Y21WcEtETTNORFF4TEdFdWNISmxiWFZzZEdsd2JIbEJiSEJvWVNrN2FDNXdhWGhsYkZOMGIzSmxhU2d6TnpRME15eGhMbU52Ykc5eVUzQmhZMlVwTzJndWNHbDRaV3hUZEc5eVpXa29Nek14Tnl4aExuVnVjR0ZqYTBGc2FXZHViV1Z1ZENsOVpuVnVZM1JwYjI0Z2NTZ3BlMFF1WTJGc2JDaDBhR2x6S1R0Y2JuUm9hWE11ZVU5bVpuTmxkRDEwYUdsekxuaFBabVp6WlhROU1EdDBhR2x6TG1SaGRHRTliblZzYkR0MGFHbHpMbTVsWldSelJuSmxaVDBoTVR0MGFHbHpMbVZzWlcxbGJuUTliblZzYkR0MGFHbHpMbTVsWldSelEyOXdlVDBoTVgxbWRXNWpkR2x2YmlCVEtHRXNZaWw3ZG1GeUlHZzliblZzYkR0eUtHSXBQMmc5WWpwaUppWW9XU2hoTEdJcExGd2llRndpYVc0Z1lpWW1LR0V1ZUU5bVpuTmxkRDFpTG5oOE1Da3NYQ0o1WENKcGJpQmlKaVlvWVM1NVQyWm1jMlYwUFdJdWVYd3dLU3h5S0dJdVpHRjBZU2ttSmlob1BXSXVaR0YwWVNrcE8ybG1LR0l1WTI5d2VTbDdkbUZ5SUdZOVNDNTJhV1YzY0c5eWRGZHBaSFJvTEc0OVNDNTJhV1YzY0c5eWRFaGxhV2RvZER0aExuZHBaSFJvUFdFdWQybGtkR2g4ZkdZdFlTNTRUMlptYzJWME8yRXVhR1ZwWjJoMFBXRXVhR1ZwWjJoMGZIeHVMV0V1ZVU5bVpuTmxkRHRoTG01bFpXUnpRMjl3ZVQwaE1IMWxiSE5sSUdsbUtDRm9LV0V1ZDJsa2RHZzlZUzUzYVdSMGFIeDhNU3hoTG1obGFXZG9kRDFoTG1obGFXZG9kSHg4TVN4aExtTm9ZVzV1Wld4elBXRXVZMmhoYm01bGJITjhmRFE3Wld4elpTQnBaaWhOS0dncEtXRXVZMmhoYm01bGJITTlZUzVqYUdGdWJtVnNjM3g4TkN4aExtUmhkR0U5YUN4Y0luUjVjR1ZjSW1sdUlHSjhmRFV4TWpFaFBUMWhMblI1Y0dWOGZDaGhMblI1Y0dVOVhHNU9XMDlpYW1WamRDNXdjbTkwYjNSNWNHVXVkRzlUZEhKcGJtY3VZMkZzYkNob0tWMThNQ2s3Wld4elpTQnBaaWhzS0dncEtYdGhMbU5vWVc1dVpXeHpQV0V1WTJoaGJtNWxiSE44ZkRRN1pqMW9PMjQ5Wmk1c1pXNW5kR2c3YzNkcGRHTm9LR0V1ZEhsd1pTbDdZMkZ6WlNBMU1USXhPbU5oYzJVZ05URXlNenBqWVhObElEVXhNalU2WTJGelpTQTFNVEkyT200OWVTNWhiR3h2WTFSNWNHVW9ZUzUwZVhCbExHNHBPMjR1YzJWMEtHWXBPMkV1WkdGMFlUMXVPMkp5WldGck8yTmhjMlVnTXpZeE9UTTZZUzVrWVhSaFBXY29aaWw5WVM1aGJHbG5ibTFsYm5ROU1UdGhMbTVsWldSelJuSmxaVDBoTUgxbGJITmxJR2xtS0hRb2FDa3BlMlk5YUM1a1lYUmhPMEZ5Y21GNUxtbHpRWEp5WVhrb1ppbDhmRFV4TWpFaFBUMWhMblI1Y0dWOGZDaGhMblI1Y0dVOVRsdFBZbXBsWTNRdWNISnZkRzkwZVhCbExuUnZVM1J5YVc1bkxtTmhiR3dvWmlsZGZEQXBPM1poY2lCdVBXZ3VjMmhoY0dVc2NUMW9Mbk4wY21sa1pTeHdMRVlzWkN4Mk96TTlQVDF1TG14bGJtZDBhRDhvWkQxdVd6SmRMSFk5Y1ZzeVhTazZkajFrUFRFN2NEMXVXekJkTzBZOWJsc3hYVHR1UFhGYk1GMDdjVDF4V3pGZE8yRXVZV3hwWjI1dFpXNTBQVEU3WVM1M2FXUjBhRDF3TzJFdWFHVnBaMmgwUFVZN1lTNWphR0Z1Ym1Wc2N6MWtPMkV1Wm05eWJXRjBQVnh1WVM1cGJuUmxjbTVoYkdadmNtMWhkRDF0VzJSZE8yRXVibVZsWkhOR2NtVmxQU0V3TzNBOWRqdG9QV2d1YjJabWMyVjBPMlE5WVM1M2FXUjBhRHQyUFdFdWFHVnBaMmgwTzBZOVlTNWphR0Z1Ym1Wc2N6dG1iM0lvZG1GeUlIVTllUzVoYkd4dlkxUjVjR1VvTXpZeE9UTTlQVDFoTG5SNWNHVS9OVEV5TmpwaExuUjVjR1VzWkNwMktrWXBMRUk5TUN4QlBUQTdRVHgyT3lzclFTbG1iM0lvZG1GeUlFUTlNRHRFUEdRN0t5dEVLV1p2Y2loMllYSWdkV0U5TUR0MVlUeEdPeXNyZFdFcGRWdENLeXRkUFdaYmJpcEVLM0VxUVN0d0tuVmhLMmhkTzJNb1lTeDFLWDFsYkhObElHbG1LRndpVzI5aWFtVmpkQ0JJVkUxTVEyRnVkbUZ6Uld4bGJXVnVkRjFjSWowOVBYZ29hQ2w4ZkZ3aVcyOWlhbVZqZENCRFlXNTJZWE5TWlc1a1pYSnBibWREYjI1MFpYaDBNa1JkWENJOVBUMTRLR2dwS1Z3aVcyOWlhbVZqZENCSVZFMU1RMkZ1ZG1GelJXeGxiV1Z1ZEYxY0lqMDlQWGdvYUNrL1lTNWxiR1Z0Wlc1MFBXZzZZUzVsYkdWdFpXNTBQV2d1WTJGdWRtRnpMR0V1ZDJsa2RHZzlZUzVsYkdWdFpXNTBMbmRwWkhSb0xHRXVhR1ZwWjJoMFBXRXVaV3hsYldWdWRDNW9aV2xuYUhRc1lTNWphR0Z1Ym1Wc2N6MDBPMlZzYzJVZ2FXWW9YQ0piYjJKcVpXTjBJRWhVVFV4SmJXRm5aVVZzWlcxbGJuUmRYQ0k5UFQxNEtHZ3BLV0V1Wld4bGJXVnVkRDFjYm1nc1lTNTNhV1IwYUQxb0xtNWhkSFZ5WVd4WGFXUjBhQ3hoTG1obGFXZG9kRDFvTG01aGRIVnlZV3hJWldsbmFIUXNZUzVqYUdGdWJtVnNjejAwTzJWc2MyVWdhV1lvWENKYmIySnFaV04wSUVoVVRVeFdhV1JsYjBWc1pXMWxiblJkWENJOVBUMTRLR2dwS1dFdVpXeGxiV1Z1ZEQxb0xHRXVkMmxrZEdnOWFDNTJhV1JsYjFkcFpIUm9MR0V1YUdWcFoyaDBQV2d1ZG1sa1pXOUlaV2xuYUhRc1lTNWphR0Z1Ym1Wc2N6MDBPMlZzYzJVZ2FXWW9heWhvS1NsN1pqMWhMbmRwWkhSb2ZIeG9XekJkTG14bGJtZDBhRHR1UFdFdWFHVnBaMmgwZkh4b0xteGxibWQwYUR0eFBXRXVZMmhoYm01bGJITTdjVDFGS0doYk1GMWJNRjBwUDNGOGZHaGJNRjFiTUYwdWJHVnVaM1JvT25GOGZERTdjRDFETG5Ob1lYQmxLR2dwTzJROU1UdG1iM0lvZGowd08zWThjQzVzWlc1bmRHZzdLeXQyS1dRcVBYQmJkbDA3WkQxNUxtRnNiRzlqVkhsd1pTZ3pOakU1TXowOVBXRXVkSGx3WlQ4MU1USTJPbUV1ZEhsd1pTeGtLVHRETG1ac1lYUjBaVzRvYUN4d0xGd2lYQ0lzWkNrN1l5aGhMR1FwTzJFdVlXeHBaMjV0Wlc1MFBURTdZUzUzYVdSMGFEMW1PMkV1YUdWcFoyaDBQVzQ3WVM1amFHRnVibVZzY3oxeE8yRXVabTl5YldGMFBXRXVhVzUwWlhKdVlXeG1iM0p0WVhROWJWdHhYVHRoTG01bFpXUnpSbkpsWlQwaE1IMTlablZ1WTNScGIyNGdiV0VvWVN4Y2JtSXNZeXhuTEdZcGUzWmhjaUJyUFdFdVpXeGxiV1Z1ZEN4c1BXRXVaR0YwWVN4dFBXRXVhVzUwWlhKdVlXeG1iM0p0WVhRc1pEMWhMbVp2Y20xaGRDeHlQV0V1ZEhsd1pTeHVQV0V1ZDJsa2RHZ3NjVDFoTG1obGFXZG9kRHQyWVNoaEtUdHJQMmd1ZEdWNFUzVmlTVzFoWjJVeVJDaGlMR1lzWXl4bkxHUXNjaXhyS1RwaExtTnZiWEJ5WlhOelpXUS9hQzVqYjIxd2NtVnpjMlZrVkdWNFUzVmlTVzFoWjJVeVJDaGlMR1lzWXl4bkxHMHNiaXh4TEd3cE9tRXVibVZsWkhORGIzQjVQeWgxS0Nrc2FDNWpiM0I1VkdWNFUzVmlTVzFoWjJVeVJDaGlMR1lzWXl4bkxHRXVlRTltWm5ObGRDeGhMbmxQWm1aelpYUXNiaXh4S1NrNmFDNTBaWGhUZFdKSmJXRm5aVEpFS0dJc1ppeGpMR2NzYml4eExHUXNjaXhzS1gxbWRXNWpkR2x2YmlCbllTZ3BlM0psZEhWeWJpQk9ZUzV3YjNBb0tYeDhibVYzSUhGOVpuVnVZM1JwYjI0Z1Z5aGhLWHRoTG01bFpXUnpSbkpsWlNZbWVTNW1jbVZsVkhsd1pTaGhMbVJoZEdFcE8zRXVZMkZzYkNoaEtUdE9ZUzV3ZFhOb0tHRXBmV1oxYm1OMGFXOXVJRklvS1h0RUxtTmhiR3dvZEdocGN5azdkR2hwY3k1blpXNU5hWEJ0WVhCelBTRXhPM1JvYVhNdWJXbHdiV0Z3U0dsdWREMDBNelV5TzNSb2FYTXViV2x3YldGemF6MHdPM1JvYVhNdWFXMWhaMlZ6UFVGeWNtRjVLREUyS1gxY2JtWjFibU4wYVc5dUlFY29ZU3hpTEdNcGUzWmhjaUJuUFdFdWFXMWhaMlZ6V3pCZFBXZGhLQ2s3WVM1dGFYQnRZWE5yUFRFN1p5NTNhV1IwYUQxaExuZHBaSFJvUFdJN1p5NW9aV2xuYUhROVlTNW9aV2xuYUhROVl6dG5MbU5vWVc1dVpXeHpQV0V1WTJoaGJtNWxiSE05TkgxbWRXNWpkR2x2YmlCaVlTaGhMR0lwZTNaaGNpQmpQVzUxYkd3N2FXWW9jaWhpS1NsalBXRXVhVzFoWjJWeld6QmRQV2RoS0Nrc1N5aGpMR0VwTEZNb1l5eGlLU3hoTG0xcGNHMWhjMnM5TVR0bGJITmxJR2xtS0Zrb1lTeGlLU3hCY25KaGVTNXBjMEZ5Y21GNUtHSXViV2x3YldGd0tTbG1iM0lvZG1GeUlHYzlZaTV0YVhCdFlYQXNhRDB3TzJnOFp5NXNaVzVuZEdnN0t5dG9LV005WVM1cGJXRm5aWE5iYUYwOVoyRW9LU3hMS0dNc1lTa3NZeTUzYVdSMGFENCtQV2dzWXk1b1pXbG5hSFErUGoxb0xGTW9ZeXhuVzJoZEtTeGhMbTFwY0cxaGMydDhQVEU4UEdnN1pXeHpaU0JqUFdFdWFXMWhaMlZ6V3pCZFBXZGhLQ2tzU3loakxHRXBMRk1vWXl4aUtTeGhMbTFwY0cxaGMyczlNVHRMS0dFc1lTNXBiV0ZuWlhOYk1GMHBmV1oxYm1OMGFXOXVJRzVoS0dFc1lpbDdabTl5S0haaGNpQmpQV0V1YVcxaFoyVnpMR2M5TUR0blBHTXViR1Z1WjNSb0ppWmpXMmRkT3lzclp5bDdkbUZ5SUdZOVkxdG5YU3hyUFdJc2JEMW5MRzA5Wmk1bGJHVnRaVzUwTEZ4dVpEMW1MbVJoZEdFc2NqMW1MbWx1ZEdWeWJtRnNabTl5YldGMExHNDlaaTVtYjNKdFlYUXNjVDFtTG5SNWNHVXNkRDFtTG5kcFpIUm9MSGs5Wmk1b1pXbG5hSFE3ZG1Fb1ppazdiVDlvTG5SbGVFbHRZV2RsTWtRb2F5eHNMRzRzYml4eExHMHBPbVl1WTI5dGNISmxjM05sWkQ5b0xtTnZiWEJ5WlhOelpXUlVaWGhKYldGblpUSkVLR3NzYkN4eUxIUXNlU3d3TEdRcE9tWXVibVZsWkhORGIzQjVQeWgxS0Nrc2FDNWpiM0I1VkdWNFNXMWhaMlV5UkNockxHd3NiaXhtTG5oUFptWnpaWFFzWmk1NVQyWm1jMlYwTEhRc2VTd3dLU2s2YUM1MFpYaEpiV0ZuWlRKRUtHc3NiQ3h1TEhRc2VTd3dMRzRzY1N4a0tYMTlablZ1WTNScGIyNGdlV0VvS1h0MllYSWdZVDFLWVM1d2IzQW9LWHg4Ym1WM0lGSTdSQzVqWVd4c0tHRXBPMlp2Y2loMllYSWdZajFoTG0xcGNHMWhjMnM5TURzeE5qNWlPeXNyWWlsaExtbHRZV2RsYzF0aVhUMXVkV3hzTzNKbGRIVnliaUJoZldaMWJtTjBhVzl1SUZVb1lTbDdabTl5S0haaGNpQmlQV0V1YVcxaFoyVnpMR005TUR0alBHSXViR1Z1WjNSb095c3JZeWxpVzJOZEppWlhLR0piWTEwcExHSmJZMTA5Ym5Wc2JEdEtZUzV3ZFhOb0tHRXBmV1oxYm1OMGFXOXVJR2xoS0NsN2RHaHBjeTV0WVdkR2FXeDBaWEk5ZEdocGN5NXRhVzVHYVd4MFpYSTlPVGN5T0R0MGFHbHpMbmR5WVhCVVBWeHVkR2hwY3k1M2NtRndVejB6TXpBM01UdDBhR2x6TG1GdWFYTnZkSEp2Y0dsalBURTdkR2hwY3k1blpXNU5hWEJ0WVhCelBTRXhPM1JvYVhNdWJXbHdiV0Z3U0dsdWREMDBNelV5ZldaMWJtTjBhVzl1SUd0aEtHRXNZaWw3WENKdGFXNWNJbWx1SUdJbUppaGhMbTFwYmtacGJIUmxjajFSVzJJdWJXbHVYU3d3UEQxdUxtbHVaR1Y0VDJZb1lTNXRhVzVHYVd4MFpYSXBKaVlvWVM1blpXNU5hWEJ0WVhCelBTRXdLU2s3WENKdFlXZGNJbWx1SUdJbUppaGhMbTFoWjBacGJIUmxjajFvWVZ0aUxtMWhaMTBwTzNaaGNpQmpQV0V1ZDNKaGNGTXNaejFoTG5keVlYQlVPMmxtS0Z3aWQzSmhjRndpYVc0Z1lpbDdkbUZ5SUdnOVlpNTNjbUZ3TzF3aWMzUnlhVzVuWENJOVBUMTBlWEJsYjJZZ2FEOWpQV2M5VDF0b1hUcEJjbkpoZVM1cGMwRnljbUY1S0dncEppWW9ZejFQVzJoYk1GMWRMR2M5VDF0b1d6RmRYU2w5Wld4elpWd2lkM0poY0ZOY0ltbHVJR0ltSmloalBVOWJZaTUzY21Gd1UxMHBMRndpZDNKaGNGUmNJbWx1SUdJbUppaG5QVTliWWk1M2NtRndWRjBwTzJFdWQzSmhjRk05WXp0aExuZHlZWEJVUFdjN1hDSmhibWx6YjNSeWIzQnBZMXdpYVc0Z1lpWW1LR0V1WVc1cGMyOTBjbTl3YVdNOVlpNWhibWx6YjNSeWIzQnBZeWs3YVdZb1hDSnRhWEJ0WVhCY0ltbHVJR0lwZTJNOUlURTdjM2RwZEdOb0tIUjVjR1Z2WmlCaUxtMXBjRzFoY0NsN1kyRnpaU0JjSW5OMGNtbHVaMXdpT21FdWJXbHdiV0Z3U0dsdWREMWNibVZoVzJJdWJXbHdiV0Z3WFR0alBXRXVaMlZ1VFdsd2JXRndjejBoTUR0aWNtVmhhenRqWVhObElGd2lZbTl2YkdWaGJsd2lPbU05WVM1blpXNU5hWEJ0WVhCelBXSXViV2x3YldGd08ySnlaV0ZyTzJOaGMyVWdYQ0p2WW1wbFkzUmNJanBoTG1kbGJrMXBjRzFoY0hNOUlURXNZejBoTUgwaFkzeDhYQ0p0YVc1Y0ltbHVJR0o4ZkNoaExtMXBia1pwYkhSbGNqMDVPVGcwS1gxOVpuVnVZM1JwYjI0Z2NtRW9ZU3hpS1h0b0xuUmxlRkJoY21GdFpYUmxjbWtvWWl3eE1ESTBNU3hoTG0xcGJrWnBiSFJsY2lrN2FDNTBaWGhRWVhKaGJXVjBaWEpwS0dJc01UQXlOREFzWVM1dFlXZEdhV3gwWlhJcE8yZ3VkR1Y0VUdGeVlXMWxkR1Z5YVNoaUxERXdNalF5TEdFdWQzSmhjRk1wTzJndWRHVjRVR0Z5WVcxbGRHVnlhU2hpTERFd01qUXpMR0V1ZDNKaGNGUXBPMll1WlhoMFgzUmxlSFIxY21WZlptbHNkR1Z5WDJGdWFYTnZkSEp2Y0dsakppWm9MblJsZUZCaGNtRnRaWFJsY21rb1lpd3pOREEwTml4aExtRnVhWE52ZEhKdmNHbGpLVHRoTG1kbGJrMXBjRzFoY0hNbUppaG9MbWhwYm5Rb016TXhOekFzWVM1dGFYQnRZWEJJYVc1MEtTeG9MbWRsYm1WeVlYUmxUV2x3YldGd0tHSXBLWDFtZFc1amRHbHZiaUJ6WVNoaEtYdEVMbU5oYkd3b2RHaHBjeWs3ZEdocGN5NXRhWEJ0WVhOclBUQTdkR2hwY3k1cGJuUmxjbTVoYkdadmNtMWhkRDFjYmpZME1EZzdkR2hwY3k1cFpEMUNZU3NyTzNSb2FYTXVjbVZtUTI5MWJuUTlNVHQwYUdsekxuUmhjbWRsZEQxaE8zUm9hWE11ZEdWNGRIVnlaVDFvTG1OeVpXRjBaVlJsZUhSMWNtVW9LVHQwYUdsekxuVnVhWFE5TFRFN2RHaHBjeTVpYVc1a1EyOTFiblE5TUR0MGFHbHpMblJsZUVsdVptODlibVYzSUdsaE8xb3VjSEp2Wm1sc1pTWW1LSFJvYVhNdWMzUmhkSE05ZTNOcGVtVTZNSDBwZldaMWJtTjBhVzl1SUdSaEtHRXBlMmd1WVdOMGFYWmxWR1Y0ZEhWeVpTZ3pNems0TkNrN2FDNWlhVzVrVkdWNGRIVnlaU2hoTG5SaGNtZGxkQ3hoTG5SbGVIUjFjbVVwZldaMWJtTjBhVzl1SUdwaEtDbDdkbUZ5SUdFOWIyRmJNRjA3WVQ5b0xtSnBibVJVWlhoMGRYSmxLR0V1ZEdGeVoyVjBMR0V1ZEdWNGRIVnlaU2s2YUM1aWFXNWtWR1Y0ZEhWeVpTZ3pOVFV6TEc1MWJHd3BmV1oxYm1OMGFXOXVJR3hoS0dFcGUzWmhjaUJpUFdFdWRHVjRkSFZ5WlN4alBXRXVkVzVwZEN4blBXRXVkR0Z5WjJWME96QThQV01tSmlob0xtRmpkR2wyWlZSbGVIUjFjbVVvTXpNNU9EUXJZeWtzYUM1aWFXNWtWR1Y0ZEhWeVpTaG5MRzUxYkd3cExHOWhXMk5kUFc1MWJHd3BPMmd1WkdWc1pYUmxWR1Y0ZEhWeVpTaGlLVHRoTG5SbGVIUjFjbVU5Ym5Wc2JEdGhMbkJoY21GdGN6MXVkV3hzTzJFdWNHbDRaV3h6UFc1MWJHdzdZUzV5WldaRGIzVnVkRDFjYmpBN1pHVnNaWFJsSUdOaFcyRXVhV1JkTzB3dWRHVjRkSFZ5WlVOdmRXNTBMUzE5ZG1GeUlHVmhQWHRjSW1SdmJpZDBJR05oY21WY0lqbzBNelV5TEZ3aVpHOXVkQ0JqWVhKbFhDSTZORE0xTWl4dWFXTmxPalF6TlRRc1ptRnpkRG8wTXpVemZTeFBQWHR5WlhCbFlYUTZNVEEwT1Rjc1kyeGhiWEE2TXpNd056RXNiV2x5Y205eU9qTXpOalE0ZlN4b1lUMTdibVZoY21WemREbzVOekk0TEd4cGJtVmhjam81TnpJNWZTeFJQV0lvZTIxcGNHMWhjRG81T1RnM0xGd2libVZoY21WemRDQnRhWEJ0WVhBZ2JtVmhjbVZ6ZEZ3aU9qazVPRFFzWENKc2FXNWxZWElnYldsd2JXRndJRzVsWVhKbGMzUmNJam81T1RnMUxGd2libVZoY21WemRDQnRhWEJ0WVhBZ2JHbHVaV0Z5WENJNk9UazROaXhjSW14cGJtVmhjaUJ0YVhCdFlYQWdiR2x1WldGeVhDSTZPVGs0TjMwc2FHRXBMSEJoUFh0dWIyNWxPakFzWW5KdmQzTmxjam96TnpRME5IMHNWajE3ZFdsdWREZzZOVEV5TVN4eVoySmhORG96TWpneE9TeHlaMkkxTmpVNk16TTJNelVzWENKeVoySTFJR0V4WENJNk16STRNakI5TEZnOWUyRnNjR2hoT2pZME1EWXNiSFZ0YVc1aGJtTmxPalkwTURrc1hDSnNkVzFwYm1GdVkyVWdZV3h3YUdGY0lqbzJOREV3TEhKbllqbzJOREEzTEhKblltRTZOalF3T0N4eVoySmhORG96TWpnMU5DeGNJbkpuWWpVZ1lURmNJam96TWpnMU5TeHlaMkkxTmpVNk16WXhPVFI5TEZ4dVZEMTdmVHRtTG1WNGRGOXpjbWRpSmlZb1dDNXpjbWRpUFRNMU9UQTBMRmd1YzNKblltRTlNelU1TURZcE8yWXViMlZ6WDNSbGVIUjFjbVZmWm14dllYUW1KaWhXTG1ac2IyRjBNekk5Vmx0Y0ltWnNiMkYwWENKZFBUVXhNallwTzJZdWIyVnpYM1JsZUhSMWNtVmZhR0ZzWmw5bWJHOWhkQ1ltS0ZZdVpteHZZWFF4TmoxV1cxd2lhR0ZzWmlCbWJHOWhkRndpWFQwek5qRTVNeWs3Wmk1M1pXSm5iRjlrWlhCMGFGOTBaWGgwZFhKbEppWW9ZaWhZTEh0a1pYQjBhRG8yTkRBeUxGd2laR1Z3ZEdnZ2MzUmxibU5wYkZ3aU9qTTBNRFF4ZlNrc1lpaFdMSHQxYVc1ME1UWTZOVEV5TXl4MWFXNTBNekk2TlRFeU5TeGNJbVJsY0hSb0lITjBaVzVqYVd4Y0lqb3pOREEwTW4wcEtUdG1MbmRsWW1kc1gyTnZiWEJ5WlhOelpXUmZkR1Y0ZEhWeVpWOXpNM1JqSmlaaUtGUXNlMXdpY21kaUlITXpkR01nWkhoME1Wd2lPak16TnpjMkxGd2ljbWRpWVNCek0zUmpJR1I0ZERGY0lqb3pNemMzTnl4Y0luSm5ZbUVnY3pOMFl5QmtlSFF6WENJNk16TTNOemdzWENKeVoySmhJSE16ZEdNZ1pIaDBOVndpT2pNek56YzVmU2s3Wmk1M1pXSm5iRjlqYjIxd2NtVnpjMlZrWDNSbGVIUjFjbVZmWVhSakppWmlLRlFzZTF3aWNtZGlJR0YwWTF3aU9qTTFPVGcyTEZ3aWNtZGlZU0JoZEdNZ1pYaHdiR2xqYVhRZ1lXeHdhR0ZjSWpvek5UazROeXhjSW5KblltRWdZWFJqSUdsdWRHVnljRzlzWVhSbFpDQmhiSEJvWVZ3aU9qTTBOems0ZlNrN1hHNW1MbmRsWW1kc1gyTnZiWEJ5WlhOelpXUmZkR1Y0ZEhWeVpWOXdkbkowWXlZbVlpaFVMSHRjSW5KbllpQndkbkowWXlBMFluQndkakZjSWpvek5UZzBNQ3hjSW5KbllpQndkbkowWXlBeVluQndkakZjSWpvek5UZzBNU3hjSW5KblltRWdjSFp5ZEdNZ05HSndjSFl4WENJNk16VTRORElzWENKeVoySmhJSEIyY25SaklESmljSEIyTVZ3aU9qTTFPRFF6ZlNrN1ppNTNaV0puYkY5amIyMXdjbVZ6YzJWa1gzUmxlSFIxY21WZlpYUmpNU1ltS0ZSYlhDSnlaMklnWlhSak1Wd2lYVDB6TmpFNU5pazdkbUZ5SUhWaFBVRnljbUY1TG5CeWIzUnZkSGx3WlM1emJHbGpaUzVqWVd4c0tHZ3VaMlYwVUdGeVlXMWxkR1Z5S0RNME5EWTNLU2s3VDJKcVpXTjBMbXRsZVhNb1ZDa3VabTl5UldGamFDaG1kVzVqZEdsdmJpaGhLWHQyWVhJZ1lqMVVXMkZkT3pBOFBYVmhMbWx1WkdWNFQyWW9ZaWttSmloWVcyRmRQV0lwZlNrN2RtRnlJRVZoUFU5aWFtVmpkQzVyWlhsektGZ3BPM0F1ZEdWNGRIVnlaVVp2Y20xaGRITTlSV0U3ZG1GeUlFWmhQVnRkTzA5aWFtVmpkQzVyWlhsektGZ3BMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9ZU2w3Um1GYldGdGhYVjA5WVgwcE8zWmhjaUJJWVQxYlhUdFBZbXBsWTNRdWEyVjVjeWhXS1M1bWIzSkZZV05vS0daMWJtTjBhVzl1S0dFcGUwaGhXMVpiWVYxZFBXRjlLVHQyWVhJZ1NXRTlXMTA3VDJKcVpXTjBMbXRsZVhNb2FHRXBMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9ZU2w3U1dGYmFHRmJZVjFkUFZ4dVlYMHBPM1poY2lCRFlUMWJYVHRQWW1wbFkzUXVhMlY1Y3loUktTNW1iM0pGWVdOb0tHWjFibU4wYVc5dUtHRXBlME5oVzFGYllWMWRQV0Y5S1R0MllYSWdSR0U5VzEwN1QySnFaV04wTG10bGVYTW9UeWt1Wm05eVJXRmphQ2htZFc1amRHbHZiaWhoS1h0RVlWdFBXMkZkWFQxaGZTazdkbUZ5SUZCaFBVVmhMbkpsWkhWalpTaG1kVzVqZEdsdmJpaGhMR0lwZTNaaGNpQmpQVmhiWWwwN05qUXdPVDA5UFdOOGZEWTBNRFk5UFQxamZIdzJOREE1UFQwOVkzeDhOalF4TUQwOVBXTjhmRFkwTURJOVBUMWpmSHd6TkRBME1UMDlQV00vWVZ0alhUMWpPak15T0RVMVBUMDlZM3g4TUR3OVlpNXBibVJsZUU5bUtGd2ljbWRpWVZ3aUtUOWhXMk5kUFRZME1EZzZZVnRqWFQwMk5EQTNPM0psZEhWeWJpQmhmU3g3ZlNrc1RtRTlXMTBzU21FOVcxMHNRbUU5TUN4allUMTdmU3gwWVQxd0xtMWhlRlJsZUhSMWNtVlZibWwwY3l4dllUMUJjbkpoZVNoMFlTa3ViV0Z3S0daMWJtTjBhVzl1S0NsN2NtVjBkWEp1SUc1MWJHeDlLVHRpS0hOaExuQnliM1J2ZEhsd1pTeDdZbWx1WkRwbWRXNWpkR2x2YmlncGUzUm9hWE11WW1sdVpFTnZkVzUwS3oweE8zWmhjaUJoUFhSb2FYTXVkVzVwZER0cFppZ3dQbUVwZTJadmNpaDJZWElnWWowd08ySThkR0U3S3l0aUtYdDJZWElnWXoxdllWdGlYVHRwWmloaktYdHBaaWd3UEdNdVltbHVaRU52ZFc1MEtXTnZiblJwYm5WbE8xeHVZeTUxYm1sMFBTMHhmVzloVzJKZFBYUm9hWE03WVQxaU8ySnlaV0ZyZlZvdWNISnZabWxzWlNZbVRDNXRZWGhVWlhoMGRYSmxWVzVwZEhNOFlTc3hKaVlvVEM1dFlYaFVaWGgwZFhKbFZXNXBkSE05WVNzeEtUdDBhR2x6TG5WdWFYUTlZVHRvTG1GamRHbDJaVlJsZUhSMWNtVW9Nek01T0RRcllTazdhQzVpYVc1a1ZHVjRkSFZ5WlNoMGFHbHpMblJoY21kbGRDeDBhR2x6TG5SbGVIUjFjbVVwZlhKbGRIVnliaUJoZlN4MWJtSnBibVE2Wm5WdVkzUnBiMjRvS1hzdExYUm9hWE11WW1sdVpFTnZkVzUwZlN4a1pXTlNaV1k2Wm5WdVkzUnBiMjRvS1hzd1BqMHRMWFJvYVhNdWNtVm1RMjkxYm5RbUpteGhLSFJvYVhNcGZYMHBPMW91Y0hKdlptbHNaU1ltS0V3dVoyVjBWRzkwWVd4VVpYaDBkWEpsVTJsNlpUMW1kVzVqZEdsdmJpZ3BlM1poY2lCaFBUQTdUMkpxWldOMExtdGxlWE1vWTJFcExtWnZja1ZoWTJnb1puVnVZM1JwYjI0b1lpbDdZU3M5WTJGYllsMHVjM1JoZEhNdWMybDZaWDBwTzNKbGRIVnliaUJoZlNrN2NtVjBkWEp1ZTJOeVpXRjBaVEpFT21aMWJtTjBhVzl1S0dJc1l5bDdablZ1WTNScGIyNGdaeWhpTEdNcGUzWmhjaUJsUFdZdWRHVjRTVzVtYnp0cFlTNWpZV3hzS0dVcE8zWmhjaUJvUFhsaEtDazdYQ0p1ZFcxaVpYSmNJajA5UFhSNWNHVnZaaUJpUDF3aWJuVnRZbVZ5WENJOVBUMTBlWEJsYjJZZ1l6OWNia2NvYUN4aWZEQXNZM3d3S1RwSEtHZ3NZbnd3TEdKOE1DazZZajhvYTJFb1pTeGlLU3hpWVNob0xHSXBLVHBIS0dnc01Td3hLVHRsTG1kbGJrMXBjRzFoY0hNbUppaG9MbTFwY0cxaGMyczlLR2d1ZDJsa2RHZzhQREVwTFRFcE8yWXViV2x3YldGemF6MW9MbTFwY0cxaGMyczdTeWhtTEdncE8yWXVhVzUwWlhKdVlXeG1iM0p0WVhROWFDNXBiblJsY201aGJHWnZjbTFoZER0bkxuZHBaSFJvUFdndWQybGtkR2c3Wnk1b1pXbG5hSFE5YUM1b1pXbG5hSFE3WkdFb1ppazdibUVvYUN3ek5UVXpLVHR5WVNobExETTFOVE1wTzJwaEtDazdWU2hvS1R0YUxuQnliMlpwYkdVbUppaG1Mbk4wWVhSekxuTnBlbVU5WVNobUxtbHVkR1Z5Ym1Gc1ptOXliV0YwTEdZdWRIbHdaU3hvTG5kcFpIUm9MR2d1YUdWcFoyaDBMR1V1WjJWdVRXbHdiV0Z3Y3l3aE1Ta3BPMmN1Wm05eWJXRjBQVVpoVzJZdWFXNTBaWEp1WVd4bWIzSnRZWFJkTzJjdWRIbHdaVDFJWVZ0bUxuUjVjR1ZkTzJjdWJXRm5QVWxoVzJVdWJXRm5SbWxzZEdWeVhUdG5MbTFwYmoxRFlWdGxMbTFwYmtacGJIUmxjbDA3Wnk1M2NtRndVejFFWVZ0bExuZHlZWEJUWFR0bkxuZHlZWEJVUFVSaFcyVXVkM0poY0ZSZE8zSmxkSFZ5YmlCbmZYWmhjaUJtUFc1bGR5QnpZU2d6TlRVektUdGpZVnRtTG1sa1hUMW1PMHd1ZEdWNGRIVnlaVU52ZFc1MEt5czdYRzVuS0dJc1l5azdaeTV6ZFdKcGJXRm5aVDFtZFc1amRHbHZiaWhoTEdJc1l5eGxLWHRpZkQwd08yTjhQVEE3Wlh3OU1EdDJZWElnWkQxbllTZ3BPMHNvWkN4bUtUdGtMbmRwWkhSb1BUQTdaQzVvWldsbmFIUTlNRHRUS0dRc1lTazdaQzUzYVdSMGFEMWtMbmRwWkhSb2ZId29aaTUzYVdSMGFENCtaU2t0WWp0a0xtaGxhV2RvZEQxa0xtaGxhV2RvZEh4OEtHWXVhR1ZwWjJoMFBqNWxLUzFqTzJSaEtHWXBPMjFoS0dRc016VTFNeXhpTEdNc1pTazdhbUVvS1R0WEtHUXBPM0psZEhWeWJpQm5mVHRuTG5KbGMybDZaVDFtZFc1amRHbHZiaWhpTEdNcGUzWmhjaUJsUFdKOE1DeHJQV044TUh4OFpUdHBaaWhsUFQwOVppNTNhV1IwYUNZbWF6MDlQV1l1YUdWcFoyaDBLWEpsZEhWeWJpQm5PMmN1ZDJsa2RHZzlaaTUzYVdSMGFEMWxPMmN1YUdWcFoyaDBQV1l1YUdWcFoyaDBQV3M3WkdFb1ppazdabTl5S0haaGNpQmtQVEE3Wmk1dGFYQnRZWE5yUGo1a095c3JaQ2xvTG5SbGVFbHRZV2RsTWtRb016VTFNeXhrTEdZdVptOXliV0YwTEdVK1BtUXNhejQrWkN3d0xHWXVabTl5YldGMExHWXVkSGx3WlN4dWRXeHNLVHRxWVNncE8xb3VjSEp2Wm1sc1pTWW1LR1l1YzNSaGRITXVjMmw2WlQxaEtHWXVhVzUwWlhKdVlXeG1iM0p0WVhRc1ppNTBlWEJsTEdVc2F5d2hNU3doTVNrcE8zSmxkSFZ5YmlCbmZUdGNibWN1WDNKbFoyeFVlWEJsUFZ3aWRHVjRkSFZ5WlRKa1hDSTdaeTVmZEdWNGRIVnlaVDFtTzFvdWNISnZabWxzWlNZbUtHY3VjM1JoZEhNOVppNXpkR0YwY3lrN1p5NWtaWE4wY205NVBXWjFibU4wYVc5dUtDbDdaaTVrWldOU1pXWW9LWDA3Y21WMGRYSnVJR2Q5TEdOeVpXRjBaVU4xWW1VNlpuVnVZM1JwYjI0b1lpeGpMR2NzWml4ckxHd3BlMloxYm1OMGFXOXVJRzBvWWl4akxHVXNaeXhvTEdZcGUzWmhjaUJyTEd3OWJpNTBaWGhKYm1adk8ybGhMbU5oYkd3b2JDazdabTl5S0dzOU1EczJQbXM3S3l0cktXUmJhMTA5ZVdFb0tUdHBaaWhjSW01MWJXSmxjbHdpUFQwOWRIbHdaVzltSUdKOGZDRmlLV1p2Y2loaVBXSjhNSHg4TVN4clBUQTdOajVyT3lzcmF5bEhLR1JiYTEwc1lpeGlLVHRsYkhObElHbG1LRndpYjJKcVpXTjBYQ0k5UFQxMGVYQmxiMllnWWlscFppaGpLV0poS0dSYk1GMHNZaWtzWW1Fb1pGc3hYU3hqS1N4aVlTaGtXekpkTEdVcExHSmhLR1JiTTEwc1p5a3NZbUVvWkZzMFhTeG9LU3hpWVNoa1d6VmRMR1lwTzJWc2MyVWdhV1lvYTJFb2JDeGlLU3haS0c0c1lpa3NYQ0ptWVdObGMxd2lhVzRnWWlsbWIzSW9ZajFpTG1aaFkyVnpMR3M5TURzMlBtczdLeXRyS1Vzb1pGdHJYU3h1S1N4aVlTaGtXMnRkTEdKYmExMHBPMlZzYzJVZ1ptOXlLR3M5TURzMlBtczdLeXRyS1dKaEtHUmJhMTBzWWlrN1hHNUxLRzRzWkZzd1hTazdiaTV0YVhCdFlYTnJQV3d1WjJWdVRXbHdiV0Z3Y3o4b1pGc3dYUzUzYVdSMGFEdzhNU2t0TVRwa1d6QmRMbTFwY0cxaGMyczdiaTVwYm5SbGNtNWhiR1p2Y20xaGREMWtXekJkTG1sdWRHVnlibUZzWm05eWJXRjBPMjB1ZDJsa2RHZzlaRnN3WFM1M2FXUjBhRHR0TG1obGFXZG9kRDFrV3pCZExtaGxhV2RvZER0a1lTaHVLVHRtYjNJb2F6MHdPelkrYXpzcksyc3BibUVvWkZ0clhTd3pOREEyT1N0cktUdHlZU2hzTERNME1EWTNLVHRxWVNncE8xb3VjSEp2Wm1sc1pTWW1LRzR1YzNSaGRITXVjMmw2WlQxaEtHNHVhVzUwWlhKdVlXeG1iM0p0WVhRc2JpNTBlWEJsTEcwdWQybGtkR2dzYlM1b1pXbG5hSFFzYkM1blpXNU5hWEJ0WVhCekxDRXdLU2s3YlM1bWIzSnRZWFE5Um1GYmJpNXBiblJsY201aGJHWnZjbTFoZEYwN2JTNTBlWEJsUFVoaFcyNHVkSGx3WlYwN2JTNXRZV2M5U1dGYmJDNXRZV2RHYVd4MFpYSmRPMjB1YldsdVBVTmhXMnd1YldsdVJtbHNkR1Z5WFR0dExuZHlZWEJUUFVSaFcyd3VkM0poY0ZOZE8yMHVkM0poY0ZROVJHRmJiQzUzY21Gd1ZGMDdabTl5S0dzOU1EczJQbXM3S3l0cktWVW9aRnRyWFNrN2NtVjBkWEp1SUcxOWRtRnlJRzQ5Ym1WM0lITmhLRE0wTURZM0tUdGpZVnR1TG1sa1hUMXVPMHd1WTNWaVpVTnZkVzUwS3lzN2RtRnlJR1E5UVhKeVlYa29OaWs3WEc1dEtHSXNZeXhuTEdZc2F5eHNLVHR0TG5OMVltbHRZV2RsUFdaMWJtTjBhVzl1S0dFc1lpeGpMR1FzWlNsN1kzdzlNRHRrZkQwd08yVjhQVEE3ZG1GeUlHYzlaMkVvS1R0TEtHY3NiaWs3Wnk1M2FXUjBhRDB3TzJjdWFHVnBaMmgwUFRBN1V5aG5MR0lwTzJjdWQybGtkR2c5Wnk1M2FXUjBhSHg4S0c0dWQybGtkR2crUG1VcExXTTdaeTVvWldsbmFIUTlaeTVvWldsbmFIUjhmQ2h1TG1obGFXZG9kRDQrWlNrdFpEdGtZU2h1S1R0dFlTaG5MRE0wTURZNUsyRXNZeXhrTEdVcE8ycGhLQ2s3VnlobktUdHlaWFIxY200Z2JYMDdiUzV5WlhOcGVtVTlablZ1WTNScGIyNG9ZaWw3WW53OU1EdHBaaWhpSVQwOWJpNTNhV1IwYUNsN2JTNTNhV1IwYUQxdUxuZHBaSFJvUFdJN2JTNW9aV2xuYUhROWJpNW9aV2xuYUhROVlqdGtZU2h1S1R0bWIzSW9kbUZ5SUdNOU1EczJQbU03S3l0aktXWnZjaWgyWVhJZ1pEMHdPMjR1Yldsd2JXRnphejQrWkRzcksyUXBhQzUwWlhoSmJXRm5aVEpFS0RNME1EWTVLMk1zWkN4dUxtWnZjbTFoZEN4aVBqNWtMR0krUG1Rc01DeHVMbVp2Y20xaGRDeHVMblI1Y0dVc2JuVnNiQ2s3YW1Fb0tUdGFMbkJ5YjJacGJHVW1KaWh1TG5OMFlYUnpMbk5wZW1VOVlTaHVMbWx1ZEdWeWJtRnNabTl5YldGMExHNHVkSGx3WlN4dExuZHBaSFJvTEcwdWFHVnBaMmgwTENFeExDRXdLU2s3WEc1eVpYUjFjbTRnYlgxOU8yMHVYM0psWjJ4VWVYQmxQVndpZEdWNGRIVnlaVU4xWW1WY0lqdHRMbDkwWlhoMGRYSmxQVzQ3V2k1d2NtOW1hV3hsSmlZb2JTNXpkR0YwY3oxdUxuTjBZWFJ6S1R0dExtUmxjM1J5YjNrOVpuVnVZM1JwYjI0b0tYdHVMbVJsWTFKbFppZ3BmVHR5WlhSMWNtNGdiWDBzWTJ4bFlYSTZablZ1WTNScGIyNG9LWHRtYjNJb2RtRnlJR0U5TUR0aFBIUmhPeXNyWVNsb0xtRmpkR2wyWlZSbGVIUjFjbVVvTXpNNU9EUXJZU2tzYUM1aWFXNWtWR1Y0ZEhWeVpTZ3pOVFV6TEc1MWJHd3BMRzloVzJGZFBXNTFiR3c3UmloallTa3VabTl5UldGamFDaHNZU2s3VEM1amRXSmxRMjkxYm5ROU1EdE1MblJsZUhSMWNtVkRiM1Z1ZEQwd2ZTeG5aWFJVWlhoMGRYSmxPbVoxYm1OMGFXOXVLR0VwZTNKbGRIVnliaUJ1ZFd4c2ZTeHlaWE4wYjNKbE9tWjFibU4wYVc5dUtDbDdSaWhqWVNrdVptOXlSV0ZqYUNobWRXNWpkR2x2YmloaEtYdGhMblJsZUhSMWNtVTlhQzVqY21WaGRHVlVaWGgwZFhKbEtDazdhQzVpYVc1a1ZHVjRkSFZ5WlNoaExuUmhjbWRsZEN4aExuUmxlSFIxY21VcE8yWnZjaWgyWVhJZ1lqMHdPek15UG1JN0t5dGlLV2xtS0RBaFBUMG9ZUzV0YVhCdFlYTnJKakU4UEdJcEtXbG1LRE0xTlRNOVBUMWhMblJoY21kbGRDbG9MblJsZUVsdFlXZGxNa1FvTXpVMU15eGlMR0V1YVc1MFpYSnVZV3htYjNKdFlYUXNYRzVoTG5kcFpIUm9QajVpTEdFdWFHVnBaMmgwUGo1aUxEQXNZUzVwYm5SbGNtNWhiR1p2Y20xaGRDeGhMblI1Y0dVc2JuVnNiQ2s3Wld4elpTQm1iM0lvZG1GeUlHTTlNRHMyUG1NN0t5dGpLV2d1ZEdWNFNXMWhaMlV5UkNnek5EQTJPU3RqTEdJc1lTNXBiblJsY201aGJHWnZjbTFoZEN4aExuZHBaSFJvUGo1aUxHRXVhR1ZwWjJoMFBqNWlMREFzWVM1cGJuUmxjbTVoYkdadmNtMWhkQ3hoTG5SNWNHVXNiblZzYkNrN2NtRW9ZUzUwWlhoSmJtWnZMR0V1ZEdGeVoyVjBLWDBwZlgxOWZTeDdYQ0l1TDJOdmJuTjBZVzUwY3k5aGNuSmhlWFI1Y0dWekxtcHpiMjVjSWpvekxGd2lMaTkxZEdsc0wyVjRkR1Z1WkZ3aU9qSXlMRndpTGk5MWRHbHNMMlpzWVhSMFpXNWNJam95TXl4Y0lpNHZkWFJwYkM5cGN5MWhjbkpoZVMxc2FXdGxYQ0k2TWpRc1hDSXVMM1YwYVd3dmFYTXRibVJoY25KaGVWd2lPakkxTEZ3aUxpOTFkR2xzTDJsekxYUjVjR1ZrTFdGeWNtRjVYQ0k2TWpZc1hDSXVMM1YwYVd3dmNHOXZiRndpT2pJNExGd2lMaTkxZEdsc0wzUnZMV2hoYkdZdFpteHZZWFJjSWpvek1DeGNJaTR2ZFhScGJDOTJZV3gxWlhOY0lqb3pNWDFkTERFNU9sdG1kVzVqZEdsdmJpaG1MSEFzZFNsN2NDNWxlSEJ2Y25SelBXWjFibU4wYVc5dUtHWXNheWw3Wm5WdVkzUnBiMjRnY0NncGUzUm9hWE11Wlc1a1VYVmxjbmxKYm1SbGVEMTBhR2x6TG5OMFlYSjBVWFZsY25sSmJtUmxlRDFjYmkweE8zUm9hWE11YzNWdFBUQTdkR2hwY3k1emRHRjBjejF1ZFd4c2ZXWjFibU4wYVc5dUlISW9ZU3hpTEdNcGUzWmhjaUJtUFVZdWNHOXdLQ2w4Zkc1bGR5QndPMll1YzNSaGNuUlJkV1Z5ZVVsdVpHVjRQV0U3Wmk1bGJtUlJkV1Z5ZVVsdVpHVjRQV0k3Wmk1emRXMDlNRHRtTG5OMFlYUnpQV003ZFM1d2RYTm9LR1lwZlhaaGNpQmpQV3N1WlhoMFgyUnBjMnB2YVc1MFgzUnBiV1Z5WDNGMVpYSjVPMmxtS0NGaktYSmxkSFZ5YmlCdWRXeHNPM1poY2lCaFBWdGRMR0k5VzEwc1JqMWJYU3gxUFZ0ZExIUTlXMTBzZVQxYlhUdHlaWFIxY201N1ltVm5hVzVSZFdWeWVUcG1kVzVqZEdsdmJpaG5LWHQyWVhJZ1pqMWhMbkJ2Y0NncGZIeGpMbU55WldGMFpWRjFaWEo1UlZoVUtDazdZeTVpWldkcGJsRjFaWEo1UlZoVUtETTFNREEzTEdZcE8ySXVjSFZ6YUNobUtUdHlLR0l1YkdWdVozUm9MVEVzWWk1c1pXNW5kR2dzWnlsOUxHVnVaRkYxWlhKNU9tWjFibU4wYVc5dUtDbDdZeTVsYm1SUmRXVnllVVZZVkNnek5UQXdOeWw5TEhCMWMyaFRZMjl3WlZOMFlYUnpPbklzZFhCa1lYUmxPbVoxYm1OMGFXOXVLQ2w3ZG1GeUlHY3NaanRuUFdJdWJHVnVaM1JvTzJsbUtEQWhQVDFuS1h0NUxteGxibWQwYUQxTllYUm9MbTFoZUNoNUxteGxibWQwYUN4bkt6RXBPM1F1YkdWdVozUm9QVTFoZEdndWJXRjRLSFF1YkdWdVozUm9MRnh1WnlzeEtUdDBXekJkUFRBN2RtRnlJR3M5ZVZzd1hUMHdPMlp2Y2lobVBXYzlNRHRtUEdJdWJHVnVaM1JvT3lzclppbDdkbUZ5SUd3OVlsdG1YVHRqTG1kbGRGRjFaWEo1VDJKcVpXTjBSVmhVS0d3c016UTVNVGtwUHlockt6MWpMbWRsZEZGMVpYSjVUMkpxWldOMFJWaFVLR3dzTXpRNU1UZ3BMR0V1Y0hWemFDaHNLU2s2WWx0bkt5dGRQV3c3ZEZ0bUt6RmRQV3M3ZVZ0bUt6RmRQV2Q5WWk1c1pXNW5kR2c5Wnp0bWIzSW9aajFuUFRBN1pqeDFMbXhsYm1kMGFEc3JLMllwZTNaaGNpQnJQWFZiWmwwc2JqMXJMbk4wWVhKMFVYVmxjbmxKYm1SbGVDeHNQV3N1Wlc1a1VYVmxjbmxKYm1SbGVEdHJMbk4xYlNzOWRGdHNYUzEwVzI1ZE8yNDllVnR1WFR0c1BYbGJiRjA3YkQwOVBXNC9LR3N1YzNSaGRITXVaM0IxVkdsdFpTczlheTV6ZFcwdk1VVTJMRVl1Y0hWemFDaHJLU2s2S0dzdWMzUmhjblJSZFdWeWVVbHVaR1Y0UFc0c2F5NWxibVJSZFdWeWVVbHVaR1Y0UFd3c2RWdG5LeXRkUFdzcGZYVXViR1Z1WjNSb1BXZDlmU3huWlhST2RXMVFaVzVrYVc1blVYVmxjbWxsY3pwbWRXNWpkR2x2YmlncGUzSmxkSFZ5YmlCaUxteGxibWQwYUgwc1kyeGxZWEk2Wm5WdVkzUnBiMjRvS1h0aExuQjFjMmd1WVhCd2JIa29ZU3hpS1R0bWIzSW9kbUZ5SUdjOU1EdG5QR0V1YkdWdVozUm9PMmNyS3lsakxtUmxiR1YwWlZGMVpYSjVSVmhVS0dGYloxMHBPMXh1WWk1c1pXNW5kR2c5TUR0aExteGxibWQwYUQwd2ZTeHlaWE4wYjNKbE9tWjFibU4wYVc5dUtDbDdZaTVzWlc1bmRHZzlNRHRoTG14bGJtZDBhRDB3ZlgxOWZTeDdmVjBzTWpBNlcyWjFibU4wYVc5dUtHWXNjQ3gxS1h0d0xtVjRjRzl5ZEhNOVhDSjFibVJsWm1sdVpXUmNJaUU5UFhSNWNHVnZaaUJ3WlhKbWIzSnRZVzVqWlNZbWNHVnlabTl5YldGdVkyVXVibTkzUDJaMWJtTjBhVzl1S0NsN2NtVjBkWEp1SUhCbGNtWnZjbTFoYm1ObExtNXZkeWdwZlRwbWRXNWpkR2x2YmlncGUzSmxkSFZ5Yml0dVpYY2dSR0YwWlgxOUxIdDlYU3d5TVRwYlpuVnVZM1JwYjI0b1ppeHdMSFVwZTJaMWJtTjBhVzl1SUd3b1ppbDdjbVYwZFhKdUlFRnljbUY1TG5CeWIzUnZkSGx3WlM1emJHbGpaUzVqWVd4c0tHWXBmV1oxYm1OMGFXOXVJR3NvWmlsN2NtVjBkWEp1SUd3b1ppa3VhbTlwYmloY0lsd2lLWDEyWVhJZ2VEMW1LRndpTGk5bGVIUmxibVJjSWlrN2NDNWxlSEJ2Y25SelBXWjFibU4wYVc5dUtDbDdablZ1WTNScGIyNGdaaWdwZTNaaGNpQmlQVnRkTEdNOVcxMDdjbVYwZFhKdUlIZ29ablZ1WTNScGIyNG9LWHRpTG5CMWMyZ3VZWEJ3Ykhrb1lpeHNLR0Z5WjNWdFpXNTBjeWtwZlN4N1pHVm1PbVoxYm1OMGFXOXVLQ2w3ZG1GeUlHWTlYQ0oyWENJcllTc3JPMk11Y0hWemFDaG1LVHN3UEdGeVozVnRaVzUwY3k1c1pXNW5kR2dtSmx4dUtHSXVjSFZ6YUNobUxGd2lQVndpS1N4aUxuQjFjMmd1WVhCd2JIa29ZaXhzS0dGeVozVnRaVzUwY3lrcExHSXVjSFZ6YUNoY0lqdGNJaWtwTzNKbGRIVnliaUJtZlN4MGIxTjBjbWx1WnpwbWRXNWpkR2x2YmlncGUzSmxkSFZ5YmlCcktGc3dQR011YkdWdVozUm9QMXdpZG1GeUlGd2lLMk1yWENJN1hDSTZYQ0pjSWl4cktHSXBYU2w5ZlNsOVpuVnVZM1JwYjI0Z1l5Z3BlMloxYm1OMGFXOXVJR0VvWml4cktYdGpLR1lzYXl4Y0lqMWNJaXhpTG1SbFppaG1MR3NwTEZ3aU8xd2lLWDEyWVhJZ1lqMW1LQ2tzWXoxbUtDa3NhejFpTG5SdlUzUnlhVzVuTEhROVl5NTBiMU4wY21sdVp6dHlaWFIxY200Z2VDaG1kVzVqZEdsdmJpZ3BlMkl1WVhCd2JIa29ZaXhzS0dGeVozVnRaVzUwY3lrcGZTeDdaR1ZtT21JdVpHVm1MR1Z1ZEhKNU9tSXNaWGhwZERwakxITmhkbVU2WVN4elpYUTZablZ1WTNScGIyNG9ZeXhtTEdzcGUyRW9ZeXhtS1R0aUtHTXNaaXhjSWoxY0lpeHJMRndpTzF3aUtYMHNkRzlUZEhKcGJtYzZablZ1WTNScGIyNG9LWHR5WlhSMWNtNGdheWdwSzNRb0tYMTlLWDEyWVhJZ1lUMHdMR0k5VzEwc2NEMWJYU3gxUFdZb0tTeDBQWHQ5TzNKbGRIVnlibnRuYkc5aVlXdzZkU3hzYVc1ck9tWjFibU4wYVc5dUtHTXBlMlp2Y2loMllYSWdaejB3TzJjOGNDNXNaVzVuZEdnN0t5dG5LV2xtS0hCYloxMDlQVDFqS1hKbGRIVnliaUJpVzJkZE8xeHVaejFjSW1kY0lpdGhLeXM3WWk1d2RYTm9LR2NwTzNBdWNIVnphQ2hqS1R0eVpYUjFjbTRnWjMwc1lteHZZMnM2Wml4d2NtOWpPbVoxYm1OMGFXOXVLR0VzWWlsN1puVnVZM1JwYjI0Z1ppZ3BlM1poY2lCaFBWd2lZVndpSzJ3dWJHVnVaM1JvTzJ3dWNIVnphQ2hoS1R0eVpYUjFjbTRnWVgxMllYSWdiRDFiWFR0aVBXSjhmREE3Wm05eUtIWmhjaUJ5UFRBN2NqeGlPeXNyY2lsbUtDazdkbUZ5SUhJOVl5Z3BMRzQ5Y2k1MGIxTjBjbWx1Wnp0eVpYUjFjbTRnZEZ0aFhUMTRLSElzZTJGeVp6cG1MSFJ2VTNSeWFXNW5PbVoxYm1OMGFXOXVLQ2w3Y21WMGRYSnVJR3NvVzF3aVpuVnVZM1JwYjI0b1hDSXNiQzVxYjJsdUtDa3NYQ0lwZTF3aUxHNG9LU3hjSW4xY0lsMHBmWDBwZlN4elkyOXdaVHBqTEdOdmJtUTZablZ1WTNScGIyNG9LWHQyWVhJZ1lUMXJLR0Z5WjNWdFpXNTBjeWtzWWoxaktDa3NaajFqS0Nrc2NqMWlMblJ2VTNSeWFXNW5MSFE5Wmk1MGIxTjBjbWx1Wnp0eVpYUjFjbTRnZUNoaUxIdDBhR1Z1T21aMWJtTjBhVzl1S0NsN1lpNWhjSEJzZVNoaUxHd29ZWEpuZFcxbGJuUnpLU2s3Y21WMGRYSnVJSFJvYVhOOUxGd2laV3h6WlZ3aU9tWjFibU4wYVc5dUtDbDdaaTVoY0hCc2VTaG1MR3dvWVhKbmRXMWxiblJ6S1NrN2NtVjBkWEp1SUhSb2FYTjlMSFJ2VTNSeWFXNW5PbVoxYm1OMGFXOXVLQ2w3ZG1GeUlHSTlYRzUwS0NrN1lpWW1LR0k5WENKbGJITmxlMXdpSzJJclhDSjlYQ0lwTzNKbGRIVnliaUJyS0Z0Y0ltbG1LRndpTEdFc1hDSXBlMXdpTEhJb0tTeGNJbjFjSWl4aVhTbDlmU2w5TEdOdmJYQnBiR1U2Wm5WdVkzUnBiMjRvS1h0MllYSWdZVDFiSjF3aWRYTmxJSE4wY21samRGd2lPeWNzZFN4Y0luSmxkSFZ5YmlCN1hDSmRPMDlpYW1WamRDNXJaWGx6S0hRcExtWnZja1ZoWTJnb1puVnVZM1JwYjI0b1lpbDdZUzV3ZFhOb0tDZGNJaWNzWWl3blhDSTZKeXgwVzJKZExuUnZVM1J5YVc1bktDa3NYQ0lzWENJcGZTazdZUzV3ZFhOb0tGd2lmVndpS1R0MllYSWdZejFyS0dFcExuSmxjR3hoWTJVb0x6c3ZaeXhjSWp0Y1hHNWNJaWt1Y21Wd2JHRmpaU2d2ZlM5bkxGd2lmVnhjYmx3aUtTNXlaWEJzWVdObEtDOTdMMmNzWENKN1hGeHVYQ0lwTzNKbGRIVnliaUJHZFc1amRHbHZiaTVoY0hCc2VTaHVkV3hzTEdJdVkyOXVZMkYwS0dNcEtTNWhjSEJzZVNodWRXeHNMSEFwZlgxOWZTeDdYQ0l1TDJWNGRHVnVaRndpT2pJeWZWMHNNakk2VzJaMWJtTjBhVzl1S0dZc2NDeDFLWHR3TG1WNGNHOXlkSE05Wm5WdVkzUnBiMjRvWml4cktYdG1iM0lvZG1GeUlIQTlUMkpxWldOMExtdGxlWE1vYXlrc2NqMHdPM0k4Y0M1c1pXNW5kR2c3S3l0eUtXWmJjRnR5WFYwOWExdHdXM0pkWFR0eVpYUjFjbTRnWm4xOUxIdDlYU3d5TXpwYlpuVnVZM1JwYjI0b1ppeHdMSFVwZTJaMWJtTjBhVzl1SUd3b1ppeGNibU1zWVN4aUxHc3NiQ2w3Wm05eUtIWmhjaUIwUFRBN2REeGpPeXNyZENsbWIzSW9kbUZ5SUhBOVpsdDBYU3huUFRBN1p6eGhPeXNyWnlsbWIzSW9kbUZ5SUhnOWNGdG5YU3gxUFRBN2RUeGlPeXNyZFNsclcyd3JLMTA5ZUZ0MVhYMW1kVzVqZEdsdmJpQnJLR1lzWXl4aExHSXNjQ2w3Wm05eUtIWmhjaUI0UFRFc2REMWhLekU3ZER4akxteGxibWQwYURzckszUXBlQ285WTF0MFhUdDJZWElnZVQxalcyRmRPMmxtS0RROVBUMWpMbXhsYm1kMGFDMWhLWHQyWVhJZ1p6MWpXMkVyTVYwc2RUMWpXMkVyTWwwN1l6MWpXMkVyTTEwN1ptOXlLSFE5TUR0MFBIazdLeXQwS1d3b1psdDBYU3huTEhVc1l5eGlMSEFwTEhBclBYaDlaV3h6WlNCbWIzSW9kRDB3TzNROGVUc3JLM1FwYXlobVczUmRMR01zWVNzeExHSXNjQ2tzY0NzOWVIMTJZWElnZUQxbUtGd2lMaTl3YjI5c1hDSXBPM0F1Wlhod2IzSjBjejE3YzJoaGNHVTZablZ1WTNScGIyNG9aaWw3Wm05eUtIWmhjaUJqUFZ0ZE8yWXViR1Z1WjNSb08yWTlabHN3WFNsakxuQjFjMmdvWmk1c1pXNW5kR2dwTzNKbGRIVnliaUJqZlN4bWJHRjBkR1Z1T21aMWJtTjBhVzl1S0dZc1l5eGhMR0lwZTNaaGNpQndQVEU3YVdZb1l5NXNaVzVuZEdncFptOXlLSFpoY2lCMVBUQTdkVHhqTG14bGJtZDBhRHNySzNVcGNDbzlZMXQxWFR0bGJITmxJSEE5TUR0aFBXSjhmRnh1ZUM1aGJHeHZZMVI1Y0dVb1lTeHdLVHR6ZDJsMFkyZ29ZeTVzWlc1bmRHZ3BlMk5oYzJVZ01EcGljbVZoYXp0allYTmxJREU2WWoxald6QmRPMlp2Y2loalBUQTdZenhpT3lzcll5bGhXMk5kUFdaYlkxMDdZbkpsWVdzN1kyRnpaU0F5T21JOVkxc3dYVHRqUFdOYk1WMDdabTl5S0hVOWNEMHdPM1U4WWpzckszVXBabTl5S0haaGNpQjBQV1piZFYwc2VUMHdPM2s4WXpzcksza3BZVnR3S3l0ZFBYUmJlVjA3WW5KbFlXczdZMkZ6WlNBek9td29aaXhqV3pCZExHTmJNVjBzWTFzeVhTeGhMREFwTzJKeVpXRnJPMlJsWm1GMWJIUTZheWhtTEdNc01DeGhMREFwZlhKbGRIVnliaUJoZlgxOUxIdGNJaTR2Y0c5dmJGd2lPakk0ZlYwc01qUTZXMloxYm1OMGFXOXVLR1lzY0N4MUtYdDJZWElnYkQxbUtGd2lMaTlwY3kxMGVYQmxaQzFoY25KaGVWd2lLVHR3TG1WNGNHOXlkSE05Wm5WdVkzUnBiMjRvWmlsN2NtVjBkWEp1SUVGeWNtRjVMbWx6UVhKeVlYa29aaWw4Zkd3b1ppbDlmU3g3WENJdUwybHpMWFI1Y0dWa0xXRnljbUY1WENJNk1qWjlYU3d5TlRwYlpuVnVZM1JwYjI0b1ppeHdMSFVwZTNaaGNpQnNQV1lvWENJdUwybHpMWFI1Y0dWa0xXRnljbUY1WENJcE8zQXVaWGh3YjNKMGN6MW1kVzVqZEdsdmJpaG1LWHR5WlhSMWNtNGhJV1ltSmx3aWIySnFaV04wWENJOVBUMTBlWEJsYjJZZ1ppWW1RWEp5WVhrdWFYTkJjbkpoZVNobUxuTm9ZWEJsS1NZbVhHNUJjbkpoZVM1cGMwRnljbUY1S0dZdWMzUnlhV1JsS1NZbVhDSnVkVzFpWlhKY0lqMDlQWFI1Y0dWdlppQm1MbTltWm5ObGRDWW1aaTV6YUdGd1pTNXNaVzVuZEdnOVBUMW1Mbk4wY21sa1pTNXNaVzVuZEdnbUppaEJjbkpoZVM1cGMwRnljbUY1S0dZdVpHRjBZU2w4Zkd3b1ppNWtZWFJoS1NsOWZTeDdYQ0l1TDJsekxYUjVjR1ZrTFdGeWNtRjVYQ0k2TWpaOVhTd3lOanBiWm5WdVkzUnBiMjRvWml4d0xIVXBlM1poY2lCc1BXWW9YQ0l1TGk5amIyNXpkR0Z1ZEhNdllYSnlZWGwwZVhCbGN5NXFjMjl1WENJcE8zQXVaWGh3YjNKMGN6MW1kVzVqZEdsdmJpaG1LWHR5WlhSMWNtNGdUMkpxWldOMExuQnliM1J2ZEhsd1pTNTBiMU4wY21sdVp5NWpZV3hzS0dZcGFXNGdiSDE5TEh0Y0lpNHVMMk52Ym5OMFlXNTBjeTloY25KaGVYUjVjR1Z6TG1wemIyNWNJam96ZlYwc01qYzZXMloxYm1OMGFXOXVLR1lzY0N4MUtYdHdMbVY0Y0c5eWRITTlablZ1WTNScGIyNG9aaXhyS1h0bWIzSW9kbUZ5SUhBOVFYSnlZWGtvWmlrc2NqMHdPM0k4WmpzckszSXBjRnR5WFQxcktISXBPM0psZEhWeWJpQndmWDBzZTMxZExESTRPbHRtZFc1amRHbHZiaWhtTEhBc2RTbDdablZ1WTNScGIyNGdiQ2hqS1h0MllYSWdZU3hpTzJFOUtEWTFOVE0xUEdNcFBEdzBPMk0rUGo0OVlUdGlQU2d5TlRVOFl5azhQRE03WXo0K1BqMWlPMkY4UFZ4dVlqdGlQU2d4TlR4aktUdzhNanRqUGo0K1BXSTdZWHc5WWp0aVBTZ3pQR01wUER3eE8zSmxkSFZ5YmlCaGZHSjhZejQrUG1JK1BqRjlablZ1WTNScGIyNGdheWhqS1h0aE9udG1iM0lvZG1GeUlHRTlNVFk3TWpZNE5ETTFORFUyUGoxaE8yRXFQVEUyS1dsbUtHTThQV0VwZTJNOVlUdGljbVZoYXlCaGZXTTlNSDFoUFhKYmJDaGpLVDQrTWwwN2NtVjBkWEp1SURBOFlTNXNaVzVuZEdnL1lTNXdiM0FvS1RwdVpYY2dRWEp5WVhsQ2RXWm1aWElvWXlsOVpuVnVZM1JwYjI0Z2VDaGpLWHR5VzJ3b1l5NWllWFJsVEdWdVozUm9LVDQrTWwwdWNIVnphQ2hqS1gxMllYSWdjajFtS0Z3aUxpOXNiMjl3WENJcEtEZ3NablZ1WTNScGIyNG9LWHR5WlhSMWNtNWJYWDBwTzNBdVpYaHdiM0owY3oxN1lXeHNiMk02YXl4bWNtVmxPbmdzWVd4c2IyTlVlWEJsT21aMWJtTjBhVzl1S0dNc1lTbDdkbUZ5SUdJOWJuVnNiRHR6ZDJsMFkyZ29ZeWw3WTJGelpTQTFNVEl3T21JOWJtVjNJRWx1ZERoQmNuSmhlU2hyS0dFcExEQXNZU2s3WW5KbFlXczdZMkZ6WlNBMU1USXhPbUk5Ym1WM0lGVnBiblE0UVhKeVlYa29heWhoS1N3d0xHRXBPMkp5WldGck8yTmhjMlVnTlRFeU1qcGlQVzVsZHlCSmJuUXhOa0Z5Y21GNUtHc29NaXBoS1N3d0xHRXBPMkp5WldGck8yTmhjMlVnTlRFeU16cGlQVzVsZHlCVmFXNTBNVFpCY25KaGVTaHJLRElxWEc1aEtTd3dMR0VwTzJKeVpXRnJPMk5oYzJVZ05URXlORHBpUFc1bGR5QkpiblF6TWtGeWNtRjVLR3NvTkNwaEtTd3dMR0VwTzJKeVpXRnJPMk5oYzJVZ05URXlOVHBpUFc1bGR5QlZhVzUwTXpKQmNuSmhlU2hyS0RRcVlTa3NNQ3hoS1R0aWNtVmhhenRqWVhObElEVXhNalk2WWoxdVpYY2dSbXh2WVhRek1rRnljbUY1S0dzb05DcGhLU3d3TEdFcE8ySnlaV0ZyTzJSbFptRjFiSFE2Y21WMGRYSnVJRzUxYkd4OWNtVjBkWEp1SUdJdWJHVnVaM1JvSVQwOVlUOWlMbk4xWW1GeWNtRjVLREFzWVNrNlluMHNabkpsWlZSNWNHVTZablZ1WTNScGIyNG9ZeWw3ZUNoakxtSjFabVpsY2lsOWZYMHNlMXdpTGk5c2IyOXdYQ0k2TWpkOVhTd3lPVHBiWm5WdVkzUnBiMjRvWml4d0xIVXBlM0F1Wlhod2IzSjBjejFjSW1aMWJtTjBhVzl1WENJOVBUMTBlWEJsYjJZZ2NtVnhkV1Z6ZEVGdWFXMWhkR2x2YmtaeVlXMWxKaVpjSW1aMWJtTjBhVzl1WENJOVBUMTBlWEJsYjJZZ1kyRnVZMlZzUVc1cGJXRjBhVzl1Um5KaGJXVS9lMjVsZUhRNlpuVnVZM1JwYjI0b1ppbDdjbVYwZFhKdUlISmxjWFZsYzNSQmJtbHRZWFJwYjI1R2NtRnRaU2htS1gwc1kyRnVZMlZzT21aMWJtTjBhVzl1S0dZcGUzSmxkSFZ5YmlCallXNWpaV3hCYm1sdFlYUnBiMjVHY21GdFpTaG1LWDE5T250dVpYaDBPbVoxYm1OMGFXOXVLR1lwZTNKbGRIVnliaUJ6WlhSVWFXMWxiM1YwS0dZc1hHNHhOaWw5TEdOaGJtTmxiRHBqYkdWaGNsUnBiV1Z2ZFhSOWZTeDdmVjBzTXpBNlcyWjFibU4wYVc5dUtHWXNjQ3gxS1h0MllYSWdiRDFtS0Z3aUxpOXdiMjlzWENJcExHczlibVYzSUVac2IyRjBNekpCY25KaGVTZ3hLU3g0UFc1bGR5QlZhVzUwTXpKQmNuSmhlU2hyTG1KMVptWmxjaWs3Y0M1bGVIQnZjblJ6UFdaMWJtTjBhVzl1S0dZcGUyWnZjaWgyWVhJZ1l6MXNMbUZzYkc5alZIbHdaU2cxTVRJekxHWXViR1Z1WjNSb0tTeGhQVEE3WVR4bUxteGxibWQwYURzcksyRXBhV1lvYVhOT1lVNG9abHRoWFNrcFkxdGhYVDAyTlRVek5UdGxiSE5sSUdsbUtFbHVabWx1YVhSNVBUMDlabHRoWFNsalcyRmRQVE14TnpRME8yVnNjMlVnYVdZb0xVbHVabWx1YVhSNVBUMDlabHRoWFNsalcyRmRQVFkwTlRFeU8yVnNjMlY3YTFzd1hUMW1XMkZkTzNaaGNpQmlQWGhiTUYwc2NEMWlQajQrTXpFOFBERTFMSFU5S0dJOFBERStQajR5TkNrdE1USTNMR0k5WWo0K01UTW1NVEF5TXp0alcyRmRQUzB5TkQ1MVAzQTZMVEUwUG5VL2NDc29ZaXN4TURJMFBqNHRNVFF0ZFNrNk1UVThkVDl3S3pNeE56UTBPbkFyS0hVck1UVThQREV3S1N0aWZYSmxkSFZ5YmlCamZYMHNlMXdpTGk5d2IyOXNYQ0k2TWpoOVhTd3pNVHBiWm5WdVkzUnBiMjRvWml4d0xIVXBlM0F1Wlhod2IzSjBjejFtZFc1amRHbHZiaWhtS1h0eVpYUjFjbTRnVDJKcVpXTjBMbXRsZVhNb1ppa3ViV0Z3S0daMWJtTjBhVzl1S0dzcGUzSmxkSFZ5YmlCbVcydGRmU2w5ZlN4Y2JudDlYU3d6TWpwYlpuVnVZM1JwYjI0b1ppeHdMSFVwZTJaMWJtTjBhVzl1SUd3b1lTeGlMR1lwZTJaMWJtTjBhVzl1SUdzb0tYdDJZWElnWWoxM2FXNWtiM2N1YVc1dVpYSlhhV1IwYUN4blBYZHBibVJ2ZHk1cGJtNWxja2hsYVdkb2REdGhJVDA5Wkc5amRXMWxiblF1WW05a2VTWW1LR2M5WVM1blpYUkNiM1Z1WkdsdVowTnNhV1Z1ZEZKbFkzUW9LU3hpUFdjdWNtbG5hSFF0Wnk1c1pXWjBMR2M5Wnk1MGIzQXRaeTVpYjNSMGIyMHBPMnd1ZDJsa2RHZzlaaXBpTzJ3dWFHVnBaMmgwUFdZcVp6dGpLR3d1YzNSNWJHVXNlM2RwWkhSb09tSXJYQ0p3ZUZ3aUxHaGxhV2RvZERwbksxd2ljSGhjSW4wcGZYWmhjaUJzUFdSdlkzVnRaVzUwTG1OeVpXRjBaVVZzWlcxbGJuUW9YQ0pqWVc1MllYTmNJaWs3WXloc0xuTjBlV3hsTEh0aWIzSmtaWEk2TUN4dFlYSm5hVzQ2TUN4d1lXUmthVzVuT2pBc2RHOXdPakFzYkdWbWREb3dmU2s3WVM1aGNIQmxibVJEYUdsc1pDaHNLVHRoUFQwOVpHOWpkVzFsYm5RdVltOWtlU1ltS0d3dWMzUjViR1V1Y0c5emFYUnBiMjQ5WENKaFluTnZiSFYwWlZ3aUxHTW9ZUzV6ZEhsc1pTeDdiV0Z5WjJsdU9qQXNjR0ZrWkdsdVp6b3dmU2twTzNkcGJtUnZkeTVoWkdSRmRtVnVkRXhwYzNSbGJtVnlLRndpY21WemFYcGxYQ0lzYXl3aE1TazdheWdwTzNKbGRIVnlibnRqWVc1MllYTTZiQ3h2YmtSbGMzUnliM2s2Wm5WdVkzUnBiMjRvS1h0M2FXNWtiM2N1Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2loY0luSmxjMmw2WlZ3aUxGeHVheWs3WVM1eVpXMXZkbVZEYUdsc1pDaHNLWDE5ZldaMWJtTjBhVzl1SUdzb1lTeGlLWHRtZFc1amRHbHZiaUJqS0dZcGUzUnllWHR5WlhSMWNtNGdZUzVuWlhSRGIyNTBaWGgwS0dZc1lpbDlZMkYwWTJnb2F5bDdjbVYwZFhKdUlHNTFiR3g5ZlhKbGRIVnliaUJqS0Z3aWQyVmlaMnhjSWlsOGZHTW9YQ0psZUhCbGNtbHRaVzUwWVd3dGQyVmlaMnhjSWlsOGZHTW9YQ0ozWldKbmJDMWxlSEJsY21sdFpXNTBZV3hjSWlsOVpuVnVZM1JwYjI0Z2VDaGhLWHR5WlhSMWNtNWNJbk4wY21sdVoxd2lQVDA5ZEhsd1pXOW1JR0UvWVM1emNHeHBkQ2dwT21GOVpuVnVZM1JwYjI0Z2NpaGhLWHR5WlhSMWNtNWNJbk4wY21sdVoxd2lQVDA5ZEhsd1pXOW1JR0UvWkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNpaGhLVHBoZlhaaGNpQmpQV1lvWENJdUwzVjBhV3d2WlhoMFpXNWtYQ0lwTzNBdVpYaHdiM0owY3oxbWRXNWpkR2x2YmloaEtYdDJZWElnWWoxaGZIeDdmU3hqTEdZc2NDeDFPMkU5ZTMwN2RtRnlJR2M5VzEwc1JUMWJYU3hEUFZ3aWRXNWtaV1pwYm1Wa1hDSTlQVDEwZVhCbGIyWWdkMmx1Wkc5M1B6RTZkMmx1Wkc5M0xtUmxkbWxqWlZCcGVHVnNVbUYwYVc4c1RqMGhNU3h1UFdaMWJtTjBhVzl1S0dFcGUzMHNiVDFtZFc1amRHbHZiaWdwZTMwN1hDSnpkSEpwYm1kY0lqMDlQWFI1Y0dWdlppQmlQMk05Wkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNpaGlLVHBjYmx3aWIySnFaV04wWENJOVBUMTBlWEJsYjJZZ1lpWW1LRndpYzNSeWFXNW5YQ0k5UFQxMGVYQmxiMllnWWk1dWIyUmxUbUZ0WlNZbVhDSm1kVzVqZEdsdmJsd2lQVDA5ZEhsd1pXOW1JR0l1WVhCd1pXNWtRMmhwYkdRbUpsd2lablZ1WTNScGIyNWNJajA5UFhSNWNHVnZaaUJpTG1kbGRFSnZkVzVrYVc1blEyeHBaVzUwVW1WamREOWpQV0k2WENKbWRXNWpkR2x2Ymx3aVBUMDlkSGx3Wlc5bUlHSXVaSEpoZDBGeWNtRjVjM3g4WENKbWRXNWpkR2x2Ymx3aVBUMDlkSGx3Wlc5bUlHSXVaSEpoZDBWc1pXMWxiblJ6UHloMVBXSXNjRDExTG1OaGJuWmhjeWs2S0Z3aVoyeGNJbWx1SUdJL2RUMWlMbWRzT2x3aVkyRnVkbUZ6WENKcGJpQmlQM0E5Y2loaUxtTmhiblpoY3lrNlhDSmpiMjUwWVdsdVpYSmNJbWx1SUdJbUppaG1QWElvWWk1amIyNTBZV2x1WlhJcEtTeGNJbUYwZEhKcFluVjBaWE5jSW1sdUlHSW1KaWhoUFdJdVlYUjBjbWxpZFhSbGN5a3NYQ0psZUhSbGJuTnBiMjV6WENKcGJpQmlKaVlvWnoxNEtHSXVaWGgwWlc1emFXOXVjeWtwTEZ3aWIzQjBhVzl1WVd4RmVIUmxibk5wYjI1elhDSnBiaUJpSmlZb1JUMTRLR0l1YjNCMGFXOXVZV3hGZUhSbGJuTnBiMjV6S1Nrc1hDSnZia1J2Ym1WY0ltbHVJR0ltSmlodVBXSXViMjVFYjI1bEtTeGNJbkJ5YjJacGJHVmNJbWx1SUdJbUppaE9QU0VoWWk1d2NtOW1hV3hsS1N4Y0luQnBlR1ZzVW1GMGFXOWNJbWx1SUdJbUpseHVLRU05SzJJdWNHbDRaV3hTWVhScGJ5a3BLVHRqSmlZb1hDSmpZVzUyWVhOY0lqMDlQV011Ym05a1pVNWhiV1V1ZEc5TWIzZGxja05oYzJVb0tUOXdQV002WmoxaktUdHBaaWdoZFNsN2FXWW9JWEFwZTJNOWJDaG1mSHhrYjJOMWJXVnVkQzVpYjJSNUxHNHNReWs3YVdZb0lXTXBjbVYwZFhKdUlHNTFiR3c3Y0QxakxtTmhiblpoY3p0dFBXTXViMjVFWlhOMGNtOTVmWFU5YXlod0xHRXBmWEpsZEhWeWJpQjFQM3RuYkRwMUxHTmhiblpoY3pwd0xHTnZiblJoYVc1bGNqcG1MR1Y0ZEdWdWMybHZibk02Wnl4dmNIUnBiMjVoYkVWNGRHVnVjMmx2Ym5NNlJTeHdhWGhsYkZKaGRHbHZPa01zY0hKdlptbHNaVHBPTEc5dVJHOXVaVHB1TEc5dVJHVnpkSEp2ZVRwdGZUb29iU2dwTEc0b1hDSjNaV0puYkNCdWIzUWdjM1Z3Y0c5eWRHVmtMQ0IwY25rZ2RYQm5jbUZrYVc1bklIbHZkWElnWW5KdmQzTmxjaUJ2Y2lCbmNtRndhR2xqY3lCa2NtbDJaWEp6SUdoMGRIQTZMeTluWlhRdWQyVmlaMnd1YjNKblhDSXBMRzUxYkd3cGZYMHNlMXdpTGk5MWRHbHNMMlY0ZEdWdVpGd2lPakl5ZlYwc016TTZXMloxYm1OMGFXOXVLR1lzY0N4MUtYdG1kVzVqZEdsdmJpQnNLR0VzWWlsN1ptOXlLSFpoY2lCalBUQTdZenhoTG14bGJtZDBhRHNySzJNcGFXWW9ZVnRqWFQwOVBXSXBjbVYwZFhKdUlHTTdjbVYwZFhKdUxURjlkbUZ5SUdzOVhHNW1LRndpTGk5c2FXSXZkWFJwYkM5bGVIUmxibVJjSWlrc2VEMW1LRndpTGk5c2FXSXZaSGx1WVcxcFkxd2lLU3h5UFdZb1hDSXVMMnhwWWk5MWRHbHNMM0poWmx3aUtTeGpQV1lvWENJdUwyeHBZaTkxZEdsc0wyTnNiMk5yWENJcExHRTlaaWhjSWk0dmJHbGlMM04wY21sdVozTmNJaWtzWWoxbUtGd2lMaTlzYVdJdmQyVmlaMnhjSWlrc1JqMW1LRndpTGk5c2FXSXZaWGgwWlc1emFXOXVYQ0lwTEUwOVppaGNJaTR2YkdsaUwyeHBiV2wwYzF3aUtTeDBQV1lvWENJdUwyeHBZaTlpZFdabVpYSmNJaWtzZVQxbUtGd2lMaTlzYVdJdlpXeGxiV1Z1ZEhOY0lpa3NaejFtS0Z3aUxpOXNhV0l2ZEdWNGRIVnlaVndpS1N4RlBXWW9YQ0l1TDJ4cFlpOXlaVzVrWlhKaWRXWm1aWEpjSWlrc1F6MW1LRndpTGk5c2FXSXZabkpoYldWaWRXWm1aWEpjSWlrc1RqMW1LRndpTGk5c2FXSXZZWFIwY21saWRYUmxYQ0lwTEc0OVppaGNJaTR2YkdsaUwzTm9ZV1JsY2x3aUtTeHRQV1lvWENJdUwyeHBZaTl5WldGa1hDSXBMRUk5WmloY0lpNHZiR2xpTDJOdmNtVmNJaWtzV1QxbUtGd2lMaTlzYVdJdmMzUmhkSE5jSWlrc1REMW1LRndpTGk5c2FXSXZkR2x0WlhKY0lpazdjQzVsZUhCdmNuUnpQV1oxYm1OMGFXOXVLR1lwZTJaMWJtTjBhVzl1SUdnb0tYdHBaaWd3UFQwOVVTNXNaVzVuZEdncFJ5WW1SeTUxY0dSaGRHVW9LU3hVUFc1MWJHdzdaV3h6Wlh0VVBYSXVibVY0ZENob0tUdExLQ2s3Wm05eUtIWmhjaUJoUFZ4dVVTNXNaVzVuZEdndE1Uc3dQRDFoT3kwdFlTbDdkbUZ5SUdJOVVWdGhYVHRpSmlaaUtGVXNiblZzYkN3d0tYMXhMbVpzZFhOb0tDazdSeVltUnk1MWNHUmhkR1VvS1gxOVpuVnVZM1JwYjI0Z2NDZ3BleUZVSmlZd1BGRXViR1Z1WjNSb0ppWW9WRDF5TG01bGVIUW9hQ2twZldaMWJtTjBhVzl1SUhVb0tYdFVKaVlvY2k1allXNWpaV3dvYUNrc1ZEMXVkV3hzS1gxbWRXNWpkR2x2YmlCTVlTaGhLWHRoTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3ZFNncE8zQmhMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9ZU2w3WVNncGZTbDlablZ1WTNScGIyNGdlbUVvWVNsN2NTNW5aWFJGY25KdmNpZ3BPMjFoTG5KbGMzUnZjbVVvS1R0ellTNXlaWE4wYjNKbEtDazdhMkV1Y21WemRHOXlaU2dwTzJSaExuSmxjM1J2Y21Vb0tUdHFZUzV5WlhOMGIzSmxLQ2s3YkdFdWNtVnpkRzl5WlNncE8wY21Ka2N1Y21WemRHOXlaU2dwTzJWaExuQnliMk56TG5KbFpuSmxjMmdvS1R0d0tDazdWaTVtYjNKRllXTm9LR1oxYm1OMGFXOXVLR0VwZTJFb0tYMHBmV1oxYm1OMGFXOXVJRWRoS0dFcGUyWjFibU4wYVc5dUlHSW9ZU2w3ZG1GeUlHTTllMzBzWmoxN2ZUdFBZbXBsWTNRdWEyVjVjeWhoS1M1bWIzSkZZV05vS0daMWJtTjBhVzl1S0dJcGUzWmhjaUJuUFdGYllsMDdlQzVwYzBSNWJtRnRhV01vWnlrL1psdGlYVDE0TG5WdVltOTRLR2NzWEc1aUtUcGpXMkpkUFdkOUtUdHlaWFIxY201N1pIbHVZVzFwWXpwbUxGd2ljM1JoZEdsalhDSTZZMzE5Wm5WdVkzUnBiMjRnWXloaEtYdG1iM0lvTzNFdWJHVnVaM1JvUEdFN0tYRXVjSFZ6YUNodWRXeHNLVHR5WlhSMWNtNGdjWDEyWVhJZ1pqMWlLR0V1WTI5dWRHVjRkSHg4ZTMwcExHYzlZaWhoTG5WdWFXWnZjbTF6Zkh4N2ZTa3NhRDFpS0dFdVlYUjBjbWxpZFhSbGMzeDhlMzBwTEd3OVlpaG1kVzVqZEdsdmJpaGhLWHRtZFc1amRHbHZiaUJpS0dFcGUybG1LR0VnYVc0Z1l5bDdkbUZ5SUdZOVkxdGhYVHRrWld4bGRHVWdZMXRoWFR0UFltcGxZM1F1YTJWNWN5aG1LUzVtYjNKRllXTm9LR1oxYm1OMGFXOXVLR0lwZTJOYllTdGNJaTVjSWl0aVhUMW1XMkpkZlNsOWZYWmhjaUJqUFdzb2UzMHNZU2s3WkdWc1pYUmxJR011ZFc1cFptOXliWE03WkdWc1pYUmxJR011WVhSMGNtbGlkWFJsY3p0a1pXeGxkR1VnWXk1amIyNTBaWGgwTzF3aWMzUmxibU5wYkZ3aWFXNGdZeVltWXk1emRHVnVZMmxzTG05d0ppWW9ZeTV6ZEdWdVkybHNMbTl3UW1GamF6MWpMbk4wWlc1amFXd3ViM0JHY205dWREMWpMbk4wWlc1amFXd3ViM0FzWkdWc1pYUmxJR011YzNSbGJtTnBiQzV2Y0NrN1lpaGNJbUpzWlc1a1hDSXBPMklvWENKa1pYQjBhRndpS1R0aUtGd2lZM1ZzYkZ3aUtUdGlLRndpYzNSbGJtTnBiRndpS1R0aUtGd2ljRzlzZVdkdmJrOW1abk5sZEZ3aUtUdGNibUlvWENKelkybHpjMjl5WENJcE8ySW9YQ0p6WVcxd2JHVmNJaWs3Y21WMGRYSnVJR045S0dFcEtUdGhQWHRuY0hWVWFXMWxPakFzWTNCMVZHbHRaVG93TEdOdmRXNTBPakI5TzNaaGNpQm1QV1ZoTG1OdmJYQnBiR1VvYkN4b0xHY3NaaXhoS1N4dFBXWXVaSEpoZHl4dVBXWXVZbUYwWTJnc2NEMW1Mbk5qYjNCbExIRTlXMTA3Y21WMGRYSnVJR3NvWm5WdVkzUnBiMjRvWVN4aUtYdDJZWElnWmp0cFppaGNJbVoxYm1OMGFXOXVYQ0k5UFQxMGVYQmxiMllnWVNseVpYUjFjbTRnY0M1allXeHNLSFJvYVhNc2JuVnNiQ3hoTERBcE8ybG1LRndpWm5WdVkzUnBiMjVjSWowOVBYUjVjR1Z2WmlCaUtXbG1LRndpYm5WdFltVnlYQ0k5UFQxMGVYQmxiMllnWVNsbWIzSW9aajB3TzJZOFlUc3JLMllwY0M1allXeHNLSFJvYVhNc2JuVnNiQ3hpTEdZcE8yVnNjMlVnYVdZb1FYSnlZWGt1YVhOQmNuSmhlU2hoS1NsbWIzSW9aajB3TzJZOFlTNXNaVzVuZEdnN0t5dG1LWEF1WTJGc2JDaDBhR2x6TEdGYlpsMHNZaXhtS1R0bGJITmxJSEpsZEhWeWJpQndMbU5oYkd3b2RHaHBjeXhoTEdJc01DazdaV3h6WlNCcFppaGNJbTUxYldKbGNsd2lQVDA5ZEhsd1pXOW1JR0VwZTJsbUtEQThZU2x5WlhSMWNtNGdiaTVqWVd4c0tIUm9hWE1zWXloaGZEQXBMR0Y4TUNsOVpXeHpaU0JwWmloQmNuSmhlUzVwYzBGeWNtRjVLR0VwS1h0cFppaGhMbXhsYm1kMGFDbHlaWFIxY200Z2JpNWpZV3hzS0hSb2FYTXNYRzVoTEdFdWJHVnVaM1JvS1gxbGJITmxJSEpsZEhWeWJpQnRMbU5oYkd3b2RHaHBjeXhoS1gwc2UzTjBZWFJ6T21GOUtYMW1kVzVqZEdsdmJpQmFLR0VwZTFFdWNIVnphQ2hoS1R0d0tDazdjbVYwZFhKdWUyTmhibU5sYkRwbWRXNWpkR2x2YmlncGUyWjFibU4wYVc5dUlHSW9LWHQyWVhJZ1lUMXNLRkVzWWlrN1VWdGhYVDFSVzFFdWJHVnVaM1JvTFRGZE95MHRVUzVzWlc1bmRHZzdNRDQ5VVM1c1pXNW5kR2dtSm5Vb0tYMTJZWElnWXoxc0tGRXNZU2s3VVZ0alhUMWlmWDE5Wm5WdVkzUnBiMjRnUkNncGUzWmhjaUJoUFU4dWRtbGxkM0J2Y25Rc1lqMVBMbk5qYVhOemIzSmZZbTk0TzJGYk1GMDlZVnN4WFQxaVd6QmRQV0piTVYwOU1EdFZMblpwWlhkd2IzSjBWMmxrZEdnOVZTNW1jbUZ0WldKMVptWmxjbGRwWkhSb1BWVXVaSEpoZDJsdVowSjFabVpsY2xkcFpIUm9QV0ZiTWwwOVlsc3lYVDF4TG1SeVlYZHBibWRDZFdabVpYSlhhV1IwYUR0VkxuWnBaWGR3YjNKMFNHVnBaMmgwUFZVdVpuSmhiV1ZpZFdabVpYSklaV2xuYUhROVZTNWtjbUYzYVc1blFuVm1abVZ5U0dWcFoyaDBQV0ZiTTEwOVlsc3pYVDF4TG1SeVlYZHBibWRDZFdabVpYSklaV2xuYUhSOVpuVnVZM1JwYjI0Z1N5Z3BlMVV1ZEdsamF5czlNVHRWTG5ScGJXVTlkbUVvS1R0RUtDazdaV0V1Y0hKdlkzTXVjRzlzYkNncGZXWjFibU4wYVc5dUlFRmhLQ2w3UkNncE8xeHVaV0V1Y0hKdlkzTXVjbVZtY21WemFDZ3BPMGNtSmtjdWRYQmtZWFJsS0NsOVpuVnVZM1JwYjI0Z2RtRW9LWHR5WlhSMWNtNG9ZeWdwTFdKaEtTOHhSVE45WmoxaUtHWXBPMmxtS0NGbUtYSmxkSFZ5YmlCdWRXeHNPM1poY2lCeFBXWXVaMndzVXoxeExtZGxkRU52Ym5SbGVIUkJkSFJ5YVdKMWRHVnpLQ2s3Y1M1cGMwTnZiblJsZUhSTWIzTjBLQ2s3ZG1GeUlHMWhQVVlvY1N4bUtUdHBaaWdoYldFcGNtVjBkWEp1SUc1MWJHdzdkbUZ5SUdkaFBXRW9LU3hYUFZrb0tTeFNQVzFoTG1WNGRHVnVjMmx2Ym5Nc1J6MU1LSEVzVWlrc1ltRTlZeWdwTEc1aFBYRXVaSEpoZDJsdVowSjFabVpsY2xkcFpIUm9MSGxoUFhFdVpISmhkMmx1WjBKMVptWmxja2hsYVdkb2RDeFZQWHQwYVdOck9qQXNkR2x0WlRvd0xIWnBaWGR3YjNKMFYybGtkR2c2Ym1Fc2RtbGxkM0J2Y25SSVpXbG5hSFE2ZVdFc1puSmhiV1ZpZFdabVpYSlhhV1IwYURwdVlTeG1jbUZ0WldKMVptWmxja2hsYVdkb2REcDVZU3hrY21GM2FXNW5RblZtWm1WeVYybGtkR2c2Ym1Fc1pISmhkMmx1WjBKMVptWmxja2hsYVdkb2REcDVZU3h3YVhobGJGSmhkR2x2T21ZdWNHbDRaV3hTWVhScGIzMHNhV0U5VFNoeExGSXBMR3RoUFhRb2NTeFhMR1lwTEhKaFBYa29jU3hTTEd0aExGY3BMRzVoUFU0b2NTeFNMR2xoTEd0aExHZGhLU3h6WVQxdUtIRXNYRzVuWVN4WExHWXBMR1JoUFdjb2NTeFNMR2xoTEdaMWJtTjBhVzl1S0NsN1pXRXVjSEp2WTNNdWNHOXNiQ2dwZlN4VkxGY3NaaWtzYW1FOVJTaHhMRklzYVdFc1Z5eG1LU3hzWVQxREtIRXNVaXhwWVN4a1lTeHFZU3hYS1N4bFlUMUNLSEVzWjJFc1VpeHBZU3hyWVN4eVlTeGtZU3hzWVN4N2ZTeHVZU3h6WVN4N1pXeGxiV1Z1ZEhNNmJuVnNiQ3h3Y21sdGFYUnBkbVU2TkN4amIzVnVkRG90TVN4dlptWnpaWFE2TUN4cGJuTjBZVzVqWlhNNkxURjlMRlVzUnl4bUtTeG5ZVDF0S0hFc2JHRXNaV0V1Y0hKdlkzTXVjRzlzYkN4VkxGTXNVaWtzVHoxbFlTNXVaWGgwTEdoaFBYRXVZMkZ1ZG1GekxGRTlXMTBzY0dFOVcxMHNWajFiWFN4WVBWdG1MbTl1UkdWemRISnZlVjBzVkQxdWRXeHNPMmhoSmlZb2FHRXVZV1JrUlhabGJuUk1hWE4wWlc1bGNpaGNJbmRsWW1kc1kyOXVkR1Y0ZEd4dmMzUmNJaXhNWVN3aE1Ta3NhR0V1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWhjSW5kbFltZHNZMjl1ZEdWNGRISmxjM1J2Y21Wa1hDSXNlbUVzSVRFcEtUdEJZU2dwTzFNOWF5aEhZU3g3WTJ4bFlYSTZablZ1WTNScGIyNG9ZU2w3ZG1GeUlHSTlNRHRsWVM1d2NtOWpjeTV3YjJ4c0tDazdkbUZ5SUdNOVlTNWpiMnh2Y2p0akppWW9jUzVqYkdWaGNrTnZiRzl5S0N0ald6QmRmSHd3TEN0ald6RmRmSHd3TEN0ald6SmRmSHd3TEZ4dUsyTmJNMTE4ZkRBcExHSjhQVEUyTXpnMEtUdGNJbVJsY0hSb1hDSnBiaUJoSmlZb2NTNWpiR1ZoY2tSbGNIUm9LQ3RoTG1SbGNIUm9LU3hpZkQweU5UWXBPMXdpYzNSbGJtTnBiRndpYVc0Z1lTWW1LSEV1WTJ4bFlYSlRkR1Z1WTJsc0tHRXVjM1JsYm1OcGJId3dLU3hpZkQweE1ESTBLVHR4TG1Oc1pXRnlLR0lwZlN4d2NtOXdPbmd1WkdWbWFXNWxMbUpwYm1Rb2JuVnNiQ3d4S1N4amIyNTBaWGgwT25ndVpHVm1hVzVsTG1KcGJtUW9iblZzYkN3eUtTeGNJblJvYVhOY0lqcDRMbVJsWm1sdVpTNWlhVzVrS0c1MWJHd3NNeWtzWkhKaGR6cEhZU2g3ZlNrc1luVm1abVZ5T21aMWJtTjBhVzl1S0dFcGUzSmxkSFZ5YmlCcllTNWpjbVZoZEdVb1lTd3pORGsyTWl3aE1Td2hNU2w5TEdWc1pXMWxiblJ6T21aMWJtTjBhVzl1S0dFcGUzSmxkSFZ5YmlCeVlTNWpjbVZoZEdVb1lTd2hNU2w5TEhSbGVIUjFjbVU2WkdFdVkzSmxZWFJsTWtRc1kzVmlaVHBrWVM1amNtVmhkR1ZEZFdKbExISmxibVJsY21KMVptWmxjanBxWVM1amNtVmhkR1VzWm5KaGJXVmlkV1ptWlhJNmJHRXVZM0psWVhSbExHWnlZVzFsWW5WbVptVnlRM1ZpWlRwc1lTNWpjbVZoZEdWRGRXSmxMR0YwZEhKcFluVjBaWE02VXl4bWNtRnRaVHBhTEc5dU9tWjFibU4wYVc5dUtHRXNZaWw3ZG1GeUlHTTdjM2RwZEdOb0tHRXBlMk5oYzJVZ1hDSm1jbUZ0WlZ3aU9uSmxkSFZ5YmlCYUtHSXBPMXh1WTJGelpTQmNJbXh2YzNSY0lqcGpQWEJoTzJKeVpXRnJPMk5oYzJVZ1hDSnlaWE4wYjNKbFhDSTZZejFXTzJKeVpXRnJPMk5oYzJVZ1hDSmtaWE4wY205NVhDSTZZejFZZldNdWNIVnphQ2hpS1R0eVpYUjFjbTU3WTJGdVkyVnNPbVoxYm1OMGFXOXVLQ2w3Wm05eUtIWmhjaUJoUFRBN1lUeGpMbXhsYm1kMGFEc3JLMkVwYVdZb1kxdGhYVDA5UFdJcGUyTmJZVjA5WTF0akxteGxibWQwYUMweFhUdGpMbkJ2Y0NncE8ySnlaV0ZyZlgxOWZTeHNhVzFwZEhNNmFXRXNhR0Z6UlhoMFpXNXphVzl1T21aMWJtTjBhVzl1S0dFcGUzSmxkSFZ5YmlBd1BEMXBZUzVsZUhSbGJuTnBiMjV6TG1sdVpHVjRUMllvWVM1MGIweHZkMlZ5UTJGelpTZ3BLWDBzY21WaFpEcG5ZU3hrWlhOMGNtOTVPbVoxYm1OMGFXOXVLQ2w3VVM1c1pXNW5kR2c5TUR0MUtDazdhR0VtSmlob1lTNXlaVzF2ZG1WRmRtVnVkRXhwYzNSbGJtVnlLRndpZDJWaVoyeGpiMjUwWlhoMGJHOXpkRndpTEV4aEtTeG9ZUzV5WlcxdmRtVkZkbVZ1ZEV4cGMzUmxibVZ5S0Z3aWQyVmlaMnhqYjI1MFpYaDBjbVZ6ZEc5eVpXUmNJaXg2WVNrcE8zTmhMbU5zWldGeUtDazdiR0V1WTJ4bFlYSW9LVHRxWVM1amJHVmhjaWdwTzJSaExtTnNaV0Z5S0NrN2NtRXVZMnhsWVhJb0tUdHJZUzVqYkdWaGNpZ3BPMGNtSmtjdVkyeGxZWElvS1R0WUxtWnZja1ZoWTJnb1puVnVZM1JwYjI0b1lTbDdZU2dwZlNsOUxGeHVYMmRzT25Fc1gzSmxabkpsYzJnNlFXRXNjRzlzYkRwbWRXNWpkR2x2YmlncGUwc29LVHRISmlaSExuVndaR0YwWlNncGZTeHViM2M2ZG1Fc2MzUmhkSE02VjMwcE8yWXViMjVFYjI1bEtHNTFiR3dzVXlrN2NtVjBkWEp1SUZOOWZTeDdYQ0l1TDJ4cFlpOWhkSFJ5YVdKMWRHVmNJam94TEZ3aUxpOXNhV0l2WW5WbVptVnlYQ0k2TWl4Y0lpNHZiR2xpTDJOdmNtVmNJam8zTEZ3aUxpOXNhV0l2WkhsdVlXMXBZMXdpT2pnc1hDSXVMMnhwWWk5bGJHVnRaVzUwYzF3aU9qa3NYQ0l1TDJ4cFlpOWxlSFJsYm5OcGIyNWNJam94TUN4Y0lpNHZiR2xpTDJaeVlXMWxZblZtWm1WeVhDSTZNVEVzWENJdUwyeHBZaTlzYVcxcGRITmNJam94TWl4Y0lpNHZiR2xpTDNKbFlXUmNJam94TXl4Y0lpNHZiR2xpTDNKbGJtUmxjbUoxWm1abGNsd2lPakUwTEZ3aUxpOXNhV0l2YzJoaFpHVnlYQ0k2TVRVc1hDSXVMMnhwWWk5emRHRjBjMXdpT2pFMkxGd2lMaTlzYVdJdmMzUnlhVzVuYzF3aU9qRTNMRndpTGk5c2FXSXZkR1Y0ZEhWeVpWd2lPakU0TEZ3aUxpOXNhV0l2ZEdsdFpYSmNJam94T1N4Y0lpNHZiR2xpTDNWMGFXd3ZZMnh2WTJ0Y0lqb3lNQ3hjSWk0dmJHbGlMM1YwYVd3dlpYaDBaVzVrWENJNk1qSXNYQ0l1TDJ4cFlpOTFkR2xzTDNKaFpsd2lPakk1TEZ3aUxpOXNhV0l2ZDJWaVoyeGNJam96TW4xZGZTeDdmU3hiTXpOZEtTZ3pNeWw5S1R0Y2JpSmRmUT09Il19
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"resl":[function(require,module,exports){
/* global XMLHttpRequest */
var configParameters = [
'manifest',
'onDone',
'onProgress',
'onError'
]
var manifestParameters = [
'type',
'src',
'stream',
'credentials',
'parser'
]
var parserParameters = [
'onData',
'onDone'
]
var STATE_ERROR = -1
var STATE_DATA = 0
var STATE_COMPLETE = 1
function raise (message) {
throw new Error('resl: ' + message)
}
function checkType (object, parameters, name) {
Object.keys(object).forEach(function (param) {
if (parameters.indexOf(param) < 0) {
raise('invalid parameter "' + param + '" in ' + name)
}
})
}
function Loader (name, cancel) {
this.state = STATE_DATA
this.ready = false
this.progress = 0
this.name = name
this.cancel = cancel
}
module.exports = function resl (config) {
if (typeof config !== 'object' || !config) {
raise('invalid or missing configuration')
}
checkType(config, configParameters, 'config')
var manifest = config.manifest
if (typeof manifest !== 'object' || !manifest) {
raise('missing manifest')
}
function getFunction (name, dflt) {
if (name in config) {
var func = config[name]
if (typeof func !== 'function') {
raise('invalid callback "' + name + '"')
}
return func
}
return null
}
var onDone = getFunction('onDone')
if (!onDone) {
raise('missing onDone() callback')
}
var onProgress = getFunction('onProgress')
var onError = getFunction('onError')
var assets = {}
var state = STATE_DATA
function loadXHR (request) {
var name = request.name
var stream = request.stream
var binary = request.type === 'binary'
var parser = request.parser
var xhr = new XMLHttpRequest()
var asset = null
var loader = new Loader(name, cancel)
if (stream) {
xhr.onreadystatechange = onReadyStateChange
} else {
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
onReadyStateChange()
}
}
}
if (binary) {
xhr.responseType = 'arraybuffer'
}
function onReadyStateChange () {
if (xhr.readyState < 2 ||
loader.state === STATE_COMPLETE ||
loader.state === STATE_ERROR) {
return
}
if (xhr.status !== 200) {
return abort('error loading resource "' + request.name + '"')
}
if (xhr.readyState > 2 && loader.state === STATE_DATA) {
var response
if (request.type === 'binary') {
response = xhr.response
} else {
response = xhr.responseText
}
if (parser.data) {
try {
asset = parser.data(response)
} catch (e) {
return abort(e)
}
} else {
asset = response
}
}
if (xhr.readyState > 3 && loader.state === STATE_DATA) {
if (parser.done) {
try {
asset = parser.done()
} catch (e) {
return abort(e)
}
}
loader.state = STATE_COMPLETE
}
assets[name] = asset
loader.progress = 0.75 * loader.progress + 0.25
loader.ready =
(request.stream && !!asset) ||
loader.state === STATE_COMPLETE
notifyProgress()
}
function cancel () {
if (loader.state === STATE_COMPLETE || loader.state === STATE_ERROR) {
return
}
xhr.onreadystatechange = null
xhr.abort()
loader.state = STATE_ERROR
}
// set up request
if (request.credentials) {
xhr.withCredentials = true
}
xhr.open('GET', request.src, true)
xhr.send()
return loader
}
function loadElement (request, element) {
var name = request.name
var parser = request.parser
var loader = new Loader(name, cancel)
var asset = element
function handleProgress () {
if (loader.state === STATE_DATA) {
if (parser.data) {
try {
asset = parser.data(element)
} catch (e) {
return abort(e)
}
} else {
asset = element
}
}
}
function onProgress (e) {
handleProgress()
assets[name] = asset
if (e.lengthComputable) {
loader.progress = Math.max(loader.progress, e.loaded / e.total)
} else {
loader.progress = 0.75 * loader.progress + 0.25
}
notifyProgress(name)
}
function onComplete () {
handleProgress()
if (loader.state === STATE_DATA) {
if (parser.done) {
try {
asset = parser.done()
} catch (e) {
return abort(e)
}
}
loader.state = STATE_COMPLETE
}
loader.progress = 1
loader.ready = true
assets[name] = asset
removeListeners()
notifyProgress('finish ' + name)
}
function onError () {
abort('error loading asset "' + name + '"')
}
if (request.stream) {
element.addEventListener('progress', onProgress)
}
if (request.type === 'image') {
element.addEventListener('load', onComplete)
} else {
var canPlay = false
var loadedMetaData = false
element.addEventListener('loadedmetadata', function () {
loadedMetaData = true
if (canPlay) {
onComplete()
}
})
element.addEventListener('canplay', function () {
canPlay = true
if (loadedMetaData) {
onComplete()
}
})
}
element.addEventListener('error', onError)
function removeListeners () {
if (request.stream) {
element.removeEventListener('progress', onProgress)
}
if (request.type === 'image') {
element.addEventListener('load', onComplete)
} else {
element.addEventListener('canplay', onComplete)
}
element.removeEventListener('error', onError)
}
function cancel () {
if (loader.state === STATE_COMPLETE || loader.state === STATE_ERROR) {
return
}
loader.state = STATE_ERROR
removeListeners()
element.src = ''
}
// set up request
if (request.credentials) {
element.crossOrigin = 'use-credentials'
} else {
element.crossOrigin = 'anonymous'
}
element.src = request.src
return loader
}
var loaders = {
text: loadXHR,
binary: function (request) {
// TODO use fetch API for streaming if supported
return loadXHR(request)
},
image: function (request) {
return loadElement(request, document.createElement('img'))
},
video: function (request) {
return loadElement(request, document.createElement('video'))
},
audio: function (request) {
return loadElement(request, document.createElement('audio'))
}
}
// First we parse all objects in order to verify that all type information
// is correct
var pending = Object.keys(manifest).map(function (name) {
var request = manifest[name]
if (typeof request === 'string') {
request = {
src: request
}
} else if (typeof request !== 'object' || !request) {
raise('invalid asset definition "' + name + '"')
}
checkType(request, manifestParameters, 'asset "' + name + '"')
function getParameter (prop, accepted, init) {
var value = init
if (prop in request) {
value = request[prop]
}
if (accepted.indexOf(value) < 0) {
raise('invalid ' + prop + ' "' + value + '" for asset "' + name + '", possible values: ' + accepted)
}
return value
}
function getString (prop, required, init) {
var value = init
if (prop in request) {
value = request[prop]
} else if (required) {
raise('missing ' + prop + ' for asset "' + name + '"')
}
if (typeof value !== 'string') {
raise('invalid ' + prop + ' for asset "' + name + '", must be a string')
}
return value
}
function getParseFunc (name, dflt) {
if (name in request.parser) {
var result = request.parser[name]
if (typeof result !== 'function') {
raise('invalid parser callback ' + name + ' for asset "' + name + '"')
}
return result
} else {
return dflt
}
}
var parser = {}
if ('parser' in request) {
if (typeof request.parser === 'function') {
parser = {
data: request.parser
}
} else if (typeof request.parser === 'object' && request.parser) {
checkType(parser, parserParameters, 'parser for asset "' + name + '"')
if (!('onData' in parser)) {
raise('missing onData callback for parser in asset "' + name + '"')
}
parser = {
data: getParseFunc('onData'),
done: getParseFunc('onDone')
}
} else {
raise('invalid parser for asset "' + name + '"')
}
}
return {
name: name,
type: getParameter('type', Object.keys(loaders), 'text'),
stream: !!request.stream,
credentials: !!request.credentials,
src: getString('src', true, ''),
parser: parser
}
}).map(function (request) {
return (loaders[request.type])(request)
})
function abort (message) {
if (state === STATE_ERROR || state === STATE_COMPLETE) {
return
}
state = STATE_ERROR
pending.forEach(function (loader) {
loader.cancel()
})
if (onError) {
if (typeof message === 'string') {
onError(new Error('resl: ' + message))
} else {
onError(message)
}
} else {
console.error('resl error:', message)
}
}
function notifyProgress (message) {
if (state === STATE_ERROR || state === STATE_COMPLETE) {
return
}
var progress = 0
var numReady = 0
pending.forEach(function (loader) {
if (loader.ready) {
numReady += 1
}
progress += loader.progress
})
if (numReady === pending.length) {
state = STATE_COMPLETE
onDone(assets)
} else {
if (onProgress) {
onProgress(progress / pending.length, message)
}
}
}
if (pending.length === 0) {
setTimeout(function () {
notifyProgress('done')
}, 1)
}
}
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyogZ2xvYmFsIFhNTEh0dHBSZXF1ZXN0ICovXG52YXIgY29uZmlnUGFyYW1ldGVycyA9IFtcbiAgJ21hbmlmZXN0JyxcbiAgJ29uRG9uZScsXG4gICdvblByb2dyZXNzJyxcbiAgJ29uRXJyb3InXG5dXG5cbnZhciBtYW5pZmVzdFBhcmFtZXRlcnMgPSBbXG4gICd0eXBlJyxcbiAgJ3NyYycsXG4gICdzdHJlYW0nLFxuICAnY3JlZGVudGlhbHMnLFxuICAncGFyc2VyJ1xuXVxuXG52YXIgcGFyc2VyUGFyYW1ldGVycyA9IFtcbiAgJ29uRGF0YScsXG4gICdvbkRvbmUnXG5dXG5cbnZhciBTVEFURV9FUlJPUiA9IC0xXG52YXIgU1RBVEVfREFUQSA9IDBcbnZhciBTVEFURV9DT01QTEVURSA9IDFcblxuZnVuY3Rpb24gcmFpc2UgKG1lc3NhZ2UpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdyZXNsOiAnICsgbWVzc2FnZSlcbn1cblxuZnVuY3Rpb24gY2hlY2tUeXBlIChvYmplY3QsIHBhcmFtZXRlcnMsIG5hbWUpIHtcbiAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgIGlmIChwYXJhbWV0ZXJzLmluZGV4T2YocGFyYW0pIDwgMCkge1xuICAgICAgcmFpc2UoJ2ludmFsaWQgcGFyYW1ldGVyIFwiJyArIHBhcmFtICsgJ1wiIGluICcgKyBuYW1lKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gTG9hZGVyIChuYW1lLCBjYW5jZWwpIHtcbiAgdGhpcy5zdGF0ZSA9IFNUQVRFX0RBVEFcbiAgdGhpcy5yZWFkeSA9IGZhbHNlXG4gIHRoaXMucHJvZ3Jlc3MgPSAwXG4gIHRoaXMubmFtZSA9IG5hbWVcbiAgdGhpcy5jYW5jZWwgPSBjYW5jZWxcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXNsIChjb25maWcpIHtcbiAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnIHx8ICFjb25maWcpIHtcbiAgICByYWlzZSgnaW52YWxpZCBvciBtaXNzaW5nIGNvbmZpZ3VyYXRpb24nKVxuICB9XG5cbiAgY2hlY2tUeXBlKGNvbmZpZywgY29uZmlnUGFyYW1ldGVycywgJ2NvbmZpZycpXG5cbiAgdmFyIG1hbmlmZXN0ID0gY29uZmlnLm1hbmlmZXN0XG4gIGlmICh0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnIHx8ICFtYW5pZmVzdCkge1xuICAgIHJhaXNlKCdtaXNzaW5nIG1hbmlmZXN0JylcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZ1bmN0aW9uIChuYW1lLCBkZmx0KSB7XG4gICAgaWYgKG5hbWUgaW4gY29uZmlnKSB7XG4gICAgICB2YXIgZnVuYyA9IGNvbmZpZ1tuYW1lXVxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJhaXNlKCdpbnZhbGlkIGNhbGxiYWNrIFwiJyArIG5hbWUgKyAnXCInKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmNcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHZhciBvbkRvbmUgPSBnZXRGdW5jdGlvbignb25Eb25lJylcbiAgaWYgKCFvbkRvbmUpIHtcbiAgICByYWlzZSgnbWlzc2luZyBvbkRvbmUoKSBjYWxsYmFjaycpXG4gIH1cblxuICB2YXIgb25Qcm9ncmVzcyA9IGdldEZ1bmN0aW9uKCdvblByb2dyZXNzJylcbiAgdmFyIG9uRXJyb3IgPSBnZXRGdW5jdGlvbignb25FcnJvcicpXG5cbiAgdmFyIGFzc2V0cyA9IHt9XG5cbiAgdmFyIHN0YXRlID0gU1RBVEVfREFUQVxuXG4gIGZ1bmN0aW9uIGxvYWRYSFIgKHJlcXVlc3QpIHtcbiAgICB2YXIgbmFtZSA9IHJlcXVlc3QubmFtZVxuICAgIHZhciBzdHJlYW0gPSByZXF1ZXN0LnN0cmVhbVxuICAgIHZhciBiaW5hcnkgPSByZXF1ZXN0LnR5cGUgPT09ICdiaW5hcnknXG4gICAgdmFyIHBhcnNlciA9IHJlcXVlc3QucGFyc2VyXG5cbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICB2YXIgYXNzZXQgPSBudWxsXG5cbiAgICB2YXIgbG9hZGVyID0gbmV3IExvYWRlcihuYW1lLCBjYW5jZWwpXG5cbiAgICBpZiAoc3RyZWFtKSB7XG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gb25SZWFkeVN0YXRlQ2hhbmdlXG4gICAgfSBlbHNlIHtcbiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgIG9uUmVhZHlTdGF0ZUNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmluYXJ5KSB7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJ1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uUmVhZHlTdGF0ZUNoYW5nZSAoKSB7XG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPCAyIHx8XG4gICAgICAgICAgbG9hZGVyLnN0YXRlID09PSBTVEFURV9DT01QTEVURSB8fFxuICAgICAgICAgIGxvYWRlci5zdGF0ZSA9PT0gU1RBVEVfRVJST1IpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoeGhyLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgIHJldHVybiBhYm9ydCgnZXJyb3IgbG9hZGluZyByZXNvdXJjZSBcIicgKyByZXF1ZXN0Lm5hbWUgKyAnXCInKVxuICAgICAgfVxuICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID4gMiAmJiBsb2FkZXIuc3RhdGUgPT09IFNUQVRFX0RBVEEpIHtcbiAgICAgICAgdmFyIHJlc3BvbnNlXG4gICAgICAgIGlmIChyZXF1ZXN0LnR5cGUgPT09ICdiaW5hcnknKSB7XG4gICAgICAgICAgcmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHRcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VyLmRhdGEpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXNzZXQgPSBwYXJzZXIuZGF0YShyZXNwb25zZSlcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gYWJvcnQoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXNzZXQgPSByZXNwb25zZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPiAzICYmIGxvYWRlci5zdGF0ZSA9PT0gU1RBVEVfREFUQSkge1xuICAgICAgICBpZiAocGFyc2VyLmRvbmUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXNzZXQgPSBwYXJzZXIuZG9uZSgpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFib3J0KGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvYWRlci5zdGF0ZSA9IFNUQVRFX0NPTVBMRVRFXG4gICAgICB9XG4gICAgICBhc3NldHNbbmFtZV0gPSBhc3NldFxuICAgICAgbG9hZGVyLnByb2dyZXNzID0gMC43NSAqIGxvYWRlci5wcm9ncmVzcyArIDAuMjVcbiAgICAgIGxvYWRlci5yZWFkeSA9XG4gICAgICAgIChyZXF1ZXN0LnN0cmVhbSAmJiAhIWFzc2V0KSB8fFxuICAgICAgICBsb2FkZXIuc3RhdGUgPT09IFNUQVRFX0NPTVBMRVRFXG4gICAgICBub3RpZnlQcm9ncmVzcygpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuY2VsICgpIHtcbiAgICAgIGlmIChsb2FkZXIuc3RhdGUgPT09IFNUQVRFX0NPTVBMRVRFIHx8IGxvYWRlci5zdGF0ZSA9PT0gU1RBVEVfRVJST1IpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbFxuICAgICAgeGhyLmFib3J0KClcbiAgICAgIGxvYWRlci5zdGF0ZSA9IFNUQVRFX0VSUk9SXG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIHJlcXVlc3RcbiAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICB9XG4gICAgeGhyLm9wZW4oJ0dFVCcsIHJlcXVlc3Quc3JjLCB0cnVlKVxuICAgIHhoci5zZW5kKClcblxuICAgIHJldHVybiBsb2FkZXJcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWRFbGVtZW50IChyZXF1ZXN0LCBlbGVtZW50KSB7XG4gICAgdmFyIG5hbWUgPSByZXF1ZXN0Lm5hbWVcbiAgICB2YXIgcGFyc2VyID0gcmVxdWVzdC5wYXJzZXJcblxuICAgIHZhciBsb2FkZXIgPSBuZXcgTG9hZGVyKG5hbWUsIGNhbmNlbClcbiAgICB2YXIgYXNzZXQgPSBlbGVtZW50XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVQcm9ncmVzcyAoKSB7XG4gICAgICBpZiAobG9hZGVyLnN0YXRlID09PSBTVEFURV9EQVRBKSB7XG4gICAgICAgIGlmIChwYXJzZXIuZGF0YSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhc3NldCA9IHBhcnNlci5kYXRhKGVsZW1lbnQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFib3J0KGUpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2V0ID0gZWxlbWVudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Qcm9ncmVzcyAoZSkge1xuICAgICAgaGFuZGxlUHJvZ3Jlc3MoKVxuICAgICAgYXNzZXRzW25hbWVdID0gYXNzZXRcbiAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgICAgbG9hZGVyLnByb2dyZXNzID0gTWF0aC5tYXgobG9hZGVyLnByb2dyZXNzLCBlLmxvYWRlZCAvIGUudG90YWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkZXIucHJvZ3Jlc3MgPSAwLjc1ICogbG9hZGVyLnByb2dyZXNzICsgMC4yNVxuICAgICAgfVxuICAgICAgbm90aWZ5UHJvZ3Jlc3MobmFtZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNvbXBsZXRlICgpIHtcbiAgICAgIGhhbmRsZVByb2dyZXNzKClcbiAgICAgIGlmIChsb2FkZXIuc3RhdGUgPT09IFNUQVRFX0RBVEEpIHtcbiAgICAgICAgaWYgKHBhcnNlci5kb25lKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFzc2V0ID0gcGFyc2VyLmRvbmUoKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhYm9ydChlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2FkZXIuc3RhdGUgPSBTVEFURV9DT01QTEVURVxuICAgICAgfVxuICAgICAgbG9hZGVyLnByb2dyZXNzID0gMVxuICAgICAgbG9hZGVyLnJlYWR5ID0gdHJ1ZVxuICAgICAgYXNzZXRzW25hbWVdID0gYXNzZXRcbiAgICAgIHJlbW92ZUxpc3RlbmVycygpXG4gICAgICBub3RpZnlQcm9ncmVzcygnZmluaXNoICcgKyBuYW1lKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRXJyb3IgKCkge1xuICAgICAgYWJvcnQoJ2Vycm9yIGxvYWRpbmcgYXNzZXQgXCInICsgbmFtZSArICdcIicpXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc3RyZWFtKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgb25Qcm9ncmVzcylcbiAgICB9XG4gICAgaWYgKHJlcXVlc3QudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Db21wbGV0ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNhblBsYXkgPSBmYWxzZVxuICAgICAgdmFyIGxvYWRlZE1ldGFEYXRhID0gZmFsc2VcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvYWRlZE1ldGFEYXRhID0gdHJ1ZVxuICAgICAgICBpZiAoY2FuUGxheSkge1xuICAgICAgICAgIG9uQ29tcGxldGUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjYW5wbGF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYW5QbGF5ID0gdHJ1ZVxuICAgICAgICBpZiAobG9hZGVkTWV0YURhdGEpIHtcbiAgICAgICAgICBvbkNvbXBsZXRlKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpXG5cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMgKCkge1xuICAgICAgaWYgKHJlcXVlc3Quc3RyZWFtKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBvblByb2dyZXNzKVxuICAgICAgfVxuICAgICAgaWYgKHJlcXVlc3QudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkNvbXBsZXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjYW5wbGF5Jywgb25Db21wbGV0ZSlcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbmNlbCAoKSB7XG4gICAgICBpZiAobG9hZGVyLnN0YXRlID09PSBTVEFURV9DT01QTEVURSB8fCBsb2FkZXIuc3RhdGUgPT09IFNUQVRFX0VSUk9SKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgbG9hZGVyLnN0YXRlID0gU1RBVEVfRVJST1JcbiAgICAgIHJlbW92ZUxpc3RlbmVycygpXG4gICAgICBlbGVtZW50LnNyYyA9ICcnXG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIHJlcXVlc3RcbiAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscykge1xuICAgICAgZWxlbWVudC5jcm9zc09yaWdpbiA9ICd1c2UtY3JlZGVudGlhbHMnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJ1xuICAgIH1cbiAgICBlbGVtZW50LnNyYyA9IHJlcXVlc3Quc3JjXG5cbiAgICByZXR1cm4gbG9hZGVyXG4gIH1cblxuICB2YXIgbG9hZGVycyA9IHtcbiAgICB0ZXh0OiBsb2FkWEhSLFxuICAgIGJpbmFyeTogZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgIC8vIFRPRE8gdXNlIGZldGNoIEFQSSBmb3Igc3RyZWFtaW5nIGlmIHN1cHBvcnRlZFxuICAgICAgcmV0dXJuIGxvYWRYSFIocmVxdWVzdClcbiAgICB9LFxuICAgIGltYWdlOiBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgcmV0dXJuIGxvYWRFbGVtZW50KHJlcXVlc3QsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpKVxuICAgIH0sXG4gICAgdmlkZW86IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gbG9hZEVsZW1lbnQocmVxdWVzdCwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKSlcbiAgICB9LFxuICAgIGF1ZGlvOiBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgcmV0dXJuIGxvYWRFbGVtZW50KHJlcXVlc3QsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2F1ZGlvJykpXG4gICAgfVxuICB9XG5cbiAgLy8gRmlyc3Qgd2UgcGFyc2UgYWxsIG9iamVjdHMgaW4gb3JkZXIgdG8gdmVyaWZ5IHRoYXQgYWxsIHR5cGUgaW5mb3JtYXRpb25cbiAgLy8gaXMgY29ycmVjdFxuICB2YXIgcGVuZGluZyA9IE9iamVjdC5rZXlzKG1hbmlmZXN0KS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgcmVxdWVzdCA9IG1hbmlmZXN0W25hbWVdXG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmVxdWVzdCA9IHtcbiAgICAgICAgc3JjOiByZXF1ZXN0XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWVzdCAhPT0gJ29iamVjdCcgfHwgIXJlcXVlc3QpIHtcbiAgICAgIHJhaXNlKCdpbnZhbGlkIGFzc2V0IGRlZmluaXRpb24gXCInICsgbmFtZSArICdcIicpXG4gICAgfVxuXG4gICAgY2hlY2tUeXBlKHJlcXVlc3QsIG1hbmlmZXN0UGFyYW1ldGVycywgJ2Fzc2V0IFwiJyArIG5hbWUgKyAnXCInKVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyYW1ldGVyIChwcm9wLCBhY2NlcHRlZCwgaW5pdCkge1xuICAgICAgdmFyIHZhbHVlID0gaW5pdFxuICAgICAgaWYgKHByb3AgaW4gcmVxdWVzdCkge1xuICAgICAgICB2YWx1ZSA9IHJlcXVlc3RbcHJvcF1cbiAgICAgIH1cbiAgICAgIGlmIChhY2NlcHRlZC5pbmRleE9mKHZhbHVlKSA8IDApIHtcbiAgICAgICAgcmFpc2UoJ2ludmFsaWQgJyArIHByb3AgKyAnIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhc3NldCBcIicgKyBuYW1lICsgJ1wiLCBwb3NzaWJsZSB2YWx1ZXM6ICcgKyBhY2NlcHRlZClcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFN0cmluZyAocHJvcCwgcmVxdWlyZWQsIGluaXQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGluaXRcbiAgICAgIGlmIChwcm9wIGluIHJlcXVlc3QpIHtcbiAgICAgICAgdmFsdWUgPSByZXF1ZXN0W3Byb3BdXG4gICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgIHJhaXNlKCdtaXNzaW5nICcgKyBwcm9wICsgJyBmb3IgYXNzZXQgXCInICsgbmFtZSArICdcIicpXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICByYWlzZSgnaW52YWxpZCAnICsgcHJvcCArICcgZm9yIGFzc2V0IFwiJyArIG5hbWUgKyAnXCIsIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VGdW5jIChuYW1lLCBkZmx0KSB7XG4gICAgICBpZiAobmFtZSBpbiByZXF1ZXN0LnBhcnNlcikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVxdWVzdC5wYXJzZXJbbmFtZV1cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByYWlzZSgnaW52YWxpZCBwYXJzZXIgY2FsbGJhY2sgJyArIG5hbWUgKyAnIGZvciBhc3NldCBcIicgKyBuYW1lICsgJ1wiJylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGZsdFxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwYXJzZXIgPSB7fVxuICAgIGlmICgncGFyc2VyJyBpbiByZXF1ZXN0KSB7XG4gICAgICBpZiAodHlwZW9mIHJlcXVlc3QucGFyc2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBhcnNlciA9IHtcbiAgICAgICAgICBkYXRhOiByZXF1ZXN0LnBhcnNlclxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1ZXN0LnBhcnNlciA9PT0gJ29iamVjdCcgJiYgcmVxdWVzdC5wYXJzZXIpIHtcbiAgICAgICAgY2hlY2tUeXBlKHBhcnNlciwgcGFyc2VyUGFyYW1ldGVycywgJ3BhcnNlciBmb3IgYXNzZXQgXCInICsgbmFtZSArICdcIicpXG4gICAgICAgIGlmICghKCdvbkRhdGEnIGluIHBhcnNlcikpIHtcbiAgICAgICAgICByYWlzZSgnbWlzc2luZyBvbkRhdGEgY2FsbGJhY2sgZm9yIHBhcnNlciBpbiBhc3NldCBcIicgKyBuYW1lICsgJ1wiJylcbiAgICAgICAgfVxuICAgICAgICBwYXJzZXIgPSB7XG4gICAgICAgICAgZGF0YTogZ2V0UGFyc2VGdW5jKCdvbkRhdGEnKSxcbiAgICAgICAgICBkb25lOiBnZXRQYXJzZUZ1bmMoJ29uRG9uZScpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhaXNlKCdpbnZhbGlkIHBhcnNlciBmb3IgYXNzZXQgXCInICsgbmFtZSArICdcIicpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB0eXBlOiBnZXRQYXJhbWV0ZXIoJ3R5cGUnLCBPYmplY3Qua2V5cyhsb2FkZXJzKSwgJ3RleHQnKSxcbiAgICAgIHN0cmVhbTogISFyZXF1ZXN0LnN0cmVhbSxcbiAgICAgIGNyZWRlbnRpYWxzOiAhIXJlcXVlc3QuY3JlZGVudGlhbHMsXG4gICAgICBzcmM6IGdldFN0cmluZygnc3JjJywgdHJ1ZSwgJycpLFxuICAgICAgcGFyc2VyOiBwYXJzZXJcbiAgICB9XG4gIH0pLm1hcChmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgIHJldHVybiAobG9hZGVyc1tyZXF1ZXN0LnR5cGVdKShyZXF1ZXN0KVxuICB9KVxuXG4gIGZ1bmN0aW9uIGFib3J0IChtZXNzYWdlKSB7XG4gICAgaWYgKHN0YXRlID09PSBTVEFURV9FUlJPUiB8fCBzdGF0ZSA9PT0gU1RBVEVfQ09NUExFVEUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBzdGF0ZSA9IFNUQVRFX0VSUk9SXG4gICAgcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uIChsb2FkZXIpIHtcbiAgICAgIGxvYWRlci5jYW5jZWwoKVxuICAgIH0pXG4gICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb25FcnJvcihuZXcgRXJyb3IoJ3Jlc2w6ICcgKyBtZXNzYWdlKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uRXJyb3IobWVzc2FnZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcigncmVzbCBlcnJvcjonLCBtZXNzYWdlKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdGlmeVByb2dyZXNzIChtZXNzYWdlKSB7XG4gICAgaWYgKHN0YXRlID09PSBTVEFURV9FUlJPUiB8fCBzdGF0ZSA9PT0gU1RBVEVfQ09NUExFVEUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBwcm9ncmVzcyA9IDBcbiAgICB2YXIgbnVtUmVhZHkgPSAwXG4gICAgcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uIChsb2FkZXIpIHtcbiAgICAgIGlmIChsb2FkZXIucmVhZHkpIHtcbiAgICAgICAgbnVtUmVhZHkgKz0gMVxuICAgICAgfVxuICAgICAgcHJvZ3Jlc3MgKz0gbG9hZGVyLnByb2dyZXNzXG4gICAgfSlcblxuICAgIGlmIChudW1SZWFkeSA9PT0gcGVuZGluZy5sZW5ndGgpIHtcbiAgICAgIHN0YXRlID0gU1RBVEVfQ09NUExFVEVcbiAgICAgIG9uRG9uZShhc3NldHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgIG9uUHJvZ3Jlc3MocHJvZ3Jlc3MgLyBwZW5kaW5nLmxlbmd0aCwgbWVzc2FnZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vdGlmeVByb2dyZXNzKCdkb25lJylcbiAgICB9LCAxKVxuICB9XG59XG4iXX0=
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"glsl-quad":[function(require,module,exports){
const verts = [
[-1.0, -1.0],
[+1.0, -1.0],
[-1.0, +1.0],
[-1.0, +1.0],
[+1.0, -1.0],
[+1.0, +1.0]
];
const uvs = [
[0.0, 0.0],
[1.0, 0.0],
[0.0, 1.0],
[0.0, 1.0],
[1.0, 0.0],
[1.0, 1.0]
];
const indices = [
[0, 1, 2],
[3, 4, 5]
];
const vshader = `
precision mediump float;
attribute vec2 a_position;
attribute vec2 a_uv;
uniform float u_clip_y;
varying vec2 v_uv;
void main() {
v_uv = a_uv;
gl_Position = vec4(a_position * vec2(1,u_clip_y), 0, 1);
}
`;
const fshader = `
precision mediump float;
varying vec2 v_uv;
uniform sampler2D u_tex;
void main () {
gl_FragColor = texture2D(u_tex,v_uv);
}
`;
const showUVsFshader = `
precision mediump float;
varying vec2 v_uv;
void main () {
gl_FragColor = vec4(v_uv,0,1);
}
`;
const showPositionsVshader = `
precision mediump float;
attribute vec2 a_position;
uniform float u_clip_y;
varying vec2 v_uv;
void main() {
gl_Position = vec4(a_position * vec2(1,u_clip_y), 0, 1);
v_uv = gl_Position.xy;
}
`;
const showPositionsFshader = `
precision mediump float;
varying vec2 v_uv;
void main () {
gl_FragColor = vec4(v_uv,0,1);
}
`;
const directionsDataUri = `
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAA
BACAIAAAAlC+aJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQ
UAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEbSURBVGhD7dhRDsIgEI
RhjubNPHqlHUTAdjfRWRKa+UIirQnd376Z0vZZG1vQsfvB76WAa3
En3yug3GHD0HX6gIZCAaYaEGdSQM2g9yjApADfpIBhTzQvIIgCTA
rwKcCkAJ8CTArwKcCkAN/56Y/8XAZCwH7AsS6sEDBseisEYF1YIW
DY9Lq7eW6Mjk29/Bk/YD+vO7Bc/D/rKULAqSbj80tHrOehPC9mjY
/krhkBeBF4HvZE6CgXRJgeW3wAPYMf0IwO1NO/RL2BhgJMCvApwK
QAnwJMCvApwKQAnwJMCvApwNQGYE/vmRowbCgUYLpbQHvJMi8gSN
TpmLsGxGWsH9Aq90gwfW1gwv9zx+qUr0mWD8hCps/uE5DSC/pgVD
kvIARVAAAAAElFTkSuQmCC`.replace(/\s*/g, '');
const bitmaps = {
directions: {uri: directionsDataUri}
};
module.exports = {verts, indices, uvs, shader: {vert: vshader, frag: fshader},
show: {
uvs: {frag: showUVsFshader, vert: vshader},
positions: {frag: showPositionsFshader, vert: showPositionsVshader}
},
bitmaps};
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImdsc2wtcXVhZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIlxuY29uc3QgdmVydHMgPSBbXG4gIFstMS4wLCAtMS4wXSxcbiAgWysxLjAsIC0xLjBdLFxuICBbLTEuMCwgKzEuMF0sXG4gIFstMS4wLCArMS4wXSxcbiAgWysxLjAsIC0xLjBdLFxuICBbKzEuMCwgKzEuMF1cbl07XG5cbmNvbnN0IHV2cyA9IFtcbiAgWzAuMCwgMC4wXSxcbiAgWzEuMCwgMC4wXSxcbiAgWzAuMCwgMS4wXSxcbiAgWzAuMCwgMS4wXSxcbiAgWzEuMCwgMC4wXSxcbiAgWzEuMCwgMS4wXVxuXTtcblxuY29uc3QgaW5kaWNlcyA9IFtcbiAgWzAsIDEsIDJdLFxuICBbMywgNCwgNV1cbl07XG5cbmNvbnN0IHZzaGFkZXIgPSBgXG4gIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuICBhdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uO1xuICBhdHRyaWJ1dGUgdmVjMiBhX3V2O1xuXG4gIHVuaWZvcm0gZmxvYXQgdV9jbGlwX3k7XG5cbiAgdmFyeWluZyB2ZWMyIHZfdXY7XG4gIFxuICB2b2lkIG1haW4oKSB7XG4gICAgdl91diA9IGFfdXY7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24gKiB2ZWMyKDEsdV9jbGlwX3kpLCAwLCAxKTtcbiAgfVxuYDtcblxuY29uc3QgZnNoYWRlciA9IGBcbiAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4gIHZhcnlpbmcgdmVjMiB2X3V2O1xuICB1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDtcbiAgdm9pZCBtYWluICgpIHtcbiAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodV90ZXgsdl91dik7XG4gIH1cbmA7XG5cbmNvbnN0IHNob3dVVnNGc2hhZGVyID0gYFxuICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiAgdmFyeWluZyB2ZWMyIHZfdXY7XG4gIHZvaWQgbWFpbiAoKSB7XG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh2X3V2LDAsMSk7XG4gIH1cbmA7XG5cblxuY29uc3Qgc2hvd1Bvc2l0aW9uc1ZzaGFkZXIgPSBgXG4gIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuICBhdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uO1xuXG4gIHVuaWZvcm0gZmxvYXQgdV9jbGlwX3k7XG5cbiAgdmFyeWluZyB2ZWMyIHZfdXY7XG4gIFxuICB2b2lkIG1haW4oKSB7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24gKiB2ZWMyKDEsdV9jbGlwX3kpLCAwLCAxKTtcbiAgICB2X3V2ID0gZ2xfUG9zaXRpb24ueHk7XG4gIH1cbmA7XG5cbmNvbnN0IHNob3dQb3NpdGlvbnNGc2hhZGVyID0gYFxuICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiAgdmFyeWluZyB2ZWMyIHZfdXY7XG4gIHZvaWQgbWFpbiAoKSB7XG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh2X3V2LDAsMSk7XG4gIH1cbmA7XG5cbmNvbnN0IGRpcmVjdGlvbnNEYXRhVXJpID0gYFxuZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFQUFBQVxuQkFDQUlBQUFBbEMrYUpBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVxuVUFBQUFKY0VoWmN3QUFFblFBQUJKMEFkNW1IM2dBQUFFYlNVUkJWR2hEN2RoUkRzSWdFSVxuUmhqdWJOUEhxbEhVVEFkamZSV1JLYStVSWlyUW5kMzc2WjB2WlpHMXZRc2Z2Qjc2V0FhM1xuRW4zeXVnM0dIRDBIWDZnSVpDQWFZYUVHZFNRTTJnOXlqQXBBRGZwSUJoVHpRdklJZ0NUQVxucndLY0NrQUo4Q1RBcndLY0NrQU4vNTZZLzhYQVpDd0g3QXNTNnNFREJzZWlzRVlGMVlJV1xuRFk5THE3ZVc2TWprMjkvQmsvWUQrdk83QmMvRC9yS1VMQXFTYmo4MHRIck9laFBDOW1qWVxuL2tyaGtCZUJGNEh2WkU2Q2dYUkpnZVczd0FQWU1mMEl3TzFOTy9STDJCaGdKTUN2QXB3S1xuUUFud0pNQ3ZBcHdLUUFud0pNQ3ZBcHdOUUdZRS92bVJvd2JDZ1VZTHBiUUh2Sk1pOGdTTlxuVHBtTHNHeEdXc0g5QXE5MGd3ZlcxZ3d2OXp4K3FVcjBtV0Q4aENwcy91RTVEU0MvcGdWRFxua3ZJQVJWQUFBQUFFbEZUa1N1UW1DQ2AucmVwbGFjZSgvXFxzKi9nLCAnJyk7XG5cbmNvbnN0IGJpdG1hcHMgPSB7XG4gIGRpcmVjdGlvbnM6IHt1cmk6IGRpcmVjdGlvbnNEYXRhVXJpfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7dmVydHMsIGluZGljZXMsIHV2cywgc2hhZGVyOiB7dmVydDogdnNoYWRlciwgZnJhZzogZnNoYWRlcn0sXG4gICAgICAgICAgICAgICAgICBzaG93OiB7XG4gICAgICAgICAgICAgICAgICAgIHV2czoge2ZyYWc6IHNob3dVVnNGc2hhZGVyLCB2ZXJ0OiB2c2hhZGVyfSxcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zOiB7ZnJhZzogc2hvd1Bvc2l0aW9uc0ZzaGFkZXIsIHZlcnQ6IHNob3dQb3NpdGlvbnNWc2hhZGVyfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGJpdG1hcHN9O1xuIl19
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
(function (global){
/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
* @license MIT
*/
/* eslint-disable no-proto */
'use strict'
var base64 = require('base64-js')
var ieee754 = require('ieee754')
var isArray = require('isarray')
exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50
Buffer.poolSize = 8192 // not used by this implementation
var rootParent = {}
/**
* If `Buffer.TYPED_ARRAY_SUPPORT`:
* === true Use Uint8Array implementation (fastest)
* === false Use Object implementation (most compatible, even IE6)
*
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
* Opera 11.6+, iOS 4.2+.
*
* Due to various browser bugs, sometimes the Object implementation will be used even
* when the browser supports typed arrays.
*
* Note:
*
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
*
* - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property
* on objects.
*
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
*
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
* incorrect length in some situations.
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
* get the Object implementation, which is slower but behaves correctly.
*/
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
? global.TYPED_ARRAY_SUPPORT
: typedArraySupport()
function typedArraySupport () {
function Bar () {}
try {
var arr = new Uint8Array(1)
arr.foo = function () { return 42 }
arr.constructor = Bar
return arr.foo() === 42 && // typed array instances can be augmented
arr.constructor === Bar && // constructor can be set
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
} catch (e) {
return false
}
}
function kMaxLength () {
return Buffer.TYPED_ARRAY_SUPPORT
? 0x7fffffff
: 0x3fffffff
}
/**
* Class: Buffer
* =============
*
* The Buffer constructor returns instances of `Uint8Array` that are augmented
* with function properties for all the node `Buffer` API functions. We use
* `Uint8Array` so that square bracket notation works as expected -- it returns
* a single octet.
*
* By augmenting the instances, we can avoid modifying the `Uint8Array`
* prototype.
*/
function Buffer (arg) {
if (!(this instanceof Buffer)) {
// Avoid going through an ArgumentsAdaptorTrampoline in the common case.
if (arguments.length > 1) return new Buffer(arg, arguments[1])
return new Buffer(arg)
}
if (!Buffer.TYPED_ARRAY_SUPPORT) {
this.length = 0
this.parent = undefined
}
// Common case.
if (typeof arg === 'number') {
return fromNumber(this, arg)
}
// Slightly less common case.
if (typeof arg === 'string') {
return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
}
// Unusual.
return fromObject(this, arg)
}
function fromNumber (that, length) {
that = allocate(that, length < 0 ? 0 : checked(length) | 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) {
for (var i = 0; i < length; i++) {
that[i] = 0
}
}
return that
}
function fromString (that, string, encoding) {
if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
// Assumption: byteLength() return value is always < kMaxLength.
var length = byteLength(string, encoding) | 0
that = allocate(that, length)
that.write(string, encoding)
return that
}
function fromObject (that, object) {
if (Buffer.isBuffer(object)) return fromBuffer(that, object)
if (isArray(object)) return fromArray(that, object)
if (object == null) {
throw new TypeError('must start with number, buffer, array or string')
}
if (typeof ArrayBuffer !== 'undefined') {
if (object.buffer instanceof ArrayBuffer) {
return fromTypedArray(that, object)
}
if (object instanceof ArrayBuffer) {
return fromArrayBuffer(that, object)
}
}
if (object.length) return fromArrayLike(that, object)
return fromJsonObject(that, object)
}
function fromBuffer (that, buffer) {
var length = checked(buffer.length) | 0
that = allocate(that, length)
buffer.copy(that, 0, 0, length)
return that
}
function fromArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Duplicate of fromArray() to keep fromArray() monomorphic.
function fromTypedArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
// Truncating the elements is probably not what people expect from typed
// arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
// of the old Buffer constructor.
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
function fromArrayBuffer (that, array) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
array.byteLength
that = Buffer._augment(new Uint8Array(array))
} else {
// Fallback: Return an object instance of the Buffer class
that = fromTypedArray(that, new Uint8Array(array))
}
return that
}
function fromArrayLike (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
// Returns a zero-length buffer for inputs that don't conform to the spec.
function fromJsonObject (that, object) {
var array
var length = 0
if (object.type === 'Buffer' && isArray(object.data)) {
array = object.data
length = checked(array.length) | 0
}
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
if (Buffer.TYPED_ARRAY_SUPPORT) {
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array
} else {
// pre-set for values that may exist in the future
Buffer.prototype.length = undefined
Buffer.prototype.parent = undefined
}
function allocate (that, length) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
that = Buffer._augment(new Uint8Array(length))
that.__proto__ = Buffer.prototype
} else {
// Fallback: Return an object instance of the Buffer class
that.length = length
that._isBuffer = true
}
var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
if (fromPool) that.parent = rootParent
return that
}
function checked (length) {
// Note: cannot use `length < kMaxLength` here because that fails when
// length is NaN (which is otherwise coerced to zero.)
if (length >= kMaxLength()) {
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
'size: 0x' + kMaxLength().toString(16) + ' bytes')
}
return length | 0
}
function SlowBuffer (subject, encoding) {
if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
var buf = new Buffer(subject, encoding)
delete buf.parent
return buf
}
Buffer.isBuffer = function isBuffer (b) {
return !!(b != null && b._isBuffer)
}
Buffer.compare = function compare (a, b) {
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
throw new TypeError('Arguments must be Buffers')
}
if (a === b) return 0
var x = a.length
var y = b.length
var i = 0
var len = Math.min(x, y)
while (i < len) {
if (a[i] !== b[i]) break
++i
}
if (i !== len) {
x = a[i]
y = b[i]
}
if (x < y) return -1
if (y < x) return 1
return 0
}
Buffer.isEncoding = function isEncoding (encoding) {
switch (String(encoding).toLowerCase()) {
case 'hex':
case 'utf8':
case 'utf-8':
case 'ascii':
case 'binary':
case 'base64':
case 'raw':
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return true
default:
return false
}
}
Buffer.concat = function concat (list, length) {
if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
if (list.length === 0) {
return new Buffer(0)
}
var i
if (length === undefined) {
length = 0
for (i = 0; i < list.length; i++) {
length += list[i].length
}
}
var buf = new Buffer(length)
var pos = 0
for (i = 0; i < list.length; i++) {
var item = list[i]
item.copy(buf, pos)
pos += item.length
}
return buf
}
function byteLength (string, encoding) {
if (typeof string !== 'string') string = '' + string
var len = string.length
if (len === 0) return 0
// Use a for loop to avoid recursion
var loweredCase = false
for (;;) {
switch (encoding) {
case 'ascii':
case 'binary':
// Deprecated
case 'raw':
case 'raws':
return len
case 'utf8':
case 'utf-8':
return utf8ToBytes(string).length
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return len * 2
case 'hex':
return len >>> 1
case 'base64':
return base64ToBytes(string).length
default:
if (loweredCase) return utf8ToBytes(string).length // assume utf8
encoding = ('' + encoding).toLowerCase()
loweredCase = true
}
}
}
Buffer.byteLength = byteLength
function slowToString (encoding, start, end) {
var loweredCase = false
start = start | 0
end = end === undefined || end === Infinity ? this.length : end | 0
if (!encoding) encoding = 'utf8'
if (start < 0) start = 0
if (end > this.length) end = this.length
if (end <= start) return ''
while (true) {
switch (encoding) {
case 'hex':
return hexSlice(this, start, end)
case 'utf8':
case 'utf-8':
return utf8Slice(this, start, end)
case 'ascii':
return asciiSlice(this, start, end)
case 'binary':
return binarySlice(this, start, end)
case 'base64':
return base64Slice(this, start, end)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return utf16leSlice(this, start, end)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = (encoding + '').toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.toString = function toString () {
var length = this.length | 0
if (length === 0) return ''
if (arguments.length === 0) return utf8Slice(this, 0, length)
return slowToString.apply(this, arguments)
}
Buffer.prototype.equals = function equals (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return true
return Buffer.compare(this, b) === 0
}
Buffer.prototype.inspect = function inspect () {
var str = ''
var max = exports.INSPECT_MAX_BYTES
if (this.length > 0) {
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
if (this.length > max) str += ' ... '
}
return '<Buffer ' + str + '>'
}
Buffer.prototype.compare = function compare (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return 0
return Buffer.compare(this, b)
}
Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
else if (byteOffset < -0x80000000) byteOffset = -0x80000000
byteOffset >>= 0
if (this.length === 0) return -1
if (byteOffset >= this.length) return -1
// Negative offsets start from the end of the buffer
if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
if (typeof val === 'string') {
if (val.length === 0) return -1 // special case: looking for empty string always fails
return String.prototype.indexOf.call(this, val, byteOffset)
}
if (Buffer.isBuffer(val)) {
return arrayIndexOf(this, val, byteOffset)
}
if (typeof val === 'number') {
if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
}
return arrayIndexOf(this, [ val ], byteOffset)
}
function arrayIndexOf (arr, val, byteOffset) {
var foundIndex = -1
for (var i = 0; byteOffset + i < arr.length; i++) {
if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
if (foundIndex === -1) foundIndex = i
if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
} else {
foundIndex = -1
}
}
return -1
}
throw new TypeError('val must be string, number or Buffer')
}
// `get` is deprecated
Buffer.prototype.get = function get (offset) {
console.log('.get() is deprecated. Access using array indexes instead.')
return this.readUInt8(offset)
}
// `set` is deprecated
Buffer.prototype.set = function set (v, offset) {
console.log('.set() is deprecated. Access using array indexes instead.')
return this.writeUInt8(v, offset)
}
function hexWrite (buf, string, offset, length) {
offset = Number(offset) || 0
var remaining = buf.length - offset
if (!length) {
length = remaining
} else {
length = Number(length)
if (length > remaining) {
length = remaining
}
}
// must be an even number of digits
var strLen = string.length
if (strLen % 2 !== 0) throw new Error('Invalid hex string')
if (length > strLen / 2) {
length = strLen / 2
}
for (var i = 0; i < length; i++) {
var parsed = parseInt(string.substr(i * 2, 2), 16)
if (isNaN(parsed)) throw new Error('Invalid hex string')
buf[offset + i] = parsed
}
return i
}
function utf8Write (buf, string, offset, length) {
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}
function asciiWrite (buf, string, offset, length) {
return blitBuffer(asciiToBytes(string), buf, offset, length)
}
function binaryWrite (buf, string, offset, length) {
return asciiWrite(buf, string, offset, length)
}
function base64Write (buf, string, offset, length) {
return blitBuffer(base64ToBytes(string), buf, offset, length)
}
function ucs2Write (buf, string, offset, length) {
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}
Buffer.prototype.write = function write (string, offset, length, encoding) {
// Buffer#write(string)
if (offset === undefined) {
encoding = 'utf8'
length = this.length
offset = 0
// Buffer#write(string, encoding)
} else if (length === undefined && typeof offset === 'string') {
encoding = offset
length = this.length
offset = 0
// Buffer#write(string, offset[, length][, encoding])
} else if (isFinite(offset)) {
offset = offset | 0
if (isFinite(length)) {
length = length | 0
if (encoding === undefined) encoding = 'utf8'
} else {
encoding = length
length = undefined
}
// legacy write(string, encoding, offset, length) - remove in v0.13
} else {
var swap = encoding
encoding = offset
offset = length | 0
length = swap
}
var remaining = this.length - offset
if (length === undefined || length > remaining) length = remaining
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
throw new RangeError('attempt to write outside buffer bounds')
}
if (!encoding) encoding = 'utf8'
var loweredCase = false
for (;;) {
switch (encoding) {
case 'hex':
return hexWrite(this, string, offset, length)
case 'utf8':
case 'utf-8':
return utf8Write(this, string, offset, length)
case 'ascii':
return asciiWrite(this, string, offset, length)
case 'binary':
return binaryWrite(this, string, offset, length)
case 'base64':
// Warning: maxLength not taken into account in base64Write
return base64Write(this, string, offset, length)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return ucs2Write(this, string, offset, length)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = ('' + encoding).toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.toJSON = function toJSON () {
return {
type: 'Buffer',
data: Array.prototype.slice.call(this._arr || this, 0)
}
}
function base64Slice (buf, start, end) {
if (start === 0 && end === buf.length) {
return base64.fromByteArray(buf)
} else {
return base64.fromByteArray(buf.slice(start, end))
}
}
function utf8Slice (buf, start, end) {
end = Math.min(buf.length, end)
var res = []
var i = start
while (i < end) {
var firstByte = buf[i]
var codePoint = null
var bytesPerSequence = (firstByte > 0xEF) ? 4
: (firstByte > 0xDF) ? 3
: (firstByte > 0xBF) ? 2
: 1
if (i + bytesPerSequence <= end) {
var secondByte, thirdByte, fourthByte, tempCodePoint
switch (bytesPerSequence) {
case 1:
if (firstByte < 0x80) {
codePoint = firstByte
}
break
case 2:
secondByte = buf[i + 1]
if ((secondByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
if (tempCodePoint > 0x7F) {
codePoint = tempCodePoint
}
}
break
case 3:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
codePoint = tempCodePoint
}
}
break
case 4:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
fourthByte = buf[i + 3]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
codePoint = tempCodePoint
}
}
}
}
if (codePoint === null) {
// we did not generate a valid codePoint so insert a
// replacement char (U+FFFD) and advance only 1 byte
codePoint = 0xFFFD
bytesPerSequence = 1
} else if (codePoint > 0xFFFF) {
// encode to utf16 (surrogate pair dance)
codePoint -= 0x10000
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
codePoint = 0xDC00 | codePoint & 0x3FF
}
res.push(codePoint)
i += bytesPerSequence
}
return decodeCodePointsArray(res)
}
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000
function decodeCodePointsArray (codePoints) {
var len = codePoints.length
if (len <= MAX_ARGUMENTS_LENGTH) {
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
}
// Decode in chunks to avoid "call stack size exceeded".
var res = ''
var i = 0
while (i < len) {
res += String.fromCharCode.apply(
String,
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
)
}
return res
}
function asciiSlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i] & 0x7F)
}
return ret
}
function binarySlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i])
}
return ret
}
function hexSlice (buf, start, end) {
var len = buf.length
if (!start || start < 0) start = 0
if (!end || end < 0 || end > len) end = len
var out = ''
for (var i = start; i < end; i++) {
out += toHex(buf[i])
}
return out
}
function utf16leSlice (buf, start, end) {
var bytes = buf.slice(start, end)
var res = ''
for (var i = 0; i < bytes.length; i += 2) {
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
}
return res
}
Buffer.prototype.slice = function slice (start, end) {
var len = this.length
start = ~~start
end = end === undefined ? len : ~~end
if (start < 0) {
start += len
if (start < 0) start = 0
} else if (start > len) {
start = len
}
if (end < 0) {
end += len
if (end < 0) end = 0
} else if (end > len) {
end = len
}
if (end < start) end = start
var newBuf
if (Buffer.TYPED_ARRAY_SUPPORT) {
newBuf = Buffer._augment(this.subarray(start, end))
} else {
var sliceLen = end - start
newBuf = new Buffer(sliceLen, undefined)
for (var i = 0; i < sliceLen; i++) {
newBuf[i] = this[i + start]
}
}
if (newBuf.length) newBuf.parent = this.parent || this
return newBuf
}
/*
* Need to make sure that buffer isn't trying to write out of bounds.
*/
function checkOffset (offset, ext, length) {
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
return val
}
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) {
checkOffset(offset, byteLength, this.length)
}
var val = this[offset + --byteLength]
var mul = 1
while (byteLength > 0 && (mul *= 0x100)) {
val += this[offset + --byteLength] * mul
}
return val
}
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
return this[offset]
}
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return this[offset] | (this[offset + 1] << 8)
}
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return (this[offset] << 8) | this[offset + 1]
}
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ((this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16)) +
(this[offset + 3] * 0x1000000)
}
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] * 0x1000000) +
((this[offset + 1] << 16) |
(this[offset + 2] << 8) |
this[offset + 3])
}
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var i = byteLength
var mul = 1
var val = this[offset + --i]
while (i > 0 && (mul *= 0x100)) {
val += this[offset + --i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
if (!(this[offset] & 0x80)) return (this[offset])
return ((0xff - this[offset] + 1) * -1)
}
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset] | (this[offset + 1] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset + 1] | (this[offset] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16) |
(this[offset + 3] << 24)
}
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] << 24) |
(this[offset + 1] << 16) |
(this[offset + 2] << 8) |
(this[offset + 3])
}
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, true, 23, 4)
}
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, false, 23, 4)
}
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, true, 52, 8)
}
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, false, 52, 8)
}
function checkInt (buf, value, offset, ext, max, min) {
if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
}
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var mul = 1
var i = 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var i = byteLength - 1
var mul = 1
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
this[offset] = (value & 0xff)
return offset + 1
}
function objectWriteUInt16 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
(littleEndian ? i : 1 - i) * 8
}
}
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = (value & 0xff)
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
function objectWriteUInt32 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffffffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
}
}
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset + 3] = (value >>> 24)
this[offset + 2] = (value >>> 16)
this[offset + 1] = (value >>> 8)
this[offset] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = 0
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = byteLength - 1
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
if (value < 0) value = 0xff + value + 1
this[offset] = (value & 0xff)
return offset + 1
}
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = (value & 0xff)
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
this[offset + 2] = (value >>> 16)
this[offset + 3] = (value >>> 24)
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (value < 0) value = 0xffffffff + value + 1
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
function checkIEEE754 (buf, value, offset, ext, max, min) {
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
if (offset < 0) throw new RangeError('index out of range')
}
function writeFloat (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
}
ieee754.write(buf, value, offset, littleEndian, 23, 4)
return offset + 4
}
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
return writeFloat(this, value, offset, true, noAssert)
}
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
return writeFloat(this, value, offset, false, noAssert)
}
function writeDouble (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
}
ieee754.write(buf, value, offset, littleEndian, 52, 8)
return offset + 8
}
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
return writeDouble(this, value, offset, true, noAssert)
}
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
return writeDouble(this, value, offset, false, noAssert)
}
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
if (!start) start = 0
if (!end && end !== 0) end = this.length
if (targetStart >= target.length) targetStart = target.length
if (!targetStart) targetStart = 0
if (end > 0 && end < start) end = start
// Copy 0 bytes; we're done
if (end === start) return 0
if (target.length === 0 || this.length === 0) return 0
// Fatal error conditions
if (targetStart < 0) {
throw new RangeError('targetStart out of bounds')
}
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
if (end < 0) throw new RangeError('sourceEnd out of bounds')
// Are we oob?
if (end > this.length) end = this.length
if (target.length - targetStart < end - start) {
end = target.length - targetStart + start
}
var len = end - start
var i
if (this === target && start < targetStart && targetStart < end) {
// descending copy from end
for (i = len - 1; i >= 0; i--) {
target[i + targetStart] = this[i + start]
}
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
// ascending copy from start
for (i = 0; i < len; i++) {
target[i + targetStart] = this[i + start]
}
} else {
target._set(this.subarray(start, start + len), targetStart)
}
return len
}
// fill(value, start=0, end=buffer.length)
Buffer.prototype.fill = function fill (value, start, end) {
if (!value) value = 0
if (!start) start = 0
if (!end) end = this.length
if (end < start) throw new RangeError('end < start')
// Fill 0 bytes; we're done
if (end === start) return
if (this.length === 0) return
if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
var i
if (typeof value === 'number') {
for (i = start; i < end; i++) {
this[i] = value
}
} else {
var bytes = utf8ToBytes(value.toString())
var len = bytes.length
for (i = start; i < end; i++) {
this[i] = bytes[i % len]
}
}
return this
}
/**
* Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
* Added in Node 0.12. Only available in browsers that support ArrayBuffer.
*/
Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
if (typeof Uint8Array !== 'undefined') {
if (Buffer.TYPED_ARRAY_SUPPORT) {
return (new Buffer(this)).buffer
} else {
var buf = new Uint8Array(this.length)
for (var i = 0, len = buf.length; i < len; i += 1) {
buf[i] = this[i]
}
return buf.buffer
}
} else {
throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
}
}
// HELPER FUNCTIONS
// ================
var BP = Buffer.prototype
/**
* Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
*/
Buffer._augment = function _augment (arr) {
arr.constructor = Buffer
arr._isBuffer = true
// save reference to original Uint8Array set method before overwriting
arr._set = arr.set
// deprecated
arr.get = BP.get
arr.set = BP.set
arr.write = BP.write
arr.toString = BP.toString
arr.toLocaleString = BP.toString
arr.toJSON = BP.toJSON
arr.equals = BP.equals
arr.compare = BP.compare
arr.indexOf = BP.indexOf
arr.copy = BP.copy
arr.slice = BP.slice
arr.readUIntLE = BP.readUIntLE
arr.readUIntBE = BP.readUIntBE
arr.readUInt8 = BP.readUInt8
arr.readUInt16LE = BP.readUInt16LE
arr.readUInt16BE = BP.readUInt16BE
arr.readUInt32LE = BP.readUInt32LE
arr.readUInt32BE = BP.readUInt32BE
arr.readIntLE = BP.readIntLE
arr.readIntBE = BP.readIntBE
arr.readInt8 = BP.readInt8
arr.readInt16LE = BP.readInt16LE
arr.readInt16BE = BP.readInt16BE
arr.readInt32LE = BP.readInt32LE
arr.readInt32BE = BP.readInt32BE
arr.readFloatLE = BP.readFloatLE
arr.readFloatBE = BP.readFloatBE
arr.readDoubleLE = BP.readDoubleLE
arr.readDoubleBE = BP.readDoubleBE
arr.writeUInt8 = BP.writeUInt8
arr.writeUIntLE = BP.writeUIntLE
arr.writeUIntBE = BP.writeUIntBE
arr.writeUInt16LE = BP.writeUInt16LE
arr.writeUInt16BE = BP.writeUInt16BE
arr.writeUInt32LE = BP.writeUInt32LE
arr.writeUInt32BE = BP.writeUInt32BE
arr.writeIntLE = BP.writeIntLE
arr.writeIntBE = BP.writeIntBE
arr.writeInt8 = BP.writeInt8
arr.writeInt16LE = BP.writeInt16LE
arr.writeInt16BE = BP.writeInt16BE
arr.writeInt32LE = BP.writeInt32LE
arr.writeInt32BE = BP.writeInt32BE
arr.writeFloatLE = BP.writeFloatLE
arr.writeFloatBE = BP.writeFloatBE
arr.writeDoubleLE = BP.writeDoubleLE
arr.writeDoubleBE = BP.writeDoubleBE
arr.fill = BP.fill
arr.inspect = BP.inspect
arr.toArrayBuffer = BP.toArrayBuffer
return arr
}
var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
function base64clean (str) {
// Node strips out invalid characters like \n and \t from the string, base64-js does not
str = stringtrim(str).replace(INVALID_BASE64_RE, '')
// Node converts strings with length < 2 to ''
if (str.length < 2) return ''
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
while (str.length % 4 !== 0) {
str = str + '='
}
return str
}
function stringtrim (str) {
if (str.trim) return str.trim()
return str.replace(/^\s+|\s+$/g, '')
}
function toHex (n) {
if (n < 16) return '0' + n.toString(16)
return n.toString(16)
}
function utf8ToBytes (string, units) {
units = units || Infinity
var codePoint
var length = string.length
var leadSurrogate = null
var bytes = []
for (var i = 0; i < length; i++) {
codePoint = string.charCodeAt(i)
// is surrogate component
if (codePoint > 0xD7FF && codePoint < 0xE000) {
// last char was a lead
if (!leadSurrogate) {
// no lead yet
if (codePoint > 0xDBFF) {
// unexpected trail
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
} else if (i + 1 === length) {
// unpaired lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
}
// valid lead
leadSurrogate = codePoint
continue
}
// 2 leads in a row
if (codePoint < 0xDC00) {
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
leadSurrogate = codePoint
continue
}
// valid surrogate pair
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
} else if (leadSurrogate) {
// valid bmp char, but last char was a lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
}
leadSurrogate = null
// encode utf8
if (codePoint < 0x80) {
if ((units -= 1) < 0) break
bytes.push(codePoint)
} else if (codePoint < 0x800) {
if ((units -= 2) < 0) break
bytes.push(
codePoint >> 0x6 | 0xC0,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x10000) {
if ((units -= 3) < 0) break
bytes.push(
codePoint >> 0xC | 0xE0,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x110000) {
if ((units -= 4) < 0) break
bytes.push(
codePoint >> 0x12 | 0xF0,
codePoint >> 0xC & 0x3F | 0x80,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else {
throw new Error('Invalid code point')
}
}
return bytes
}
function asciiToBytes (str) {
var byteArray = []
for (var i = 0; i < str.length; i++) {
// Node's code seems to be doing this and not & 0x7F..
byteArray.push(str.charCodeAt(i) & 0xFF)
}
return byteArray
}
function utf16leToBytes (str, units) {
var c, hi, lo
var byteArray = []
for (var i = 0; i < str.length; i++) {
if ((units -= 2) < 0) break
c = str.charCodeAt(i)
hi = c >> 8
lo = c % 256
byteArray.push(lo)
byteArray.push(hi)
}
return byteArray
}
function base64ToBytes (str) {
return base64.toByteArray(base64clean(str))
}
function blitBuffer (src, dst, offset, length) {
for (var i = 0; i < length; i++) {
if ((i + offset >= dst.length) || (i >= src.length)) break
dst[i + offset] = src[i]
}
return i
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxudmFyIHJvb3RQYXJlbnQgPSB7fVxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIFNhZmFyaSA1LTcgbGFja3Mgc3VwcG9ydCBmb3IgY2hhbmdpbmcgdGhlIGBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yYCBwcm9wZXJ0eVxuICogICAgIG9uIG9iamVjdHMuXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICBmdW5jdGlvbiBCYXIgKCkge31cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuZm9vID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfVxuICAgIGFyci5jb25zdHJ1Y3RvciA9IEJhclxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIGFyci5jb25zdHJ1Y3RvciA9PT0gQmFyICYmIC8vIGNvbnN0cnVjdG9yIGNhbiBiZSBzZXRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuLyoqXG4gKiBDbGFzczogQnVmZmVyXG4gKiA9PT09PT09PT09PT09XG4gKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBhcmUgYXVnbWVudGVkXG4gKiB3aXRoIGZ1bmN0aW9uIHByb3BlcnRpZXMgZm9yIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBBUEkgZnVuY3Rpb25zLiBXZSB1c2VcbiAqIGBVaW50OEFycmF5YCBzbyB0aGF0IHNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0IHJldHVybnNcbiAqIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIEJ5IGF1Z21lbnRpbmcgdGhlIGluc3RhbmNlcywgd2UgY2FuIGF2b2lkIG1vZGlmeWluZyB0aGUgYFVpbnQ4QXJyYXlgXG4gKiBwcm90b3R5cGUuXG4gKi9cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgLy8gQXZvaWQgZ29pbmcgdGhyb3VnaCBhbiBBcmd1bWVudHNBZGFwdG9yVHJhbXBvbGluZSBpbiB0aGUgY29tbW9uIGNhc2UuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGFyZ3VtZW50c1sxXSlcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcpXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpcy5sZW5ndGggPSAwXG4gICAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLCBhcmcpXG4gIH1cblxuICAvLyBTbGlnaHRseSBsZXNzIGNvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGlzLCBhcmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogJ3V0ZjgnKVxuICB9XG5cbiAgLy8gVW51c3VhbC5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhpcywgYXJnKVxufVxuXG5mdW5jdGlvbiBmcm9tTnVtYmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChsZW5ndGgpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIC8vIEFzc3VtcHRpb246IGJ5dGVMZW5ndGgoKSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIDwga01heExlbmd0aC5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG5cbiAgdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpKSByZXR1cm4gZnJvbUJ1ZmZlcih0aGF0LCBvYmplY3QpXG5cbiAgaWYgKGlzQXJyYXkob2JqZWN0KSkgcmV0dXJuIGZyb21BcnJheSh0aGF0LCBvYmplY3QpXG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBzdGFydCB3aXRoIG51bWJlciwgYnVmZmVyLCBhcnJheSBvciBzdHJpbmcnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob2JqZWN0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gZnJvbVR5cGVkQXJyYXkodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgfVxuXG4gIGlmIChvYmplY3QubGVuZ3RoKSByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmplY3QpXG5cbiAgcmV0dXJuIGZyb21Kc29uT2JqZWN0KHRoYXQsIG9iamVjdClcbn1cblxuZnVuY3Rpb24gZnJvbUJ1ZmZlciAodGhhdCwgYnVmZmVyKSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGJ1ZmZlci5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBidWZmZXIuY29weSh0aGF0LCAwLCAwLCBsZW5ndGgpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIER1cGxpY2F0ZSBvZiBmcm9tQXJyYXkoKSB0byBrZWVwIGZyb21BcnJheSgpIG1vbm9tb3JwaGljLlxuZnVuY3Rpb24gZnJvbVR5cGVkQXJyYXkgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIC8vIFRydW5jYXRpbmcgdGhlIGVsZW1lbnRzIGlzIHByb2JhYmx5IG5vdCB3aGF0IHBlb3BsZSBleHBlY3QgZnJvbSB0eXBlZFxuICAvLyBhcnJheXMgd2l0aCBCWVRFU19QRVJfRUxFTUVOVCA+IDEgYnV0IGl0J3MgY29tcGF0aWJsZSB3aXRoIHRoZSBiZWhhdmlvclxuICAvLyBvZiB0aGUgb2xkIEJ1ZmZlciBjb25zdHJ1Y3Rvci5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXkpIHtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgYXJyYXkuYnl0ZUxlbmd0aFxuICAgIHRoYXQgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkoYXJyYXkpKVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbVR5cGVkQXJyYXkodGhhdCwgbmV3IFVpbnQ4QXJyYXkoYXJyYXkpKVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vLyBEZXNlcmlhbGl6ZSB7IHR5cGU6ICdCdWZmZXInLCBkYXRhOiBbMSwyLDMsLi4uXSB9IGludG8gYSBCdWZmZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHplcm8tbGVuZ3RoIGJ1ZmZlciBmb3IgaW5wdXRzIHRoYXQgZG9uJ3QgY29uZm9ybSB0byB0aGUgc3BlYy5cbmZ1bmN0aW9uIGZyb21Kc29uT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgdmFyIGFycmF5XG4gIHZhciBsZW5ndGggPSAwXG5cbiAgaWYgKG9iamVjdC50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iamVjdC5kYXRhKSkge1xuICAgIGFycmF5ID0gb2JqZWN0LmRhdGFcbiAgICBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIH1cbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbn0gZWxzZSB7XG4gIC8vIHByZS1zZXQgZm9yIHZhbHVlcyB0aGF0IG1heSBleGlzdCBpbiB0aGUgZnV0dXJlXG4gIEJ1ZmZlci5wcm90b3R5cGUubGVuZ3RoID0gdW5kZWZpbmVkXG4gIEJ1ZmZlci5wcm90b3R5cGUucGFyZW50ID0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGFsbG9jYXRlICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IEJ1ZmZlci5fYXVnbWVudChuZXcgVWludDhBcnJheShsZW5ndGgpKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICAgIHRoYXQuX2lzQnVmZmVyID0gdHJ1ZVxuICB9XG5cbiAgdmFyIGZyb21Qb29sID0gbGVuZ3RoICE9PSAwICYmIGxlbmd0aCA8PSBCdWZmZXIucG9vbFNpemUgPj4+IDFcbiAgaWYgKGZyb21Qb29sKSB0aGF0LnBhcmVudCA9IHJvb3RQYXJlbnRcblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKHN1YmplY3QsIGVuY29kaW5nKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTbG93QnVmZmVyKSkgcmV0dXJuIG5ldyBTbG93QnVmZmVyKHN1YmplY3QsIGVuY29kaW5nKVxuXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKHN1YmplY3QsIGVuY29kaW5nKVxuICBkZWxldGUgYnVmLnBhcmVudFxuICByZXR1cm4gYnVmXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICB2YXIgaSA9IDBcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIGJyZWFrXG5cbiAgICArK2lcbiAgfVxuXG4gIGlmIChpICE9PSBsZW4pIHtcbiAgICB4ID0gYVtpXVxuICAgIHkgPSBiW2ldXG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3Jhdyc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xpc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzLicpXG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXVxuICAgIGl0ZW0uY29weShidWYsIHBvcylcbiAgICBwb3MgKz0gaXRlbS5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSBzdHJpbmcgPSAnJyArIHN0cmluZ1xuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgLy8gRGVwcmVjYXRlZFxuICAgICAgY2FzZSAncmF3JzpcbiAgICAgIGNhc2UgJ3Jhd3MnOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIHN0YXJ0ID0gc3RhcnQgfCAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gSW5maW5pdHkgPyB0aGlzLmxlbmd0aCA6IGVuZCB8IDBcblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gJydcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBiaW5hcnlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIDBcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCkge1xuICBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIGJ5dGVPZmZzZXQgPj49IDBcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAtMVxuICBpZiAoYnl0ZU9mZnNldCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuIC0xXG5cbiAgLy8gTmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLmxlbmd0aCArIGJ5dGVPZmZzZXQsIDApXG5cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHJldHVybiAtMSAvLyBzcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZyBhbHdheXMgZmFpbHNcbiAgICByZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZih0aGlzLCBbIHZhbCBdLCBieXRlT2Zmc2V0KVxuICB9XG5cbiAgZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCkge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKHZhciBpID0gMDsgYnl0ZU9mZnNldCArIGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJbYnl0ZU9mZnNldCArIGldID09PSB2YWxbZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXhdKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsLmxlbmd0aCkgcmV0dXJuIGJ5dGVPZmZzZXQgKyBmb3VuZEluZGV4XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG4vLyBgZ2V0YCBpcyBkZXByZWNhdGVkXG5CdWZmZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAob2Zmc2V0KSB7XG4gIGNvbnNvbGUubG9nKCcuZ2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4nKVxuICByZXR1cm4gdGhpcy5yZWFkVUludDgob2Zmc2V0KVxufVxuXG4vLyBgc2V0YCBpcyBkZXByZWNhdGVkXG5CdWZmZXIucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCAodiwgb2Zmc2V0KSB7XG4gIGNvbnNvbGUubG9nKCcuc2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4nKVxuICByZXR1cm4gdGhpcy53cml0ZVVJbnQ4KHYsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiaW5hcnlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdmFyIHN3YXAgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgb2Zmc2V0ID0gbGVuZ3RoIHwgMFxuICAgIGxlbmd0aCA9IHN3YXBcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdhdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBiaW5hcnlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gQnVmZmVyLl9hdWdtZW50KHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCkpXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgaSsrKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICBpZiAobmV3QnVmLmxlbmd0aCkgbmV3QnVmLnBhcmVudCA9IHRoaXMucGFyZW50IHx8IHRoaXNcblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J1ZmZlciBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSB2YWx1ZSA8IDAgPyAxIDogMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ZhbHVlIGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuX3NldCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksIHRhcmdldFN0YXJ0KVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBmaWxsKHZhbHVlLCBzdGFydD0wLCBlbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gIGlmICghdmFsdWUpIHZhbHVlID0gMFxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQpIGVuZCA9IHRoaXMubGVuZ3RoXG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIDwgc3RhcnQnKVxuXG4gIC8vIEZpbGwgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2VuZCBvdXQgb2YgYm91bmRzJylcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSB2YWx1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSB1dGY4VG9CeXRlcyh2YWx1ZS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYEFycmF5QnVmZmVyYCB3aXRoIHRoZSAqY29waWVkKiBtZW1vcnkgb2YgdGhlIGJ1ZmZlciBpbnN0YW5jZS5cbiAqIEFkZGVkIGluIE5vZGUgMC4xMi4gT25seSBhdmFpbGFibGUgaW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IEFycmF5QnVmZmVyLlxuICovXG5CdWZmZXIucHJvdG90eXBlLnRvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiB0b0FycmF5QnVmZmVyICgpIHtcbiAgaWYgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIChuZXcgQnVmZmVyKHRoaXMpKS5idWZmZXJcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KHRoaXMubGVuZ3RoKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJ1Zi5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBidWZbaV0gPSB0aGlzW2ldXG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmLmJ1ZmZlclxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdWZmZXIudG9BcnJheUJ1ZmZlciBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlcicpXG4gIH1cbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgQlAgPSBCdWZmZXIucHJvdG90eXBlXG5cbi8qKlxuICogQXVnbWVudCBhIFVpbnQ4QXJyYXkgKmluc3RhbmNlKiAobm90IHRoZSBVaW50OEFycmF5IGNsYXNzISkgd2l0aCBCdWZmZXIgbWV0aG9kc1xuICovXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiBfYXVnbWVudCAoYXJyKSB7XG4gIGFyci5jb25zdHJ1Y3RvciA9IEJ1ZmZlclxuICBhcnIuX2lzQnVmZmVyID0gdHJ1ZVxuXG4gIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIFVpbnQ4QXJyYXkgc2V0IG1ldGhvZCBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgYXJyLl9zZXQgPSBhcnIuc2V0XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBhcnIuZ2V0ID0gQlAuZ2V0XG4gIGFyci5zZXQgPSBCUC5zZXRcblxuICBhcnIud3JpdGUgPSBCUC53cml0ZVxuICBhcnIudG9TdHJpbmcgPSBCUC50b1N0cmluZ1xuICBhcnIudG9Mb2NhbGVTdHJpbmcgPSBCUC50b1N0cmluZ1xuICBhcnIudG9KU09OID0gQlAudG9KU09OXG4gIGFyci5lcXVhbHMgPSBCUC5lcXVhbHNcbiAgYXJyLmNvbXBhcmUgPSBCUC5jb21wYXJlXG4gIGFyci5pbmRleE9mID0gQlAuaW5kZXhPZlxuICBhcnIuY29weSA9IEJQLmNvcHlcbiAgYXJyLnNsaWNlID0gQlAuc2xpY2VcbiAgYXJyLnJlYWRVSW50TEUgPSBCUC5yZWFkVUludExFXG4gIGFyci5yZWFkVUludEJFID0gQlAucmVhZFVJbnRCRVxuICBhcnIucmVhZFVJbnQ4ID0gQlAucmVhZFVJbnQ4XG4gIGFyci5yZWFkVUludDE2TEUgPSBCUC5yZWFkVUludDE2TEVcbiAgYXJyLnJlYWRVSW50MTZCRSA9IEJQLnJlYWRVSW50MTZCRVxuICBhcnIucmVhZFVJbnQzMkxFID0gQlAucmVhZFVJbnQzMkxFXG4gIGFyci5yZWFkVUludDMyQkUgPSBCUC5yZWFkVUludDMyQkVcbiAgYXJyLnJlYWRJbnRMRSA9IEJQLnJlYWRJbnRMRVxuICBhcnIucmVhZEludEJFID0gQlAucmVhZEludEJFXG4gIGFyci5yZWFkSW50OCA9IEJQLnJlYWRJbnQ4XG4gIGFyci5yZWFkSW50MTZMRSA9IEJQLnJlYWRJbnQxNkxFXG4gIGFyci5yZWFkSW50MTZCRSA9IEJQLnJlYWRJbnQxNkJFXG4gIGFyci5yZWFkSW50MzJMRSA9IEJQLnJlYWRJbnQzMkxFXG4gIGFyci5yZWFkSW50MzJCRSA9IEJQLnJlYWRJbnQzMkJFXG4gIGFyci5yZWFkRmxvYXRMRSA9IEJQLnJlYWRGbG9hdExFXG4gIGFyci5yZWFkRmxvYXRCRSA9IEJQLnJlYWRGbG9hdEJFXG4gIGFyci5yZWFkRG91YmxlTEUgPSBCUC5yZWFkRG91YmxlTEVcbiAgYXJyLnJlYWREb3VibGVCRSA9IEJQLnJlYWREb3VibGVCRVxuICBhcnIud3JpdGVVSW50OCA9IEJQLndyaXRlVUludDhcbiAgYXJyLndyaXRlVUludExFID0gQlAud3JpdGVVSW50TEVcbiAgYXJyLndyaXRlVUludEJFID0gQlAud3JpdGVVSW50QkVcbiAgYXJyLndyaXRlVUludDE2TEUgPSBCUC53cml0ZVVJbnQxNkxFXG4gIGFyci53cml0ZVVJbnQxNkJFID0gQlAud3JpdGVVSW50MTZCRVxuICBhcnIud3JpdGVVSW50MzJMRSA9IEJQLndyaXRlVUludDMyTEVcbiAgYXJyLndyaXRlVUludDMyQkUgPSBCUC53cml0ZVVJbnQzMkJFXG4gIGFyci53cml0ZUludExFID0gQlAud3JpdGVJbnRMRVxuICBhcnIud3JpdGVJbnRCRSA9IEJQLndyaXRlSW50QkVcbiAgYXJyLndyaXRlSW50OCA9IEJQLndyaXRlSW50OFxuICBhcnIud3JpdGVJbnQxNkxFID0gQlAud3JpdGVJbnQxNkxFXG4gIGFyci53cml0ZUludDE2QkUgPSBCUC53cml0ZUludDE2QkVcbiAgYXJyLndyaXRlSW50MzJMRSA9IEJQLndyaXRlSW50MzJMRVxuICBhcnIud3JpdGVJbnQzMkJFID0gQlAud3JpdGVJbnQzMkJFXG4gIGFyci53cml0ZUZsb2F0TEUgPSBCUC53cml0ZUZsb2F0TEVcbiAgYXJyLndyaXRlRmxvYXRCRSA9IEJQLndyaXRlRmxvYXRCRVxuICBhcnIud3JpdGVEb3VibGVMRSA9IEJQLndyaXRlRG91YmxlTEVcbiAgYXJyLndyaXRlRG91YmxlQkUgPSBCUC53cml0ZURvdWJsZUJFXG4gIGFyci5maWxsID0gQlAuZmlsbFxuICBhcnIuaW5zcGVjdCA9IEJQLmluc3BlY3RcbiAgYXJyLnRvQXJyYXlCdWZmZXIgPSBCUC50b0FycmF5QnVmZmVyXG5cbiAgcmV0dXJuIGFyclxufVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cbiJdfQ==
},{"base64-js":2,"ieee754":3,"isarray":4}],2:[function(require,module,exports){
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
;(function (exports) {
'use strict';
var Arr = (typeof Uint8Array !== 'undefined')
? Uint8Array
: Array
var PLUS = '+'.charCodeAt(0)
var SLASH = '/'.charCodeAt(0)
var NUMBER = '0'.charCodeAt(0)
var LOWER = 'a'.charCodeAt(0)
var UPPER = 'A'.charCodeAt(0)
var PLUS_URL_SAFE = '-'.charCodeAt(0)
var SLASH_URL_SAFE = '_'.charCodeAt(0)
function decode (elt) {
var code = elt.charCodeAt(0)
if (code === PLUS ||
code === PLUS_URL_SAFE)
return 62 // '+'
if (code === SLASH ||
code === SLASH_URL_SAFE)
return 63 // '/'
if (code < NUMBER)
return -1 //no match
if (code < NUMBER + 10)
return code - NUMBER + 26 + 26
if (code < UPPER + 26)
return code - UPPER
if (code < LOWER + 26)
return code - LOWER + 26
}
function b64ToByteArray (b64) {
var i, j, l, tmp, placeHolders, arr
if (b64.length % 4 > 0) {
throw new Error('Invalid string. Length must be a multiple of 4')
}
// the number of equal signs (place holders)
// if there are two placeholders, than the two characters before it
// represent one byte
// if there is only one, then the three characters before it represent 2 bytes
// this is just a cheap hack to not do indexOf twice
var len = b64.length
placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
// base64 is 4/3 + up to two characters of the original data
arr = new Arr(b64.length * 3 / 4 - placeHolders)
// if there are placeholders, only get up to the last complete 4 chars
l = placeHolders > 0 ? b64.length - 4 : b64.length
var L = 0
function push (v) {
arr[L++] = v
}
for (i = 0, j = 0; i < l; i += 4, j += 3) {
tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
push((tmp & 0xFF0000) >> 16)
push((tmp & 0xFF00) >> 8)
push(tmp & 0xFF)
}
if (placeHolders === 2) {
tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
push(tmp & 0xFF)
} else if (placeHolders === 1) {
tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
push((tmp >> 8) & 0xFF)
push(tmp & 0xFF)
}
return arr
}
function uint8ToBase64 (uint8) {
var i,
extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
output = "",
temp, length
function encode (num) {
return lookup.charAt(num)
}
function tripletToBase64 (num) {
return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
}
// go through the array every three bytes, we'll deal with trailing stuff later
for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
output += tripletToBase64(temp)
}
// pad the end with zeros, but make sure to not forget the extra bytes
switch (extraBytes) {
case 1:
temp = uint8[uint8.length - 1]
output += encode(temp >> 2)
output += encode((temp << 4) & 0x3F)
output += '=='
break
case 2:
temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
output += encode(temp >> 10)
output += encode((temp >> 4) & 0x3F)
output += encode((temp << 2) & 0x3F)
output += '='
break
}
return output
}
exports.toByteArray = b64ToByteArray
exports.fromByteArray = uint8ToBase64
}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
},{}],3:[function(require,module,exports){
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
var e, m
var eLen = nBytes * 8 - mLen - 1
var eMax = (1 << eLen) - 1
var eBias = eMax >> 1
var nBits = -7
var i = isLE ? (nBytes - 1) : 0
var d = isLE ? -1 : 1
var s = buffer[offset + i]
i += d
e = s & ((1 << (-nBits)) - 1)
s >>= (-nBits)
nBits += eLen
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
m = e & ((1 << (-nBits)) - 1)
e >>= (-nBits)
nBits += mLen
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
if (e === 0) {
e = 1 - eBias
} else if (e === eMax) {
return m ? NaN : ((s ? -1 : 1) * Infinity)
} else {
m = m + Math.pow(2, mLen)
e = e - eBias
}
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
var e, m, c
var eLen = nBytes * 8 - mLen - 1
var eMax = (1 << eLen) - 1
var eBias = eMax >> 1
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
var i = isLE ? 0 : (nBytes - 1)
var d = isLE ? 1 : -1
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
value = Math.abs(value)
if (isNaN(value) || value === Infinity) {
m = isNaN(value) ? 1 : 0
e = eMax
} else {
e = Math.floor(Math.log(value) / Math.LN2)
if (value * (c = Math.pow(2, -e)) < 1) {
e--
c *= 2
}
if (e + eBias >= 1) {
value += rt / c
} else {
value += rt * Math.pow(2, 1 - eBias)
}
if (value * c >= 2) {
e++
c /= 2
}
if (e + eBias >= eMax) {
m = 0
e = eMax
} else if (e + eBias >= 1) {
m = (value * c - 1) * Math.pow(2, mLen)
e = e + eBias
} else {
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
e = 0
}
}
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
e = (e << mLen) | m
eLen += mLen
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
buffer[offset + i - d] |= s * 128
}
},{}],4:[function(require,module,exports){
var toString = {}.toString;
module.exports = Array.isArray || function (arr) {
return toString.call(arr) == '[object Array]';
};
},{}],5:[function(require,module,exports){
"use strict"
module.exports = KDTHeap
var pool = require("typedarray-pool")
function heapParent(i) {
if(i & 1) {
return (i - 1) >> 1
}
return (i >> 1) - 1
}
function KDTHeap(n, d) {
this.count = 0
this.dataSize = d
this.index = pool.mallocInt32(n)
this.data = pool.mallocFloat64(n*d)
}
var proto = KDTHeap.prototype
proto.heapSwap = function(_i,_j) {
var data = this.data
var index = this.index
var d = this.dataSize
var tmp = index[_i]
index[_i] = index[_j]
index[_j] = tmp
var aptr = d*_i
var bptr = d*_j
for(var _k=0; _k<d; ++_k) {
var t2 = data[aptr]
data[aptr] = data[bptr]
data[bptr] = t2
aptr += 1
bptr += 1
}
}
proto.heapUp = function(i) {
var d = this.dataSize
var index = this.index
var data = this.data
var w = data[d*i]
while(i>0) {
var parent = heapParent(i)
if(parent >= 0) {
var pw = data[d*parent]
if(w < pw) {
this.heapSwap(i, parent)
i = parent
continue
}
}
break
}
}
proto.heapDown = function(i) {
var d = this.dataSize
var index = this.index
var data = this.data
var count = this.count
var w = data[d*i]
while(true) {
var tw = w
var left = 2*i + 1
var right = 2*(i + 1)
var next = i
if(left < count) {
var lw = data[d*left]
if(lw < tw) {
next = left
tw = lw
}
}
if(right < count) {
var rw = data[d*right]
if(rw < tw) {
next = right
}
}
if(next === i) {
break
}
this.heapSwap(i, next)
i = next
}
}
//Clear item from top of heap
proto.pop = function() {
this.count -= 1
this.heapSwap(0, this.count)
this.heapDown(0)
}
//Assume object already written to data
proto.push = function() {
this.heapUp(this.count)
this.count += 1
}
proto.dispose = function() {
pool.freeInt32(this.index)
pool.freeFloat64(this.data)
}
},{"typedarray-pool":26}],6:[function(require,module,exports){
/**
* Bit twiddling hacks for JavaScript.
*
* Author: Mikola Lysenko
*
* Ported from Stanford bit twiddling hack library:
* http://graphics.stanford.edu/~seander/bithacks.html
*/
"use strict"; "use restrict";
//Number of bits in an integer
var INT_BITS = 32;
//Constants
exports.INT_BITS = INT_BITS;
exports.INT_MAX = 0x7fffffff;
exports.INT_MIN = -1<<(INT_BITS-1);
//Returns -1, 0, +1 depending on sign of x
exports.sign = function(v) {
return (v > 0) - (v < 0);
}
//Computes absolute value of integer
exports.abs = function(v) {
var mask = v >> (INT_BITS-1);
return (v ^ mask) - mask;
}
//Computes minimum of integers x and y
exports.min = function(x, y) {
return y ^ ((x ^ y) & -(x < y));
}
//Computes maximum of integers x and y
exports.max = function(x, y) {
return x ^ ((x ^ y) & -(x < y));
}
//Checks if a number is a power of two
exports.isPow2 = function(v) {
return !(v & (v-1)) && (!!v);
}
//Computes log base 2 of v
exports.log2 = function(v) {
var r, shift;
r = (v > 0xFFFF) << 4; v >>>= r;
shift = (v > 0xFF ) << 3; v >>>= shift; r |= shift;
shift = (v > 0xF ) << 2; v >>>= shift; r |= shift;
shift = (v > 0x3 ) << 1; v >>>= shift; r |= shift;
return r | (v >> 1);
}
//Computes log base 10 of v
exports.log10 = function(v) {
return (v >= 1000000000) ? 9 : (v >= 100000000) ? 8 : (v >= 10000000) ? 7 :
(v >= 1000000) ? 6 : (v >= 100000) ? 5 : (v >= 10000) ? 4 :
(v >= 1000) ? 3 : (v >= 100) ? 2 : (v >= 10) ? 1 : 0;
}
//Counts number of bits
exports.popCount = function(v) {
v = v - ((v >>> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >>> 2) & 0x33333333);
return ((v + (v >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24;
}
//Counts number of trailing zeros
function countTrailingZeros(v) {
var c = 32;
v &= -v;
if (v) c--;
if (v & 0x0000FFFF) c -= 16;
if (v & 0x00FF00FF) c -= 8;
if (v & 0x0F0F0F0F) c -= 4;
if (v & 0x33333333) c -= 2;
if (v & 0x55555555) c -= 1;
return c;
}
exports.countTrailingZeros = countTrailingZeros;
//Rounds to next power of 2
exports.nextPow2 = function(v) {
v += v === 0;
--v;
v |= v >>> 1;
v |= v >>> 2;
v |= v >>> 4;
v |= v >>> 8;
v |= v >>> 16;
return v + 1;
}
//Rounds down to previous power of 2
exports.prevPow2 = function(v) {
v |= v >>> 1;
v |= v >>> 2;
v |= v >>> 4;
v |= v >>> 8;
v |= v >>> 16;
return v - (v>>>1);
}
//Computes parity of word
exports.parity = function(v) {
v ^= v >>> 16;
v ^= v >>> 8;
v ^= v >>> 4;
v &= 0xf;
return (0x6996 >>> v) & 1;
}
var REVERSE_TABLE = new Array(256);
(function(tab) {
for(var i=0; i<256; ++i) {
var v = i, r = i, s = 7;
for (v >>>= 1; v; v >>>= 1) {
r <<= 1;
r |= v & 1;
--s;
}
tab[i] = (r << s) & 0xff;
}
})(REVERSE_TABLE);
//Reverse bits in a 32 bit word
exports.reverse = function(v) {
return (REVERSE_TABLE[ v & 0xff] << 24) |
(REVERSE_TABLE[(v >>> 8) & 0xff] << 16) |
(REVERSE_TABLE[(v >>> 16) & 0xff] << 8) |
REVERSE_TABLE[(v >>> 24) & 0xff];
}
//Interleave bits of 2 coordinates with 16 bits. Useful for fast quadtree codes
exports.interleave2 = function(x, y) {
x &= 0xFFFF;
x = (x | (x << 8)) & 0x00FF00FF;
x = (x | (x << 4)) & 0x0F0F0F0F;
x = (x | (x << 2)) & 0x33333333;
x = (x | (x << 1)) & 0x55555555;
y &= 0xFFFF;
y = (y | (y << 8)) & 0x00FF00FF;
y = (y | (y << 4)) & 0x0F0F0F0F;
y = (y | (y << 2)) & 0x33333333;
y = (y | (y << 1)) & 0x55555555;
return x | (y << 1);
}
//Extracts the nth interleaved component
exports.deinterleave2 = function(v, n) {
v = (v >>> n) & 0x55555555;
v = (v | (v >>> 1)) & 0x33333333;
v = (v | (v >>> 2)) & 0x0F0F0F0F;
v = (v | (v >>> 4)) & 0x00FF00FF;
v = (v | (v >>> 16)) & 0x000FFFF;
return (v << 16) >> 16;
}
//Interleave bits of 3 coordinates, each with 10 bits. Useful for fast octree codes
exports.interleave3 = function(x, y, z) {
x &= 0x3FF;
x = (x | (x<<16)) & 4278190335;
x = (x | (x<<8)) & 251719695;
x = (x | (x<<4)) & 3272356035;
x = (x | (x<<2)) & 1227133513;
y &= 0x3FF;
y = (y | (y<<16)) & 4278190335;
y = (y | (y<<8)) & 251719695;
y = (y | (y<<4)) & 3272356035;
y = (y | (y<<2)) & 1227133513;
x |= (y << 1);
z &= 0x3FF;
z = (z | (z<<16)) & 4278190335;
z = (z | (z<<8)) & 251719695;
z = (z | (z<<4)) & 3272356035;
z = (z | (z<<2)) & 1227133513;
return x | (z << 2);
}
//Extracts nth interleaved component of a 3-tuple
exports.deinterleave3 = function(v, n) {
v = (v >>> n) & 1227133513;
v = (v | (v>>>2)) & 3272356035;
v = (v | (v>>>4)) & 251719695;
v = (v | (v>>>8)) & 4278190335;
v = (v | (v>>>16)) & 0x3FF;
return (v<<22)>>22;
}
//Computes next combination in colexicographic order (this is mistakenly called nextPermutation on the bit twiddling hacks page)
exports.nextCombination = function(v) {
var t = v | (v - 1);
return (t + 1) | (((~t & -~t) - 1) >>> (countTrailingZeros(v) + 1));
}
},{}],7:[function(require,module,exports){
"use strict"
var bits = require("bit-twiddle")
function rootInorder(n) {
var ptree = (bits.nextPow2(n+1)>>>1) - 1
var f = n - ptree
if(bits.nextPow2(f)-1 >= ptree) {
return ptree
}
return (ptree>>>1)+f
}
exports.root = rootInorder
function beginInorder(n) {
return 0
}
exports.begin = beginInorder
function endInorder(n) {
return n-1
}
exports.end = endInorder
//This is really horrible because n is not necessarily a power of 2
// If it was, we could just do:
//
// height = bits.countTrailingZeros(~x)
//
// Instead, we just binary search because doing the right thing here is way too complicated.
function heightInorder(n, x) {
if(n <= 0) {
return 0
}
var r = rootInorder(n)
if(x > r) {
return heightInorder(n-r-1, x-r-1)
} else if(x === r) {
return bits.log2(n)
}
return heightInorder(r, x)
}
exports.height = heightInorder
function prevInorder(n, x) {
return Math.max(x-1,0)
}
exports.prev = prevInorder
function nextInorder(n, x) {
return Math.min(x+1,n-1)
}
exports.next = nextInorder
//The version for n = (1<<k)-1:
//
// parent = (x & ~(1<<(h+1))) + (1<<h)
//
function parentInorder(n, x) {
if(n <= 0) {
return -1
}
var r = rootInorder(n)
if(x > r) {
var q = parentInorder(n-r-1, x-r-1)
if(q < 0) {
return r
} else {
return q + r + 1
}
} else if(x === r) {
return -1
}
var q = parentInorder(r, x)
if(q < 0) {
return r
}
return q
}
exports.parent = parentInorder
//Again, we get screwed because n is not a power of two -1. If it was, we could do:
//
// left = x - (1 << (h-1) )
//
// Where h is the height of the node
//
function leftInorder(n, x) {
if(n <= 0) {
return 0
}
var r = rootInorder(n)
if(x > r) {
return leftInorder(n-r-1, x-r-1) + r + 1
} else if(x === r) {
return rootInorder(x)
}
return leftInorder(r, x)
}
exports.left = leftInorder
//for power of two minus one:
//
// right = x + (1<<(h-1))
//
function rightInorder(n, x) {
if(n <= 0) {
return 0
}
var r = rootInorder(n)
if(x > r) {
return rightInorder(n-r-1, x-r-1) + r + 1
} else if(x === r) {
return rootInorder(n-r-1) + r + 1
}
return rightInorder(r, x)
}
exports.right = rightInorder
function leafInorder(n, x) {
return heightInorder(n, x) === 0
}
exports.leaf = leafInorder
function loInorder(n, x) {
n |= 0
x |= 0
var l = 0
while(n > 1) {
var r = rootInorder(n)
if(x > r) {
l += r + 1
n -= r + 1
x -= r + 1
} else if(x === r) {
break
} else {
n = r
}
}
return l
}
exports.lo = loInorder
function hiInorder(n, x) {
n |= 0
x |= 0
var l = 0
while(n > 1) {
var r = rootInorder(n)
if(x > r) {
l += r + 1
n -= r + 1
x -= r + 1
} else if(x === r) {
l += n-1
break
} else {
n = r
}
}
return l
}
exports.hi = hiInorder
},{"bit-twiddle":8}],8:[function(require,module,exports){
arguments[4][6][0].apply(exports,arguments)
},{"dup":6}],9:[function(require,module,exports){
"use strict"
var compile = require("cwise-compiler")
var EmptyProc = {
body: "",
args: [],
thisVars: [],
localVars: []
}
function fixup(x) {
if(!x) {
return EmptyProc
}
for(var i=0; i<x.args.length; ++i) {
var a = x.args[i]
if(i === 0) {
x.args[i] = {name: a, lvalue:true, rvalue: !!x.rvalue, count:x.count||1 }
} else {
x.args[i] = {name: a, lvalue:false, rvalue:true, count: 1}
}
}
if(!x.thisVars) {
x.thisVars = []
}
if(!x.localVars) {
x.localVars = []
}
return x
}
function pcompile(user_args) {
return compile({
args: user_args.args,
pre: fixup(user_args.pre),
body: fixup(user_args.body),
post: fixup(user_args.proc),
funcName: user_args.funcName
})
}
function makeOp(user_args) {
var args = []
for(var i=0; i<user_args.args.length; ++i) {
args.push("a"+i)
}
var wrapper = new Function("P", [
"return function ", user_args.funcName, "_ndarrayops(", args.join(","), ") {P(", args.join(","), ");return a0}"
].join(""))
return wrapper(pcompile(user_args))
}
var assign_ops = {
add: "+",
sub: "-",
mul: "*",
div: "/",
mod: "%",
band: "&",
bor: "|",
bxor: "^",
lshift: "<<",
rshift: ">>",
rrshift: ">>>"
}
;(function(){
for(var id in assign_ops) {
var op = assign_ops[id]
exports[id] = makeOp({
args: ["array","array","array"],
body: {args:["a","b","c"],
body: "a=b"+op+"c"},
funcName: id
})
exports[id+"eq"] = makeOp({
args: ["array","array"],
body: {args:["a","b"],
body:"a"+op+"=b"},
rvalue: true,
funcName: id+"eq"
})
exports[id+"s"] = makeOp({
args: ["array", "array", "scalar"],
body: {args:["a","b","s"],
body:"a=b"+op+"s"},
funcName: id+"s"
})
exports[id+"seq"] = makeOp({
args: ["array","scalar"],
body: {args:["a","s"],
body:"a"+op+"=s"},
rvalue: true,
funcName: id+"seq"
})
}
})();
var unary_ops = {
not: "!",
bnot: "~",
neg: "-",
recip: "1.0/"
}
;(function(){
for(var id in unary_ops) {
var op = unary_ops[id]
exports[id] = makeOp({
args: ["array", "array"],
body: {args:["a","b"],
body:"a="+op+"b"},
funcName: id
})
exports[id+"eq"] = makeOp({
args: ["array"],
body: {args:["a"],
body:"a="+op+"a"},
rvalue: true,
count: 2,
funcName: id+"eq"
})
}
})();
var binary_ops = {
and: "&&",
or: "||",
eq: "===",
neq: "!==",
lt: "<",
gt: ">",
leq: "<=",
geq: ">="
}
;(function() {
for(var id in binary_ops) {
var op = binary_ops[id]
exports[id] = makeOp({
args: ["array","array","array"],
body: {args:["a", "b", "c"],
body:"a=b"+op+"c"},
funcName: id
})
exports[id+"s"] = makeOp({
args: ["array","array","scalar"],
body: {args:["a", "b", "s"],
body:"a=b"+op+"s"},
funcName: id+"s"
})
exports[id+"eq"] = makeOp({
args: ["array", "array"],
body: {args:["a", "b"],
body:"a=a"+op+"b"},
rvalue:true,
count:2,
funcName: id+"eq"
})
exports[id+"seq"] = makeOp({
args: ["array", "scalar"],
body: {args:["a","s"],
body:"a=a"+op+"s"},
rvalue:true,
count:2,
funcName: id+"seq"
})
}
})();
var math_unary = [
"abs",
"acos",
"asin",
"atan",
"ceil",
"cos",
"exp",
"floor",
"log",
"round",
"sin",
"sqrt",
"tan"
]
;(function() {
for(var i=0; i<math_unary.length; ++i) {
var f = math_unary[i]
exports[f] = makeOp({
args: ["array", "array"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args:["a","b"], body:"a=this_f(b)", thisVars:["this_f"]},
funcName: f
})
exports[f+"eq"] = makeOp({
args: ["array"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args: ["a"], body:"a=this_f(a)", thisVars:["this_f"]},
rvalue: true,
count: 2,
funcName: f+"eq"
})
}
})();
var math_comm = [
"max",
"min",
"atan2",
"pow"
]
;(function(){
for(var i=0; i<math_comm.length; ++i) {
var f= math_comm[i]
exports[f] = makeOp({
args:["array", "array", "array"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args:["a","b","c"], body:"a=this_f(b,c)", thisVars:["this_f"]},
funcName: f
})
exports[f+"s"] = makeOp({
args:["array", "array", "scalar"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args:["a","b","c"], body:"a=this_f(b,c)", thisVars:["this_f"]},
funcName: f+"s"
})
exports[f+"eq"] = makeOp({ args:["array", "array"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args:["a","b"], body:"a=this_f(a,b)", thisVars:["this_f"]},
rvalue: true,
count: 2,
funcName: f+"eq"
})
exports[f+"seq"] = makeOp({ args:["array", "scalar"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args:["a","b"], body:"a=this_f(a,b)", thisVars:["this_f"]},
rvalue:true,
count:2,
funcName: f+"seq"
})
}
})();
var math_noncomm = [
"atan2",
"pow"
]
;(function(){
for(var i=0; i<math_noncomm.length; ++i) {
var f= math_noncomm[i]
exports[f+"op"] = makeOp({
args:["array", "array", "array"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args:["a","b","c"], body:"a=this_f(c,b)", thisVars:["this_f"]},
funcName: f+"op"
})
exports[f+"ops"] = makeOp({
args:["array", "array", "scalar"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args:["a","b","c"], body:"a=this_f(c,b)", thisVars:["this_f"]},
funcName: f+"ops"
})
exports[f+"opeq"] = makeOp({ args:["array", "array"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args:["a","b"], body:"a=this_f(b,a)", thisVars:["this_f"]},
rvalue: true,
count: 2,
funcName: f+"opeq"
})
exports[f+"opseq"] = makeOp({ args:["array", "scalar"],
pre: {args:[], body:"this_f=Math."+f, thisVars:["this_f"]},
body: {args:["a","b"], body:"a=this_f(b,a)", thisVars:["this_f"]},
rvalue:true,
count:2,
funcName: f+"opseq"
})
}
})();
exports.any = compile({
args:["array"],
pre: EmptyProc,
body: {args:[{name:"a", lvalue:false, rvalue:true, count:1}], body: "if(a){return true}", localVars: [], thisVars: []},
post: {args:[], localVars:[], thisVars:[], body:"return false"},
funcName: "any"
})
exports.all = compile({
args:["array"],
pre: EmptyProc,
body: {args:[{name:"x", lvalue:false, rvalue:true, count:1}], body: "if(!x){return false}", localVars: [], thisVars: []},
post: {args:[], localVars:[], thisVars:[], body:"return true"},
funcName: "all"
})
exports.sum = compile({
args:["array"],
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"},
body: {args:[{name:"a", lvalue:false, rvalue:true, count:1}], body: "this_s+=a", localVars: [], thisVars: ["this_s"]},
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"},
funcName: "sum"
})
exports.prod = compile({
args:["array"],
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=1"},
body: {args:[{name:"a", lvalue:false, rvalue:true, count:1}], body: "this_s*=a", localVars: [], thisVars: ["this_s"]},
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"},
funcName: "prod"
})
exports.norm2squared = compile({
args:["array"],
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"},
body: {args:[{name:"a", lvalue:false, rvalue:true, count:2}], body: "this_s+=a*a", localVars: [], thisVars: ["this_s"]},
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"},
funcName: "norm2squared"
})
exports.norm2 = compile({
args:["array"],
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"},
body: {args:[{name:"a", lvalue:false, rvalue:true, count:2}], body: "this_s+=a*a", localVars: [], thisVars: ["this_s"]},
post: {args:[], localVars:[], thisVars:["this_s"], body:"return Math.sqrt(this_s)"},
funcName: "norm2"
})
exports.norminf = compile({
args:["array"],
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"},
body: {args:[{name:"a", lvalue:false, rvalue:true, count:4}], body:"if(-a>this_s){this_s=-a}else if(a>this_s){this_s=a}", localVars: [], thisVars: ["this_s"]},
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"},
funcName: "norminf"
})
exports.norm1 = compile({
args:["array"],
pre: {args:[], localVars:[], thisVars:["this_s"], body:"this_s=0"},
body: {args:[{name:"a", lvalue:false, rvalue:true, count:3}], body: "this_s+=a<0?-a:a", localVars: [], thisVars: ["this_s"]},
post: {args:[], localVars:[], thisVars:["this_s"], body:"return this_s"},
funcName: "norm1"
})
exports.sup = compile({
args: [ "array" ],
pre:
{ body: "this_h=-Infinity",
args: [],
thisVars: [ "this_h" ],
localVars: [] },
body:
{ body: "if(_inline_1_arg0_>this_h)this_h=_inline_1_arg0_",
args: [{"name":"_inline_1_arg0_","lvalue":false,"rvalue":true,"count":2} ],
thisVars: [ "this_h" ],
localVars: [] },
post:
{ body: "return this_h",
args: [],
thisVars: [ "this_h" ],
localVars: [] }
})
exports.inf = compile({
args: [ "array" ],
pre:
{ body: "this_h=Infinity",
args: [],
thisVars: [ "this_h" ],
localVars: [] },
body:
{ body: "if(_inline_1_arg0_<this_h)this_h=_inline_1_arg0_",
args: [{"name":"_inline_1_arg0_","lvalue":false,"rvalue":true,"count":2} ],
thisVars: [ "this_h" ],
localVars: [] },
post:
{ body: "return this_h",
args: [],
thisVars: [ "this_h" ],
localVars: [] }
})
exports.argmin = compile({
args:["index","array","shape"],
pre:{
body:"{this_v=Infinity;this_i=_inline_0_arg2_.slice(0)}",
args:[
{name:"_inline_0_arg0_",lvalue:false,rvalue:false,count:0},
{name:"_inline_0_arg1_",lvalue:false,rvalue:false,count:0},
{name:"_inline_0_arg2_",lvalue:false,rvalue:true,count:1}
],
thisVars:["this_i","this_v"],
localVars:[]},
body:{
body:"{if(_inline_1_arg1_<this_v){this_v=_inline_1_arg1_;for(var _inline_1_k=0;_inline_1_k<_inline_1_arg0_.length;++_inline_1_k){this_i[_inline_1_k]=_inline_1_arg0_[_inline_1_k]}}}",
args:[
{name:"_inline_1_arg0_",lvalue:false,rvalue:true,count:2},
{name:"_inline_1_arg1_",lvalue:false,rvalue:true,count:2}],
thisVars:["this_i","this_v"],
localVars:["_inline_1_k"]},
post:{
body:"{return this_i}",
args:[],
thisVars:["this_i"],
localVars:[]}
})
exports.argmax = compile({
args:["index","array","shape"],
pre:{
body:"{this_v=-Infinity;this_i=_inline_0_arg2_.slice(0)}",
args:[
{name:"_inline_0_arg0_",lvalue:false,rvalue:false,count:0},
{name:"_inline_0_arg1_",lvalue:false,rvalue:false,count:0},
{name:"_inline_0_arg2_",lvalue:false,rvalue:true,count:1}
],
thisVars:["this_i","this_v"],
localVars:[]},
body:{
body:"{if(_inline_1_arg1_>this_v){this_v=_inline_1_arg1_;for(var _inline_1_k=0;_inline_1_k<_inline_1_arg0_.length;++_inline_1_k){this_i[_inline_1_k]=_inline_1_arg0_[_inline_1_k]}}}",
args:[
{name:"_inline_1_arg0_",lvalue:false,rvalue:true,count:2},
{name:"_inline_1_arg1_",lvalue:false,rvalue:true,count:2}],
thisVars:["this_i","this_v"],
localVars:["_inline_1_k"]},
post:{
body:"{return this_i}",
args:[],
thisVars:["this_i"],
localVars:[]}
})
exports.random = makeOp({
args: ["array"],
pre: {args:[], body:"this_f=Math.random", thisVars:["this_f"]},
body: {args: ["a"], body:"a=this_f()", thisVars:["this_f"]},
funcName: "random"
})
exports.assign = makeOp({
args:["array", "array"],
body: {args:["a", "b"], body:"a=b"},
funcName: "assign" })
exports.assigns = makeOp({
args:["array", "scalar"],
body: {args:["a", "b"], body:"a=b"},
funcName: "assigns" })
exports.equals = compile({
args:["array", "array"],
pre: EmptyProc,
body: {args:[{name:"x", lvalue:false, rvalue:true, count:1},
{name:"y", lvalue:false, rvalue:true, count:1}],
body: "if(x!==y){return false}",
localVars: [],
thisVars: []},
post: {args:[], localVars:[], thisVars:[], body:"return true"},
funcName: "equals"
})
},{"cwise-compiler":10}],10:[function(require,module,exports){
"use strict"
var createThunk = require("./lib/thunk.js")
function Procedure() {
this.argTypes = []
this.shimArgs = []
this.arrayArgs = []
this.arrayBlockIndices = []
this.scalarArgs = []
this.offsetArgs = []
this.offsetArgIndex = []
this.indexArgs = []
this.shapeArgs = []
this.funcName = ""
this.pre = null
this.body = null
this.post = null
this.debug = false
}
function compileCwise(user_args) {
//Create procedure
var proc = new Procedure()
//Parse blocks
proc.pre = user_args.pre
proc.body = user_args.body
proc.post = user_args.post
//Parse arguments
var proc_args = user_args.args.slice(0)
proc.argTypes = proc_args
for(var i=0; i<proc_args.length; ++i) {
var arg_type = proc_args[i]
if(arg_type === "array" || (typeof arg_type === "object" && arg_type.blockIndices)) {
proc.argTypes[i] = "array"
proc.arrayArgs.push(i)
proc.arrayBlockIndices.push(arg_type.blockIndices ? arg_type.blockIndices : 0)
proc.shimArgs.push("array" + i)
if(i < proc.pre.args.length && proc.pre.args[i].count>0) {
throw new Error("cwise: pre() block may not reference array args")
}
if(i < proc.post.args.length && proc.post.args[i].count>0) {
throw new Error("cwise: post() block may not reference array args")
}
} else if(arg_type === "scalar") {
proc.scalarArgs.push(i)
proc.shimArgs.push("scalar" + i)
} else if(arg_type === "index") {
proc.indexArgs.push(i)
if(i < proc.pre.args.length && proc.pre.args[i].count > 0) {
throw new Error("cwise: pre() block may not reference array index")
}
if(i < proc.body.args.length && proc.body.args[i].lvalue) {
throw new Error("cwise: body() block may not write to array index")
}
if(i < proc.post.args.length && proc.post.args[i].count > 0) {
throw new Error("cwise: post() block may not reference array index")
}
} else if(arg_type === "shape") {
proc.shapeArgs.push(i)
if(i < proc.pre.args.length && proc.pre.args[i].lvalue) {
throw new Error("cwise: pre() block may not write to array shape")
}
if(i < proc.body.args.length && proc.body.args[i].lvalue) {
throw new Error("cwise: body() block may not write to array shape")
}
if(i < proc.post.args.length && proc.post.args[i].lvalue) {
throw new Error("cwise: post() block may not write to array shape")
}
} else if(typeof arg_type === "object" && arg_type.offset) {
proc.argTypes[i] = "offset"
proc.offsetArgs.push({ array: arg_type.array, offset:arg_type.offset })
proc.offsetArgIndex.push(i)
} else {
throw new Error("cwise: Unknown argument type " + proc_args[i])
}
}
//Make sure at least one array argument was specified
if(proc.arrayArgs.length <= 0) {
throw new Error("cwise: No array arguments specified")
}
//Make sure arguments are correct
if(proc.pre.args.length > proc_args.length) {
throw new Error("cwise: Too many arguments in pre() block")
}
if(proc.body.args.length > proc_args.length) {
throw new Error("cwise: Too many arguments in body() block")
}
if(proc.post.args.length > proc_args.length) {
throw new Error("cwise: Too many arguments in post() block")
}
//Check debug flag
proc.debug = !!user_args.printCode || !!user_args.debug
//Retrieve name
proc.funcName = user_args.funcName || "cwise"
//Read in block size
proc.blockSize = user_args.blockSize || 64
return createThunk(proc)
}
module.exports = compileCwise
},{"./lib/thunk.js":12}],11:[function(require,module,exports){
"use strict"
var uniq = require("uniq")
// This function generates very simple loops analogous to how you typically traverse arrays (the outermost loop corresponds to the slowest changing index, the innermost loop to the fastest changing index)
// TODO: If two arrays have the same strides (and offsets) there is potential for decreasing the number of "pointers" and related variables. The drawback is that the type signature would become more specific and that there would thus be less potential for caching, but it might still be worth it, especially when dealing with large numbers of arguments.
function innerFill(order, proc, body) {
var dimension = order.length
, nargs = proc.arrayArgs.length
, has_index = proc.indexArgs.length>0
, code = []
, vars = []
, idx=0, pidx=0, i, j
for(i=0; i<dimension; ++i) { // Iteration variables
vars.push(["i",i,"=0"].join(""))
}
//Compute scan deltas
for(j=0; j<nargs; ++j) {
for(i=0; i<dimension; ++i) {
pidx = idx
idx = order[i]
if(i === 0) { // The innermost/fastest dimension's delta is simply its stride
vars.push(["d",j,"s",i,"=t",j,"p",idx].join(""))
} else { // For other dimensions the delta is basically the stride minus something which essentially "rewinds" the previous (more inner) dimension
vars.push(["d",j,"s",i,"=(t",j,"p",idx,"-s",pidx,"*t",j,"p",pidx,")"].join(""))
}
}
}
code.push("var " + vars.join(","))
//Scan loop
for(i=dimension-1; i>=0; --i) { // Start at largest stride and work your way inwards
idx = order[i]
code.push(["for(i",i,"=0;i",i,"<s",idx,";++i",i,"){"].join(""))
}
//Push body of inner loop
code.push(body)
//Advance scan pointers
for(i=0; i<dimension; ++i) {
pidx = idx
idx = order[i]
for(j=0; j<nargs; ++j) {
code.push(["p",j,"+=d",j,"s",i].join(""))
}
if(has_index) {
if(i > 0) {
code.push(["index[",pidx,"]-=s",pidx].join(""))
}
code.push(["++index[",idx,"]"].join(""))
}
code.push("}")
}
return code.join("\n")
}
// Generate "outer" loops that loop over blocks of data, applying "inner" loops to the blocks by manipulating the local variables in such a way that the inner loop only "sees" the current block.
// TODO: If this is used, then the previous declaration (done by generateCwiseOp) of s* is essentially unnecessary.
// I believe the s* are not used elsewhere (in particular, I don't think they're used in the pre/post parts and "shape" is defined independently), so it would be possible to make defining the s* dependent on what loop method is being used.
function outerFill(matched, order, proc, body) {
var dimension = order.length
, nargs = proc.arrayArgs.length
, blockSize = proc.blockSize
, has_index = proc.indexArgs.length > 0
, code = []
for(var i=0; i<nargs; ++i) {
code.push(["var offset",i,"=p",i].join(""))
}
//Generate loops for unmatched dimensions
// The order in which these dimensions are traversed is fairly arbitrary (from small stride to large stride, for the first argument)
// TODO: It would be nice if the order in which these loops are placed would also be somehow "optimal" (at the very least we should check that it really doesn't hurt us if they're not).
for(var i=matched; i<dimension; ++i) {
code.push(["for(var j"+i+"=SS[", order[i], "]|0;j", i, ">0;){"].join("")) // Iterate back to front
code.push(["if(j",i,"<",blockSize,"){"].join("")) // Either decrease j by blockSize (s = blockSize), or set it to zero (after setting s = j).
code.push(["s",order[i],"=j",i].join(""))
code.push(["j",i,"=0"].join(""))
code.push(["}else{s",order[i],"=",blockSize].join(""))
code.push(["j",i,"-=",blockSize,"}"].join(""))
if(has_index) {
code.push(["index[",order[i],"]=j",i].join(""))
}
}
for(var i=0; i<nargs; ++i) {
var indexStr = ["offset"+i]
for(var j=matched; j<dimension; ++j) {
indexStr.push(["j",j,"*t",i,"p",order[j]].join(""))
}
code.push(["p",i,"=(",indexStr.join("+"),")"].join(""))
}
code.push(innerFill(order, proc, body))
for(var i=matched; i<dimension; ++i) {
code.push("}")
}
return code.join("\n")
}
//Count the number of compatible inner orders
// This is the length of the longest common prefix of the arrays in orders.
// Each array in orders lists the dimensions of the correspond ndarray in order of increasing stride.
// This is thus the maximum number of dimensions that can be efficiently traversed by simple nested loops for all arrays.
function countMatches(orders) {
var matched = 0, dimension = orders[0].length
while(matched < dimension) {
for(var j=1; j<orders.length; ++j) {
if(orders[j][matched] !== orders[0][matched]) {
return matched
}
}
++matched
}
return matched
}
//Processes a block according to the given data types
// Replaces variable names by different ones, either "local" ones (that are then ferried in and out of the given array) or ones matching the arguments that the function performing the ultimate loop will accept.
function processBlock(block, proc, dtypes) {
var code = block.body
var pre = []
var post = []
for(var i=0; i<block.args.length; ++i) {
var carg = block.args[i]
if(carg.count <= 0) {
continue
}
var re = new RegExp(carg.name, "g")
var ptrStr = ""
var arrNum = proc.arrayArgs.indexOf(i)
switch(proc.argTypes[i]) {
case "offset":
var offArgIndex = proc.offsetArgIndex.indexOf(i)
var offArg = proc.offsetArgs[offArgIndex]
arrNum = offArg.array
ptrStr = "+q" + offArgIndex // Adds offset to the "pointer" in the array
case "array":
ptrStr = "p" + arrNum + ptrStr
var localStr = "l" + i
var arrStr = "a" + arrNum
if (proc.arrayBlockIndices[arrNum] === 0) { // Argument to body is just a single value from this array
if(carg.count === 1) { // Argument/array used only once(?)
if(dtypes[arrNum] === "generic") {
if(carg.lvalue) {
pre.push(["var ", localStr, "=", arrStr, ".get(", ptrStr, ")"].join("")) // Is this necessary if the argument is ONLY used as an lvalue? (keep in mind that we can have a += something, so we would actually need to check carg.rvalue)
code = code.replace(re, localStr)
post.push([arrStr, ".set(", ptrStr, ",", localStr,")"].join(""))
} else {
code = code.replace(re, [arrStr, ".get(", ptrStr, ")"].join(""))
}
} else {
code = code.replace(re, [arrStr, "[", ptrStr, "]"].join(""))
}
} else if(dtypes[arrNum] === "generic") {
pre.push(["var ", localStr, "=", arrStr, ".get(", ptrStr, ")"].join("")) // TODO: Could we optimize by checking for carg.rvalue?
code = code.replace(re, localStr)
if(carg.lvalue) {
post.push([arrStr, ".set(", ptrStr, ",", localStr,")"].join(""))
}
} else {
pre.push(["var ", localStr, "=", arrStr, "[", ptrStr, "]"].join("")) // TODO: Could we optimize by checking for carg.rvalue?
code = code.replace(re, localStr)
if(carg.lvalue) {
post.push([arrStr, "[", ptrStr, "]=", localStr].join(""))
}
}
} else { // Argument to body is a "block"
var reStrArr = [carg.name], ptrStrArr = [ptrStr]
for(var j=0; j<Math.abs(proc.arrayBlockIndices[arrNum]); j++) {
reStrArr.push("\\s*\\[([^\\]]+)\\]")
ptrStrArr.push("$" + (j+1) + "*t" + arrNum + "b" + j) // Matched index times stride
}
re = new RegExp(reStrArr.join(""), "g")
ptrStr = ptrStrArr.join("+")
if(dtypes[arrNum] === "generic") {
/*if(carg.lvalue) {
pre.push(["var ", localStr, "=", arrStr, ".get(", ptrStr, ")"].join("")) // Is this necessary if the argument is ONLY used as an lvalue? (keep in mind that we can have a += something, so we would actually need to check carg.rvalue)
code = code.replace(re, localStr)
post.push([arrStr, ".set(", ptrStr, ",", localStr,")"].join(""))
} else {
code = code.replace(re, [arrStr, ".get(", ptrStr, ")"].join(""))
}*/
throw new Error("cwise: Generic arrays not supported in combination with blocks!")
} else {
// This does not produce any local variables, even if variables are used multiple times. It would be possible to do so, but it would complicate things quite a bit.
code = code.replace(re, [arrStr, "[", ptrStr, "]"].join(""))
}
}
break
case "scalar":
code = code.replace(re, "Y" + proc.scalarArgs.indexOf(i))
break
case "index":
code = code.replace(re, "index")
break
case "shape":
code = code.replace(re, "shape")
break
}
}
return [pre.join("\n"), code, post.join("\n")].join("\n").trim()
}
function typeSummary(dtypes) {
var summary = new Array(dtypes.length)
var allEqual = true
for(var i=0; i<dtypes.length; ++i) {
var t = dtypes[i]
var digits = t.match(/\d+/)
if(!digits) {
digits = ""
} else {
digits = digits[0]
}
if(t.charAt(0) === 0) {
summary[i] = "u" + t.charAt(1) + digits
} else {
summary[i] = t.charAt(0) + digits
}
if(i > 0) {
allEqual = allEqual && summary[i] === summary[i-1]
}
}
if(allEqual) {
return summary[0]
}
return summary.join("")
}
//Generates a cwise operator
function generateCWiseOp(proc, typesig) {
//Compute dimension
// Arrays get put first in typesig, and there are two entries per array (dtype and order), so this gets the number of dimensions in the first array arg.
var dimension = (typesig[1].length - Math.abs(proc.arrayBlockIndices[0]))|0
var orders = new Array(proc.arrayArgs.length)
var dtypes = new Array(proc.arrayArgs.length)
for(var i=0; i<proc.arrayArgs.length; ++i) {
dtypes[i] = typesig[2*i]
orders[i] = typesig[2*i+1]
}
//Determine where block and loop indices start and end
var blockBegin = [], blockEnd = [] // These indices are exposed as blocks
var loopBegin = [], loopEnd = [] // These indices are iterated over
var loopOrders = [] // orders restricted to the loop indices
for(var i=0; i<proc.arrayArgs.length; ++i) {
if (proc.arrayBlockIndices[i]<0) {
loopBegin.push(0)
loopEnd.push(dimension)
blockBegin.push(dimension)
blockEnd.push(dimension+proc.arrayBlockIndices[i])
} else {
loopBegin.push(proc.arrayBlockIndices[i]) // Non-negative
loopEnd.push(proc.arrayBlockIndices[i]+dimension)
blockBegin.push(0)
blockEnd.push(proc.arrayBlockIndices[i])
}
var newOrder = []
for(var j=0; j<orders[i].length; j++) {
if (loopBegin[i]<=orders[i][j] && orders[i][j]<loopEnd[i]) {
newOrder.push(orders[i][j]-loopBegin[i]) // If this is a loop index, put it in newOrder, subtracting loopBegin, to make sure that all loopOrders are using a common set of indices.
}
}
loopOrders.push(newOrder)
}
//First create arguments for procedure
var arglist = ["SS"] // SS is the overall shape over which we iterate
var code = ["'use strict'"]
var vars = []
for(var j=0; j<dimension; ++j) {
vars.push(["s", j, "=SS[", j, "]"].join("")) // The limits for each dimension.
}
for(var i=0; i<proc.arrayArgs.length; ++i) {
arglist.push("a"+i) // Actual data array
arglist.push("t"+i) // Strides
arglist.push("p"+i) // Offset in the array at which the data starts (also used for iterating over the data)
for(var j=0; j<dimension; ++j) { // Unpack the strides into vars for looping
vars.push(["t",i,"p",j,"=t",i,"[",loopBegin[i]+j,"]"].join(""))
}
for(var j=0; j<Math.abs(proc.arrayBlockIndices[i]); ++j) { // Unpack the strides into vars for block iteration
vars.push(["t",i,"b",j,"=t",i,"[",blockBegin[i]+j,"]"].join(""))
}
}
for(var i=0; i<proc.scalarArgs.length; ++i) {
arglist.push("Y" + i)
}
if(proc.shapeArgs.length > 0) {
vars.push("shape=SS.slice(0)") // Makes the shape over which we iterate available to the user defined functions (so you can use width/height for example)
}
if(proc.indexArgs.length > 0) {
// Prepare an array to keep track of the (logical) indices, initialized to dimension zeroes.
var zeros = new Array(dimension)
for(var i=0; i<dimension; ++i) {
zeros[i] = "0"
}
vars.push(["index=[", zeros.join(","), "]"].join(""))
}
for(var i=0; i<proc.offsetArgs.length; ++i) { // Offset arguments used for stencil operations
var off_arg = proc.offsetArgs[i]
var init_string = []
for(var j=0; j<off_arg.offset.length; ++j) {
if(off_arg.offset[j] === 0) {
continue
} else if(off_arg.offset[j] === 1) {
init_string.push(["t", off_arg.array, "p", j].join(""))
} else {
init_string.push([off_arg.offset[j], "*t", off_arg.array, "p", j].join(""))
}
}
if(init_string.length === 0) {
vars.push("q" + i + "=0")
} else {
vars.push(["q", i, "=", init_string.join("+")].join(""))
}
}
//Prepare this variables
var thisVars = uniq([].concat(proc.pre.thisVars)
.concat(proc.body.thisVars)
.concat(proc.post.thisVars))
vars = vars.concat(thisVars)
code.push("var " + vars.join(","))
for(var i=0; i<proc.arrayArgs.length; ++i) {
code.push("p"+i+"|=0")
}
//Inline prelude
if(proc.pre.body.length > 3) {
code.push(processBlock(proc.pre, proc, dtypes))
}
//Process body
var body = processBlock(proc.body, proc, dtypes)
var matched = countMatches(loopOrders)
if(matched < dimension) {
code.push(outerFill(matched, loopOrders[0], proc, body)) // TODO: Rather than passing loopOrders[0], it might be interesting to look at passing an order that represents the majority of the arguments for example.
} else {
code.push(innerFill(loopOrders[0], proc, body))
}
//Inline epilog
if(proc.post.body.length > 3) {
code.push(processBlock(proc.post, proc, dtypes))
}
if(proc.debug) {
console.log("-----Generated cwise routine for ", typesig, ":\n" + code.join("\n") + "\n----------")
}
var loopName = [(proc.funcName||"unnamed"), "_cwise_loop_", orders[0].join("s"),"m",matched,typeSummary(dtypes)].join("")
var f = new Function(["function ",loopName,"(", arglist.join(","),"){", code.join("\n"),"} return ", loopName].join(""))
return f()
}
module.exports = generateCWiseOp
},{"uniq":13}],12:[function(require,module,exports){
"use strict"
// The function below is called when constructing a cwise function object, and does the following:
// A function object is constructed which accepts as argument a compilation function and returns another function.
// It is this other function that is eventually returned by createThunk, and this function is the one that actually
// checks whether a certain pattern of arguments has already been used before and compiles new loops as needed.
// The compilation passed to the first function object is used for compiling new functions.
// Once this function object is created, it is called with compile as argument, where the first argument of compile
// is bound to "proc" (essentially containing a preprocessed version of the user arguments to cwise).
// So createThunk roughly works like this:
// function createThunk(proc) {
// var thunk = function(compileBound) {
// var CACHED = {}
// return function(arrays and scalars) {
// if (dtype and order of arrays in CACHED) {
// var func = CACHED[dtype and order of arrays]
// } else {
// var func = CACHED[dtype and order of arrays] = compileBound(dtype and order of arrays)
// }
// return func(arrays and scalars)
// }
// }
// return thunk(compile.bind1(proc))
// }
var compile = require("./compile.js")
function createThunk(proc) {
var code = ["'use strict'", "var CACHED={}"]
var vars = []
var thunkName = proc.funcName + "_cwise_thunk"
//Build thunk
code.push(["return function ", thunkName, "(", proc.shimArgs.join(","), "){"].join(""))
var typesig = []
var string_typesig = []
var proc_args = [["array",proc.arrayArgs[0],".shape.slice(", // Slice shape so that we only retain the shape over which we iterate (which gets passed to the cwise operator as SS).
Math.max(0,proc.arrayBlockIndices[0]),proc.arrayBlockIndices[0]<0?(","+proc.arrayBlockIndices[0]+")"):")"].join("")]
var shapeLengthConditions = [], shapeConditions = []
// Process array arguments
for(var i=0; i<proc.arrayArgs.length; ++i) {
var j = proc.arrayArgs[i]
vars.push(["t", j, "=array", j, ".dtype,",
"r", j, "=array", j, ".order"].join(""))
typesig.push("t" + j)
typesig.push("r" + j)
string_typesig.push("t"+j)
string_typesig.push("r"+j+".join()")
proc_args.push("array" + j + ".data")
proc_args.push("array" + j + ".stride")
proc_args.push("array" + j + ".offset|0")
if (i>0) { // Gather conditions to check for shape equality (ignoring block indices)
shapeLengthConditions.push("array" + proc.arrayArgs[0] + ".shape.length===array" + j + ".shape.length+" + (Math.abs(proc.arrayBlockIndices[0])-Math.abs(proc.arrayBlockIndices[i])))
shapeConditions.push("array" + proc.arrayArgs[0] + ".shape[shapeIndex+" + Math.max(0,proc.arrayBlockIndices[0]) + "]===array" + j + ".shape[shapeIndex+" + Math.max(0,proc.arrayBlockIndices[i]) + "]")
}
}
// Check for shape equality
if (proc.arrayArgs.length > 1) {
code.push("if (!(" + shapeLengthConditions.join(" && ") + ")) throw new Error('cwise: Arrays do not all have the same dimensionality!')")
code.push("for(var shapeIndex=array" + proc.arrayArgs[0] + ".shape.length-" + Math.abs(proc.arrayBlockIndices[0]) + "; shapeIndex-->0;) {")
code.push("if (!(" + shapeConditions.join(" && ") + ")) throw new Error('cwise: Arrays do not all have the same shape!')")
code.push("}")
}
// Process scalar arguments
for(var i=0; i<proc.scalarArgs.length; ++i) {
proc_args.push("scalar" + proc.scalarArgs[i])
}
// Check for cached function (and if not present, generate it)
vars.push(["type=[", string_typesig.join(","), "].join()"].join(""))
vars.push("proc=CACHED[type]")
code.push("var " + vars.join(","))
code.push(["if(!proc){",
"CACHED[type]=proc=compile([", typesig.join(","), "])}",
"return proc(", proc_args.join(","), ")}"].join(""))
if(proc.debug) {
console.log("-----Generated thunk:\n" + code.join("\n") + "\n----------")
}
//Compile thunk
var thunk = new Function("compile", code.join("\n"))
return thunk(compile.bind(undefined, proc))
}
module.exports = createThunk
},{"./compile.js":11}],13:[function(require,module,exports){
"use strict"
function unique_pred(list, compare) {
var ptr = 1
, len = list.length
, a=list[0], b=list[0]
for(var i=1; i<len; ++i) {
b = a
a = list[i]
if(compare(a, b)) {
if(i === ptr) {
ptr++
continue
}
list[ptr++] = a
}
}
list.length = ptr
return list
}
function unique_eq(list) {
var ptr = 1
, len = list.length
, a=list[0], b = list[0]
for(var i=1; i<len; ++i, b=a) {
b = a
a = list[i]
if(a !== b) {
if(i === ptr) {
ptr++
continue
}
list[ptr++] = a
}
}
list.length = ptr
return list
}
function unique(list, compare, sorted) {
if(list.length === 0) {
return list
}
if(compare) {
if(!sorted) {
list.sort(compare)
}
return unique_pred(list, compare)
}
if(!sorted) {
list.sort()
}
return unique_eq(list)
}
module.exports = unique
},{}],14:[function(require,module,exports){
"use strict"
var ndarray = require("ndarray")
var do_convert = require("./doConvert.js")
module.exports = function convert(arr, result) {
var shape = [], c = arr, sz = 1
while(Array.isArray(c)) {
shape.push(c.length)
sz *= c.length
c = c[0]
}
if(shape.length === 0) {
return ndarray()
}
if(!result) {
result = ndarray(new Float64Array(sz), shape)
}
do_convert(result, arr)
return result
}
},{"./doConvert.js":15,"ndarray":22}],15:[function(require,module,exports){
module.exports=require('cwise-compiler')({"args":["array","scalar","index"],"pre":{"body":"{}","args":[],"thisVars":[],"localVars":[]},"body":{"body":"{\nvar _inline_1_v=_inline_1_arg1_,_inline_1_i\nfor(_inline_1_i=0;_inline_1_i<_inline_1_arg2_.length-1;++_inline_1_i) {\n_inline_1_v=_inline_1_v[_inline_1_arg2_[_inline_1_i]]\n}\n_inline_1_arg0_=_inline_1_v[_inline_1_arg2_[_inline_1_arg2_.length-1]]\n}","args":[{"name":"_inline_1_arg0_","lvalue":true,"rvalue":false,"count":1},{"name":"_inline_1_arg1_","lvalue":false,"rvalue":true,"count":1},{"name":"_inline_1_arg2_","lvalue":false,"rvalue":true,"count":4}],"thisVars":[],"localVars":["_inline_1_i","_inline_1_v"]},"post":{"body":"{}","args":[],"thisVars":[],"localVars":[]},"funcName":"convert","blockSize":64})
},{"cwise-compiler":16}],16:[function(require,module,exports){
arguments[4][10][0].apply(exports,arguments)
},{"./lib/thunk.js":18,"dup":10}],17:[function(require,module,exports){
arguments[4][11][0].apply(exports,arguments)
},{"dup":11,"uniq":19}],18:[function(require,module,exports){
arguments[4][12][0].apply(exports,arguments)
},{"./compile.js":17,"dup":12}],19:[function(require,module,exports){
arguments[4][13][0].apply(exports,arguments)
},{"dup":13}],20:[function(require,module,exports){
"use strict"
var ndarray = require("ndarray")
var ops = require("ndarray-ops")
var pool = require("typedarray-pool")
function clone(array) {
var dtype = array.dtype
if(dtype === "generic" || dtype === "array") {
dtype = "double"
}
var data = pool.malloc(array.size, dtype)
var result = ndarray(data, array.shape)
ops.assign(result, array)
return result
}
exports.clone = clone
function malloc(shape, dtype) {
if(!dtype) {
dtype = "double"
}
var sz = 1
var stride = new Array(shape.length)
for(var i=shape.length-1; i>=0; --i) {
stride[i] = sz
sz *= shape[i]
}
return ndarray(pool.malloc(sz, dtype), shape, stride, 0)
}
exports.malloc = malloc
function free(array) {
if(array.dtype === "generic" || array.dtype === "array") {
return
}
pool.free(array.data)
}
exports.free = free
function zeros(shape, dtype) {
if(!dtype) {
dtype = "double"
}
var sz = 1
var stride = new Array(shape.length)
for(var i=shape.length-1; i>=0; --i) {
stride[i] = sz
sz *= shape[i]
}
var buf = pool.malloc(sz, dtype)
for(var i=0; i<sz; ++i) {
buf[i] = 0
}
return ndarray(buf, shape, stride, 0)
}
exports.zeros = zeros
function ones(shape, dtype) {
if(!dtype) {
dtype = "double"
}
var sz = 1
var stride = new Array(shape.length)
for(var i=shape.length-1; i>=0; --i) {
stride[i] = sz
sz *= shape[i]
}
var buf = pool.malloc(sz, dtype)
for(var i=0; i<sz; ++i) {
buf[i] = 1
}
return ndarray(buf, shape, stride, 0)
}
exports.ones = ones
function eye(shape, dtype) {
var i, offset
if(!dtype) {
dtype = "double"
}
var sz = 1
var stride = new Array(shape.length)
for(i=shape.length-1; i>=0; --i) {
stride[i] = sz
sz *= shape[i]
}
var buf = pool.malloc(sz, dtype)
for(i=0; i<sz; ++i) {
buf[i] = 0
}
var mindim = Infinity
var offsum = 0
for( i=shape.length-1; i>=0; i--) {
offsum += stride[i]
mindim = Math.min(mindim,shape[i])
}
for(i=0,offset=0; i<mindim; i++,offset+=offsum) {
buf[offset] = 1
}
return ndarray(buf, shape, stride, 0)
}
exports.eye = eye
},{"ndarray":22,"ndarray-ops":9,"typedarray-pool":26}],21:[function(require,module,exports){
"use strict"
module.exports = ndSelect
module.exports.compile = lookupCache
//Macros
var ARRAY = "a"
var RANK = "K"
var CMP = "C"
var DATA = "d"
var OFFSET = "o"
var RND = "R"
var TMP = "T"
var LO = "L"
var HI = "H"
var PIVOT = "X"
function SHAPE(i) {
return "s" + i
}
function STRIDE(i) {
return "t" + i
}
function STEP(i) {
return "u" + i
}
function STEP_CMP(i) {
return "v" + i
}
function INDEX(i) {
return "i" + i
}
function PICK(i) {
return "p" + i
}
function PTR(i) {
return "x" + i
}
//Create new order where index 0 is slowest index
function permuteOrder(order) {
var norder = order.slice()
norder.splice(order.indexOf(0), 1)
norder.unshift(0)
return norder
}
//Generate quick select procedure
function compileQuickSelect(order, useCompare, dtype) {
order = permuteOrder(order)
var dimension = order.length
var useGetter = (dtype === "generic")
var funcName = "ndSelect" + dtype + order.join("_") + "_" + (useCompare ? "cmp" : "lex")
var code = []
//Get arguments for code
var args = [ARRAY, RANK]
if(useCompare) {
args.push(CMP)
}
//Unpack ndarray variables
var vars = [
DATA + "=" + ARRAY + ".data",
OFFSET + "=" + ARRAY + ".offset|0",
RND + "=Math.random",
TMP]
for(var i=0; i<2; ++i) {
vars.push(PTR(i) + "=0")
}
for(var i=0; i<dimension; ++i) {
vars.push(
SHAPE(i) + "=" + ARRAY + ".shape[" + i + "]|0",
STRIDE(i) + "=" + ARRAY + ".stride[" + i + "]|0",
INDEX(i) + "=0")
}
for(var i=1; i<dimension; ++i) {
if(i > 1) {
vars.push(STEP_CMP(i) + "=(" + STRIDE(i) + "-" + SHAPE(i-1) + "*" + STRIDE(i-1) + ")|0",
STEP(order[i]) + "=(" + STRIDE(order[i]) + "-" + SHAPE(order[i-1]) + "*" + STRIDE(order[i-1]) + ")|0")
} else {
vars.push(STEP_CMP(i) + "=" + STRIDE(i),
STEP(order[i]) + "=" + STRIDE(order[i]))
}
}
if(useCompare) {
for(var i=0; i<2; ++i) {
vars.push(PICK(i) + "=" + ARRAY + ".pick(0)")
}
}
vars.push(
PIVOT + "=0",
LO + "=0",
HI + "=" + SHAPE(order[0]) + "-1")
function compare(out, i0, i1) {
if(useCompare) {
code.push(
PICK(0), ".offset=", OFFSET, "+", STRIDE(order[0]), "*(", i0, ");",
PICK(1), ".offset=", OFFSET, "+", STRIDE(order[0]), "*(", i1, ");",
out, "=", CMP, "(", PICK(0), ",", PICK(1), ");")
} else {
code.push(
PTR(0), "=", OFFSET, "+", STRIDE(0), "*(", i0, ");",
PTR(1), "=", OFFSET, "+", STRIDE(0), "*(", i1, ");")
if(dimension > 1) {
code.push("_cmp:")
}
for(var i=dimension-1; i>0; --i) {
code.push("for(", INDEX(i), "=0;",
INDEX(i), "<", SHAPE(i), ";",
INDEX(i), "++){")
}
if(useGetter) {
code.push(out, "=", DATA, ".get(", PTR(0), ")-",
DATA, ".get(", PTR(1), ");")
} else {
code.push(out, "=", DATA, "[", PTR(0), "]-",
DATA, "[", PTR(1), "];")
}
if(dimension > 1) {
code.push("if(", out, ")break _cmp;")
}
for(var i=1; i<dimension; ++i) {
code.push(
PTR(0), "+=", STEP_CMP(i), ";",
PTR(1), "+=", STEP_CMP(i),
"}")
}
}
}
function swap(i0, i1) {
code.push(
PTR(0), "=", OFFSET, "+", STRIDE(order[0]), "*(", i0, ");",
PTR(1), "=", OFFSET, "+", STRIDE(order[0]), "*(", i1, ");")
for(var i=dimension-1; i>0; --i) {
code.push("for(", INDEX(order[i]), "=0;",
INDEX(order[i]), "<", SHAPE(order[i]), ";",
INDEX(order[i]), "++){")
}
if(useGetter) {
code.push(TMP, "=", DATA, ".get(", PTR(0), ");",
DATA, ".set(", PTR(0), ",", DATA, ".get(", PTR(1), "));",
DATA, ".set(", PTR(1), ",", TMP, ");")
} else {
code.push(TMP, "=", DATA, "[", PTR(0), "];",
DATA, "[", PTR(0), "]=", DATA, "[", PTR(1), "];",
DATA, "[", PTR(1), "]=", TMP, ";")
}
for(var i=1; i<dimension; ++i) {
code.push(
PTR(0), "+=", STEP(order[i]), ";",
PTR(1), "+=", STEP(order[i]),
"}")
}
}
code.push(
"while(", LO, "<", HI, "){",
PIVOT, "=(", RND, "()*(", HI, "-", LO, "+1)+", LO, ")|0;")
//Partition array by pivot
swap(PIVOT, HI) // Store pivot temporarily at the end of the array
code.push(
PIVOT, "=", LO, ";", // PIVOT will now be used to keep track of the end of the interval of elements less than the pivot
"for(", INDEX(0), "=", LO, ";",
INDEX(0), "<", HI, ";",
INDEX(0), "++){") // Loop over other elements (unequal to the pivot), note that HI now points to the pivot
compare(TMP, INDEX(0), HI) // Lexicographical compare of element with pivot
code.push("if(", TMP, "<0){")
swap(PIVOT, INDEX(0)) // Swap current element with element at index PIVOT if it is less than the pivot
code.push(PIVOT, "++;")
code.push("}}")
swap(PIVOT, HI) // Store pivot right after all elements that are less than the pivot (implying that all elements >= the pivot are behind the pivot)
//Check pivot bounds
code.push(
"if(", PIVOT, "===", RANK, "){",
LO, "=", PIVOT, ";",
"break;",
"}else if(", RANK, "<", PIVOT, "){",
HI, "=", PIVOT, "-1;",
"}else{",
LO, "=", PIVOT, "+1;",
"}",
"}")
if(useCompare) {
code.push(PICK(0), ".offset=", OFFSET, "+", LO, "*", STRIDE(0), ";",
"return ", PICK(0), ";")
} else {
code.push("return ", ARRAY, ".pick(", LO, ");")
}
//Compile and link js together
var procCode = [
"'use strict';function ", funcName, "(", args, "){",
"var ", vars.join(), ";",
code.join(""),
"};return ", funcName
].join("")
var proc = new Function(procCode)
return proc()
}
var CACHE = {}
function lookupCache(order, useCompare, dtype) {
var typesig = order.join() + useCompare + dtype
var proc = CACHE[typesig]
if(proc) {
return proc
}
return CACHE[typesig] = compileQuickSelect(order, useCompare, dtype)
}
function ndSelect(array, k, compare) {
k |= 0
if((array.dimension === 0) ||
(array.shape[0] <= k) ||
(k < 0)) {
return null
}
var useCompare = !!compare
var proc = lookupCache(array.order, useCompare, array.dtype)
if(useCompare) {
return proc(array, k, compare)
} else {
return proc(array, k)
}
}
},{}],22:[function(require,module,exports){
var iota = require("iota-array")
var isBuffer = require("is-buffer")
var hasTypedArrays = ((typeof Float64Array) !== "undefined")
function compare1st(a, b) {
return a[0] - b[0]
}
function order() {
var stride = this.stride
var terms = new Array(stride.length)
var i
for(i=0; i<terms.length; ++i) {
terms[i] = [Math.abs(stride[i]), i]
}
terms.sort(compare1st)
var result = new Array(terms.length)
for(i=0; i<result.length; ++i) {
result[i] = terms[i][1]
}
return result
}
function compileConstructor(dtype, dimension) {
var className = ["View", dimension, "d", dtype].join("")
if(dimension < 0) {
className = "View_Nil" + dtype
}
var useGetters = (dtype === "generic")
if(dimension === -1) {
//Special case for trivial arrays
var code =
"function "+className+"(a){this.data=a;};\
var proto="+className+".prototype;\
proto.dtype='"+dtype+"';\
proto.index=function(){return -1};\
proto.size=0;\
proto.dimension=-1;\
proto.shape=proto.stride=proto.order=[];\
proto.lo=proto.hi=proto.transpose=proto.step=\
function(){return new "+className+"(this.data);};\
proto.get=proto.set=function(){};\
proto.pick=function(){return null};\
return function construct_"+className+"(a){return new "+className+"(a);}"
var procedure = new Function(code)
return procedure()
} else if(dimension === 0) {
//Special case for 0d arrays
var code =
"function "+className+"(a,d) {\
this.data = a;\
this.offset = d\
};\
var proto="+className+".prototype;\
proto.dtype='"+dtype+"';\
proto.index=function(){return this.offset};\
proto.dimension=0;\
proto.size=1;\
proto.shape=\
proto.stride=\
proto.order=[];\
proto.lo=\
proto.hi=\
proto.transpose=\
proto.step=function "+className+"_copy() {\
return new "+className+"(this.data,this.offset)\
};\
proto.pick=function "+className+"_pick(){\
return TrivialArray(this.data);\
};\
proto.valueOf=proto.get=function "+className+"_get(){\
return "+(useGetters ? "this.data.get(this.offset)" : "this.data[this.offset]")+
"};\
proto.set=function "+className+"_set(v){\
return "+(useGetters ? "this.data.set(this.offset,v)" : "this.data[this.offset]=v")+"\
};\
return function construct_"+className+"(a,b,c,d){return new "+className+"(a,d)}"
var procedure = new Function("TrivialArray", code)
return procedure(CACHED_CONSTRUCTORS[dtype][0])
}
var code = ["'use strict'"]
//Create constructor for view
var indices = iota(dimension)
var args = indices.map(function(i) { return "i"+i })
var index_str = "this.offset+" + indices.map(function(i) {
return "this.stride[" + i + "]*i" + i
}).join("+")
var shapeArg = indices.map(function(i) {
return "b"+i
}).join(",")
var strideArg = indices.map(function(i) {
return "c"+i
}).join(",")
code.push(
"function "+className+"(a," + shapeArg + "," + strideArg + ",d){this.data=a",
"this.shape=[" + shapeArg + "]",
"this.stride=[" + strideArg + "]",
"this.offset=d|0}",
"var proto="+className+".prototype",
"proto.dtype='"+dtype+"'",
"proto.dimension="+dimension)
//view.size:
code.push("Object.defineProperty(proto,'size',{get:function "+className+"_size(){\
return "+indices.map(function(i) { return "this.shape["+i+"]" }).join("*"),
"}})")
//view.order:
if(dimension === 1) {
code.push("proto.order=[0]")
} else {
code.push("Object.defineProperty(proto,'order',{get:")
if(dimension < 4) {
code.push("function "+className+"_order(){")
if(dimension === 2) {
code.push("return (Math.abs(this.stride[0])>Math.abs(this.stride[1]))?[1,0]:[0,1]}})")
} else if(dimension === 3) {
code.push(
"var s0=Math.abs(this.stride[0]),s1=Math.abs(this.stride[1]),s2=Math.abs(this.stride[2]);\
if(s0>s1){\
if(s1>s2){\
return [2,1,0];\
}else if(s0>s2){\
return [1,2,0];\
}else{\
return [1,0,2];\
}\
}else if(s0>s2){\
return [2,0,1];\
}else if(s2>s1){\
return [0,1,2];\
}else{\
return [0,2,1];\
}}})")
}
} else {
code.push("ORDER})")
}
}
//view.set(i0, ..., v):
code.push(
"proto.set=function "+className+"_set("+args.join(",")+",v){")
if(useGetters) {
code.push("return this.data.set("+index_str+",v)}")
} else {
code.push("return this.data["+index_str+"]=v}")
}
//view.get(i0, ...):
code.push("proto.get=function "+className+"_get("+args.join(",")+"){")
if(useGetters) {
code.push("return this.data.get("+index_str+")}")
} else {
code.push("return this.data["+index_str+"]}")
}
//view.index:
code.push(
"proto.index=function "+className+"_index(", args.join(), "){return "+index_str+"}")
//view.hi():
code.push("proto.hi=function "+className+"_hi("+args.join(",")+"){return new "+className+"(this.data,"+
indices.map(function(i) {
return ["(typeof i",i,"!=='number'||i",i,"<0)?this.shape[", i, "]:i", i,"|0"].join("")
}).join(",")+","+
indices.map(function(i) {
return "this.stride["+i + "]"
}).join(",")+",this.offset)}")
//view.lo():
var a_vars = indices.map(function(i) { return "a"+i+"=this.shape["+i+"]" })
var c_vars = indices.map(function(i) { return "c"+i+"=this.stride["+i+"]" })
code.push("proto.lo=function "+className+"_lo("+args.join(",")+"){var b=this.offset,d=0,"+a_vars.join(",")+","+c_vars.join(","))
for(var i=0; i<dimension; ++i) {
code.push(
"if(typeof i"+i+"==='number'&&i"+i+">=0){\
d=i"+i+"|0;\
b+=c"+i+"*d;\
a"+i+"-=d}")
}
code.push("return new "+className+"(this.data,"+
indices.map(function(i) {
return "a"+i
}).join(",")+","+
indices.map(function(i) {
return "c"+i
}).join(",")+",b)}")
//view.step():
code.push("proto.step=function "+className+"_step("+args.join(",")+"){var "+
indices.map(function(i) {
return "a"+i+"=this.shape["+i+"]"
}).join(",")+","+
indices.map(function(i) {
return "b"+i+"=this.stride["+i+"]"
}).join(",")+",c=this.offset,d=0,ceil=Math.ceil")
for(var i=0; i<dimension; ++i) {
code.push(
"if(typeof i"+i+"==='number'){\
d=i"+i+"|0;\
if(d<0){\
c+=b"+i+"*(a"+i+"-1);\
a"+i+"=ceil(-a"+i+"/d)\
}else{\
a"+i+"=ceil(a"+i+"/d)\
}\
b"+i+"*=d\
}")
}
code.push("return new "+className+"(this.data,"+
indices.map(function(i) {
return "a" + i
}).join(",")+","+
indices.map(function(i) {
return "b" + i
}).join(",")+",c)}")
//view.transpose():
var tShape = new Array(dimension)
var tStride = new Array(dimension)
for(var i=0; i<dimension; ++i) {
tShape[i] = "a[i"+i+"]"
tStride[i] = "b[i"+i+"]"
}
code.push("proto.transpose=function "+className+"_transpose("+args+"){"+
args.map(function(n,idx) { return n + "=(" + n + "===undefined?" + idx + ":" + n + "|0)"}).join(";"),
"var a=this.shape,b=this.stride;return new "+className+"(this.data,"+tShape.join(",")+","+tStride.join(",")+",this.offset)}")
//view.pick():
code.push("proto.pick=function "+className+"_pick("+args+"){var a=[],b=[],c=this.offset")
for(var i=0; i<dimension; ++i) {
code.push("if(typeof i"+i+"==='number'&&i"+i+">=0){c=(c+this.stride["+i+"]*i"+i+")|0}else{a.push(this.shape["+i+"]);b.push(this.stride["+i+"])}")
}
code.push("var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}")
//Add return statement
code.push("return function construct_"+className+"(data,shape,stride,offset){return new "+className+"(data,"+
indices.map(function(i) {
return "shape["+i+"]"
}).join(",")+","+
indices.map(function(i) {
return "stride["+i+"]"
}).join(",")+",offset)}")
//Compile procedure
var procedure = new Function("CTOR_LIST", "ORDER", code.join("\n"))
return procedure(CACHED_CONSTRUCTORS[dtype], order)
}
function arrayDType(data) {
if(isBuffer(data)) {
return "buffer"
}
if(hasTypedArrays) {
switch(Object.prototype.toString.call(data)) {
case "[object Float64Array]":
return "float64"
case "[object Float32Array]":
return "float32"
case "[object Int8Array]":
return "int8"
case "[object Int16Array]":
return "int16"
case "[object Int32Array]":
return "int32"
case "[object Uint8Array]":
return "uint8"
case "[object Uint16Array]":
return "uint16"
case "[object Uint32Array]":
return "uint32"
case "[object Uint8ClampedArray]":
return "uint8_clamped"
}
}
if(Array.isArray(data)) {
return "array"
}
return "generic"
}
var CACHED_CONSTRUCTORS = {
"float32":[],
"float64":[],
"int8":[],
"int16":[],
"int32":[],
"uint8":[],
"uint16":[],
"uint32":[],
"array":[],
"uint8_clamped":[],
"buffer":[],
"generic":[]
}
;(function() {
for(var id in CACHED_CONSTRUCTORS) {
CACHED_CONSTRUCTORS[id].push(compileConstructor(id, -1))
}
});
function wrappedNDArrayCtor(data, shape, stride, offset) {
if(data === undefined) {
var ctor = CACHED_CONSTRUCTORS.array[0]
return ctor([])
} else if(typeof data === "number") {
data = [data]
}
if(shape === undefined) {
shape = [ data.length ]
}
var d = shape.length
if(stride === undefined) {
stride = new Array(d)
for(var i=d-1, sz=1; i>=0; --i) {
stride[i] = sz
sz *= shape[i]
}
}
if(offset === undefined) {
offset = 0
for(var i=0; i<d; ++i) {
if(stride[i] < 0) {
offset -= (shape[i]-1)*stride[i]
}
}
}
var dtype = arrayDType(data)
var ctor_list = CACHED_CONSTRUCTORS[dtype]
while(ctor_list.length <= d+1) {
ctor_list.push(compileConstructor(dtype, ctor_list.length-1))
}
var ctor = ctor_list[d+1]
return ctor(data, shape, stride, offset)
}
module.exports = wrappedNDArrayCtor
},{"iota-array":23,"is-buffer":24}],23:[function(require,module,exports){
"use strict"
function iota(n) {
var result = new Array(n)
for(var i=0; i<n; ++i) {
result[i] = i
}
return result
}
module.exports = iota
},{}],24:[function(require,module,exports){
/*!
* Determine if an object is a Buffer
*
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
* @license MIT
*/
// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}
function isBuffer (obj) {
return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}
// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}
},{}],25:[function(require,module,exports){
"use strict"
function dupe_array(count, value, i) {
var c = count[i]|0
if(c <= 0) {
return []
}
var result = new Array(c), j
if(i === count.length-1) {
for(j=0; j<c; ++j) {
result[j] = value
}
} else {
for(j=0; j<c; ++j) {
result[j] = dupe_array(count, value, i+1)
}
}
return result
}
function dupe_number(count, value) {
var result, i
result = new Array(count)
for(i=0; i<count; ++i) {
result[i] = value
}
return result
}
function dupe(count, value) {
if(typeof value === "undefined") {
value = 0
}
switch(typeof count) {
case "number":
if(count > 0) {
return dupe_number(count|0, value)
}
break
case "object":
if(typeof (count.length) === "number") {
return dupe_array(count, value, 0)
}
break
}
return []
}
module.exports = dupe
},{}],26:[function(require,module,exports){
(function (global,Buffer){
'use strict'
var bits = require('bit-twiddle')
var dup = require('dup')
//Legacy pool support
if(!global.__TYPEDARRAY_POOL) {
global.__TYPEDARRAY_POOL = {
UINT8 : dup([32, 0])
, UINT16 : dup([32, 0])
, UINT32 : dup([32, 0])
, INT8 : dup([32, 0])
, INT16 : dup([32, 0])
, INT32 : dup([32, 0])
, FLOAT : dup([32, 0])
, DOUBLE : dup([32, 0])
, DATA : dup([32, 0])
, UINT8C : dup([32, 0])
, BUFFER : dup([32, 0])
}
}
var hasUint8C = (typeof Uint8ClampedArray) !== 'undefined'
var POOL = global.__TYPEDARRAY_POOL
//Upgrade pool
if(!POOL.UINT8C) {
POOL.UINT8C = dup([32, 0])
}
if(!POOL.BUFFER) {
POOL.BUFFER = dup([32, 0])
}
//New technique: Only allocate from ArrayBufferView and Buffer
var DATA = POOL.DATA
, BUFFER = POOL.BUFFER
exports.free = function free(array) {
if(Buffer.isBuffer(array)) {
BUFFER[bits.log2(array.length)].push(array)
} else {
if(Object.prototype.toString.call(array) !== '[object ArrayBuffer]') {
array = array.buffer
}
if(!array) {
return
}
var n = array.length || array.byteLength
var log_n = bits.log2(n)|0
DATA[log_n].push(array)
}
}
function freeArrayBuffer(buffer) {
if(!buffer) {
return
}
var n = buffer.length || buffer.byteLength
var log_n = bits.log2(n)
DATA[log_n].push(buffer)
}
function freeTypedArray(array) {
freeArrayBuffer(array.buffer)
}
exports.freeUint8 =
exports.freeUint16 =
exports.freeUint32 =
exports.freeInt8 =
exports.freeInt16 =
exports.freeInt32 =
exports.freeFloat32 =
exports.freeFloat =
exports.freeFloat64 =
exports.freeDouble =
exports.freeUint8Clamped =
exports.freeDataView = freeTypedArray
exports.freeArrayBuffer = freeArrayBuffer
exports.freeBuffer = function freeBuffer(array) {
BUFFER[bits.log2(array.length)].push(array)
}
exports.malloc = function malloc(n, dtype) {
if(dtype === undefined || dtype === 'arraybuffer') {
return mallocArrayBuffer(n)
} else {
switch(dtype) {
case 'uint8':
return mallocUint8(n)
case 'uint16':
return mallocUint16(n)
case 'uint32':
return mallocUint32(n)
case 'int8':
return mallocInt8(n)
case 'int16':
return mallocInt16(n)
case 'int32':
return mallocInt32(n)
case 'float':
case 'float32':
return mallocFloat(n)
case 'double':
case 'float64':
return mallocDouble(n)
case 'uint8_clamped':
return mallocUint8Clamped(n)
case 'buffer':
return mallocBuffer(n)
case 'data':
case 'dataview':
return mallocDataView(n)
default:
return null
}
}
return null
}
function mallocArrayBuffer(n) {
var n = bits.nextPow2(n)
var log_n = bits.log2(n)
var d = DATA[log_n]
if(d.length > 0) {
return d.pop()
}
return new ArrayBuffer(n)
}
exports.mallocArrayBuffer = mallocArrayBuffer
function mallocUint8(n) {
return new Uint8Array(mallocArrayBuffer(n), 0, n)
}
exports.mallocUint8 = mallocUint8
function mallocUint16(n) {
return new Uint16Array(mallocArrayBuffer(2*n), 0, n)
}
exports.mallocUint16 = mallocUint16
function mallocUint32(n) {
return new Uint32Array(mallocArrayBuffer(4*n), 0, n)
}
exports.mallocUint32 = mallocUint32
function mallocInt8(n) {
return new Int8Array(mallocArrayBuffer(n), 0, n)
}
exports.mallocInt8 = mallocInt8
function mallocInt16(n) {
return new Int16Array(mallocArrayBuffer(2*n), 0, n)
}
exports.mallocInt16 = mallocInt16
function mallocInt32(n) {
return new Int32Array(mallocArrayBuffer(4*n), 0, n)
}
exports.mallocInt32 = mallocInt32
function mallocFloat(n) {
return new Float32Array(mallocArrayBuffer(4*n), 0, n)
}
exports.mallocFloat32 = exports.mallocFloat = mallocFloat
function mallocDouble(n) {
return new Float64Array(mallocArrayBuffer(8*n), 0, n)
}
exports.mallocFloat64 = exports.mallocDouble = mallocDouble
function mallocUint8Clamped(n) {
if(hasUint8C) {
return new Uint8ClampedArray(mallocArrayBuffer(n), 0, n)
} else {
return mallocUint8(n)
}
}
exports.mallocUint8Clamped = mallocUint8Clamped
function mallocDataView(n) {
return new DataView(mallocArrayBuffer(n), 0, n)
}
exports.mallocDataView = mallocDataView
function mallocBuffer(n) {
n = bits.nextPow2(n)
var log_n = bits.log2(n)
var cache = BUFFER[log_n]
if(cache.length > 0) {
return cache.pop()
}
return new Buffer(n)
}
exports.mallocBuffer = mallocBuffer
exports.clearCache = function clearCache() {
for(var i=0; i<32; ++i) {
POOL.UINT8[i].length = 0
POOL.UINT16[i].length = 0
POOL.UINT32[i].length = 0
POOL.INT8[i].length = 0
POOL.INT16[i].length = 0
POOL.INT32[i].length = 0
POOL.FLOAT[i].length = 0
POOL.DOUBLE[i].length = 0
POOL.UINT8C[i].length = 0
DATA[i].length = 0
BUFFER[i].length = 0
}
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy90eXBlZGFycmF5LXBvb2wvcG9vbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG52YXIgYml0cyA9IHJlcXVpcmUoJ2JpdC10d2lkZGxlJylcbnZhciBkdXAgPSByZXF1aXJlKCdkdXAnKVxuXG4vL0xlZ2FjeSBwb29sIHN1cHBvcnRcbmlmKCFnbG9iYWwuX19UWVBFREFSUkFZX1BPT0wpIHtcbiAgZ2xvYmFsLl9fVFlQRURBUlJBWV9QT09MID0ge1xuICAgICAgVUlOVDggICA6IGR1cChbMzIsIDBdKVxuICAgICwgVUlOVDE2ICA6IGR1cChbMzIsIDBdKVxuICAgICwgVUlOVDMyICA6IGR1cChbMzIsIDBdKVxuICAgICwgSU5UOCAgICA6IGR1cChbMzIsIDBdKVxuICAgICwgSU5UMTYgICA6IGR1cChbMzIsIDBdKVxuICAgICwgSU5UMzIgICA6IGR1cChbMzIsIDBdKVxuICAgICwgRkxPQVQgICA6IGR1cChbMzIsIDBdKVxuICAgICwgRE9VQkxFICA6IGR1cChbMzIsIDBdKVxuICAgICwgREFUQSAgICA6IGR1cChbMzIsIDBdKVxuICAgICwgVUlOVDhDICA6IGR1cChbMzIsIDBdKVxuICAgICwgQlVGRkVSICA6IGR1cChbMzIsIDBdKVxuICB9XG59XG5cbnZhciBoYXNVaW50OEMgPSAodHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSAhPT0gJ3VuZGVmaW5lZCdcbnZhciBQT09MID0gZ2xvYmFsLl9fVFlQRURBUlJBWV9QT09MXG5cbi8vVXBncmFkZSBwb29sXG5pZighUE9PTC5VSU5UOEMpIHtcbiAgUE9PTC5VSU5UOEMgPSBkdXAoWzMyLCAwXSlcbn1cbmlmKCFQT09MLkJVRkZFUikge1xuICBQT09MLkJVRkZFUiA9IGR1cChbMzIsIDBdKVxufVxuXG4vL05ldyB0ZWNobmlxdWU6IE9ubHkgYWxsb2NhdGUgZnJvbSBBcnJheUJ1ZmZlclZpZXcgYW5kIEJ1ZmZlclxudmFyIERBVEEgICAgPSBQT09MLkRBVEFcbiAgLCBCVUZGRVIgID0gUE9PTC5CVUZGRVJcblxuZXhwb3J0cy5mcmVlID0gZnVuY3Rpb24gZnJlZShhcnJheSkge1xuICBpZihCdWZmZXIuaXNCdWZmZXIoYXJyYXkpKSB7XG4gICAgQlVGRkVSW2JpdHMubG9nMihhcnJheS5sZW5ndGgpXS5wdXNoKGFycmF5KVxuICB9IGVsc2Uge1xuICAgIGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnJheSkgIT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGFycmF5ID0gYXJyYXkuYnVmZmVyXG4gICAgfVxuICAgIGlmKCFhcnJheSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHZhciBuID0gYXJyYXkubGVuZ3RoIHx8IGFycmF5LmJ5dGVMZW5ndGhcbiAgICB2YXIgbG9nX24gPSBiaXRzLmxvZzIobil8MFxuICAgIERBVEFbbG9nX25dLnB1c2goYXJyYXkpXG4gIH1cbn1cblxuZnVuY3Rpb24gZnJlZUFycmF5QnVmZmVyKGJ1ZmZlcikge1xuICBpZighYnVmZmVyKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIG4gPSBidWZmZXIubGVuZ3RoIHx8IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gIHZhciBsb2dfbiA9IGJpdHMubG9nMihuKVxuICBEQVRBW2xvZ19uXS5wdXNoKGJ1ZmZlcilcbn1cblxuZnVuY3Rpb24gZnJlZVR5cGVkQXJyYXkoYXJyYXkpIHtcbiAgZnJlZUFycmF5QnVmZmVyKGFycmF5LmJ1ZmZlcilcbn1cblxuZXhwb3J0cy5mcmVlVWludDggPVxuZXhwb3J0cy5mcmVlVWludDE2ID1cbmV4cG9ydHMuZnJlZVVpbnQzMiA9XG5leHBvcnRzLmZyZWVJbnQ4ID1cbmV4cG9ydHMuZnJlZUludDE2ID1cbmV4cG9ydHMuZnJlZUludDMyID1cbmV4cG9ydHMuZnJlZUZsb2F0MzIgPSBcbmV4cG9ydHMuZnJlZUZsb2F0ID1cbmV4cG9ydHMuZnJlZUZsb2F0NjQgPSBcbmV4cG9ydHMuZnJlZURvdWJsZSA9IFxuZXhwb3J0cy5mcmVlVWludDhDbGFtcGVkID0gXG5leHBvcnRzLmZyZWVEYXRhVmlldyA9IGZyZWVUeXBlZEFycmF5XG5cbmV4cG9ydHMuZnJlZUFycmF5QnVmZmVyID0gZnJlZUFycmF5QnVmZmVyXG5cbmV4cG9ydHMuZnJlZUJ1ZmZlciA9IGZ1bmN0aW9uIGZyZWVCdWZmZXIoYXJyYXkpIHtcbiAgQlVGRkVSW2JpdHMubG9nMihhcnJheS5sZW5ndGgpXS5wdXNoKGFycmF5KVxufVxuXG5leHBvcnRzLm1hbGxvYyA9IGZ1bmN0aW9uIG1hbGxvYyhuLCBkdHlwZSkge1xuICBpZihkdHlwZSA9PT0gdW5kZWZpbmVkIHx8IGR0eXBlID09PSAnYXJyYXlidWZmZXInKSB7XG4gICAgcmV0dXJuIG1hbGxvY0FycmF5QnVmZmVyKG4pXG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoKGR0eXBlKSB7XG4gICAgICBjYXNlICd1aW50OCc6XG4gICAgICAgIHJldHVybiBtYWxsb2NVaW50OChuKVxuICAgICAgY2FzZSAndWludDE2JzpcbiAgICAgICAgcmV0dXJuIG1hbGxvY1VpbnQxNihuKVxuICAgICAgY2FzZSAndWludDMyJzpcbiAgICAgICAgcmV0dXJuIG1hbGxvY1VpbnQzMihuKVxuICAgICAgY2FzZSAnaW50OCc6XG4gICAgICAgIHJldHVybiBtYWxsb2NJbnQ4KG4pXG4gICAgICBjYXNlICdpbnQxNic6XG4gICAgICAgIHJldHVybiBtYWxsb2NJbnQxNihuKVxuICAgICAgY2FzZSAnaW50MzInOlxuICAgICAgICByZXR1cm4gbWFsbG9jSW50MzIobilcbiAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgIGNhc2UgJ2Zsb2F0MzInOlxuICAgICAgICByZXR1cm4gbWFsbG9jRmxvYXQobilcbiAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICBjYXNlICdmbG9hdDY0JzpcbiAgICAgICAgcmV0dXJuIG1hbGxvY0RvdWJsZShuKVxuICAgICAgY2FzZSAndWludDhfY2xhbXBlZCc6XG4gICAgICAgIHJldHVybiBtYWxsb2NVaW50OENsYW1wZWQobilcbiAgICAgIGNhc2UgJ2J1ZmZlcic6XG4gICAgICAgIHJldHVybiBtYWxsb2NCdWZmZXIobilcbiAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgY2FzZSAnZGF0YXZpZXcnOlxuICAgICAgICByZXR1cm4gbWFsbG9jRGF0YVZpZXcobilcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gbWFsbG9jQXJyYXlCdWZmZXIobikge1xuICB2YXIgbiA9IGJpdHMubmV4dFBvdzIobilcbiAgdmFyIGxvZ19uID0gYml0cy5sb2cyKG4pXG4gIHZhciBkID0gREFUQVtsb2dfbl1cbiAgaWYoZC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGQucG9wKClcbiAgfVxuICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKG4pXG59XG5leHBvcnRzLm1hbGxvY0FycmF5QnVmZmVyID0gbWFsbG9jQXJyYXlCdWZmZXJcblxuZnVuY3Rpb24gbWFsbG9jVWludDgobikge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobWFsbG9jQXJyYXlCdWZmZXIobiksIDAsIG4pXG59XG5leHBvcnRzLm1hbGxvY1VpbnQ4ID0gbWFsbG9jVWludDhcblxuZnVuY3Rpb24gbWFsbG9jVWludDE2KG4pIHtcbiAgcmV0dXJuIG5ldyBVaW50MTZBcnJheShtYWxsb2NBcnJheUJ1ZmZlcigyKm4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NVaW50MTYgPSBtYWxsb2NVaW50MTZcblxuZnVuY3Rpb24gbWFsbG9jVWludDMyKG4pIHtcbiAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShtYWxsb2NBcnJheUJ1ZmZlcig0Km4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NVaW50MzIgPSBtYWxsb2NVaW50MzJcblxuZnVuY3Rpb24gbWFsbG9jSW50OChuKSB7XG4gIHJldHVybiBuZXcgSW50OEFycmF5KG1hbGxvY0FycmF5QnVmZmVyKG4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NJbnQ4ID0gbWFsbG9jSW50OFxuXG5mdW5jdGlvbiBtYWxsb2NJbnQxNihuKSB7XG4gIHJldHVybiBuZXcgSW50MTZBcnJheShtYWxsb2NBcnJheUJ1ZmZlcigyKm4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NJbnQxNiA9IG1hbGxvY0ludDE2XG5cbmZ1bmN0aW9uIG1hbGxvY0ludDMyKG4pIHtcbiAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KG1hbGxvY0FycmF5QnVmZmVyKDQqbiksIDAsIG4pXG59XG5leHBvcnRzLm1hbGxvY0ludDMyID0gbWFsbG9jSW50MzJcblxuZnVuY3Rpb24gbWFsbG9jRmxvYXQobikge1xuICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShtYWxsb2NBcnJheUJ1ZmZlcig0Km4pLCAwLCBuKVxufVxuZXhwb3J0cy5tYWxsb2NGbG9hdDMyID0gZXhwb3J0cy5tYWxsb2NGbG9hdCA9IG1hbGxvY0Zsb2F0XG5cbmZ1bmN0aW9uIG1hbGxvY0RvdWJsZShuKSB7XG4gIHJldHVybiBuZXcgRmxvYXQ2NEFycmF5KG1hbGxvY0FycmF5QnVmZmVyKDgqbiksIDAsIG4pXG59XG5leHBvcnRzLm1hbGxvY0Zsb2F0NjQgPSBleHBvcnRzLm1hbGxvY0RvdWJsZSA9IG1hbGxvY0RvdWJsZVxuXG5mdW5jdGlvbiBtYWxsb2NVaW50OENsYW1wZWQobikge1xuICBpZihoYXNVaW50OEMpIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1hbGxvY0FycmF5QnVmZmVyKG4pLCAwLCBuKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBtYWxsb2NVaW50OChuKVxuICB9XG59XG5leHBvcnRzLm1hbGxvY1VpbnQ4Q2xhbXBlZCA9IG1hbGxvY1VpbnQ4Q2xhbXBlZFxuXG5mdW5jdGlvbiBtYWxsb2NEYXRhVmlldyhuKSB7XG4gIHJldHVybiBuZXcgRGF0YVZpZXcobWFsbG9jQXJyYXlCdWZmZXIobiksIDAsIG4pXG59XG5leHBvcnRzLm1hbGxvY0RhdGFWaWV3ID0gbWFsbG9jRGF0YVZpZXdcblxuZnVuY3Rpb24gbWFsbG9jQnVmZmVyKG4pIHtcbiAgbiA9IGJpdHMubmV4dFBvdzIobilcbiAgdmFyIGxvZ19uID0gYml0cy5sb2cyKG4pXG4gIHZhciBjYWNoZSA9IEJVRkZFUltsb2dfbl1cbiAgaWYoY2FjaGUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBjYWNoZS5wb3AoKVxuICB9XG4gIHJldHVybiBuZXcgQnVmZmVyKG4pXG59XG5leHBvcnRzLm1hbGxvY0J1ZmZlciA9IG1hbGxvY0J1ZmZlclxuXG5leHBvcnRzLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiBjbGVhckNhY2hlKCkge1xuICBmb3IodmFyIGk9MDsgaTwzMjsgKytpKSB7XG4gICAgUE9PTC5VSU5UOFtpXS5sZW5ndGggPSAwXG4gICAgUE9PTC5VSU5UMTZbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuVUlOVDMyW2ldLmxlbmd0aCA9IDBcbiAgICBQT09MLklOVDhbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuSU5UMTZbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuSU5UMzJbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuRkxPQVRbaV0ubGVuZ3RoID0gMFxuICAgIFBPT0wuRE9VQkxFW2ldLmxlbmd0aCA9IDBcbiAgICBQT09MLlVJTlQ4Q1tpXS5sZW5ndGggPSAwXG4gICAgREFUQVtpXS5sZW5ndGggPSAwXG4gICAgQlVGRkVSW2ldLmxlbmd0aCA9IDBcbiAgfVxufSJdfQ==
},{"bit-twiddle":6,"buffer":1,"dup":25}],"static-kdtree":[function(require,module,exports){
"use strict"
module.exports = createKDTree
module.exports.deserialize = deserializeKDTree
var ndarray = require("ndarray")
var ndselect = require("ndarray-select")
var pack = require("ndarray-pack")
var ops = require("ndarray-ops")
var ndscratch = require("ndarray-scratch")
var pool = require("typedarray-pool")
var inorderTree = require("inorder-tree-layout")
var bits = require("bit-twiddle")
var KDTHeap = require("./lib/heap.js")
function KDTree(points, ids, n, d) {
this.points = points
this.ids = ids
this.dimension = d
this.length = n
}
var proto = KDTree.prototype
proto.serialize = function() {
if(this.length > 0) {
return {
p: Array.prototype.slice.call(this.points.data, 0, this.length*this.dimension),
i: Array.prototype.slice.call(this.ids, 0, this.length)
}
} else {
return { d: this.dimension }
}
}
//Range query
proto.range = function kdtRangeQuery(lo, hi, visit) {
var n = this.length
if(n < 1) {
return
}
//Check degenerate case
var d = this.dimension
for(var i=0; i<d; ++i) {
if(hi[i] < lo[i]) {
return
}
}
var points = this.points
var ids = this.ids
//Walk tree in level order, skipping subtrees which do not intersect range
var visitRange = ndscratch.malloc([n, 2, d])
var visitIndex = pool.mallocInt32(n)
var rangeData = visitRange.data
var pointData = points.data
var visitCount = 1
var visitTop = 0
var retval
visitIndex[0] = 0
pack(lo, visitRange.pick(0,0))
pack(hi, visitRange.pick(0,1))
while(visitTop < visitCount) {
var idx = visitIndex[visitTop]
var k = bits.log2(idx+1)%d
var loidx = visitRange.index(visitTop, 0, 0)
var hiidx = visitRange.index(visitTop, 1, 0)
var pidx = points.index(idx, 0)
var visitPoint = true
for(var i=0; i<d; ++i) {
var pc = pointData[pidx+i]
if((pc < rangeData[loidx + i]) ||
(rangeData[hiidx + i] < pc)) {
visitPoint = false
break
}
}
if(visitPoint) {
retval = visit(ids[idx])
if(retval !== undefined) {
break
}
}
//Visit children
var pk = pointData[pidx+k]
var hk = rangeData[hiidx+k]
var lk = rangeData[loidx+k]
if(lk <= pk) {
var left = 2 * idx + 1
if(left < n) {
visitIndex[visitCount] = left
var y = visitRange.index(visitCount, 0, 0)
for(var i=0; i<d; ++i) {
rangeData[y+i] = rangeData[loidx+i]
}
var z = visitRange.index(visitCount, 1, 0)
for(var i=0; i<d; ++i) {
rangeData[z+i] = rangeData[hiidx+i]
}
rangeData[z+k] = Math.min(hk, pk)
visitCount += 1
}
}
if(pk <= hk) {
var right = 2 * (idx + 1)
if(right < n) {
visitIndex[visitCount] = right
var y = visitRange.index(visitCount, 0, 0)
for(var i=0; i<d; ++i) {
rangeData[y+i] = rangeData[loidx+i]
}
var z = visitRange.index(visitCount, 1, 0)
for(var i=0; i<d; ++i) {
rangeData[z+i] = rangeData[hiidx+i]
}
rangeData[y+k] = Math.max(lk, pk)
visitCount += 1
}
}
//Increment pointer
visitTop += 1
}
ndscratch.free(visitRange)
pool.free(visitIndex)
return retval
}
proto.rnn = function(point, radius, visit) {
if(radius < 0) {
return
}
var n = this.length
if(n < 1) {
return
}
var d = this.dimension
var points = this.points
var ids = this.ids
//Walk tree in level order, skipping subtrees which do not intersect sphere
var visitDistance = ndscratch.malloc([n, d])
var visitIndex = pool.mallocInt32(n)
var distanceData = visitDistance.data
var pointData = points.data
var visitCount = 1
var visitTop = 0
var r2 = radius*radius
var retval
//Initialize top of queue
visitIndex[0] = 0
for(var i=0; i<d; ++i) {
visitDistance.set(0, i, 0)
}
//Walk over queue
while(visitTop < visitCount) {
var idx = visitIndex[visitTop]
var pidx = points.index(idx, 0)
//Check if point in sphere
var d2 = 0.0
for(var i=0; i<d; ++i) {
d2 += Math.pow(point[i] - pointData[pidx+i], 2)
}
if(d2 <= r2) {
retval = visit(ids[idx])
if(retval !== undefined) {
break
}
}
//Visit children
var k = bits.log2(idx+1)%d
var ds = 0.0
var didx = visitDistance.index(visitTop, 0)
for(var i=0; i<d; ++i) {
if(i !== k) {
ds += distanceData[didx + i]
}
}
//Handle split axis
var qk = point[k]
var pk = pointData[pidx+k]
var dk = distanceData[didx+k]
var lk = dk
var hk = dk
if(qk < pk) {
hk = Math.max(dk, Math.pow(pk - qk, 2))
} else {
lk = Math.max(dk, Math.pow(pk - qk, 2))
}
var d2l = lk + ds
var d2h = hk + ds
if(d2l <= r2) {
var left = 2 * idx + 1
if(left < n) {
visitIndex[visitCount] = left
var y = visitDistance.index(visitCount, 0)
for(var i=0; i<d; ++i) {
distanceData[y+i] = distanceData[didx+i]
}
distanceData[y+k] = lk
visitCount += 1
}
}
if(d2h <= r2) {
var right = 2 * (idx + 1)
if(right < n) {
visitIndex[visitCount] = right
var y = visitDistance.index(visitCount, 0)
for(var i=0; i<d; ++i) {
distanceData[y+i] = distanceData[didx+i]
}
distanceData[y+k] = hk
visitCount += 1
}
}
//Increment pointer
visitTop += 1
}
ndscratch.free(visitDistance)
pool.free(visitIndex)
return retval
}
proto.nn = function(point, maxDistance) {
var n = this.length
if(n < 1) {
return -1
}
if(typeof maxDistance === "number") {
if(maxDistance < 0) {
return -1
}
} else {
maxDistance = Infinity
}
var d = this.dimension
var points = this.points
var pointData = points.data
var dataVector = pool.mallocFloat64(d)
var toVisit = new KDTHeap(n, d+1)
var index = toVisit.index
var data = toVisit.data
index[0] = 0
for(var i=0; i<=d; ++i) {
data[i] = 0
}
toVisit.count += 1
var nearest = -1
var nearestD = maxDistance
while(toVisit.count > 0) {
if(data[0] >= nearestD) {
break
}
var idx = index[0]
var pidx = points.index(idx, 0)
var d2 = 0.0
for(var i=0; i<d; ++i) {
d2 += Math.pow(point[i]-pointData[pidx+i], 2)
}
if(d2 < nearestD) {
nearestD = d2
nearest = idx
}
//Compute distance bounds for children
var k = bits.log2(idx+1)%d
var ds = 0
for(var i=0; i<d; ++i) {
var dd = data[i+1]
if(i !== k) {
ds += dd
}
dataVector[i] = dd
}
var qk = point[k]
var pk = pointData[pidx+k]
var dk = dataVector[k]
var lk = dk
var hk = dk
if(qk < pk) {
hk = Math.max(dk, Math.pow(pk - qk, 2))
} else {
lk = Math.max(dk, Math.pow(pk - qk, 2))
}
var d2l = lk + ds
var d2h = hk + ds
toVisit.pop()
if(d2l < nearestD) {
var left = 2 * idx + 1
if(left < n) {
var vcount = toVisit.count
index[vcount] = left
var vptr = vcount * (d+1)
data[vptr] = d2l
for(var i=1; i<=d; ++i) {
data[vptr+i] = dataVector[i-1]
}
data[vptr+k+1] = lk
toVisit.push()
}
}
if(d2h < nearestD) {
var right = 2 * (idx + 1)
if(right < n) {
var vcount = toVisit.count
index[vcount] = right
var vptr = vcount * (d+1)
data[vptr] = d2h
for(var i=1; i<=d; ++i) {
data[vptr+i] = dataVector[i-1]
}
data[vptr+k+1] = hk
toVisit.push()
}
}
}
pool.freeFloat64(dataVector)
toVisit.dispose()
if(nearest < 0) {
return -1
}
return this.ids[nearest]
}
proto.knn = function(point, maxPoints, maxDistance) {
//Check degenerate cases
if(typeof maxDistance === "number") {
if(maxDistance < 0) {
return []
}
} else {
maxDistance = Infinity
}
var n = this.length
if(n < 1) {
return []
}
if(typeof maxPoints === "number") {
if(maxPoints <= 0) {
return []
}
maxPoints = Math.min(maxPoints, n)|0
} else {
maxPoints = n
}
var ids = this.ids
var d = this.dimension
var points = this.points
var pointData = points.data
var dataVector = pool.mallocFloat64(d)
//List of closest points
var closestPoints = new KDTHeap(maxPoints, 1)
var cl_index = closestPoints.index
var cl_data = closestPoints.data
var toVisit = new KDTHeap(n, d+1)
var index = toVisit.index
var data = toVisit.data
index[0] = 0
for(var i=0; i<=d; ++i) {
data[i] = 0
}
toVisit.count += 1
var nearest = -1
var nearestD = maxDistance
while(toVisit.count > 0) {
if(data[0] >= nearestD) {
break
}
var idx = index[0]
var pidx = points.index(idx, 0)
var d2 = 0.0
for(var i=0; i<d; ++i) {
d2 += Math.pow(point[i]-pointData[pidx+i], 2)
}
if(d2 < nearestD) {
if(closestPoints.count >= maxPoints) {
closestPoints.pop()
}
var pcount = closestPoints.count
cl_index[pcount] = idx
cl_data[pcount] = -d2
closestPoints.push()
if(closestPoints.count >= maxPoints) {
nearestD = -cl_data[0]
}
}
//Compute distance bounds for children
var k = bits.log2(idx+1)%d
var ds = 0
for(var i=0; i<d; ++i) {
var dd = data[i+1]
if(i !== k) {
ds += dd
}
dataVector[i] = dd
}
var qk = point[k]
var pk = pointData[pidx+k]
var dk = dataVector[k]
var lk = dk
var hk = dk
if(qk < pk) {
hk = Math.max(dk, Math.pow(pk - qk, 2))
} else {
lk = Math.max(dk, Math.pow(pk - qk, 2))
}
var d2l = lk + ds
var d2h = hk + ds
toVisit.pop()
if(d2l < nearestD) {
var left = 2 * idx + 1
if(left < n) {
var vcount = toVisit.count
index[vcount] = left
var vptr = vcount * (d+1)
data[vptr] = d2l
for(var i=1; i<=d; ++i) {
data[vptr+i] = dataVector[i-1]
}
data[vptr+k+1] = lk
toVisit.push()
}
}
if(d2h < nearestD) {
var right = 2 * (idx + 1)
if(right < n) {
var vcount = toVisit.count
index[vcount] = right
var vptr = vcount * (d+1)
data[vptr] = d2h
for(var i=1; i<=d; ++i) {
data[vptr+i] = dataVector[i-1]
}
data[vptr+k+1] = hk
toVisit.push()
}
}
}
pool.freeFloat64(dataVector)
toVisit.dispose()
//Sort result
var result = new Array(closestPoints.count)
var ids = this.ids
for(var i=closestPoints.count-1; i>=0; --i) {
result[i] = ids[cl_index[0]]
closestPoints.pop()
}
closestPoints.dispose()
return result
}
proto.dispose = function kdtDispose() {
pool.free(this.points.data)
pool.freeInt32(this.ids)
this.points = null
this.ids = null
this.length = 0
}
function createKDTree(points) {
var n, d, indexed
if(Array.isArray(points)) {
n = points.length
if(n === 0) {
return new KDTree(null, null, 0, 0)
}
d = points[0].length
indexed = ndarray(pool.mallocDouble(n*(d+1)), [n, d+1])
pack(points, indexed.hi(n, d))
} else {
n = points.shape[0]
d = points.shape[1]
//Round up data type size
var type = points.dtype
if(type === "int8" ||
type === "int16" ||
type === "int32" ) {
type = "int32"
} else if(type === "uint8" ||
type === "uint8_clamped" ||
type === "buffer" ||
type === "uint16" ||
type === "uint32") {
type = "uint32"
} else if(type === "float32") {
type = "float32"
} else {
type = "float64"
}
indexed = ndarray(pool.malloc(n*(d+1)), [n, d+1])
ops.assign(indexed.hi(n,d), points)
}
for(var i=0; i<n; ++i) {
indexed.set(i, d, i)
}
var pointArray = ndscratch.malloc([n, d], points.dtype)
var indexArray = pool.mallocInt32(n)
var pointer = 0
var pointData = pointArray.data
var arrayData = indexed.data
var l2_n = bits.log2(bits.nextPow2(n))
var sel_cmp = ndselect.compile(indexed.order, true, indexed.dtype)
//Walk tree in level order
var toVisit = [indexed]
while(pointer < n) {
var head = toVisit.shift()
var array = head
var nn = array.shape[0]|0
//Find median
if(nn > 1) {
var k = bits.log2(pointer+1)%d
var median
var n_2 = inorderTree.root(nn)
median = sel_cmp(array, n_2, function(a,b) {
return a.get(k) - b.get(k)
})
//Copy into new array
var pptr = pointArray.index(pointer, 0)
var mptr = median.offset
for(var i=0; i<d; ++i) {
pointData[pptr++] = arrayData[mptr++]
}
indexArray[pointer] = arrayData[mptr]
pointer += 1
//Queue new items
toVisit.push(array.hi(n_2))
if(nn > 2) {
toVisit.push(array.lo(n_2+1))
}
} else {
//Copy into new array
var mptr = array.offset
var pptr = pointArray.index(pointer, 0)
for(var i=0; i<d; ++i) {
pointData[pptr+i] = arrayData[mptr++]
}
indexArray[pointer] = arrayData[mptr]
pointer += 1
}
}
//Release indexed
pool.free(indexed.data)
return new KDTree(pointArray, indexArray, n, d)
}
function deserializeKDTree(data) {
var points = data.p
var ids = data.i
if(points) {
var nd = points.length
var pointArray = pool.mallocFloat64(nd)
for(var i=0; i<nd; ++i) {
pointArray[i] = points[i]
}
var n = ids.length
var idArray = pool.mallocInt32(n)
for(var i=0; i<n; ++i) {
idArray[i] = ids[i]
}
var d = (nd/n)|0
return new KDTree(
ndarray(pointArray, [n,d]),
idArray,
n,
d)
} else {
return new KDTree(null, null, 0, data.d)
}
}
},{"./lib/heap.js":5,"bit-twiddle":6,"inorder-tree-layout":7,"ndarray":22,"ndarray-ops":9,"ndarray-pack":14,"ndarray-scratch":20,"ndarray-select":21,"typedarray-pool":26}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2J1ZmZlci9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2xpYi9iNjQuanMiLCIuLi8uLi8uLi8uLi9ob21lL2FkbWluL2Jyb3dzZXJpZnktY2RuL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi9ob21lL2FkbWluL2Jyb3dzZXJpZnktY2RuL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJsaWIvaGVhcC5qcyIsIm5vZGVfbW9kdWxlcy9iaXQtdHdpZGRsZS90d2lkZGxlLmpzIiwibm9kZV9tb2R1bGVzL2lub3JkZXItdHJlZS1sYXlvdXQvaW5vcmRlci5qcyIsIm5vZGVfbW9kdWxlcy9uZGFycmF5LW9wcy9uZGFycmF5LW9wcy5qcyIsIm5vZGVfbW9kdWxlcy9uZGFycmF5LW9wcy9ub2RlX21vZHVsZXMvY3dpc2UtY29tcGlsZXIvY29tcGlsZXIuanMiLCJub2RlX21vZHVsZXMvbmRhcnJheS1vcHMvbm9kZV9tb2R1bGVzL2N3aXNlLWNvbXBpbGVyL2xpYi9jb21waWxlLmpzIiwibm9kZV9tb2R1bGVzL25kYXJyYXktb3BzL25vZGVfbW9kdWxlcy9jd2lzZS1jb21waWxlci9saWIvdGh1bmsuanMiLCJub2RlX21vZHVsZXMvbmRhcnJheS1vcHMvbm9kZV9tb2R1bGVzL2N3aXNlLWNvbXBpbGVyL25vZGVfbW9kdWxlcy91bmlxL3VuaXEuanMiLCJub2RlX21vZHVsZXMvbmRhcnJheS1wYWNrL2NvbnZlcnQuanMiLCJub2RlX21vZHVsZXMvbmRhcnJheS1wYWNrL2RvQ29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9uZGFycmF5LXNjcmF0Y2gvc2NyYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9uZGFycmF5LXNlbGVjdC9zZWxlY3QuanMiLCJub2RlX21vZHVsZXMvbmRhcnJheS9uZGFycmF5LmpzIiwibm9kZV9tb2R1bGVzL25kYXJyYXkvbm9kZV9tb2R1bGVzL2lvdGEtYXJyYXkvaW90YS5qcyIsIm5vZGVfbW9kdWxlcy9uZGFycmF5L25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHlwZWRhcnJheS1wb29sL25vZGVfbW9kdWxlcy9kdXAvZHVwLmpzIiwibm9kZV9tb2R1bGVzL3R5cGVkYXJyYXktcG9vbC9wb29sLmpzIiwia2R0cmVlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL2dEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN2NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbnZhciByb290UGFyZW50ID0ge31cblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBTYWZhcmkgNS03IGxhY2tzIHN1cHBvcnQgZm9yIGNoYW5naW5nIHRoZSBgT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcmAgcHJvcGVydHlcbiAqICAgICBvbiBvYmplY3RzLlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgZnVuY3Rpb24gQmFyICgpIHt9XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLmZvbyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH1cbiAgICBhcnIuY29uc3RydWN0b3IgPSBCYXJcbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICBhcnIuY29uc3RydWN0b3IgPT09IEJhciAmJiAvLyBjb25zdHJ1Y3RvciBjYW4gYmUgc2V0XG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbi8qKlxuICogQ2xhc3M6IEJ1ZmZlclxuICogPT09PT09PT09PT09PVxuICpcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgYXJlIGF1Z21lbnRlZFxuICogd2l0aCBmdW5jdGlvbiBwcm9wZXJ0aWVzIGZvciBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgQVBJIGZ1bmN0aW9ucy4gV2UgdXNlXG4gKiBgVWludDhBcnJheWAgc28gdGhhdCBzcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdCByZXR1cm5zXG4gKiBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBCeSBhdWdtZW50aW5nIHRoZSBpbnN0YW5jZXMsIHdlIGNhbiBhdm9pZCBtb2RpZnlpbmcgdGhlIGBVaW50OEFycmF5YFxuICogcHJvdG90eXBlLlxuICovXG5mdW5jdGlvbiBCdWZmZXIgKGFyZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIC8vIEF2b2lkIGdvaW5nIHRocm91Z2ggYW4gQXJndW1lbnRzQWRhcHRvclRyYW1wb2xpbmUgaW4gdGhlIGNvbW1vbiBjYXNlLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBhcmd1bWVudHNbMV0pXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnKVxuICB9XG5cbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXMubGVuZ3RoID0gMFxuICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZyb21OdW1iZXIodGhpcywgYXJnKVxuICB9XG5cbiAgLy8gU2xpZ2h0bHkgbGVzcyBjb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhpcywgYXJnLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6ICd1dGY4JylcbiAgfVxuXG4gIC8vIFVudXN1YWwuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoaXMsIGFyZylcbn1cblxuZnVuY3Rpb24gZnJvbU51bWJlciAodGhhdCwgbGVuZ3RoKSB7XG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGggPCAwID8gMCA6IGNoZWNrZWQobGVuZ3RoKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykgZW5jb2RpbmcgPSAndXRmOCdcblxuICAvLyBBc3N1bXB0aW9uOiBieXRlTGVuZ3RoKCkgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyA8IGtNYXhMZW5ndGguXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuXG4gIHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqZWN0KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqZWN0KSkgcmV0dXJuIGZyb21CdWZmZXIodGhhdCwgb2JqZWN0KVxuXG4gIGlmIChpc0FycmF5KG9iamVjdCkpIHJldHVybiBmcm9tQXJyYXkodGhhdCwgb2JqZWN0KVxuXG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ211c3Qgc3RhcnQgd2l0aCBudW1iZXIsIGJ1ZmZlciwgYXJyYXkgb3Igc3RyaW5nJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9iamVjdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGZyb21UeXBlZEFycmF5KHRoYXQsIG9iamVjdClcbiAgICB9XG4gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIG9iamVjdClcbiAgICB9XG4gIH1cblxuICBpZiAob2JqZWN0Lmxlbmd0aCkgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqZWN0KVxuXG4gIHJldHVybiBmcm9tSnNvbk9iamVjdCh0aGF0LCBvYmplY3QpXG59XG5cbmZ1bmN0aW9uIGZyb21CdWZmZXIgKHRoYXQsIGJ1ZmZlcikge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChidWZmZXIubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgYnVmZmVyLmNvcHkodGhhdCwgMCwgMCwgbGVuZ3RoKVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXkgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vLyBEdXBsaWNhdGUgb2YgZnJvbUFycmF5KCkgdG8ga2VlcCBmcm9tQXJyYXkoKSBtb25vbW9ycGhpYy5cbmZ1bmN0aW9uIGZyb21UeXBlZEFycmF5ICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICAvLyBUcnVuY2F0aW5nIHRoZSBlbGVtZW50cyBpcyBwcm9iYWJseSBub3Qgd2hhdCBwZW9wbGUgZXhwZWN0IGZyb20gdHlwZWRcbiAgLy8gYXJyYXlzIHdpdGggQllURVNfUEVSX0VMRU1FTlQgPiAxIGJ1dCBpdCdzIGNvbXBhdGlibGUgd2l0aCB0aGUgYmVoYXZpb3JcbiAgLy8gb2YgdGhlIG9sZCBCdWZmZXIgY29uc3RydWN0b3IuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5KSB7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIGFycmF5LmJ5dGVMZW5ndGhcbiAgICB0aGF0ID0gQnVmZmVyLl9hdWdtZW50KG5ldyBVaW50OEFycmF5KGFycmF5KSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21UeXBlZEFycmF5KHRoYXQsIG5ldyBVaW50OEFycmF5KGFycmF5KSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLy8gRGVzZXJpYWxpemUgeyB0eXBlOiAnQnVmZmVyJywgZGF0YTogWzEsMiwzLC4uLl0gfSBpbnRvIGEgQnVmZmVyIG9iamVjdC5cbi8vIFJldHVybnMgYSB6ZXJvLWxlbmd0aCBidWZmZXIgZm9yIGlucHV0cyB0aGF0IGRvbid0IGNvbmZvcm0gdG8gdGhlIHNwZWMuXG5mdW5jdGlvbiBmcm9tSnNvbk9iamVjdCAodGhhdCwgb2JqZWN0KSB7XG4gIHZhciBhcnJheVxuICB2YXIgbGVuZ3RoID0gMFxuXG4gIGlmIChvYmplY3QudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmplY3QuZGF0YSkpIHtcbiAgICBhcnJheSA9IG9iamVjdC5kYXRhXG4gICAgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB9XG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG59IGVsc2Uge1xuICAvLyBwcmUtc2V0IGZvciB2YWx1ZXMgdGhhdCBtYXkgZXhpc3QgaW4gdGhlIGZ1dHVyZVxuICBCdWZmZXIucHJvdG90eXBlLmxlbmd0aCA9IHVuZGVmaW5lZFxuICBCdWZmZXIucHJvdG90eXBlLnBhcmVudCA9IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBhbGxvY2F0ZSAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgICB0aGF0Ll9pc0J1ZmZlciA9IHRydWVcbiAgfVxuXG4gIHZhciBmcm9tUG9vbCA9IGxlbmd0aCAhPT0gMCAmJiBsZW5ndGggPD0gQnVmZmVyLnBvb2xTaXplID4+PiAxXG4gIGlmIChmcm9tUG9vbCkgdGhhdC5wYXJlbnQgPSByb290UGFyZW50XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChzdWJqZWN0LCBlbmNvZGluZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2xvd0J1ZmZlcikpIHJldHVybiBuZXcgU2xvd0J1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcbiAgZGVsZXRlIGJ1Zi5wYXJlbnRcbiAgcmV0dXJuIGJ1ZlxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgdmFyIGkgPSAwXG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSBicmVha1xuXG4gICAgKytpXG4gIH1cblxuICBpZiAoaSAhPT0gbGVuKSB7XG4gICAgeCA9IGFbaV1cbiAgICB5ID0gYltpXVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICdyYXcnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdsaXN0IGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycy4nKVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICBpdGVtLmNvcHkoYnVmLCBwb3MpXG4gICAgcG9zICs9IGl0ZW0ubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykgc3RyaW5nID0gJycgKyBzdHJpbmdcblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIC8vIERlcHJlY2F0ZWRcbiAgICAgIGNhc2UgJ3Jhdyc6XG4gICAgICBjYXNlICdyYXdzJzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICBzdGFydCA9IHN0YXJ0IHwgMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPT09IEluZmluaXR5ID8gdGhpcy5sZW5ndGggOiBlbmQgfCAwXG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcbiAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKGVuZCA8PSBzdGFydCkgcmV0dXJuICcnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiAwXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICBieXRlT2Zmc2V0ID4+PSAwXG5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gdGhpcy5sZW5ndGgpIHJldHVybiAtMVxuXG4gIC8vIE5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gTWF0aC5tYXgodGhpcy5sZW5ndGggKyBieXRlT2Zmc2V0LCAwKVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSByZXR1cm4gLTEgLy8gc3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcgYWx3YXlzIGZhaWxzXG4gICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgWyB2YWwgXSwgYnl0ZU9mZnNldClcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yICh2YXIgaSA9IDA7IGJ5dGVPZmZzZXQgKyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyW2J5dGVPZmZzZXQgKyBpXSA9PT0gdmFsW2ZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4XSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbC5sZW5ndGgpIHJldHVybiBieXRlT2Zmc2V0ICsgZm91bmRJbmRleFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuLy8gYGdldGAgaXMgZGVwcmVjYXRlZFxuQnVmZmVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLmdldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMucmVhZFVJbnQ4KG9mZnNldClcbn1cblxuLy8gYHNldGAgaXMgZGVwcmVjYXRlZFxuQnVmZmVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKHYsIG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLnNldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMud3JpdGVVSW50OCh2LCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmluYXJ5V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHZhciBzd2FwID0gZW5jb2RpbmdcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIG9mZnNldCA9IGxlbmd0aCB8IDBcbiAgICBsZW5ndGggPSBzd2FwXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGJpbmFyeVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gYmluYXJ5U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IEJ1ZmZlci5fYXVnbWVudCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpKVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47IGkrKykge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgaWYgKG5ld0J1Zi5sZW5ndGgpIG5ld0J1Zi5wYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzXG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdidWZmZXIgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ZhbHVlIGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpLCAwKVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpLCAwKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyBpKyspIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gdmFsdWUgPCAwID8gMSA6IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSB2YWx1ZSA8IDAgPyAxIDogMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCd2YWx1ZSBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0Ll9zZXQodGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLCB0YXJnZXRTdGFydClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gZmlsbCh2YWx1ZSwgc3RhcnQ9MCwgZW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXZhbHVlKSB2YWx1ZSA9IDBcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kKSBlbmQgPSB0aGlzLmxlbmd0aFxuXG4gIGlmIChlbmQgPCBzdGFydCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2VuZCA8IHN0YXJ0JylcblxuICAvLyBGaWxsIDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVyblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDAgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gdmFsdWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gdXRmOFRvQnl0ZXModmFsdWUudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGBBcnJheUJ1ZmZlcmAgd2l0aCB0aGUgKmNvcGllZCogbWVtb3J5IG9mIHRoZSBidWZmZXIgaW5zdGFuY2UuXG4gKiBBZGRlZCBpbiBOb2RlIDAuMTIuIE9ubHkgYXZhaWxhYmxlIGluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBBcnJheUJ1ZmZlci5cbiAqL1xuQnVmZmVyLnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24gdG9BcnJheUJ1ZmZlciAoKSB7XG4gIGlmICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgIHJldHVybiAobmV3IEJ1ZmZlcih0aGlzKSkuYnVmZmVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheSh0aGlzLmxlbmd0aClcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgYnVmW2ldID0gdGhpc1tpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1Zi5idWZmZXJcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQnVmZmVyLnRvQXJyYXlCdWZmZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInKVxuICB9XG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIEJQID0gQnVmZmVyLnByb3RvdHlwZVxuXG4vKipcbiAqIEF1Z21lbnQgYSBVaW50OEFycmF5ICppbnN0YW5jZSogKG5vdCB0aGUgVWludDhBcnJheSBjbGFzcyEpIHdpdGggQnVmZmVyIG1ldGhvZHNcbiAqL1xuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gX2F1Z21lbnQgKGFycikge1xuICBhcnIuY29uc3RydWN0b3IgPSBCdWZmZXJcbiAgYXJyLl9pc0J1ZmZlciA9IHRydWVcblxuICAvLyBzYXZlIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBVaW50OEFycmF5IHNldCBtZXRob2QgYmVmb3JlIG92ZXJ3cml0aW5nXG4gIGFyci5fc2V0ID0gYXJyLnNldFxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgYXJyLmdldCA9IEJQLmdldFxuICBhcnIuc2V0ID0gQlAuc2V0XG5cbiAgYXJyLndyaXRlID0gQlAud3JpdGVcbiAgYXJyLnRvU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvTG9jYWxlU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvSlNPTiA9IEJQLnRvSlNPTlxuICBhcnIuZXF1YWxzID0gQlAuZXF1YWxzXG4gIGFyci5jb21wYXJlID0gQlAuY29tcGFyZVxuICBhcnIuaW5kZXhPZiA9IEJQLmluZGV4T2ZcbiAgYXJyLmNvcHkgPSBCUC5jb3B5XG4gIGFyci5zbGljZSA9IEJQLnNsaWNlXG4gIGFyci5yZWFkVUludExFID0gQlAucmVhZFVJbnRMRVxuICBhcnIucmVhZFVJbnRCRSA9IEJQLnJlYWRVSW50QkVcbiAgYXJyLnJlYWRVSW50OCA9IEJQLnJlYWRVSW50OFxuICBhcnIucmVhZFVJbnQxNkxFID0gQlAucmVhZFVJbnQxNkxFXG4gIGFyci5yZWFkVUludDE2QkUgPSBCUC5yZWFkVUludDE2QkVcbiAgYXJyLnJlYWRVSW50MzJMRSA9IEJQLnJlYWRVSW50MzJMRVxuICBhcnIucmVhZFVJbnQzMkJFID0gQlAucmVhZFVJbnQzMkJFXG4gIGFyci5yZWFkSW50TEUgPSBCUC5yZWFkSW50TEVcbiAgYXJyLnJlYWRJbnRCRSA9IEJQLnJlYWRJbnRCRVxuICBhcnIucmVhZEludDggPSBCUC5yZWFkSW50OFxuICBhcnIucmVhZEludDE2TEUgPSBCUC5yZWFkSW50MTZMRVxuICBhcnIucmVhZEludDE2QkUgPSBCUC5yZWFkSW50MTZCRVxuICBhcnIucmVhZEludDMyTEUgPSBCUC5yZWFkSW50MzJMRVxuICBhcnIucmVhZEludDMyQkUgPSBCUC5yZWFkSW50MzJCRVxuICBhcnIucmVhZEZsb2F0TEUgPSBCUC5yZWFkRmxvYXRMRVxuICBhcnIucmVhZEZsb2F0QkUgPSBCUC5yZWFkRmxvYXRCRVxuICBhcnIucmVhZERvdWJsZUxFID0gQlAucmVhZERvdWJsZUxFXG4gIGFyci5yZWFkRG91YmxlQkUgPSBCUC5yZWFkRG91YmxlQkVcbiAgYXJyLndyaXRlVUludDggPSBCUC53cml0ZVVJbnQ4XG4gIGFyci53cml0ZVVJbnRMRSA9IEJQLndyaXRlVUludExFXG4gIGFyci53cml0ZVVJbnRCRSA9IEJQLndyaXRlVUludEJFXG4gIGFyci53cml0ZVVJbnQxNkxFID0gQlAud3JpdGVVSW50MTZMRVxuICBhcnIud3JpdGVVSW50MTZCRSA9IEJQLndyaXRlVUludDE2QkVcbiAgYXJyLndyaXRlVUludDMyTEUgPSBCUC53cml0ZVVJbnQzMkxFXG4gIGFyci53cml0ZVVJbnQzMkJFID0gQlAud3JpdGVVSW50MzJCRVxuICBhcnIud3JpdGVJbnRMRSA9IEJQLndyaXRlSW50TEVcbiAgYXJyLndyaXRlSW50QkUgPSBCUC53cml0ZUludEJFXG4gIGFyci53cml0ZUludDggPSBCUC53cml0ZUludDhcbiAgYXJyLndyaXRlSW50MTZMRSA9IEJQLndyaXRlSW50MTZMRVxuICBhcnIud3JpdGVJbnQxNkJFID0gQlAud3JpdGVJbnQxNkJFXG4gIGFyci53cml0ZUludDMyTEUgPSBCUC53cml0ZUludDMyTEVcbiAgYXJyLndyaXRlSW50MzJCRSA9IEJQLndyaXRlSW50MzJCRVxuICBhcnIud3JpdGVGbG9hdExFID0gQlAud3JpdGVGbG9hdExFXG4gIGFyci53cml0ZUZsb2F0QkUgPSBCUC53cml0ZUZsb2F0QkVcbiAgYXJyLndyaXRlRG91YmxlTEUgPSBCUC53cml0ZURvdWJsZUxFXG4gIGFyci53cml0ZURvdWJsZUJFID0gQlAud3JpdGVEb3VibGVCRVxuICBhcnIuZmlsbCA9IEJQLmZpbGxcbiAgYXJyLmluc3BlY3QgPSBCUC5pbnNwZWN0XG4gIGFyci50b0FycmF5QnVmZmVyID0gQlAudG9BcnJheUJ1ZmZlclxuXG4gIHJldHVybiBhcnJcbn1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyaHZiV1V2WVdSdGFXNHZZbkp2ZDNObGNtbG1lUzFqWkc0dmJtOWtaVjl0YjJSMWJHVnpMMkp5YjNkelpYSnBabmt2Ym05a1pWOXRiMlIxYkdWekwySjFabVpsY2k5cGJtUmxlQzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pTzBGQlFVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUlWeHVJQ29nVkdobElHSjFabVpsY2lCdGIyUjFiR1VnWm5KdmJTQnViMlJsTG1wekxDQm1iM0lnZEdobElHSnliM2R6WlhJdVhHNGdLbHh1SUNvZ1FHRjFkR2h2Y2lBZ0lFWmxjbTl6Y3lCQlltOTFhMmhoWkdscVpXZ2dQR1psY205emMwQm1aWEp2YzNNdWIzSm5QaUE4YUhSMGNEb3ZMMlpsY205emN5NXZjbWMrWEc0Z0tpQkFiR2xqWlc1elpTQWdUVWxVWEc0Z0tpOWNiaThxSUdWemJHbHVkQzFrYVhOaFlteGxJRzV2TFhCeWIzUnZJQ292WEc1Y2JpZDFjMlVnYzNSeWFXTjBKMXh1WEc1MllYSWdZbUZ6WlRZMElEMGdjbVZ4ZFdseVpTZ25ZbUZ6WlRZMExXcHpKeWxjYm5aaGNpQnBaV1ZsTnpVMElEMGdjbVZ4ZFdseVpTZ25hV1ZsWlRjMU5DY3BYRzUyWVhJZ2FYTkJjbkpoZVNBOUlISmxjWFZwY21Vb0oybHpZWEp5WVhrbktWeHVYRzVsZUhCdmNuUnpMa0oxWm1abGNpQTlJRUoxWm1abGNseHVaWGh3YjNKMGN5NVRiRzkzUW5WbVptVnlJRDBnVTJ4dmQwSjFabVpsY2x4dVpYaHdiM0owY3k1SlRsTlFSVU5VWDAxQldGOUNXVlJGVXlBOUlEVXdYRzVDZFdabVpYSXVjRzl2YkZOcGVtVWdQU0E0TVRreUlDOHZJRzV2ZENCMWMyVmtJR0o1SUhSb2FYTWdhVzF3YkdWdFpXNTBZWFJwYjI1Y2JseHVkbUZ5SUhKdmIzUlFZWEpsYm5RZ1BTQjdmVnh1WEc0dktpcGNiaUFxSUVsbUlHQkNkV1ptWlhJdVZGbFFSVVJmUVZKU1FWbGZVMVZRVUU5U1ZHQTZYRzRnS2lBZ0lEMDlQU0IwY25WbElDQWdJRlZ6WlNCVmFXNTBPRUZ5Y21GNUlHbHRjR3hsYldWdWRHRjBhVzl1SUNobVlYTjBaWE4wS1Z4dUlDb2dJQ0E5UFQwZ1ptRnNjMlVnSUNCVmMyVWdUMkpxWldOMElHbHRjR3hsYldWdWRHRjBhVzl1SUNodGIzTjBJR052YlhCaGRHbGliR1VzSUdWMlpXNGdTVVUyS1Z4dUlDcGNiaUFxSUVKeWIzZHpaWEp6SUhSb1lYUWdjM1Z3Y0c5eWRDQjBlWEJsWkNCaGNuSmhlWE1nWVhKbElFbEZJREV3S3l3Z1JtbHlaV1p2ZUNBMEt5d2dRMmh5YjIxbElEY3JMQ0JUWVdaaGNta2dOUzR4S3l4Y2JpQXFJRTl3WlhKaElERXhMallyTENCcFQxTWdOQzR5S3k1Y2JpQXFYRzRnS2lCRWRXVWdkRzhnZG1GeWFXOTFjeUJpY205M2MyVnlJR0oxWjNNc0lITnZiV1YwYVcxbGN5QjBhR1VnVDJKcVpXTjBJR2x0Y0d4bGJXVnVkR0YwYVc5dUlIZHBiR3dnWW1VZ2RYTmxaQ0JsZG1WdVhHNGdLaUIzYUdWdUlIUm9aU0JpY205M2MyVnlJSE4xY0hCdmNuUnpJSFI1Y0dWa0lHRnljbUY1Y3k1Y2JpQXFYRzRnS2lCT2IzUmxPbHh1SUNwY2JpQXFJQ0FnTFNCR2FYSmxabTk0SURRdE1qa2diR0ZqYTNNZ2MzVndjRzl5ZENCbWIzSWdZV1JrYVc1bklHNWxkeUJ3Y205d1pYSjBhV1Z6SUhSdklHQlZhVzUwT0VGeWNtRjVZQ0JwYm5OMFlXNWpaWE1zWEc0Z0tpQWdJQ0FnVTJWbE9pQm9kSFJ3Y3pvdkwySjFaM3BwYkd4aExtMXZlbWxzYkdFdWIzSm5MM05vYjNkZlluVm5MbU5uYVQ5cFpEMDJPVFUwTXpndVhHNGdLbHh1SUNvZ0lDQXRJRk5oWm1GeWFTQTFMVGNnYkdGamEzTWdjM1Z3Y0c5eWRDQm1iM0lnWTJoaGJtZHBibWNnZEdobElHQlBZbXBsWTNRdWNISnZkRzkwZVhCbExtTnZibk4wY25WamRHOXlZQ0J3Y205d1pYSjBlVnh1SUNvZ0lDQWdJRzl1SUc5aWFtVmpkSE11WEc0Z0tseHVJQ29nSUNBdElFTm9jbTl0WlNBNUxURXdJR2x6SUcxcGMzTnBibWNnZEdobElHQlVlWEJsWkVGeWNtRjVMbkJ5YjNSdmRIbHdaUzV6ZFdKaGNuSmhlV0FnWm5WdVkzUnBiMjR1WEc0Z0tseHVJQ29nSUNBdElFbEZNVEFnYUdGeklHRWdZbkp2YTJWdUlHQlVlWEJsWkVGeWNtRjVMbkJ5YjNSdmRIbHdaUzV6ZFdKaGNuSmhlV0FnWm5WdVkzUnBiMjRnZDJocFkyZ2djbVYwZFhKdWN5QmhjbkpoZVhNZ2IyWmNiaUFxSUNBZ0lDQnBibU52Y25KbFkzUWdiR1Z1WjNSb0lHbHVJSE52YldVZ2MybDBkV0YwYVc5dWN5NWNibHh1SUNvZ1YyVWdaR1YwWldOMElIUm9aWE5sSUdKMVoyZDVJR0p5YjNkelpYSnpJR0Z1WkNCelpYUWdZRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVZQ0IwYnlCZ1ptRnNjMlZnSUhOdklIUm9aWGxjYmlBcUlHZGxkQ0IwYUdVZ1QySnFaV04wSUdsdGNHeGxiV1Z1ZEdGMGFXOXVMQ0IzYUdsamFDQnBjeUJ6Ykc5M1pYSWdZblYwSUdKbGFHRjJaWE1nWTI5eWNtVmpkR3g1TGx4dUlDb3ZYRzVDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ0E5SUdkc2IySmhiQzVVV1ZCRlJGOUJVbEpCV1Y5VFZWQlFUMUpVSUNFOVBTQjFibVJsWm1sdVpXUmNiaUFnUHlCbmJHOWlZV3d1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkZ4dUlDQTZJSFI1Y0dWa1FYSnlZWGxUZFhCd2IzSjBLQ2xjYmx4dVpuVnVZM1JwYjI0Z2RIbHdaV1JCY25KaGVWTjFjSEJ2Y25RZ0tDa2dlMXh1SUNCbWRXNWpkR2x2YmlCQ1lYSWdLQ2tnZTMxY2JpQWdkSEo1SUh0Y2JpQWdJQ0IyWVhJZ1lYSnlJRDBnYm1WM0lGVnBiblE0UVhKeVlYa29NU2xjYmlBZ0lDQmhjbkl1Wm05dklEMGdablZ1WTNScGIyNGdLQ2tnZXlCeVpYUjFjbTRnTkRJZ2ZWeHVJQ0FnSUdGeWNpNWpiMjV6ZEhKMVkzUnZjaUE5SUVKaGNseHVJQ0FnSUhKbGRIVnliaUJoY25JdVptOXZLQ2tnUFQwOUlEUXlJQ1ltSUM4dklIUjVjR1ZrSUdGeWNtRjVJR2x1YzNSaGJtTmxjeUJqWVc0Z1ltVWdZWFZuYldWdWRHVmtYRzRnSUNBZ0lDQWdJR0Z5Y2k1amIyNXpkSEoxWTNSdmNpQTlQVDBnUW1GeUlDWW1JQzh2SUdOdmJuTjBjblZqZEc5eUlHTmhiaUJpWlNCelpYUmNiaUFnSUNBZ0lDQWdkSGx3Wlc5bUlHRnljaTV6ZFdKaGNuSmhlU0E5UFQwZ0oyWjFibU4wYVc5dUp5QW1KaUF2THlCamFISnZiV1VnT1MweE1DQnNZV05ySUdCemRXSmhjbkpoZVdCY2JpQWdJQ0FnSUNBZ1lYSnlMbk4xWW1GeWNtRjVLREVzSURFcExtSjVkR1ZNWlc1bmRHZ2dQVDA5SURBZ0x5OGdhV1V4TUNCb1lYTWdZbkp2YTJWdUlHQnpkV0poY25KaGVXQmNiaUFnZlNCallYUmphQ0FvWlNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJtWVd4elpWeHVJQ0I5WEc1OVhHNWNibVoxYm1OMGFXOXVJR3ROWVhoTVpXNW5kR2dnS0NrZ2UxeHVJQ0J5WlhSMWNtNGdRblZtWm1WeUxsUlpVRVZFWDBGU1VrRlpYMU5WVUZCUFVsUmNiaUFnSUNBL0lEQjROMlptWm1abVptWmNiaUFnSUNBNklEQjRNMlptWm1abVptWmNibjFjYmx4dUx5b3FYRzRnS2lCRGJHRnpjem9nUW5WbVptVnlYRzRnS2lBOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2x4dUlDb2dWR2hsSUVKMVptWmxjaUJqYjI1emRISjFZM1J2Y2lCeVpYUjFjbTV6SUdsdWMzUmhibU5sY3lCdlppQmdWV2x1ZERoQmNuSmhlV0FnZEdoaGRDQmhjbVVnWVhWbmJXVnVkR1ZrWEc0Z0tpQjNhWFJvSUdaMWJtTjBhVzl1SUhCeWIzQmxjblJwWlhNZ1ptOXlJR0ZzYkNCMGFHVWdibTlrWlNCZ1FuVm1abVZ5WUNCQlVFa2dablZ1WTNScGIyNXpMaUJYWlNCMWMyVmNiaUFxSUdCVmFXNTBPRUZ5Y21GNVlDQnpieUIwYUdGMElITnhkV0Z5WlNCaWNtRmphMlYwSUc1dmRHRjBhVzl1SUhkdmNtdHpJR0Z6SUdWNGNHVmpkR1ZrSUMwdElHbDBJSEpsZEhWeWJuTmNiaUFxSUdFZ2MybHVaMnhsSUc5amRHVjBMbHh1SUNwY2JpQXFJRUo1SUdGMVoyMWxiblJwYm1jZ2RHaGxJR2x1YzNSaGJtTmxjeXdnZDJVZ1kyRnVJR0YyYjJsa0lHMXZaR2xtZVdsdVp5QjBhR1VnWUZWcGJuUTRRWEp5WVhsZ1hHNGdLaUJ3Y205MGIzUjVjR1V1WEc0Z0tpOWNibVoxYm1OMGFXOXVJRUoxWm1abGNpQW9ZWEpuS1NCN1hHNGdJR2xtSUNnaEtIUm9hWE1nYVc1emRHRnVZMlZ2WmlCQ2RXWm1aWElwS1NCN1hHNGdJQ0FnTHk4Z1FYWnZhV1FnWjI5cGJtY2dkR2h5YjNWbmFDQmhiaUJCY21kMWJXVnVkSE5CWkdGd2RHOXlWSEpoYlhCdmJHbHVaU0JwYmlCMGFHVWdZMjl0Ylc5dUlHTmhjMlV1WEc0Z0lDQWdhV1lnS0dGeVozVnRaVzUwY3k1c1pXNW5kR2dnUGlBeEtTQnlaWFIxY200Z2JtVjNJRUoxWm1abGNpaGhjbWNzSUdGeVozVnRaVzUwYzFzeFhTbGNiaUFnSUNCeVpYUjFjbTRnYm1WM0lFSjFabVpsY2loaGNtY3BYRzRnSUgxY2JseHVJQ0JwWmlBb0lVSjFabVpsY2k1VVdWQkZSRjlCVWxKQldWOVRWVkJRVDFKVUtTQjdYRzRnSUNBZ2RHaHBjeTVzWlc1bmRHZ2dQU0F3WEc0Z0lDQWdkR2hwY3k1d1lYSmxiblFnUFNCMWJtUmxabWx1WldSY2JpQWdmVnh1WEc0Z0lDOHZJRU52YlcxdmJpQmpZWE5sTGx4dUlDQnBaaUFvZEhsd1pXOW1JR0Z5WnlBOVBUMGdKMjUxYldKbGNpY3BJSHRjYmlBZ0lDQnlaWFIxY200Z1puSnZiVTUxYldKbGNpaDBhR2x6TENCaGNtY3BYRzRnSUgxY2JseHVJQ0F2THlCVGJHbG5hSFJzZVNCc1pYTnpJR052YlcxdmJpQmpZWE5sTGx4dUlDQnBaaUFvZEhsd1pXOW1JR0Z5WnlBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQnlaWFIxY200Z1puSnZiVk4wY21sdVp5aDBhR2x6TENCaGNtY3NJR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQaUF4SUQ4Z1lYSm5kVzFsYm5Seld6RmRJRG9nSjNWMFpqZ25LVnh1SUNCOVhHNWNiaUFnTHk4Z1ZXNTFjM1ZoYkM1Y2JpQWdjbVYwZFhKdUlHWnliMjFQWW1wbFkzUW9kR2hwY3l3Z1lYSm5LVnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQm1jbTl0VG5WdFltVnlJQ2gwYUdGMExDQnNaVzVuZEdncElIdGNiaUFnZEdoaGRDQTlJR0ZzYkc5allYUmxLSFJvWVhRc0lHeGxibWQwYUNBOElEQWdQeUF3SURvZ1kyaGxZMnRsWkNoc1pXNW5kR2dwSUh3Z01DbGNiaUFnYVdZZ0tDRkNkV1ptWlhJdVZGbFFSVVJmUVZKU1FWbGZVMVZRVUU5U1ZDa2dlMXh1SUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F3T3lCcElEd2diR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUhSb1lYUmJhVjBnUFNBd1hHNGdJQ0FnZlZ4dUlDQjlYRzRnSUhKbGRIVnliaUIwYUdGMFhHNTlYRzVjYm1aMWJtTjBhVzl1SUdaeWIyMVRkSEpwYm1jZ0tIUm9ZWFFzSUhOMGNtbHVaeXdnWlc1amIyUnBibWNwSUh0Y2JpQWdhV1lnS0hSNWNHVnZaaUJsYm1OdlpHbHVaeUFoUFQwZ0ozTjBjbWx1WnljZ2ZId2daVzVqYjJScGJtY2dQVDA5SUNjbktTQmxibU52WkdsdVp5QTlJQ2QxZEdZNEoxeHVYRzRnSUM4dklFRnpjM1Z0Y0hScGIyNDZJR0o1ZEdWTVpXNW5kR2dvS1NCeVpYUjFjbTRnZG1Gc2RXVWdhWE1nWVd4M1lYbHpJRHdnYTAxaGVFeGxibWQwYUM1Y2JpQWdkbUZ5SUd4bGJtZDBhQ0E5SUdKNWRHVk1aVzVuZEdnb2MzUnlhVzVuTENCbGJtTnZaR2x1WnlrZ2ZDQXdYRzRnSUhSb1lYUWdQU0JoYkd4dlkyRjBaU2gwYUdGMExDQnNaVzVuZEdncFhHNWNiaUFnZEdoaGRDNTNjbWwwWlNoemRISnBibWNzSUdWdVkyOWthVzVuS1Z4dUlDQnlaWFIxY200Z2RHaGhkRnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQm1jbTl0VDJKcVpXTjBJQ2gwYUdGMExDQnZZbXBsWTNRcElIdGNiaUFnYVdZZ0tFSjFabVpsY2k1cGMwSjFabVpsY2lodlltcGxZM1FwS1NCeVpYUjFjbTRnWm5KdmJVSjFabVpsY2loMGFHRjBMQ0J2WW1wbFkzUXBYRzVjYmlBZ2FXWWdLR2x6UVhKeVlYa29iMkpxWldOMEtTa2djbVYwZFhKdUlHWnliMjFCY25KaGVTaDBhR0YwTENCdlltcGxZM1FwWEc1Y2JpQWdhV1lnS0c5aWFtVmpkQ0E5UFNCdWRXeHNLU0I3WEc0Z0lDQWdkR2h5YjNjZ2JtVjNJRlI1Y0dWRmNuSnZjaWduYlhWemRDQnpkR0Z5ZENCM2FYUm9JRzUxYldKbGNpd2dZblZtWm1WeUxDQmhjbkpoZVNCdmNpQnpkSEpwYm1jbktWeHVJQ0I5WEc1Y2JpQWdhV1lnS0hSNWNHVnZaaUJCY25KaGVVSjFabVpsY2lBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2JpQWdJQ0JwWmlBb2IySnFaV04wTG1KMVptWmxjaUJwYm5OMFlXNWpaVzltSUVGeWNtRjVRblZtWm1WeUtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1puSnZiVlI1Y0dWa1FYSnlZWGtvZEdoaGRDd2diMkpxWldOMEtWeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb2IySnFaV04wSUdsdWMzUmhibU5sYjJZZ1FYSnlZWGxDZFdabVpYSXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQm1jbTl0UVhKeVlYbENkV1ptWlhJb2RHaGhkQ3dnYjJKcVpXTjBLVnh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJR2xtSUNodlltcGxZM1F1YkdWdVozUm9LU0J5WlhSMWNtNGdabkp2YlVGeWNtRjVUR2xyWlNoMGFHRjBMQ0J2WW1wbFkzUXBYRzVjYmlBZ2NtVjBkWEp1SUdaeWIyMUtjMjl1VDJKcVpXTjBLSFJvWVhRc0lHOWlhbVZqZENsY2JuMWNibHh1Wm5WdVkzUnBiMjRnWm5KdmJVSjFabVpsY2lBb2RHaGhkQ3dnWW5WbVptVnlLU0I3WEc0Z0lIWmhjaUJzWlc1bmRHZ2dQU0JqYUdWamEyVmtLR0oxWm1abGNpNXNaVzVuZEdncElId2dNRnh1SUNCMGFHRjBJRDBnWVd4c2IyTmhkR1VvZEdoaGRDd2diR1Z1WjNSb0tWeHVJQ0JpZFdabVpYSXVZMjl3ZVNoMGFHRjBMQ0F3TENBd0xDQnNaVzVuZEdncFhHNGdJSEpsZEhWeWJpQjBhR0YwWEc1OVhHNWNibVoxYm1OMGFXOXVJR1p5YjIxQmNuSmhlU0FvZEdoaGRDd2dZWEp5WVhrcElIdGNiaUFnZG1GeUlHeGxibWQwYUNBOUlHTm9aV05yWldRb1lYSnlZWGt1YkdWdVozUm9LU0I4SURCY2JpQWdkR2hoZENBOUlHRnNiRzlqWVhSbEtIUm9ZWFFzSUd4bGJtZDBhQ2xjYmlBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQnNaVzVuZEdnN0lHa2dLejBnTVNrZ2UxeHVJQ0FnSUhSb1lYUmJhVjBnUFNCaGNuSmhlVnRwWFNBbUlESTFOVnh1SUNCOVhHNGdJSEpsZEhWeWJpQjBhR0YwWEc1OVhHNWNiaTh2SUVSMWNHeHBZMkYwWlNCdlppQm1jbTl0UVhKeVlYa29LU0IwYnlCclpXVndJR1p5YjIxQmNuSmhlU2dwSUcxdmJtOXRiM0p3YUdsakxseHVablZ1WTNScGIyNGdabkp2YlZSNWNHVmtRWEp5WVhrZ0tIUm9ZWFFzSUdGeWNtRjVLU0I3WEc0Z0lIWmhjaUJzWlc1bmRHZ2dQU0JqYUdWamEyVmtLR0Z5Y21GNUxteGxibWQwYUNrZ2ZDQXdYRzRnSUhSb1lYUWdQU0JoYkd4dlkyRjBaU2gwYUdGMExDQnNaVzVuZEdncFhHNGdJQzh2SUZSeWRXNWpZWFJwYm1jZ2RHaGxJR1ZzWlcxbGJuUnpJR2x6SUhCeWIySmhZbXg1SUc1dmRDQjNhR0YwSUhCbGIzQnNaU0JsZUhCbFkzUWdabkp2YlNCMGVYQmxaRnh1SUNBdkx5QmhjbkpoZVhNZ2QybDBhQ0JDV1ZSRlUxOVFSVkpmUlV4RlRVVk9WQ0ErSURFZ1luVjBJR2wwSjNNZ1kyOXRjR0YwYVdKc1pTQjNhWFJvSUhSb1pTQmlaV2hoZG1sdmNseHVJQ0F2THlCdlppQjBhR1VnYjJ4a0lFSjFabVpsY2lCamIyNXpkSEoxWTNSdmNpNWNiaUFnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCc1pXNW5kR2c3SUdrZ0t6MGdNU2tnZTF4dUlDQWdJSFJvWVhSYmFWMGdQU0JoY25KaGVWdHBYU0FtSURJMU5WeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCMGFHRjBYRzU5WEc1Y2JtWjFibU4wYVc5dUlHWnliMjFCY25KaGVVSjFabVpsY2lBb2RHaGhkQ3dnWVhKeVlYa3BJSHRjYmlBZ2FXWWdLRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVLU0I3WEc0Z0lDQWdMeThnVW1WMGRYSnVJR0Z1SUdGMVoyMWxiblJsWkNCZ1ZXbHVkRGhCY25KaGVXQWdhVzV6ZEdGdVkyVXNJR1p2Y2lCaVpYTjBJSEJsY21admNtMWhibU5sWEc0Z0lDQWdZWEp5WVhrdVlubDBaVXhsYm1kMGFGeHVJQ0FnSUhSb1lYUWdQU0JDZFdabVpYSXVYMkYxWjIxbGJuUW9ibVYzSUZWcGJuUTRRWEp5WVhrb1lYSnlZWGtwS1Z4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUM4dklFWmhiR3hpWVdOck9pQlNaWFIxY200Z1lXNGdiMkpxWldOMElHbHVjM1JoYm1ObElHOW1JSFJvWlNCQ2RXWm1aWElnWTJ4aGMzTmNiaUFnSUNCMGFHRjBJRDBnWm5KdmJWUjVjR1ZrUVhKeVlYa29kR2hoZEN3Z2JtVjNJRlZwYm5RNFFYSnlZWGtvWVhKeVlYa3BLVnh1SUNCOVhHNGdJSEpsZEhWeWJpQjBhR0YwWEc1OVhHNWNibVoxYm1OMGFXOXVJR1p5YjIxQmNuSmhlVXhwYTJVZ0tIUm9ZWFFzSUdGeWNtRjVLU0I3WEc0Z0lIWmhjaUJzWlc1bmRHZ2dQU0JqYUdWamEyVmtLR0Z5Y21GNUxteGxibWQwYUNrZ2ZDQXdYRzRnSUhSb1lYUWdQU0JoYkd4dlkyRjBaU2gwYUdGMExDQnNaVzVuZEdncFhHNGdJR1p2Y2lBb2RtRnlJR2tnUFNBd095QnBJRHdnYkdWdVozUm9PeUJwSUNzOUlERXBJSHRjYmlBZ0lDQjBhR0YwVzJsZElEMGdZWEp5WVhsYmFWMGdKaUF5TlRWY2JpQWdmVnh1SUNCeVpYUjFjbTRnZEdoaGRGeHVmVnh1WEc0dkx5QkVaWE5sY21saGJHbDZaU0I3SUhSNWNHVTZJQ2RDZFdabVpYSW5MQ0JrWVhSaE9pQmJNU3d5TERNc0xpNHVYU0I5SUdsdWRHOGdZU0JDZFdabVpYSWdiMkpxWldOMExseHVMeThnVW1WMGRYSnVjeUJoSUhwbGNtOHRiR1Z1WjNSb0lHSjFabVpsY2lCbWIzSWdhVzV3ZFhSeklIUm9ZWFFnWkc5dUozUWdZMjl1Wm05eWJTQjBieUIwYUdVZ2MzQmxZeTVjYm1aMWJtTjBhVzl1SUdaeWIyMUtjMjl1VDJKcVpXTjBJQ2gwYUdGMExDQnZZbXBsWTNRcElIdGNiaUFnZG1GeUlHRnljbUY1WEc0Z0lIWmhjaUJzWlc1bmRHZ2dQU0F3WEc1Y2JpQWdhV1lnS0c5aWFtVmpkQzUwZVhCbElEMDlQU0FuUW5WbVptVnlKeUFtSmlCcGMwRnljbUY1S0c5aWFtVmpkQzVrWVhSaEtTa2dlMXh1SUNBZ0lHRnljbUY1SUQwZ2IySnFaV04wTG1SaGRHRmNiaUFnSUNCc1pXNW5kR2dnUFNCamFHVmphMlZrS0dGeWNtRjVMbXhsYm1kMGFDa2dmQ0F3WEc0Z0lIMWNiaUFnZEdoaGRDQTlJR0ZzYkc5allYUmxLSFJvWVhRc0lHeGxibWQwYUNsY2JseHVJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNBclBTQXhLU0I3WEc0Z0lDQWdkR2hoZEZ0cFhTQTlJR0Z5Y21GNVcybGRJQ1lnTWpVMVhHNGdJSDFjYmlBZ2NtVjBkWEp1SUhSb1lYUmNibjFjYmx4dWFXWWdLRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVLU0I3WEc0Z0lFSjFabVpsY2k1d2NtOTBiM1I1Y0dVdVgxOXdjbTkwYjE5ZklEMGdWV2x1ZERoQmNuSmhlUzV3Y205MGIzUjVjR1ZjYmlBZ1FuVm1abVZ5TGw5ZmNISnZkRzlmWHlBOUlGVnBiblE0UVhKeVlYbGNibjBnWld4elpTQjdYRzRnSUM4dklIQnlaUzF6WlhRZ1ptOXlJSFpoYkhWbGN5QjBhR0YwSUcxaGVTQmxlR2x6ZENCcGJpQjBhR1VnWm5WMGRYSmxYRzRnSUVKMVptWmxjaTV3Y205MGIzUjVjR1V1YkdWdVozUm9JRDBnZFc1a1pXWnBibVZrWEc0Z0lFSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWNHRnlaVzUwSUQwZ2RXNWtaV1pwYm1Wa1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdGc2JHOWpZWFJsSUNoMGFHRjBMQ0JzWlc1bmRHZ3BJSHRjYmlBZ2FXWWdLRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVLU0I3WEc0Z0lDQWdMeThnVW1WMGRYSnVJR0Z1SUdGMVoyMWxiblJsWkNCZ1ZXbHVkRGhCY25KaGVXQWdhVzV6ZEdGdVkyVXNJR1p2Y2lCaVpYTjBJSEJsY21admNtMWhibU5sWEc0Z0lDQWdkR2hoZENBOUlFSjFabVpsY2k1ZllYVm5iV1Z1ZENodVpYY2dWV2x1ZERoQmNuSmhlU2hzWlc1bmRHZ3BLVnh1SUNBZ0lIUm9ZWFF1WDE5d2NtOTBiMTlmSUQwZ1FuVm1abVZ5TG5CeWIzUnZkSGx3WlZ4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUM4dklFWmhiR3hpWVdOck9pQlNaWFIxY200Z1lXNGdiMkpxWldOMElHbHVjM1JoYm1ObElHOW1JSFJvWlNCQ2RXWm1aWElnWTJ4aGMzTmNiaUFnSUNCMGFHRjBMbXhsYm1kMGFDQTlJR3hsYm1kMGFGeHVJQ0FnSUhSb1lYUXVYMmx6UW5WbVptVnlJRDBnZEhKMVpWeHVJQ0I5WEc1Y2JpQWdkbUZ5SUdaeWIyMVFiMjlzSUQwZ2JHVnVaM1JvSUNFOVBTQXdJQ1ltSUd4bGJtZDBhQ0E4UFNCQ2RXWm1aWEl1Y0c5dmJGTnBlbVVnUGo0K0lERmNiaUFnYVdZZ0tHWnliMjFRYjI5c0tTQjBhR0YwTG5CaGNtVnVkQ0E5SUhKdmIzUlFZWEpsYm5SY2JseHVJQ0J5WlhSMWNtNGdkR2hoZEZ4dWZWeHVYRzVtZFc1amRHbHZiaUJqYUdWamEyVmtJQ2hzWlc1bmRHZ3BJSHRjYmlBZ0x5OGdUbTkwWlRvZ1kyRnVibTkwSUhWelpTQmdiR1Z1WjNSb0lEd2dhMDFoZUV4bGJtZDBhR0FnYUdWeVpTQmlaV05oZFhObElIUm9ZWFFnWm1GcGJITWdkMmhsYmx4dUlDQXZMeUJzWlc1bmRHZ2dhWE1nVG1GT0lDaDNhR2xqYUNCcGN5QnZkR2hsY25kcGMyVWdZMjlsY21ObFpDQjBieUI2WlhKdkxpbGNiaUFnYVdZZ0tHeGxibWQwYUNBK1BTQnJUV0Y0VEdWdVozUm9LQ2twSUh0Y2JpQWdJQ0IwYUhKdmR5QnVaWGNnVW1GdVoyVkZjbkp2Y2lnblFYUjBaVzF3ZENCMGJ5QmhiR3h2WTJGMFpTQkNkV1ptWlhJZ2JHRnlaMlZ5SUhSb1lXNGdiV0Y0YVcxMWJTQW5JQ3RjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FuYzJsNlpUb2dNSGduSUNzZ2EwMWhlRXhsYm1kMGFDZ3BMblJ2VTNSeWFXNW5LREUyS1NBcklDY2dZbmwwWlhNbktWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCc1pXNW5kR2dnZkNBd1hHNTlYRzVjYm1aMWJtTjBhVzl1SUZOc2IzZENkV1ptWlhJZ0tITjFZbXBsWTNRc0lHVnVZMjlrYVc1bktTQjdYRzRnSUdsbUlDZ2hLSFJvYVhNZ2FXNXpkR0Z1WTJWdlppQlRiRzkzUW5WbVptVnlLU2tnY21WMGRYSnVJRzVsZHlCVGJHOTNRblZtWm1WeUtITjFZbXBsWTNRc0lHVnVZMjlrYVc1bktWeHVYRzRnSUhaaGNpQmlkV1lnUFNCdVpYY2dRblZtWm1WeUtITjFZbXBsWTNRc0lHVnVZMjlrYVc1bktWeHVJQ0JrWld4bGRHVWdZblZtTG5CaGNtVnVkRnh1SUNCeVpYUjFjbTRnWW5WbVhHNTlYRzVjYmtKMVptWmxjaTVwYzBKMVptWmxjaUE5SUdaMWJtTjBhVzl1SUdselFuVm1abVZ5SUNoaUtTQjdYRzRnSUhKbGRIVnliaUFoSVNoaUlDRTlJRzUxYkd3Z0ppWWdZaTVmYVhOQ2RXWm1aWElwWEc1OVhHNWNia0oxWm1abGNpNWpiMjF3WVhKbElEMGdablZ1WTNScGIyNGdZMjl0Y0dGeVpTQW9ZU3dnWWlrZ2UxeHVJQ0JwWmlBb0lVSjFabVpsY2k1cGMwSjFabVpsY2loaEtTQjhmQ0FoUW5WbVptVnlMbWx6UW5WbVptVnlLR0lwS1NCN1hHNGdJQ0FnZEdoeWIzY2dibVYzSUZSNWNHVkZjbkp2Y2lnblFYSm5kVzFsYm5SeklHMTFjM1FnWW1VZ1FuVm1abVZ5Y3ljcFhHNGdJSDFjYmx4dUlDQnBaaUFvWVNBOVBUMGdZaWtnY21WMGRYSnVJREJjYmx4dUlDQjJZWElnZUNBOUlHRXViR1Z1WjNSb1hHNGdJSFpoY2lCNUlEMGdZaTVzWlc1bmRHaGNibHh1SUNCMllYSWdhU0E5SURCY2JpQWdkbUZ5SUd4bGJpQTlJRTFoZEdndWJXbHVLSGdzSUhrcFhHNGdJSGRvYVd4bElDaHBJRHdnYkdWdUtTQjdYRzRnSUNBZ2FXWWdLR0ZiYVYwZ0lUMDlJR0piYVYwcElHSnlaV0ZyWEc1Y2JpQWdJQ0FySzJsY2JpQWdmVnh1WEc0Z0lHbG1JQ2hwSUNFOVBTQnNaVzRwSUh0Y2JpQWdJQ0I0SUQwZ1lWdHBYVnh1SUNBZ0lIa2dQU0JpVzJsZFhHNGdJSDFjYmx4dUlDQnBaaUFvZUNBOElIa3BJSEpsZEhWeWJpQXRNVnh1SUNCcFppQW9lU0E4SUhncElISmxkSFZ5YmlBeFhHNGdJSEpsZEhWeWJpQXdYRzU5WEc1Y2JrSjFabVpsY2k1cGMwVnVZMjlrYVc1bklEMGdablZ1WTNScGIyNGdhWE5GYm1OdlpHbHVaeUFvWlc1amIyUnBibWNwSUh0Y2JpQWdjM2RwZEdOb0lDaFRkSEpwYm1jb1pXNWpiMlJwYm1jcExuUnZURzkzWlhKRFlYTmxLQ2twSUh0Y2JpQWdJQ0JqWVhObElDZG9aWGduT2x4dUlDQWdJR05oYzJVZ0ozVjBaamduT2x4dUlDQWdJR05oYzJVZ0ozVjBaaTA0SnpwY2JpQWdJQ0JqWVhObElDZGhjMk5wYVNjNlhHNGdJQ0FnWTJGelpTQW5ZbWx1WVhKNUp6cGNiaUFnSUNCallYTmxJQ2RpWVhObE5qUW5PbHh1SUNBZ0lHTmhjMlVnSjNKaGR5YzZYRzRnSUNBZ1kyRnpaU0FuZFdOek1pYzZYRzRnSUNBZ1kyRnpaU0FuZFdOekxUSW5PbHh1SUNBZ0lHTmhjMlVnSjNWMFpqRTJiR1VuT2x4dUlDQWdJR05oYzJVZ0ozVjBaaTB4Tm14bEp6cGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGNuVmxYRzRnSUNBZ1pHVm1ZWFZzZERwY2JpQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpWeHVJQ0I5WEc1OVhHNWNia0oxWm1abGNpNWpiMjVqWVhRZ1BTQm1kVzVqZEdsdmJpQmpiMjVqWVhRZ0tHeHBjM1FzSUd4bGJtZDBhQ2tnZTF4dUlDQnBaaUFvSVdselFYSnlZWGtvYkdsemRDa3BJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjJ4cGMzUWdZWEpuZFcxbGJuUWdiWFZ6ZENCaVpTQmhiaUJCY25KaGVTQnZaaUJDZFdabVpYSnpMaWNwWEc1Y2JpQWdhV1lnS0d4cGMzUXViR1Z1WjNSb0lEMDlQU0F3S1NCN1hHNGdJQ0FnY21WMGRYSnVJRzVsZHlCQ2RXWm1aWElvTUNsY2JpQWdmVnh1WEc0Z0lIWmhjaUJwWEc0Z0lHbG1JQ2hzWlc1bmRHZ2dQVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHVJQ0FnSUd4bGJtZDBhQ0E5SURCY2JpQWdJQ0JtYjNJZ0tHa2dQU0F3T3lCcElEd2diR2x6ZEM1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdiR1Z1WjNSb0lDczlJR3hwYzNSYmFWMHViR1Z1WjNSb1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2RtRnlJR0oxWmlBOUlHNWxkeUJDZFdabVpYSW9iR1Z1WjNSb0tWeHVJQ0IyWVhJZ2NHOXpJRDBnTUZ4dUlDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z2JHbHpkQzVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUhaaGNpQnBkR1Z0SUQwZ2JHbHpkRnRwWFZ4dUlDQWdJR2wwWlcwdVkyOXdlU2hpZFdZc0lIQnZjeWxjYmlBZ0lDQndiM01nS3owZ2FYUmxiUzVzWlc1bmRHaGNiaUFnZlZ4dUlDQnlaWFIxY200Z1luVm1YRzU5WEc1Y2JtWjFibU4wYVc5dUlHSjVkR1ZNWlc1bmRHZ2dLSE4wY21sdVp5d2daVzVqYjJScGJtY3BJSHRjYmlBZ2FXWWdLSFI1Y0dWdlppQnpkSEpwYm1jZ0lUMDlJQ2R6ZEhKcGJtY25LU0J6ZEhKcGJtY2dQU0FuSnlBcklITjBjbWx1WjF4dVhHNGdJSFpoY2lCc1pXNGdQU0J6ZEhKcGJtY3ViR1Z1WjNSb1hHNGdJR2xtSUNoc1pXNGdQVDA5SURBcElISmxkSFZ5YmlBd1hHNWNiaUFnTHk4Z1ZYTmxJR0VnWm05eUlHeHZiM0FnZEc4Z1lYWnZhV1FnY21WamRYSnphVzl1WEc0Z0lIWmhjaUJzYjNkbGNtVmtRMkZ6WlNBOUlHWmhiSE5sWEc0Z0lHWnZjaUFvT3pzcElIdGNiaUFnSUNCemQybDBZMmdnS0dWdVkyOWthVzVuS1NCN1hHNGdJQ0FnSUNCallYTmxJQ2RoYzJOcGFTYzZYRzRnSUNBZ0lDQmpZWE5sSUNkaWFXNWhjbmtuT2x4dUlDQWdJQ0FnTHk4Z1JHVndjbVZqWVhSbFpGeHVJQ0FnSUNBZ1kyRnpaU0FuY21GM0p6cGNiaUFnSUNBZ0lHTmhjMlVnSjNKaGQzTW5PbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdiR1Z1WEc0Z0lDQWdJQ0JqWVhObElDZDFkR1k0SnpwY2JpQWdJQ0FnSUdOaGMyVWdKM1YwWmkwNEp6cGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIVjBaamhVYjBKNWRHVnpLSE4wY21sdVp5a3ViR1Z1WjNSb1hHNGdJQ0FnSUNCallYTmxJQ2QxWTNNeUp6cGNiaUFnSUNBZ0lHTmhjMlVnSjNWamN5MHlKenBjYmlBZ0lDQWdJR05oYzJVZ0ozVjBaakUyYkdVbk9seHVJQ0FnSUNBZ1kyRnpaU0FuZFhSbUxURTJiR1VuT2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYkdWdUlDb2dNbHh1SUNBZ0lDQWdZMkZ6WlNBbmFHVjRKenBjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR3hsYmlBK1BqNGdNVnh1SUNBZ0lDQWdZMkZ6WlNBblltRnpaVFkwSnpwY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdKaGMyVTJORlJ2UW5sMFpYTW9jM1J5YVc1bktTNXNaVzVuZEdoY2JpQWdJQ0FnSUdSbFptRjFiSFE2WEc0Z0lDQWdJQ0FnSUdsbUlDaHNiM2RsY21Wa1EyRnpaU2tnY21WMGRYSnVJSFYwWmpoVWIwSjVkR1Z6S0hOMGNtbHVaeWt1YkdWdVozUm9JQzh2SUdGemMzVnRaU0IxZEdZNFhHNGdJQ0FnSUNBZ0lHVnVZMjlrYVc1bklEMGdLQ2NuSUNzZ1pXNWpiMlJwYm1jcExuUnZURzkzWlhKRFlYTmxLQ2xjYmlBZ0lDQWdJQ0FnYkc5M1pYSmxaRU5oYzJVZ1BTQjBjblZsWEc0Z0lDQWdmVnh1SUNCOVhHNTlYRzVDZFdabVpYSXVZbmwwWlV4bGJtZDBhQ0E5SUdKNWRHVk1aVzVuZEdoY2JseHVablZ1WTNScGIyNGdjMnh2ZDFSdlUzUnlhVzVuSUNobGJtTnZaR2x1Wnl3Z2MzUmhjblFzSUdWdVpDa2dlMXh1SUNCMllYSWdiRzkzWlhKbFpFTmhjMlVnUFNCbVlXeHpaVnh1WEc0Z0lITjBZWEowSUQwZ2MzUmhjblFnZkNBd1hHNGdJR1Z1WkNBOUlHVnVaQ0E5UFQwZ2RXNWtaV1pwYm1Wa0lIeDhJR1Z1WkNBOVBUMGdTVzVtYVc1cGRIa2dQeUIwYUdsekxteGxibWQwYUNBNklHVnVaQ0I4SURCY2JseHVJQ0JwWmlBb0lXVnVZMjlrYVc1bktTQmxibU52WkdsdVp5QTlJQ2QxZEdZNEoxeHVJQ0JwWmlBb2MzUmhjblFnUENBd0tTQnpkR0Z5ZENBOUlEQmNiaUFnYVdZZ0tHVnVaQ0ErSUhSb2FYTXViR1Z1WjNSb0tTQmxibVFnUFNCMGFHbHpMbXhsYm1kMGFGeHVJQ0JwWmlBb1pXNWtJRHc5SUhOMFlYSjBLU0J5WlhSMWNtNGdKeWRjYmx4dUlDQjNhR2xzWlNBb2RISjFaU2tnZTF4dUlDQWdJSE4zYVhSamFDQW9aVzVqYjJScGJtY3BJSHRjYmlBZ0lDQWdJR05oYzJVZ0oyaGxlQ2M2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJvWlhoVGJHbGpaU2gwYUdsekxDQnpkR0Z5ZEN3Z1pXNWtLVnh1WEc0Z0lDQWdJQ0JqWVhObElDZDFkR1k0SnpwY2JpQWdJQ0FnSUdOaGMyVWdKM1YwWmkwNEp6cGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIVjBaamhUYkdsalpTaDBhR2x6TENCemRHRnlkQ3dnWlc1a0tWeHVYRzRnSUNBZ0lDQmpZWE5sSUNkaGMyTnBhU2M2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJoYzJOcGFWTnNhV05sS0hSb2FYTXNJSE4wWVhKMExDQmxibVFwWEc1Y2JpQWdJQ0FnSUdOaGMyVWdKMkpwYm1GeWVTYzZYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmlhVzVoY25sVGJHbGpaU2gwYUdsekxDQnpkR0Z5ZEN3Z1pXNWtLVnh1WEc0Z0lDQWdJQ0JqWVhObElDZGlZWE5sTmpRbk9seHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1ltRnpaVFkwVTJ4cFkyVW9kR2hwY3l3Z2MzUmhjblFzSUdWdVpDbGNibHh1SUNBZ0lDQWdZMkZ6WlNBbmRXTnpNaWM2WEc0Z0lDQWdJQ0JqWVhObElDZDFZM010TWljNlhHNGdJQ0FnSUNCallYTmxJQ2QxZEdZeE5teGxKenBjYmlBZ0lDQWdJR05oYzJVZ0ozVjBaaTB4Tm14bEp6cGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIVjBaakUyYkdWVGJHbGpaU2gwYUdsekxDQnpkR0Z5ZEN3Z1pXNWtLVnh1WEc0Z0lDQWdJQ0JrWldaaGRXeDBPbHh1SUNBZ0lDQWdJQ0JwWmlBb2JHOTNaWEpsWkVOaGMyVXBJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjFWdWEyNXZkMjRnWlc1amIyUnBibWM2SUNjZ0t5QmxibU52WkdsdVp5bGNiaUFnSUNBZ0lDQWdaVzVqYjJScGJtY2dQU0FvWlc1amIyUnBibWNnS3lBbkp5a3VkRzlNYjNkbGNrTmhjMlVvS1Z4dUlDQWdJQ0FnSUNCc2IzZGxjbVZrUTJGelpTQTlJSFJ5ZFdWY2JpQWdJQ0I5WEc0Z0lIMWNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1MGIxTjBjbWx1WnlBOUlHWjFibU4wYVc5dUlIUnZVM1J5YVc1bklDZ3BJSHRjYmlBZ2RtRnlJR3hsYm1kMGFDQTlJSFJvYVhNdWJHVnVaM1JvSUh3Z01GeHVJQ0JwWmlBb2JHVnVaM1JvSUQwOVBTQXdLU0J5WlhSMWNtNGdKeWRjYmlBZ2FXWWdLR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQVDA5SURBcElISmxkSFZ5YmlCMWRHWTRVMnhwWTJVb2RHaHBjeXdnTUN3Z2JHVnVaM1JvS1Z4dUlDQnlaWFIxY200Z2MyeHZkMVJ2VTNSeWFXNW5MbUZ3Y0d4NUtIUm9hWE1zSUdGeVozVnRaVzUwY3lsY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzVsY1hWaGJITWdQU0JtZFc1amRHbHZiaUJsY1hWaGJITWdLR0lwSUh0Y2JpQWdhV1lnS0NGQ2RXWm1aWEl1YVhOQ2RXWm1aWElvWWlrcElIUm9jbTkzSUc1bGR5QlVlWEJsUlhKeWIzSW9KMEZ5WjNWdFpXNTBJRzExYzNRZ1ltVWdZU0JDZFdabVpYSW5LVnh1SUNCcFppQW9kR2hwY3lBOVBUMGdZaWtnY21WMGRYSnVJSFJ5ZFdWY2JpQWdjbVYwZFhKdUlFSjFabVpsY2k1amIyMXdZWEpsS0hSb2FYTXNJR0lwSUQwOVBTQXdYRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWFXNXpjR1ZqZENBOUlHWjFibU4wYVc5dUlHbHVjM0JsWTNRZ0tDa2dlMXh1SUNCMllYSWdjM1J5SUQwZ0p5ZGNiaUFnZG1GeUlHMWhlQ0E5SUdWNGNHOXlkSE11U1U1VFVFVkRWRjlOUVZoZlFsbFVSVk5jYmlBZ2FXWWdLSFJvYVhNdWJHVnVaM1JvSUQ0Z01Da2dlMXh1SUNBZ0lITjBjaUE5SUhSb2FYTXVkRzlUZEhKcGJtY29KMmhsZUNjc0lEQXNJRzFoZUNrdWJXRjBZMmdvTHk1N01uMHZaeWt1YW05cGJpZ25JQ2NwWEc0Z0lDQWdhV1lnS0hSb2FYTXViR1Z1WjNSb0lENGdiV0Y0S1NCemRISWdLejBnSnlBdUxpNGdKMXh1SUNCOVhHNGdJSEpsZEhWeWJpQW5QRUoxWm1abGNpQW5JQ3NnYzNSeUlDc2dKejRuWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVZMjl0Y0dGeVpTQTlJR1oxYm1OMGFXOXVJR052YlhCaGNtVWdLR0lwSUh0Y2JpQWdhV1lnS0NGQ2RXWm1aWEl1YVhOQ2RXWm1aWElvWWlrcElIUm9jbTkzSUc1bGR5QlVlWEJsUlhKeWIzSW9KMEZ5WjNWdFpXNTBJRzExYzNRZ1ltVWdZU0JDZFdabVpYSW5LVnh1SUNCcFppQW9kR2hwY3lBOVBUMGdZaWtnY21WMGRYSnVJREJjYmlBZ2NtVjBkWEp1SUVKMVptWmxjaTVqYjIxd1lYSmxLSFJvYVhNc0lHSXBYRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWFXNWtaWGhQWmlBOUlHWjFibU4wYVc5dUlHbHVaR1Y0VDJZZ0tIWmhiQ3dnWW5sMFpVOW1abk5sZENrZ2UxeHVJQ0JwWmlBb1lubDBaVTltWm5ObGRDQStJREI0TjJabVptWm1abVlwSUdKNWRHVlBabVp6WlhRZ1BTQXdlRGRtWm1abVptWm1YRzRnSUdWc2MyVWdhV1lnS0dKNWRHVlBabVp6WlhRZ1BDQXRNSGc0TURBd01EQXdNQ2tnWW5sMFpVOW1abk5sZENBOUlDMHdlRGd3TURBd01EQXdYRzRnSUdKNWRHVlBabVp6WlhRZ1BqNDlJREJjYmx4dUlDQnBaaUFvZEdocGN5NXNaVzVuZEdnZ1BUMDlJREFwSUhKbGRIVnliaUF0TVZ4dUlDQnBaaUFvWW5sMFpVOW1abk5sZENBK1BTQjBhR2x6TG14bGJtZDBhQ2tnY21WMGRYSnVJQzB4WEc1Y2JpQWdMeThnVG1WbllYUnBkbVVnYjJabWMyVjBjeUJ6ZEdGeWRDQm1jbTl0SUhSb1pTQmxibVFnYjJZZ2RHaGxJR0oxWm1abGNseHVJQ0JwWmlBb1lubDBaVTltWm5ObGRDQThJREFwSUdKNWRHVlBabVp6WlhRZ1BTQk5ZWFJvTG0xaGVDaDBhR2x6TG14bGJtZDBhQ0FySUdKNWRHVlBabVp6WlhRc0lEQXBYRzVjYmlBZ2FXWWdLSFI1Y0dWdlppQjJZV3dnUFQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ2FXWWdLSFpoYkM1c1pXNW5kR2dnUFQwOUlEQXBJSEpsZEhWeWJpQXRNU0F2THlCemNHVmphV0ZzSUdOaGMyVTZJR3h2YjJ0cGJtY2dabTl5SUdWdGNIUjVJSE4wY21sdVp5QmhiSGRoZVhNZ1ptRnBiSE5jYmlBZ0lDQnlaWFIxY200Z1UzUnlhVzVuTG5CeWIzUnZkSGx3WlM1cGJtUmxlRTltTG1OaGJHd29kR2hwY3l3Z2RtRnNMQ0JpZVhSbFQyWm1jMlYwS1Z4dUlDQjlYRzRnSUdsbUlDaENkV1ptWlhJdWFYTkNkV1ptWlhJb2RtRnNLU2tnZTF4dUlDQWdJSEpsZEhWeWJpQmhjbkpoZVVsdVpHVjRUMllvZEdocGN5d2dkbUZzTENCaWVYUmxUMlptYzJWMEtWeHVJQ0I5WEc0Z0lHbG1JQ2gwZVhCbGIyWWdkbUZzSUQwOVBTQW5iblZ0WW1WeUp5a2dlMXh1SUNBZ0lHbG1JQ2hDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ0FtSmlCVmFXNTBPRUZ5Y21GNUxuQnliM1J2ZEhsd1pTNXBibVJsZUU5bUlEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnVldsdWREaEJjbkpoZVM1d2NtOTBiM1I1Y0dVdWFXNWtaWGhQWmk1allXeHNLSFJvYVhNc0lIWmhiQ3dnWW5sMFpVOW1abk5sZENsY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHRnljbUY1U1c1a1pYaFBaaWgwYUdsekxDQmJJSFpoYkNCZExDQmllWFJsVDJabWMyVjBLVnh1SUNCOVhHNWNiaUFnWm5WdVkzUnBiMjRnWVhKeVlYbEpibVJsZUU5bUlDaGhjbklzSUhaaGJDd2dZbmwwWlU5bVpuTmxkQ2tnZTF4dUlDQWdJSFpoY2lCbWIzVnVaRWx1WkdWNElEMGdMVEZjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ1lubDBaVTltWm5ObGRDQXJJR2tnUENCaGNuSXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUdsbUlDaGhjbkpiWW5sMFpVOW1abk5sZENBcklHbGRJRDA5UFNCMllXeGJabTkxYm1SSmJtUmxlQ0E5UFQwZ0xURWdQeUF3SURvZ2FTQXRJR1p2ZFc1a1NXNWtaWGhkS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2htYjNWdVpFbHVaR1Y0SUQwOVBTQXRNU2tnWm05MWJtUkpibVJsZUNBOUlHbGNiaUFnSUNBZ0lDQWdhV1lnS0drZ0xTQm1iM1Z1WkVsdVpHVjRJQ3NnTVNBOVBUMGdkbUZzTG14bGJtZDBhQ2tnY21WMGRYSnVJR0o1ZEdWUFptWnpaWFFnS3lCbWIzVnVaRWx1WkdWNFhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCbWIzVnVaRWx1WkdWNElEMGdMVEZjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUMweFhHNGdJSDFjYmx4dUlDQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2QyWVd3Z2JYVnpkQ0JpWlNCemRISnBibWNzSUc1MWJXSmxjaUJ2Y2lCQ2RXWm1aWEluS1Z4dWZWeHVYRzR2THlCZ1oyVjBZQ0JwY3lCa1pYQnlaV05oZEdWa1hHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExtZGxkQ0E5SUdaMWJtTjBhVzl1SUdkbGRDQW9iMlptYzJWMEtTQjdYRzRnSUdOdmJuTnZiR1V1Ykc5bktDY3VaMlYwS0NrZ2FYTWdaR1Z3Y21WallYUmxaQzRnUVdOalpYTnpJSFZ6YVc1bklHRnljbUY1SUdsdVpHVjRaWE1nYVc1emRHVmhaQzRuS1Z4dUlDQnlaWFIxY200Z2RHaHBjeTV5WldGa1ZVbHVkRGdvYjJabWMyVjBLVnh1ZlZ4dVhHNHZMeUJnYzJWMFlDQnBjeUJrWlhCeVpXTmhkR1ZrWEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5ObGRDQTlJR1oxYm1OMGFXOXVJSE5sZENBb2Rpd2diMlptYzJWMEtTQjdYRzRnSUdOdmJuTnZiR1V1Ykc5bktDY3VjMlYwS0NrZ2FYTWdaR1Z3Y21WallYUmxaQzRnUVdOalpYTnpJSFZ6YVc1bklHRnljbUY1SUdsdVpHVjRaWE1nYVc1emRHVmhaQzRuS1Z4dUlDQnlaWFIxY200Z2RHaHBjeTUzY21sMFpWVkpiblE0S0hZc0lHOW1abk5sZENsY2JuMWNibHh1Wm5WdVkzUnBiMjRnYUdWNFYzSnBkR1VnS0dKMVppd2djM1J5YVc1bkxDQnZabVp6WlhRc0lHeGxibWQwYUNrZ2UxeHVJQ0J2Wm1aelpYUWdQU0JPZFcxaVpYSW9iMlptYzJWMEtTQjhmQ0F3WEc0Z0lIWmhjaUJ5WlcxaGFXNXBibWNnUFNCaWRXWXViR1Z1WjNSb0lDMGdiMlptYzJWMFhHNGdJR2xtSUNnaGJHVnVaM1JvS1NCN1hHNGdJQ0FnYkdWdVozUm9JRDBnY21WdFlXbHVhVzVuWEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnYkdWdVozUm9JRDBnVG5WdFltVnlLR3hsYm1kMGFDbGNiaUFnSUNCcFppQW9iR1Z1WjNSb0lENGdjbVZ0WVdsdWFXNW5LU0I3WEc0Z0lDQWdJQ0JzWlc1bmRHZ2dQU0J5WlcxaGFXNXBibWRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0F2THlCdGRYTjBJR0psSUdGdUlHVjJaVzRnYm5WdFltVnlJRzltSUdScFoybDBjMXh1SUNCMllYSWdjM1J5VEdWdUlEMGdjM1J5YVc1bkxteGxibWQwYUZ4dUlDQnBaaUFvYzNSeVRHVnVJQ1VnTWlBaFBUMGdNQ2tnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RKYm5aaGJHbGtJR2hsZUNCemRISnBibWNuS1Z4dVhHNGdJR2xtSUNoc1pXNW5kR2dnUGlCemRISk1aVzRnTHlBeUtTQjdYRzRnSUNBZ2JHVnVaM1JvSUQwZ2MzUnlUR1Z1SUM4Z01seHVJQ0I5WEc0Z0lHWnZjaUFvZG1GeUlHa2dQU0F3T3lCcElEd2diR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0IyWVhJZ2NHRnljMlZrSUQwZ2NHRnljMlZKYm5Rb2MzUnlhVzVuTG5OMVluTjBjaWhwSUNvZ01pd2dNaWtzSURFMktWeHVJQ0FnSUdsbUlDaHBjMDVoVGlod1lYSnpaV1FwS1NCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjBsdWRtRnNhV1FnYUdWNElITjBjbWx1WnljcFhHNGdJQ0FnWW5WbVcyOW1abk5sZENBcklHbGRJRDBnY0dGeWMyVmtYRzRnSUgxY2JpQWdjbVYwZFhKdUlHbGNibjFjYmx4dVpuVnVZM1JwYjI0Z2RYUm1PRmR5YVhSbElDaGlkV1lzSUhOMGNtbHVaeXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BJSHRjYmlBZ2NtVjBkWEp1SUdKc2FYUkNkV1ptWlhJb2RYUm1PRlJ2UW5sMFpYTW9jM1J5YVc1bkxDQmlkV1l1YkdWdVozUm9JQzBnYjJabWMyVjBLU3dnWW5WbUxDQnZabVp6WlhRc0lHeGxibWQwYUNsY2JuMWNibHh1Wm5WdVkzUnBiMjRnWVhOamFXbFhjbWwwWlNBb1luVm1MQ0J6ZEhKcGJtY3NJRzltWm5ObGRDd2diR1Z1WjNSb0tTQjdYRzRnSUhKbGRIVnliaUJpYkdsMFFuVm1abVZ5S0dGelkybHBWRzlDZVhSbGN5aHpkSEpwYm1jcExDQmlkV1lzSUc5bVpuTmxkQ3dnYkdWdVozUm9LVnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmlhVzVoY25sWGNtbDBaU0FvWW5WbUxDQnpkSEpwYm1jc0lHOW1abk5sZEN3Z2JHVnVaM1JvS1NCN1hHNGdJSEpsZEhWeWJpQmhjMk5wYVZkeWFYUmxLR0oxWml3Z2MzUnlhVzVuTENCdlptWnpaWFFzSUd4bGJtZDBhQ2xjYm4xY2JseHVablZ1WTNScGIyNGdZbUZ6WlRZMFYzSnBkR1VnS0dKMVppd2djM1J5YVc1bkxDQnZabVp6WlhRc0lHeGxibWQwYUNrZ2UxeHVJQ0J5WlhSMWNtNGdZbXhwZEVKMVptWmxjaWhpWVhObE5qUlViMEo1ZEdWektITjBjbWx1Wnlrc0lHSjFaaXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BYRzU5WEc1Y2JtWjFibU4wYVc5dUlIVmpjekpYY21sMFpTQW9ZblZtTENCemRISnBibWNzSUc5bVpuTmxkQ3dnYkdWdVozUm9LU0I3WEc0Z0lISmxkSFZ5YmlCaWJHbDBRblZtWm1WeUtIVjBaakUyYkdWVWIwSjVkR1Z6S0hOMGNtbHVaeXdnWW5WbUxteGxibWQwYUNBdElHOW1abk5sZENrc0lHSjFaaXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BYRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWQzSnBkR1VnUFNCbWRXNWpkR2x2YmlCM2NtbDBaU0FvYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDd2daVzVqYjJScGJtY3BJSHRjYmlBZ0x5OGdRblZtWm1WeUkzZHlhWFJsS0hOMGNtbHVaeWxjYmlBZ2FXWWdLRzltWm5ObGRDQTlQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnWlc1amIyUnBibWNnUFNBbmRYUm1PQ2RjYmlBZ0lDQnNaVzVuZEdnZ1BTQjBhR2x6TG14bGJtZDBhRnh1SUNBZ0lHOW1abk5sZENBOUlEQmNiaUFnTHk4Z1FuVm1abVZ5STNkeWFYUmxLSE4wY21sdVp5d2daVzVqYjJScGJtY3BYRzRnSUgwZ1pXeHpaU0JwWmlBb2JHVnVaM1JvSUQwOVBTQjFibVJsWm1sdVpXUWdKaVlnZEhsd1pXOW1JRzltWm5ObGRDQTlQVDBnSjNOMGNtbHVaeWNwSUh0Y2JpQWdJQ0JsYm1OdlpHbHVaeUE5SUc5bVpuTmxkRnh1SUNBZ0lHeGxibWQwYUNBOUlIUm9hWE11YkdWdVozUm9YRzRnSUNBZ2IyWm1jMlYwSUQwZ01GeHVJQ0F2THlCQ2RXWm1aWElqZDNKcGRHVW9jM1J5YVc1bkxDQnZabVp6WlhSYkxDQnNaVzVuZEdoZFd5d2daVzVqYjJScGJtZGRLVnh1SUNCOUlHVnNjMlVnYVdZZ0tHbHpSbWx1YVhSbEtHOW1abk5sZENrcElIdGNiaUFnSUNCdlptWnpaWFFnUFNCdlptWnpaWFFnZkNBd1hHNGdJQ0FnYVdZZ0tHbHpSbWx1YVhSbEtHeGxibWQwYUNrcElIdGNiaUFnSUNBZ0lHeGxibWQwYUNBOUlHeGxibWQwYUNCOElEQmNiaUFnSUNBZ0lHbG1JQ2hsYm1OdlpHbHVaeUE5UFQwZ2RXNWtaV1pwYm1Wa0tTQmxibU52WkdsdVp5QTlJQ2QxZEdZNEoxeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JsYm1OdlpHbHVaeUE5SUd4bGJtZDBhRnh1SUNBZ0lDQWdiR1Z1WjNSb0lEMGdkVzVrWldacGJtVmtYRzRnSUNBZ2ZWeHVJQ0F2THlCc1pXZGhZM2tnZDNKcGRHVW9jM1J5YVc1bkxDQmxibU52WkdsdVp5d2diMlptYzJWMExDQnNaVzVuZEdncElDMGdjbVZ0YjNabElHbHVJSFl3TGpFelhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2RtRnlJSE4zWVhBZ1BTQmxibU52WkdsdVoxeHVJQ0FnSUdWdVkyOWthVzVuSUQwZ2IyWm1jMlYwWEc0Z0lDQWdiMlptYzJWMElEMGdiR1Z1WjNSb0lId2dNRnh1SUNBZ0lHeGxibWQwYUNBOUlITjNZWEJjYmlBZ2ZWeHVYRzRnSUhaaGNpQnlaVzFoYVc1cGJtY2dQU0IwYUdsekxteGxibWQwYUNBdElHOW1abk5sZEZ4dUlDQnBaaUFvYkdWdVozUm9JRDA5UFNCMWJtUmxabWx1WldRZ2ZId2diR1Z1WjNSb0lENGdjbVZ0WVdsdWFXNW5LU0JzWlc1bmRHZ2dQU0J5WlcxaGFXNXBibWRjYmx4dUlDQnBaaUFvS0hOMGNtbHVaeTVzWlc1bmRHZ2dQaUF3SUNZbUlDaHNaVzVuZEdnZ1BDQXdJSHg4SUc5bVpuTmxkQ0E4SURBcEtTQjhmQ0J2Wm1aelpYUWdQaUIwYUdsekxteGxibWQwYUNrZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCU1lXNW5aVVZ5Y205eUtDZGhkSFJsYlhCMElIUnZJSGR5YVhSbElHOTFkSE5wWkdVZ1luVm1abVZ5SUdKdmRXNWtjeWNwWEc0Z0lIMWNibHh1SUNCcFppQW9JV1Z1WTI5a2FXNW5LU0JsYm1OdlpHbHVaeUE5SUNkMWRHWTRKMXh1WEc0Z0lIWmhjaUJzYjNkbGNtVmtRMkZ6WlNBOUlHWmhiSE5sWEc0Z0lHWnZjaUFvT3pzcElIdGNiaUFnSUNCemQybDBZMmdnS0dWdVkyOWthVzVuS1NCN1hHNGdJQ0FnSUNCallYTmxJQ2RvWlhnbk9seHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2FHVjRWM0pwZEdVb2RHaHBjeXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDbGNibHh1SUNBZ0lDQWdZMkZ6WlNBbmRYUm1PQ2M2WEc0Z0lDQWdJQ0JqWVhObElDZDFkR1l0T0NjNlhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMWRHWTRWM0pwZEdVb2RHaHBjeXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDbGNibHh1SUNBZ0lDQWdZMkZ6WlNBbllYTmphV2tuT2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWVhOamFXbFhjbWwwWlNoMGFHbHpMQ0J6ZEhKcGJtY3NJRzltWm5ObGRDd2diR1Z1WjNSb0tWeHVYRzRnSUNBZ0lDQmpZWE5sSUNkaWFXNWhjbmtuT2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWW1sdVlYSjVWM0pwZEdVb2RHaHBjeXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDbGNibHh1SUNBZ0lDQWdZMkZ6WlNBblltRnpaVFkwSnpwY2JpQWdJQ0FnSUNBZ0x5OGdWMkZ5Ym1sdVp6b2diV0Y0VEdWdVozUm9JRzV2ZENCMFlXdGxiaUJwYm5SdklHRmpZMjkxYm5RZ2FXNGdZbUZ6WlRZMFYzSnBkR1ZjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR0poYzJVMk5GZHlhWFJsS0hSb2FYTXNJSE4wY21sdVp5d2diMlptYzJWMExDQnNaVzVuZEdncFhHNWNiaUFnSUNBZ0lHTmhjMlVnSjNWamN6SW5PbHh1SUNBZ0lDQWdZMkZ6WlNBbmRXTnpMVEluT2x4dUlDQWdJQ0FnWTJGelpTQW5kWFJtTVRac1pTYzZYRzRnSUNBZ0lDQmpZWE5sSUNkMWRHWXRNVFpzWlNjNlhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMVkzTXlWM0pwZEdVb2RHaHBjeXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDbGNibHh1SUNBZ0lDQWdaR1ZtWVhWc2REcGNiaUFnSUNBZ0lDQWdhV1lnS0d4dmQyVnlaV1JEWVhObEtTQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RWYm10dWIzZHVJR1Z1WTI5a2FXNW5PaUFuSUNzZ1pXNWpiMlJwYm1jcFhHNGdJQ0FnSUNBZ0lHVnVZMjlrYVc1bklEMGdLQ2NuSUNzZ1pXNWpiMlJwYm1jcExuUnZURzkzWlhKRFlYTmxLQ2xjYmlBZ0lDQWdJQ0FnYkc5M1pYSmxaRU5oYzJVZ1BTQjBjblZsWEc0Z0lDQWdmVnh1SUNCOVhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1ZEc5S1UwOU9JRDBnWm5WdVkzUnBiMjRnZEc5S1UwOU9JQ2dwSUh0Y2JpQWdjbVYwZFhKdUlIdGNiaUFnSUNCMGVYQmxPaUFuUW5WbVptVnlKeXhjYmlBZ0lDQmtZWFJoT2lCQmNuSmhlUzV3Y205MGIzUjVjR1V1YzJ4cFkyVXVZMkZzYkNoMGFHbHpMbDloY25JZ2ZId2dkR2hwY3l3Z01DbGNiaUFnZlZ4dWZWeHVYRzVtZFc1amRHbHZiaUJpWVhObE5qUlRiR2xqWlNBb1luVm1MQ0J6ZEdGeWRDd2daVzVrS1NCN1hHNGdJR2xtSUNoemRHRnlkQ0E5UFQwZ01DQW1KaUJsYm1RZ1BUMDlJR0oxWmk1c1pXNW5kR2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdZbUZ6WlRZMExtWnliMjFDZVhSbFFYSnlZWGtvWW5WbUtWeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lISmxkSFZ5YmlCaVlYTmxOalF1Wm5KdmJVSjVkR1ZCY25KaGVTaGlkV1l1YzJ4cFkyVW9jM1JoY25Rc0lHVnVaQ2twWEc0Z0lIMWNibjFjYmx4dVpuVnVZM1JwYjI0Z2RYUm1PRk5zYVdObElDaGlkV1lzSUhOMFlYSjBMQ0JsYm1RcElIdGNiaUFnWlc1a0lEMGdUV0YwYUM1dGFXNG9ZblZtTG14bGJtZDBhQ3dnWlc1a0tWeHVJQ0IyWVhJZ2NtVnpJRDBnVzExY2JseHVJQ0IyWVhJZ2FTQTlJSE4wWVhKMFhHNGdJSGRvYVd4bElDaHBJRHdnWlc1a0tTQjdYRzRnSUNBZ2RtRnlJR1pwY25OMFFubDBaU0E5SUdKMVpsdHBYVnh1SUNBZ0lIWmhjaUJqYjJSbFVHOXBiblFnUFNCdWRXeHNYRzRnSUNBZ2RtRnlJR0o1ZEdWelVHVnlVMlZ4ZFdWdVkyVWdQU0FvWm1seWMzUkNlWFJsSUQ0Z01IaEZSaWtnUHlBMFhHNGdJQ0FnSUNBNklDaG1hWEp6ZEVKNWRHVWdQaUF3ZUVSR0tTQS9JRE5jYmlBZ0lDQWdJRG9nS0dacGNuTjBRbmwwWlNBK0lEQjRRa1lwSUQ4Z01seHVJQ0FnSUNBZ09pQXhYRzVjYmlBZ0lDQnBaaUFvYVNBcklHSjVkR1Z6VUdWeVUyVnhkV1Z1WTJVZ1BEMGdaVzVrS1NCN1hHNGdJQ0FnSUNCMllYSWdjMlZqYjI1a1FubDBaU3dnZEdocGNtUkNlWFJsTENCbWIzVnlkR2hDZVhSbExDQjBaVzF3UTI5a1pWQnZhVzUwWEc1Y2JpQWdJQ0FnSUhOM2FYUmphQ0FvWW5sMFpYTlFaWEpUWlhGMVpXNWpaU2tnZTF4dUlDQWdJQ0FnSUNCallYTmxJREU2WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR1pwY25OMFFubDBaU0E4SURCNE9EQXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZaR1ZRYjJsdWRDQTlJR1pwY25OMFFubDBaVnh1SUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQmljbVZoYTF4dUlDQWdJQ0FnSUNCallYTmxJREk2WEc0Z0lDQWdJQ0FnSUNBZ2MyVmpiMjVrUW5sMFpTQTlJR0oxWmx0cElDc2dNVjFjYmlBZ0lDQWdJQ0FnSUNCcFppQW9LSE5sWTI5dVpFSjVkR1VnSmlBd2VFTXdLU0E5UFQwZ01IZzRNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkR1Z0Y0VOdlpHVlFiMmx1ZENBOUlDaG1hWEp6ZEVKNWRHVWdKaUF3ZURGR0tTQThQQ0F3ZURZZ2ZDQW9jMlZqYjI1a1FubDBaU0FtSURCNE0wWXBYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR1Z0Y0VOdlpHVlFiMmx1ZENBK0lEQjROMFlwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5a1pWQnZhVzUwSUQwZ2RHVnRjRU52WkdWUWIybHVkRnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCaWNtVmhhMXh1SUNBZ0lDQWdJQ0JqWVhObElETTZYRzRnSUNBZ0lDQWdJQ0FnYzJWamIyNWtRbmwwWlNBOUlHSjFabHRwSUNzZ01WMWNiaUFnSUNBZ0lDQWdJQ0IwYUdseVpFSjVkR1VnUFNCaWRXWmJhU0FySURKZFhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0NoelpXTnZibVJDZVhSbElDWWdNSGhETUNrZ1BUMDlJREI0T0RBZ0ppWWdLSFJvYVhKa1FubDBaU0FtSURCNFF6QXBJRDA5UFNBd2VEZ3dLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBaVzF3UTI5a1pWQnZhVzUwSUQwZ0tHWnBjbk4wUW5sMFpTQW1JREI0UmlrZ1BEd2dNSGhESUh3Z0tITmxZMjl1WkVKNWRHVWdKaUF3ZUROR0tTQThQQ0F3ZURZZ2ZDQW9kR2hwY21SQ2VYUmxJQ1lnTUhnelJpbGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBaVzF3UTI5a1pWQnZhVzUwSUQ0Z01IZzNSa1lnSmlZZ0tIUmxiWEJEYjJSbFVHOXBiblFnUENBd2VFUTRNREFnZkh3Z2RHVnRjRU52WkdWUWIybHVkQ0ErSURCNFJFWkdSaWtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5a1pWQnZhVzUwSUQwZ2RHVnRjRU52WkdWUWIybHVkRnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCaWNtVmhhMXh1SUNBZ0lDQWdJQ0JqWVhObElEUTZYRzRnSUNBZ0lDQWdJQ0FnYzJWamIyNWtRbmwwWlNBOUlHSjFabHRwSUNzZ01WMWNiaUFnSUNBZ0lDQWdJQ0IwYUdseVpFSjVkR1VnUFNCaWRXWmJhU0FySURKZFhHNGdJQ0FnSUNBZ0lDQWdabTkxY25Sb1FubDBaU0E5SUdKMVpsdHBJQ3NnTTExY2JpQWdJQ0FnSUNBZ0lDQnBaaUFvS0hObFkyOXVaRUo1ZEdVZ0ppQXdlRU13S1NBOVBUMGdNSGc0TUNBbUppQW9kR2hwY21SQ2VYUmxJQ1lnTUhoRE1Da2dQVDA5SURCNE9EQWdKaVlnS0dadmRYSjBhRUo1ZEdVZ0ppQXdlRU13S1NBOVBUMGdNSGc0TUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdWdGNFTnZaR1ZRYjJsdWRDQTlJQ2htYVhKemRFSjVkR1VnSmlBd2VFWXBJRHc4SURCNE1USWdmQ0FvYzJWamIyNWtRbmwwWlNBbUlEQjRNMFlwSUR3OElEQjRReUI4SUNoMGFHbHlaRUo1ZEdVZ0ppQXdlRE5HS1NBOFBDQXdlRFlnZkNBb1ptOTFjblJvUW5sMFpTQW1JREI0TTBZcFhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHVnRjRU52WkdWUWIybHVkQ0ErSURCNFJrWkdSaUFtSmlCMFpXMXdRMjlrWlZCdmFXNTBJRHdnTUhneE1UQXdNREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5a1pWQnZhVzUwSUQwZ2RHVnRjRU52WkdWUWIybHVkRnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvWTI5a1pWQnZhVzUwSUQwOVBTQnVkV3hzS1NCN1hHNGdJQ0FnSUNBdkx5QjNaU0JrYVdRZ2JtOTBJR2RsYm1WeVlYUmxJR0VnZG1Gc2FXUWdZMjlrWlZCdmFXNTBJSE52SUdsdWMyVnlkQ0JoWEc0Z0lDQWdJQ0F2THlCeVpYQnNZV05sYldWdWRDQmphR0Z5SUNoVkswWkdSa1FwSUdGdVpDQmhaSFpoYm1ObElHOXViSGtnTVNCaWVYUmxYRzRnSUNBZ0lDQmpiMlJsVUc5cGJuUWdQU0F3ZUVaR1JrUmNiaUFnSUNBZ0lHSjVkR1Z6VUdWeVUyVnhkV1Z1WTJVZ1BTQXhYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGpiMlJsVUc5cGJuUWdQaUF3ZUVaR1JrWXBJSHRjYmlBZ0lDQWdJQzh2SUdWdVkyOWtaU0IwYnlCMWRHWXhOaUFvYzNWeWNtOW5ZWFJsSUhCaGFYSWdaR0Z1WTJVcFhHNGdJQ0FnSUNCamIyUmxVRzlwYm5RZ0xUMGdNSGd4TURBd01GeHVJQ0FnSUNBZ2NtVnpMbkIxYzJnb1kyOWtaVkJ2YVc1MElENCtQaUF4TUNBbUlEQjRNMFpHSUh3Z01IaEVPREF3S1Z4dUlDQWdJQ0FnWTI5a1pWQnZhVzUwSUQwZ01IaEVRekF3SUh3Z1kyOWtaVkJ2YVc1MElDWWdNSGd6UmtaY2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhNdWNIVnphQ2hqYjJSbFVHOXBiblFwWEc0Z0lDQWdhU0FyUFNCaWVYUmxjMUJsY2xObGNYVmxibU5sWEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnWkdWamIyUmxRMjlrWlZCdmFXNTBjMEZ5Y21GNUtISmxjeWxjYm4xY2JseHVMeThnUW1GelpXUWdiMjRnYUhSMGNEb3ZMM04wWVdOcmIzWmxjbVpzYjNjdVkyOXRMMkV2TWpJM05EY3lOekl2Tmpnd056UXlMQ0IwYUdVZ1luSnZkM05sY2lCM2FYUm9YRzR2THlCMGFHVWdiRzkzWlhOMElHeHBiV2wwSUdseklFTm9jbTl0WlN3Z2QybDBhQ0F3ZURFd01EQXdJR0Z5WjNNdVhHNHZMeUJYWlNCbmJ5QXhJRzFoWjI1cGRIVmtaU0JzWlhOekxDQm1iM0lnYzJGbVpYUjVYRzUyWVhJZ1RVRllYMEZTUjFWTlJVNVVVMTlNUlU1SFZFZ2dQU0F3ZURFd01EQmNibHh1Wm5WdVkzUnBiMjRnWkdWamIyUmxRMjlrWlZCdmFXNTBjMEZ5Y21GNUlDaGpiMlJsVUc5cGJuUnpLU0I3WEc0Z0lIWmhjaUJzWlc0Z1BTQmpiMlJsVUc5cGJuUnpMbXhsYm1kMGFGeHVJQ0JwWmlBb2JHVnVJRHc5SUUxQldGOUJVa2RWVFVWT1ZGTmZURVZPUjFSSUtTQjdYRzRnSUNBZ2NtVjBkWEp1SUZOMGNtbHVaeTVtY205dFEyaGhja052WkdVdVlYQndiSGtvVTNSeWFXNW5MQ0JqYjJSbFVHOXBiblJ6S1NBdkx5QmhkbTlwWkNCbGVIUnlZU0J6YkdsalpTZ3BYRzRnSUgxY2JseHVJQ0F2THlCRVpXTnZaR1VnYVc0Z1kyaDFibXR6SUhSdklHRjJiMmxrSUZ3aVkyRnNiQ0J6ZEdGamF5QnphWHBsSUdWNFkyVmxaR1ZrWENJdVhHNGdJSFpoY2lCeVpYTWdQU0FuSjF4dUlDQjJZWElnYVNBOUlEQmNiaUFnZDJocGJHVWdLR2tnUENCc1pXNHBJSHRjYmlBZ0lDQnlaWE1nS3owZ1UzUnlhVzVuTG1aeWIyMURhR0Z5UTI5a1pTNWhjSEJzZVNoY2JpQWdJQ0FnSUZOMGNtbHVaeXhjYmlBZ0lDQWdJR052WkdWUWIybHVkSE11YzJ4cFkyVW9hU3dnYVNBclBTQk5RVmhmUVZKSFZVMUZUbFJUWDB4RlRrZFVTQ2xjYmlBZ0lDQXBYRzRnSUgxY2JpQWdjbVYwZFhKdUlISmxjMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmhjMk5wYVZOc2FXTmxJQ2hpZFdZc0lITjBZWEowTENCbGJtUXBJSHRjYmlBZ2RtRnlJSEpsZENBOUlDY25YRzRnSUdWdVpDQTlJRTFoZEdndWJXbHVLR0oxWmk1c1pXNW5kR2dzSUdWdVpDbGNibHh1SUNCbWIzSWdLSFpoY2lCcElEMGdjM1JoY25RN0lHa2dQQ0JsYm1RN0lHa3JLeWtnZTF4dUlDQWdJSEpsZENBclBTQlRkSEpwYm1jdVpuSnZiVU5vWVhKRGIyUmxLR0oxWmx0cFhTQW1JREI0TjBZcFhHNGdJSDFjYmlBZ2NtVjBkWEp1SUhKbGRGeHVmVnh1WEc1bWRXNWpkR2x2YmlCaWFXNWhjbmxUYkdsalpTQW9ZblZtTENCemRHRnlkQ3dnWlc1a0tTQjdYRzRnSUhaaGNpQnlaWFFnUFNBbkoxeHVJQ0JsYm1RZ1BTQk5ZWFJvTG0xcGJpaGlkV1l1YkdWdVozUm9MQ0JsYm1RcFhHNWNiaUFnWm05eUlDaDJZWElnYVNBOUlITjBZWEowT3lCcElEd2daVzVrT3lCcEt5c3BJSHRjYmlBZ0lDQnlaWFFnS3owZ1UzUnlhVzVuTG1aeWIyMURhR0Z5UTI5a1pTaGlkV1piYVYwcFhHNGdJSDFjYmlBZ2NtVjBkWEp1SUhKbGRGeHVmVnh1WEc1bWRXNWpkR2x2YmlCb1pYaFRiR2xqWlNBb1luVm1MQ0J6ZEdGeWRDd2daVzVrS1NCN1hHNGdJSFpoY2lCc1pXNGdQU0JpZFdZdWJHVnVaM1JvWEc1Y2JpQWdhV1lnS0NGemRHRnlkQ0I4ZkNCemRHRnlkQ0E4SURBcElITjBZWEowSUQwZ01GeHVJQ0JwWmlBb0lXVnVaQ0I4ZkNCbGJtUWdQQ0F3SUh4OElHVnVaQ0ErSUd4bGJpa2daVzVrSUQwZ2JHVnVYRzVjYmlBZ2RtRnlJRzkxZENBOUlDY25YRzRnSUdadmNpQW9kbUZ5SUdrZ1BTQnpkR0Z5ZERzZ2FTQThJR1Z1WkRzZ2FTc3JLU0I3WEc0Z0lDQWdiM1YwSUNzOUlIUnZTR1Y0S0dKMVpsdHBYU2xjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdiM1YwWEc1OVhHNWNibVoxYm1OMGFXOXVJSFYwWmpFMmJHVlRiR2xqWlNBb1luVm1MQ0J6ZEdGeWRDd2daVzVrS1NCN1hHNGdJSFpoY2lCaWVYUmxjeUE5SUdKMVppNXpiR2xqWlNoemRHRnlkQ3dnWlc1a0tWeHVJQ0IyWVhJZ2NtVnpJRDBnSnlkY2JpQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0JpZVhSbGN5NXNaVzVuZEdnN0lHa2dLejBnTWlrZ2UxeHVJQ0FnSUhKbGN5QXJQU0JUZEhKcGJtY3Vabkp2YlVOb1lYSkRiMlJsS0dKNWRHVnpXMmxkSUNzZ1lubDBaWE5iYVNBcklERmRJQ29nTWpVMktWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCeVpYTmNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1emJHbGpaU0E5SUdaMWJtTjBhVzl1SUhOc2FXTmxJQ2h6ZEdGeWRDd2daVzVrS1NCN1hHNGdJSFpoY2lCc1pXNGdQU0IwYUdsekxteGxibWQwYUZ4dUlDQnpkR0Z5ZENBOUlINStjM1JoY25SY2JpQWdaVzVrSUQwZ1pXNWtJRDA5UFNCMWJtUmxabWx1WldRZ1B5QnNaVzRnT2lCK2ZtVnVaRnh1WEc0Z0lHbG1JQ2h6ZEdGeWRDQThJREFwSUh0Y2JpQWdJQ0J6ZEdGeWRDQXJQU0JzWlc1Y2JpQWdJQ0JwWmlBb2MzUmhjblFnUENBd0tTQnpkR0Z5ZENBOUlEQmNiaUFnZlNCbGJITmxJR2xtSUNoemRHRnlkQ0ErSUd4bGJpa2dlMXh1SUNBZ0lITjBZWEowSUQwZ2JHVnVYRzRnSUgxY2JseHVJQ0JwWmlBb1pXNWtJRHdnTUNrZ2UxeHVJQ0FnSUdWdVpDQXJQU0JzWlc1Y2JpQWdJQ0JwWmlBb1pXNWtJRHdnTUNrZ1pXNWtJRDBnTUZ4dUlDQjlJR1ZzYzJVZ2FXWWdLR1Z1WkNBK0lHeGxiaWtnZTF4dUlDQWdJR1Z1WkNBOUlHeGxibHh1SUNCOVhHNWNiaUFnYVdZZ0tHVnVaQ0E4SUhOMFlYSjBLU0JsYm1RZ1BTQnpkR0Z5ZEZ4dVhHNGdJSFpoY2lCdVpYZENkV1pjYmlBZ2FXWWdLRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVLU0I3WEc0Z0lDQWdibVYzUW5WbUlEMGdRblZtWm1WeUxsOWhkV2R0Wlc1MEtIUm9hWE11YzNWaVlYSnlZWGtvYzNSaGNuUXNJR1Z1WkNrcFhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2RtRnlJSE5zYVdObFRHVnVJRDBnWlc1a0lDMGdjM1JoY25SY2JpQWdJQ0J1WlhkQ2RXWWdQU0J1WlhjZ1FuVm1abVZ5S0hOc2FXTmxUR1Z1TENCMWJtUmxabWx1WldRcFhHNGdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCemJHbGpaVXhsYmpzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0J1WlhkQ2RXWmJhVjBnUFNCMGFHbHpXMmtnS3lCemRHRnlkRjFjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0JwWmlBb2JtVjNRblZtTG14bGJtZDBhQ2tnYm1WM1FuVm1MbkJoY21WdWRDQTlJSFJvYVhNdWNHRnlaVzUwSUh4OElIUm9hWE5jYmx4dUlDQnlaWFIxY200Z2JtVjNRblZtWEc1OVhHNWNiaThxWEc0Z0tpQk9aV1ZrSUhSdklHMWhhMlVnYzNWeVpTQjBhR0YwSUdKMVptWmxjaUJwYzI0bmRDQjBjbmxwYm1jZ2RHOGdkM0pwZEdVZ2IzVjBJRzltSUdKdmRXNWtjeTVjYmlBcUwxeHVablZ1WTNScGIyNGdZMmhsWTJ0UFptWnpaWFFnS0c5bVpuTmxkQ3dnWlhoMExDQnNaVzVuZEdncElIdGNiaUFnYVdZZ0tDaHZabVp6WlhRZ0pTQXhLU0FoUFQwZ01DQjhmQ0J2Wm1aelpYUWdQQ0F3S1NCMGFISnZkeUJ1WlhjZ1VtRnVaMlZGY25KdmNpZ25iMlptYzJWMElHbHpJRzV2ZENCMWFXNTBKeWxjYmlBZ2FXWWdLRzltWm5ObGRDQXJJR1Y0ZENBK0lHeGxibWQwYUNrZ2RHaHliM2NnYm1WM0lGSmhibWRsUlhKeWIzSW9KMVJ5ZVdsdVp5QjBieUJoWTJObGMzTWdZbVY1YjI1a0lHSjFabVpsY2lCc1pXNW5kR2duS1Z4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbkpsWVdSVlNXNTBURVVnUFNCbWRXNWpkR2x2YmlCeVpXRmtWVWx1ZEV4RklDaHZabVp6WlhRc0lHSjVkR1ZNWlc1bmRHZ3NJRzV2UVhOelpYSjBLU0I3WEc0Z0lHOW1abk5sZENBOUlHOW1abk5sZENCOElEQmNiaUFnWW5sMFpVeGxibWQwYUNBOUlHSjVkR1ZNWlc1bmRHZ2dmQ0F3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJUMlptYzJWMEtHOW1abk5sZEN3Z1lubDBaVXhsYm1kMGFDd2dkR2hwY3k1c1pXNW5kR2dwWEc1Y2JpQWdkbUZ5SUhaaGJDQTlJSFJvYVhOYmIyWm1jMlYwWFZ4dUlDQjJZWElnYlhWc0lEMGdNVnh1SUNCMllYSWdhU0E5SURCY2JpQWdkMmhwYkdVZ0tDc3JhU0E4SUdKNWRHVk1aVzVuZEdnZ0ppWWdLRzExYkNBcVBTQXdlREV3TUNrcElIdGNiaUFnSUNCMllXd2dLejBnZEdocGMxdHZabVp6WlhRZ0t5QnBYU0FxSUcxMWJGeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlIWmhiRnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuSmxZV1JWU1c1MFFrVWdQU0JtZFc1amRHbHZiaUJ5WldGa1ZVbHVkRUpGSUNodlptWnpaWFFzSUdKNWRHVk1aVzVuZEdnc0lHNXZRWE56WlhKMEtTQjdYRzRnSUc5bVpuTmxkQ0E5SUc5bVpuTmxkQ0I4SURCY2JpQWdZbmwwWlV4bGJtZDBhQ0E5SUdKNWRHVk1aVzVuZEdnZ2ZDQXdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJSHRjYmlBZ0lDQmphR1ZqYTA5bVpuTmxkQ2h2Wm1aelpYUXNJR0o1ZEdWTVpXNW5kR2dzSUhSb2FYTXViR1Z1WjNSb0tWeHVJQ0I5WEc1Y2JpQWdkbUZ5SUhaaGJDQTlJSFJvYVhOYmIyWm1jMlYwSUNzZ0xTMWllWFJsVEdWdVozUm9YVnh1SUNCMllYSWdiWFZzSUQwZ01WeHVJQ0IzYUdsc1pTQW9ZbmwwWlV4bGJtZDBhQ0ErSURBZ0ppWWdLRzExYkNBcVBTQXdlREV3TUNrcElIdGNiaUFnSUNCMllXd2dLejBnZEdocGMxdHZabVp6WlhRZ0t5QXRMV0o1ZEdWTVpXNW5kR2hkSUNvZ2JYVnNYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdkbUZzWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVjbVZoWkZWSmJuUTRJRDBnWm5WdVkzUnBiMjRnY21WaFpGVkpiblE0SUNodlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJR2xtSUNnaGJtOUJjM05sY25RcElHTm9aV05yVDJabWMyVjBLRzltWm5ObGRDd2dNU3dnZEdocGN5NXNaVzVuZEdncFhHNGdJSEpsZEhWeWJpQjBhR2x6VzI5bVpuTmxkRjFjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNXlaV0ZrVlVsdWRERTJURVVnUFNCbWRXNWpkR2x2YmlCeVpXRmtWVWx1ZERFMlRFVWdLRzltWm5ObGRDd2dibTlCYzNObGNuUXBJSHRjYmlBZ2FXWWdLQ0Z1YjBGemMyVnlkQ2tnWTJobFkydFBabVp6WlhRb2IyWm1jMlYwTENBeUxDQjBhR2x6TG14bGJtZDBhQ2xjYmlBZ2NtVjBkWEp1SUhSb2FYTmJiMlptYzJWMFhTQjhJQ2gwYUdselcyOW1abk5sZENBcklERmRJRHc4SURncFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1Y21WaFpGVkpiblF4TmtKRklEMGdablZ1WTNScGIyNGdjbVZoWkZWSmJuUXhOa0pGSUNodlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJR2xtSUNnaGJtOUJjM05sY25RcElHTm9aV05yVDJabWMyVjBLRzltWm5ObGRDd2dNaXdnZEdocGN5NXNaVzVuZEdncFhHNGdJSEpsZEhWeWJpQW9kR2hwYzF0dlptWnpaWFJkSUR3OElEZ3BJSHdnZEdocGMxdHZabVp6WlhRZ0t5QXhYVnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuSmxZV1JWU1c1ME16Sk1SU0E5SUdaMWJtTjBhVzl1SUhKbFlXUlZTVzUwTXpKTVJTQW9iMlptYzJWMExDQnViMEZ6YzJWeWRDa2dlMXh1SUNCcFppQW9JVzV2UVhOelpYSjBLU0JqYUdWamEwOW1abk5sZENodlptWnpaWFFzSURRc0lIUm9hWE11YkdWdVozUm9LVnh1WEc0Z0lISmxkSFZ5YmlBb0tIUm9hWE5iYjJabWMyVjBYU2tnZkZ4dUlDQWdJQ0FnS0hSb2FYTmJiMlptYzJWMElDc2dNVjBnUER3Z09Da2dmRnh1SUNBZ0lDQWdLSFJvYVhOYmIyWm1jMlYwSUNzZ01sMGdQRHdnTVRZcEtTQXJYRzRnSUNBZ0lDQW9kR2hwYzF0dlptWnpaWFFnS3lBelhTQXFJREI0TVRBd01EQXdNQ2xjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNXlaV0ZrVlVsdWRETXlRa1VnUFNCbWRXNWpkR2x2YmlCeVpXRmtWVWx1ZERNeVFrVWdLRzltWm5ObGRDd2dibTlCYzNObGNuUXBJSHRjYmlBZ2FXWWdLQ0Z1YjBGemMyVnlkQ2tnWTJobFkydFBabVp6WlhRb2IyWm1jMlYwTENBMExDQjBhR2x6TG14bGJtZDBhQ2xjYmx4dUlDQnlaWFIxY200Z0tIUm9hWE5iYjJabWMyVjBYU0FxSURCNE1UQXdNREF3TUNrZ0sxeHVJQ0FnSUNnb2RHaHBjMXR2Wm1aelpYUWdLeUF4WFNBOFBDQXhOaWtnZkZ4dUlDQWdJQ2gwYUdselcyOW1abk5sZENBcklESmRJRHc4SURncElIeGNiaUFnSUNCMGFHbHpXMjltWm5ObGRDQXJJRE5kS1Z4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbkpsWVdSSmJuUk1SU0E5SUdaMWJtTjBhVzl1SUhKbFlXUkpiblJNUlNBb2IyWm1jMlYwTENCaWVYUmxUR1Z1WjNSb0xDQnViMEZ6YzJWeWRDa2dlMXh1SUNCdlptWnpaWFFnUFNCdlptWnpaWFFnZkNBd1hHNGdJR0o1ZEdWTVpXNW5kR2dnUFNCaWVYUmxUR1Z1WjNSb0lId2dNRnh1SUNCcFppQW9JVzV2UVhOelpYSjBLU0JqYUdWamEwOW1abk5sZENodlptWnpaWFFzSUdKNWRHVk1aVzVuZEdnc0lIUm9hWE11YkdWdVozUm9LVnh1WEc0Z0lIWmhjaUIyWVd3Z1BTQjBhR2x6VzI5bVpuTmxkRjFjYmlBZ2RtRnlJRzExYkNBOUlERmNiaUFnZG1GeUlHa2dQU0F3WEc0Z0lIZG9hV3hsSUNncksya2dQQ0JpZVhSbFRHVnVaM1JvSUNZbUlDaHRkV3dnS2owZ01IZ3hNREFwS1NCN1hHNGdJQ0FnZG1Gc0lDczlJSFJvYVhOYmIyWm1jMlYwSUNzZ2FWMGdLaUJ0ZFd4Y2JpQWdmVnh1SUNCdGRXd2dLajBnTUhnNE1GeHVYRzRnSUdsbUlDaDJZV3dnUGowZ2JYVnNLU0IyWVd3Z0xUMGdUV0YwYUM1d2IzY29NaXdnT0NBcUlHSjVkR1ZNWlc1bmRHZ3BYRzVjYmlBZ2NtVjBkWEp1SUhaaGJGeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5KbFlXUkpiblJDUlNBOUlHWjFibU4wYVc5dUlISmxZV1JKYm5SQ1JTQW9iMlptYzJWMExDQmllWFJsVEdWdVozUm9MQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnZabVp6WlhRZ1BTQnZabVp6WlhRZ2ZDQXdYRzRnSUdKNWRHVk1aVzVuZEdnZ1BTQmllWFJsVEdWdVozUm9JSHdnTUZ4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMDltWm5ObGRDaHZabVp6WlhRc0lHSjVkR1ZNWlc1bmRHZ3NJSFJvYVhNdWJHVnVaM1JvS1Z4dVhHNGdJSFpoY2lCcElEMGdZbmwwWlV4bGJtZDBhRnh1SUNCMllYSWdiWFZzSUQwZ01WeHVJQ0IyWVhJZ2RtRnNJRDBnZEdocGMxdHZabVp6WlhRZ0t5QXRMV2xkWEc0Z0lIZG9hV3hsSUNocElENGdNQ0FtSmlBb2JYVnNJQ285SURCNE1UQXdLU2tnZTF4dUlDQWdJSFpoYkNBclBTQjBhR2x6VzI5bVpuTmxkQ0FySUMwdGFWMGdLaUJ0ZFd4Y2JpQWdmVnh1SUNCdGRXd2dLajBnTUhnNE1GeHVYRzRnSUdsbUlDaDJZV3dnUGowZ2JYVnNLU0IyWVd3Z0xUMGdUV0YwYUM1d2IzY29NaXdnT0NBcUlHSjVkR1ZNWlc1bmRHZ3BYRzVjYmlBZ2NtVjBkWEp1SUhaaGJGeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5KbFlXUkpiblE0SUQwZ1puVnVZM1JwYjI0Z2NtVmhaRWx1ZERnZ0tHOW1abk5sZEN3Z2JtOUJjM05sY25RcElIdGNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0UFptWnpaWFFvYjJabWMyVjBMQ0F4TENCMGFHbHpMbXhsYm1kMGFDbGNiaUFnYVdZZ0tDRW9kR2hwYzF0dlptWnpaWFJkSUNZZ01IZzRNQ2twSUhKbGRIVnliaUFvZEdocGMxdHZabVp6WlhSZEtWeHVJQ0J5WlhSMWNtNGdLQ2d3ZUdabUlDMGdkR2hwYzF0dlptWnpaWFJkSUNzZ01Ta2dLaUF0TVNsY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzV5WldGa1NXNTBNVFpNUlNBOUlHWjFibU4wYVc5dUlISmxZV1JKYm5ReE5reEZJQ2h2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJUMlptYzJWMEtHOW1abk5sZEN3Z01pd2dkR2hwY3k1c1pXNW5kR2dwWEc0Z0lIWmhjaUIyWVd3Z1BTQjBhR2x6VzI5bVpuTmxkRjBnZkNBb2RHaHBjMXR2Wm1aelpYUWdLeUF4WFNBOFBDQTRLVnh1SUNCeVpYUjFjbTRnS0haaGJDQW1JREI0T0RBd01Da2dQeUIyWVd3Z2ZDQXdlRVpHUmtZd01EQXdJRG9nZG1Gc1hHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1Y21WaFpFbHVkREUyUWtVZ1BTQm1kVzVqZEdsdmJpQnlaV0ZrU1c1ME1UWkNSU0FvYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMDltWm5ObGRDaHZabVp6WlhRc0lESXNJSFJvYVhNdWJHVnVaM1JvS1Z4dUlDQjJZWElnZG1Gc0lEMGdkR2hwYzF0dlptWnpaWFFnS3lBeFhTQjhJQ2gwYUdselcyOW1abk5sZEYwZ1BEd2dPQ2xjYmlBZ2NtVjBkWEp1SUNoMllXd2dKaUF3ZURnd01EQXBJRDhnZG1Gc0lId2dNSGhHUmtaR01EQXdNQ0E2SUhaaGJGeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5KbFlXUkpiblF6TWt4RklEMGdablZ1WTNScGIyNGdjbVZoWkVsdWRETXlURVVnS0c5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdhV1lnS0NGdWIwRnpjMlZ5ZENrZ1kyaGxZMnRQWm1aelpYUW9iMlptYzJWMExDQTBMQ0IwYUdsekxteGxibWQwYUNsY2JseHVJQ0J5WlhSMWNtNGdLSFJvYVhOYmIyWm1jMlYwWFNrZ2ZGeHVJQ0FnSUNoMGFHbHpXMjltWm5ObGRDQXJJREZkSUR3OElEZ3BJSHhjYmlBZ0lDQW9kR2hwYzF0dlptWnpaWFFnS3lBeVhTQThQQ0F4TmlrZ2ZGeHVJQ0FnSUNoMGFHbHpXMjltWm5ObGRDQXJJRE5kSUR3OElESTBLVnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuSmxZV1JKYm5Rek1rSkZJRDBnWm5WdVkzUnBiMjRnY21WaFpFbHVkRE15UWtVZ0tHOW1abk5sZEN3Z2JtOUJjM05sY25RcElIdGNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0UFptWnpaWFFvYjJabWMyVjBMQ0EwTENCMGFHbHpMbXhsYm1kMGFDbGNibHh1SUNCeVpYUjFjbTRnS0hSb2FYTmJiMlptYzJWMFhTQThQQ0F5TkNrZ2ZGeHVJQ0FnSUNoMGFHbHpXMjltWm5ObGRDQXJJREZkSUR3OElERTJLU0I4WEc0Z0lDQWdLSFJvYVhOYmIyWm1jMlYwSUNzZ01sMGdQRHdnT0NrZ2ZGeHVJQ0FnSUNoMGFHbHpXMjltWm5ObGRDQXJJRE5kS1Z4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbkpsWVdSR2JHOWhkRXhGSUQwZ1puVnVZM1JwYjI0Z2NtVmhaRVpzYjJGMFRFVWdLRzltWm5ObGRDd2dibTlCYzNObGNuUXBJSHRjYmlBZ2FXWWdLQ0Z1YjBGemMyVnlkQ2tnWTJobFkydFBabVp6WlhRb2IyWm1jMlYwTENBMExDQjBhR2x6TG14bGJtZDBhQ2xjYmlBZ2NtVjBkWEp1SUdsbFpXVTNOVFF1Y21WaFpDaDBhR2x6TENCdlptWnpaWFFzSUhSeWRXVXNJREl6TENBMEtWeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5KbFlXUkdiRzloZEVKRklEMGdablZ1WTNScGIyNGdjbVZoWkVac2IyRjBRa1VnS0c5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdhV1lnS0NGdWIwRnpjMlZ5ZENrZ1kyaGxZMnRQWm1aelpYUW9iMlptYzJWMExDQTBMQ0IwYUdsekxteGxibWQwYUNsY2JpQWdjbVYwZFhKdUlHbGxaV1UzTlRRdWNtVmhaQ2gwYUdsekxDQnZabVp6WlhRc0lHWmhiSE5sTENBeU15d2dOQ2xjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNXlaV0ZrUkc5MVlteGxURVVnUFNCbWRXNWpkR2x2YmlCeVpXRmtSRzkxWW14bFRFVWdLRzltWm5ObGRDd2dibTlCYzNObGNuUXBJSHRjYmlBZ2FXWWdLQ0Z1YjBGemMyVnlkQ2tnWTJobFkydFBabVp6WlhRb2IyWm1jMlYwTENBNExDQjBhR2x6TG14bGJtZDBhQ2xjYmlBZ2NtVjBkWEp1SUdsbFpXVTNOVFF1Y21WaFpDaDBhR2x6TENCdlptWnpaWFFzSUhSeWRXVXNJRFV5TENBNEtWeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5KbFlXUkViM1ZpYkdWQ1JTQTlJR1oxYm1OMGFXOXVJSEpsWVdSRWIzVmliR1ZDUlNBb2IyWm1jMlYwTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0JwWmlBb0lXNXZRWE56WlhKMEtTQmphR1ZqYTA5bVpuTmxkQ2h2Wm1aelpYUXNJRGdzSUhSb2FYTXViR1Z1WjNSb0tWeHVJQ0J5WlhSMWNtNGdhV1ZsWlRjMU5DNXlaV0ZrS0hSb2FYTXNJRzltWm5ObGRDd2dabUZzYzJVc0lEVXlMQ0E0S1Z4dWZWeHVYRzVtZFc1amRHbHZiaUJqYUdWamEwbHVkQ0FvWW5WbUxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCbGVIUXNJRzFoZUN3Z2JXbHVLU0I3WEc0Z0lHbG1JQ2doUW5WbVptVnlMbWx6UW5WbVptVnlLR0oxWmlrcElIUm9jbTkzSUc1bGR5QlVlWEJsUlhKeWIzSW9KMkoxWm1abGNpQnRkWE4wSUdKbElHRWdRblZtWm1WeUlHbHVjM1JoYm1ObEp5bGNiaUFnYVdZZ0tIWmhiSFZsSUQ0Z2JXRjRJSHg4SUhaaGJIVmxJRHdnYldsdUtTQjBhSEp2ZHlCdVpYY2dVbUZ1WjJWRmNuSnZjaWduZG1Gc2RXVWdhWE1nYjNWMElHOW1JR0p2ZFc1a2N5Y3BYRzRnSUdsbUlDaHZabVp6WlhRZ0t5QmxlSFFnUGlCaWRXWXViR1Z1WjNSb0tTQjBhSEp2ZHlCdVpYY2dVbUZ1WjJWRmNuSnZjaWduYVc1a1pYZ2diM1YwSUc5bUlISmhibWRsSnlsY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpWVkpiblJNUlNBOUlHWjFibU4wYVc5dUlIZHlhWFJsVlVsdWRFeEZJQ2gyWVd4MVpTd2diMlptYzJWMExDQmllWFJsVEdWdVozUm9MQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQjJZV3gxWlNBOUlDdDJZV3gxWlZ4dUlDQnZabVp6WlhRZ1BTQnZabVp6WlhRZ2ZDQXdYRzRnSUdKNWRHVk1aVzVuZEdnZ1BTQmllWFJsVEdWdVozUm9JSHdnTUZ4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMGx1ZENoMGFHbHpMQ0IyWVd4MVpTd2diMlptYzJWMExDQmllWFJsVEdWdVozUm9MQ0JOWVhSb0xuQnZkeWd5TENBNElDb2dZbmwwWlV4bGJtZDBhQ2tzSURBcFhHNWNiaUFnZG1GeUlHMTFiQ0E5SURGY2JpQWdkbUZ5SUdrZ1BTQXdYRzRnSUhSb2FYTmJiMlptYzJWMFhTQTlJSFpoYkhWbElDWWdNSGhHUmx4dUlDQjNhR2xzWlNBb0t5dHBJRHdnWW5sMFpVeGxibWQwYUNBbUppQW9iWFZzSUNvOUlEQjRNVEF3S1NrZ2UxeHVJQ0FnSUhSb2FYTmJiMlptYzJWMElDc2dhVjBnUFNBb2RtRnNkV1VnTHlCdGRXd3BJQ1lnTUhoR1JseHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlHOW1abk5sZENBcklHSjVkR1ZNWlc1bmRHaGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1M2NtbDBaVlZKYm5SQ1JTQTlJR1oxYm1OMGFXOXVJSGR5YVhSbFZVbHVkRUpGSUNoMllXeDFaU3dnYjJabWMyVjBMQ0JpZVhSbFRHVnVaM1JvTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0IyWVd4MVpTQTlJQ3QyWVd4MVpWeHVJQ0J2Wm1aelpYUWdQU0J2Wm1aelpYUWdmQ0F3WEc0Z0lHSjVkR1ZNWlc1bmRHZ2dQU0JpZVhSbFRHVnVaM1JvSUh3Z01GeHVJQ0JwWmlBb0lXNXZRWE56WlhKMEtTQmphR1ZqYTBsdWRDaDBhR2x6TENCMllXeDFaU3dnYjJabWMyVjBMQ0JpZVhSbFRHVnVaM1JvTENCTllYUm9MbkJ2ZHlneUxDQTRJQ29nWW5sMFpVeGxibWQwYUNrc0lEQXBYRzVjYmlBZ2RtRnlJR2tnUFNCaWVYUmxUR1Z1WjNSb0lDMGdNVnh1SUNCMllYSWdiWFZzSUQwZ01WeHVJQ0IwYUdselcyOW1abk5sZENBcklHbGRJRDBnZG1Gc2RXVWdKaUF3ZUVaR1hHNGdJSGRvYVd4bElDZ3RMV2tnUGowZ01DQW1KaUFvYlhWc0lDbzlJREI0TVRBd0tTa2dlMXh1SUNBZ0lIUm9hWE5iYjJabWMyVjBJQ3NnYVYwZ1BTQW9kbUZzZFdVZ0x5QnRkV3dwSUNZZ01IaEdSbHh1SUNCOVhHNWNiaUFnY21WMGRYSnVJRzltWm5ObGRDQXJJR0o1ZEdWTVpXNW5kR2hjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNTNjbWwwWlZWSmJuUTRJRDBnWm5WdVkzUnBiMjRnZDNKcGRHVlZTVzUwT0NBb2RtRnNkV1VzSUc5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdkbUZzZFdVZ1BTQXJkbUZzZFdWY2JpQWdiMlptYzJWMElEMGdiMlptYzJWMElId2dNRnh1SUNCcFppQW9JVzV2UVhOelpYSjBLU0JqYUdWamEwbHVkQ2gwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENBeExDQXdlR1ptTENBd0tWeHVJQ0JwWmlBb0lVSjFabVpsY2k1VVdWQkZSRjlCVWxKQldWOVRWVkJRVDFKVUtTQjJZV3gxWlNBOUlFMWhkR2d1Wm14dmIzSW9kbUZzZFdVcFhHNGdJSFJvYVhOYmIyWm1jMlYwWFNBOUlDaDJZV3gxWlNBbUlEQjRabVlwWEc0Z0lISmxkSFZ5YmlCdlptWnpaWFFnS3lBeFhHNTlYRzVjYm1aMWJtTjBhVzl1SUc5aWFtVmpkRmR5YVhSbFZVbHVkREUySUNoaWRXWXNJSFpoYkhWbExDQnZabVp6WlhRc0lHeHBkSFJzWlVWdVpHbGhiaWtnZTF4dUlDQnBaaUFvZG1Gc2RXVWdQQ0F3S1NCMllXeDFaU0E5SURCNFptWm1aaUFySUhaaGJIVmxJQ3NnTVZ4dUlDQm1iM0lnS0haaGNpQnBJRDBnTUN3Z2FpQTlJRTFoZEdndWJXbHVLR0oxWmk1c1pXNW5kR2dnTFNCdlptWnpaWFFzSURJcE95QnBJRHdnYWpzZ2FTc3JLU0I3WEc0Z0lDQWdZblZtVzI5bVpuTmxkQ0FySUdsZElEMGdLSFpoYkhWbElDWWdLREI0Wm1ZZ1BEd2dLRGdnS2lBb2JHbDBkR3hsUlc1a2FXRnVJRDhnYVNBNklERWdMU0JwS1NrcEtTQStQajVjYmlBZ0lDQWdJQ2hzYVhSMGJHVkZibVJwWVc0Z1B5QnBJRG9nTVNBdElHa3BJQ29nT0Z4dUlDQjlYRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWQzSnBkR1ZWU1c1ME1UWk1SU0E5SUdaMWJtTjBhVzl1SUhkeWFYUmxWVWx1ZERFMlRFVWdLSFpoYkhWbExDQnZabVp6WlhRc0lHNXZRWE56WlhKMEtTQjdYRzRnSUhaaGJIVmxJRDBnSzNaaGJIVmxYRzRnSUc5bVpuTmxkQ0E5SUc5bVpuTmxkQ0I4SURCY2JpQWdhV1lnS0NGdWIwRnpjMlZ5ZENrZ1kyaGxZMnRKYm5Rb2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dNaXdnTUhobVptWm1MQ0F3S1Z4dUlDQnBaaUFvUW5WbVptVnlMbFJaVUVWRVgwRlNVa0ZaWDFOVlVGQlBVbFFwSUh0Y2JpQWdJQ0IwYUdselcyOW1abk5sZEYwZ1BTQW9kbUZzZFdVZ0ppQXdlR1ptS1Z4dUlDQWdJSFJvYVhOYmIyWm1jMlYwSUNzZ01WMGdQU0FvZG1Gc2RXVWdQajQrSURncFhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2IySnFaV04wVjNKcGRHVlZTVzUwTVRZb2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dkSEoxWlNsY2JpQWdmVnh1SUNCeVpYUjFjbTRnYjJabWMyVjBJQ3NnTWx4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbmR5YVhSbFZVbHVkREUyUWtVZ1BTQm1kVzVqZEdsdmJpQjNjbWwwWlZWSmJuUXhOa0pGSUNoMllXeDFaU3dnYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQjJZV3gxWlNBOUlDdDJZV3gxWlZ4dUlDQnZabVp6WlhRZ1BTQnZabVp6WlhRZ2ZDQXdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclNXNTBLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSURJc0lEQjRabVptWml3Z01DbGNiaUFnYVdZZ0tFSjFabVpsY2k1VVdWQkZSRjlCVWxKQldWOVRWVkJRVDFKVUtTQjdYRzRnSUNBZ2RHaHBjMXR2Wm1aelpYUmRJRDBnS0haaGJIVmxJRDQrUGlBNEtWeHVJQ0FnSUhSb2FYTmJiMlptYzJWMElDc2dNVjBnUFNBb2RtRnNkV1VnSmlBd2VHWm1LVnh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJRzlpYW1WamRGZHlhWFJsVlVsdWRERTJLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSUdaaGJITmxLVnh1SUNCOVhHNGdJSEpsZEhWeWJpQnZabVp6WlhRZ0t5QXlYRzU5WEc1Y2JtWjFibU4wYVc5dUlHOWlhbVZqZEZkeWFYUmxWVWx1ZERNeUlDaGlkV1lzSUhaaGJIVmxMQ0J2Wm1aelpYUXNJR3hwZEhSc1pVVnVaR2xoYmlrZ2UxeHVJQ0JwWmlBb2RtRnNkV1VnUENBd0tTQjJZV3gxWlNBOUlEQjRabVptWm1abVptWWdLeUIyWVd4MVpTQXJJREZjYmlBZ1ptOXlJQ2gyWVhJZ2FTQTlJREFzSUdvZ1BTQk5ZWFJvTG0xcGJpaGlkV1l1YkdWdVozUm9JQzBnYjJabWMyVjBMQ0EwS1RzZ2FTQThJR283SUdrckt5a2dlMXh1SUNBZ0lHSjFabHR2Wm1aelpYUWdLeUJwWFNBOUlDaDJZV3gxWlNBK1BqNGdLR3hwZEhSc1pVVnVaR2xoYmlBL0lHa2dPaUF6SUMwZ2FTa2dLaUE0S1NBbUlEQjRabVpjYmlBZ2ZWeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5keWFYUmxWVWx1ZERNeVRFVWdQU0JtZFc1amRHbHZiaUIzY21sMFpWVkpiblF6TWt4RklDaDJZV3gxWlN3Z2IyWm1jMlYwTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0IyWVd4MVpTQTlJQ3QyWVd4MVpWeHVJQ0J2Wm1aelpYUWdQU0J2Wm1aelpYUWdmQ0F3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJTVzUwS0hSb2FYTXNJSFpoYkhWbExDQnZabVp6WlhRc0lEUXNJREI0Wm1abVptWm1abVlzSURBcFhHNGdJR2xtSUNoQ2RXWm1aWEl1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkNrZ2UxeHVJQ0FnSUhSb2FYTmJiMlptYzJWMElDc2dNMTBnUFNBb2RtRnNkV1VnUGo0K0lESTBLVnh1SUNBZ0lIUm9hWE5iYjJabWMyVjBJQ3NnTWwwZ1BTQW9kbUZzZFdVZ1BqNCtJREUyS1Z4dUlDQWdJSFJvYVhOYmIyWm1jMlYwSUNzZ01WMGdQU0FvZG1Gc2RXVWdQajQrSURncFhHNGdJQ0FnZEdocGMxdHZabVp6WlhSZElEMGdLSFpoYkhWbElDWWdNSGhtWmlsY2JpQWdmU0JsYkhObElIdGNiaUFnSUNCdlltcGxZM1JYY21sMFpWVkpiblF6TWloMGFHbHpMQ0IyWVd4MVpTd2diMlptYzJWMExDQjBjblZsS1Z4dUlDQjlYRzRnSUhKbGRIVnliaUJ2Wm1aelpYUWdLeUEwWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVkM0pwZEdWVlNXNTBNekpDUlNBOUlHWjFibU4wYVc5dUlIZHlhWFJsVlVsdWRETXlRa1VnS0haaGJIVmxMQ0J2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lIWmhiSFZsSUQwZ0szWmhiSFZsWEc0Z0lHOW1abk5sZENBOUlHOW1abk5sZENCOElEQmNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0SmJuUW9kR2hwY3l3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnTkN3Z01IaG1abVptWm1abVppd2dNQ2xjYmlBZ2FXWWdLRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVLU0I3WEc0Z0lDQWdkR2hwYzF0dlptWnpaWFJkSUQwZ0tIWmhiSFZsSUQ0K1BpQXlOQ2xjYmlBZ0lDQjBhR2x6VzI5bVpuTmxkQ0FySURGZElEMGdLSFpoYkhWbElENCtQaUF4TmlsY2JpQWdJQ0IwYUdselcyOW1abk5sZENBcklESmRJRDBnS0haaGJIVmxJRDQrUGlBNEtWeHVJQ0FnSUhSb2FYTmJiMlptYzJWMElDc2dNMTBnUFNBb2RtRnNkV1VnSmlBd2VHWm1LVnh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJRzlpYW1WamRGZHlhWFJsVlVsdWRETXlLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSUdaaGJITmxLVnh1SUNCOVhHNGdJSEpsZEhWeWJpQnZabVp6WlhRZ0t5QTBYRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWQzSnBkR1ZKYm5STVJTQTlJR1oxYm1OMGFXOXVJSGR5YVhSbFNXNTBURVVnS0haaGJIVmxMQ0J2Wm1aelpYUXNJR0o1ZEdWTVpXNW5kR2dzSUc1dlFYTnpaWEowS1NCN1hHNGdJSFpoYkhWbElEMGdLM1poYkhWbFhHNGdJRzltWm5ObGRDQTlJRzltWm5ObGRDQjhJREJjYmlBZ2FXWWdLQ0Z1YjBGemMyVnlkQ2tnZTF4dUlDQWdJSFpoY2lCc2FXMXBkQ0E5SUUxaGRHZ3VjRzkzS0RJc0lEZ2dLaUJpZVhSbFRHVnVaM1JvSUMwZ01TbGNibHh1SUNBZ0lHTm9aV05yU1c1MEtIUm9hWE1zSUhaaGJIVmxMQ0J2Wm1aelpYUXNJR0o1ZEdWTVpXNW5kR2dzSUd4cGJXbDBJQzBnTVN3Z0xXeHBiV2wwS1Z4dUlDQjlYRzVjYmlBZ2RtRnlJR2tnUFNBd1hHNGdJSFpoY2lCdGRXd2dQU0F4WEc0Z0lIWmhjaUJ6ZFdJZ1BTQjJZV3gxWlNBOElEQWdQeUF4SURvZ01GeHVJQ0IwYUdselcyOW1abk5sZEYwZ1BTQjJZV3gxWlNBbUlEQjRSa1pjYmlBZ2QyaHBiR1VnS0NzcmFTQThJR0o1ZEdWTVpXNW5kR2dnSmlZZ0tHMTFiQ0FxUFNBd2VERXdNQ2twSUh0Y2JpQWdJQ0IwYUdselcyOW1abk5sZENBcklHbGRJRDBnS0NoMllXeDFaU0F2SUcxMWJDa2dQajRnTUNrZ0xTQnpkV0lnSmlBd2VFWkdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdiMlptYzJWMElDc2dZbmwwWlV4bGJtZDBhRnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuZHlhWFJsU1c1MFFrVWdQU0JtZFc1amRHbHZiaUIzY21sMFpVbHVkRUpGSUNoMllXeDFaU3dnYjJabWMyVjBMQ0JpZVhSbFRHVnVaM1JvTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0IyWVd4MVpTQTlJQ3QyWVd4MVpWeHVJQ0J2Wm1aelpYUWdQU0J2Wm1aelpYUWdmQ0F3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUh0Y2JpQWdJQ0IyWVhJZ2JHbHRhWFFnUFNCTllYUm9MbkJ2ZHlneUxDQTRJQ29nWW5sMFpVeGxibWQwYUNBdElERXBYRzVjYmlBZ0lDQmphR1ZqYTBsdWRDaDBhR2x6TENCMllXeDFaU3dnYjJabWMyVjBMQ0JpZVhSbFRHVnVaM1JvTENCc2FXMXBkQ0F0SURFc0lDMXNhVzFwZENsY2JpQWdmVnh1WEc0Z0lIWmhjaUJwSUQwZ1lubDBaVXhsYm1kMGFDQXRJREZjYmlBZ2RtRnlJRzExYkNBOUlERmNiaUFnZG1GeUlITjFZaUE5SUhaaGJIVmxJRHdnTUNBL0lERWdPaUF3WEc0Z0lIUm9hWE5iYjJabWMyVjBJQ3NnYVYwZ1BTQjJZV3gxWlNBbUlEQjRSa1pjYmlBZ2QyaHBiR1VnS0MwdGFTQStQU0F3SUNZbUlDaHRkV3dnS2owZ01IZ3hNREFwS1NCN1hHNGdJQ0FnZEdocGMxdHZabVp6WlhRZ0t5QnBYU0E5SUNnb2RtRnNkV1VnTHlCdGRXd3BJRDQrSURBcElDMGdjM1ZpSUNZZ01IaEdSbHh1SUNCOVhHNWNiaUFnY21WMGRYSnVJRzltWm5ObGRDQXJJR0o1ZEdWTVpXNW5kR2hjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNTNjbWwwWlVsdWREZ2dQU0JtZFc1amRHbHZiaUIzY21sMFpVbHVkRGdnS0haaGJIVmxMQ0J2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lIWmhiSFZsSUQwZ0szWmhiSFZsWEc0Z0lHOW1abk5sZENBOUlHOW1abk5sZENCOElEQmNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0SmJuUW9kR2hwY3l3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnTVN3Z01IZzNaaXdnTFRCNE9EQXBYRzRnSUdsbUlDZ2hRblZtWm1WeUxsUlpVRVZFWDBGU1VrRlpYMU5WVUZCUFVsUXBJSFpoYkhWbElEMGdUV0YwYUM1bWJHOXZjaWgyWVd4MVpTbGNiaUFnYVdZZ0tIWmhiSFZsSUR3Z01Da2dkbUZzZFdVZ1BTQXdlR1ptSUNzZ2RtRnNkV1VnS3lBeFhHNGdJSFJvYVhOYmIyWm1jMlYwWFNBOUlDaDJZV3gxWlNBbUlEQjRabVlwWEc0Z0lISmxkSFZ5YmlCdlptWnpaWFFnS3lBeFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1ZDNKcGRHVkpiblF4Tmt4RklEMGdablZ1WTNScGIyNGdkM0pwZEdWSmJuUXhOa3hGSUNoMllXeDFaU3dnYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQjJZV3gxWlNBOUlDdDJZV3gxWlZ4dUlDQnZabVp6WlhRZ1BTQnZabVp6WlhRZ2ZDQXdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclNXNTBLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSURJc0lEQjROMlptWml3Z0xUQjRPREF3TUNsY2JpQWdhV1lnS0VKMVptWmxjaTVVV1ZCRlJGOUJVbEpCV1Y5VFZWQlFUMUpVS1NCN1hHNGdJQ0FnZEdocGMxdHZabVp6WlhSZElEMGdLSFpoYkhWbElDWWdNSGhtWmlsY2JpQWdJQ0IwYUdselcyOW1abk5sZENBcklERmRJRDBnS0haaGJIVmxJRDQrUGlBNEtWeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHOWlhbVZqZEZkeWFYUmxWVWx1ZERFMktIUm9hWE1zSUhaaGJIVmxMQ0J2Wm1aelpYUXNJSFJ5ZFdVcFhHNGdJSDFjYmlBZ2NtVjBkWEp1SUc5bVpuTmxkQ0FySURKY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpVbHVkREUyUWtVZ1BTQm1kVzVqZEdsdmJpQjNjbWwwWlVsdWRERTJRa1VnS0haaGJIVmxMQ0J2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lIWmhiSFZsSUQwZ0szWmhiSFZsWEc0Z0lHOW1abk5sZENBOUlHOW1abk5sZENCOElEQmNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0SmJuUW9kR2hwY3l3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnTWl3Z01IZzNabVptTENBdE1IZzRNREF3S1Z4dUlDQnBaaUFvUW5WbVptVnlMbFJaVUVWRVgwRlNVa0ZaWDFOVlVGQlBVbFFwSUh0Y2JpQWdJQ0IwYUdselcyOW1abk5sZEYwZ1BTQW9kbUZzZFdVZ1BqNCtJRGdwWEc0Z0lDQWdkR2hwYzF0dlptWnpaWFFnS3lBeFhTQTlJQ2gyWVd4MVpTQW1JREI0Wm1ZcFhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2IySnFaV04wVjNKcGRHVlZTVzUwTVRZb2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dabUZzYzJVcFhHNGdJSDFjYmlBZ2NtVjBkWEp1SUc5bVpuTmxkQ0FySURKY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpVbHVkRE15VEVVZ1BTQm1kVzVqZEdsdmJpQjNjbWwwWlVsdWRETXlURVVnS0haaGJIVmxMQ0J2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lIWmhiSFZsSUQwZ0szWmhiSFZsWEc0Z0lHOW1abk5sZENBOUlHOW1abk5sZENCOElEQmNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0SmJuUW9kR2hwY3l3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnTkN3Z01IZzNabVptWm1abVppd2dMVEI0T0RBd01EQXdNREFwWEc0Z0lHbG1JQ2hDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ2tnZTF4dUlDQWdJSFJvYVhOYmIyWm1jMlYwWFNBOUlDaDJZV3gxWlNBbUlEQjRabVlwWEc0Z0lDQWdkR2hwYzF0dlptWnpaWFFnS3lBeFhTQTlJQ2gyWVd4MVpTQStQajRnT0NsY2JpQWdJQ0IwYUdselcyOW1abk5sZENBcklESmRJRDBnS0haaGJIVmxJRDQrUGlBeE5pbGNiaUFnSUNCMGFHbHpXMjltWm5ObGRDQXJJRE5kSUQwZ0tIWmhiSFZsSUQ0K1BpQXlOQ2xjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0J2WW1wbFkzUlhjbWwwWlZWSmJuUXpNaWgwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCMGNuVmxLVnh1SUNCOVhHNGdJSEpsZEhWeWJpQnZabVp6WlhRZ0t5QTBYRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWQzSnBkR1ZKYm5Rek1rSkZJRDBnWm5WdVkzUnBiMjRnZDNKcGRHVkpiblF6TWtKRklDaDJZV3gxWlN3Z2IyWm1jMlYwTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0IyWVd4MVpTQTlJQ3QyWVd4MVpWeHVJQ0J2Wm1aelpYUWdQU0J2Wm1aelpYUWdmQ0F3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJTVzUwS0hSb2FYTXNJSFpoYkhWbExDQnZabVp6WlhRc0lEUXNJREI0TjJabVptWm1abVlzSUMwd2VEZ3dNREF3TURBd0tWeHVJQ0JwWmlBb2RtRnNkV1VnUENBd0tTQjJZV3gxWlNBOUlEQjRabVptWm1abVptWWdLeUIyWVd4MVpTQXJJREZjYmlBZ2FXWWdLRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVLU0I3WEc0Z0lDQWdkR2hwYzF0dlptWnpaWFJkSUQwZ0tIWmhiSFZsSUQ0K1BpQXlOQ2xjYmlBZ0lDQjBhR2x6VzI5bVpuTmxkQ0FySURGZElEMGdLSFpoYkhWbElENCtQaUF4TmlsY2JpQWdJQ0IwYUdselcyOW1abk5sZENBcklESmRJRDBnS0haaGJIVmxJRDQrUGlBNEtWeHVJQ0FnSUhSb2FYTmJiMlptYzJWMElDc2dNMTBnUFNBb2RtRnNkV1VnSmlBd2VHWm1LVnh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJRzlpYW1WamRGZHlhWFJsVlVsdWRETXlLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSUdaaGJITmxLVnh1SUNCOVhHNGdJSEpsZEhWeWJpQnZabVp6WlhRZ0t5QTBYRzU5WEc1Y2JtWjFibU4wYVc5dUlHTm9aV05yU1VWRlJUYzFOQ0FvWW5WbUxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCbGVIUXNJRzFoZUN3Z2JXbHVLU0I3WEc0Z0lHbG1JQ2gyWVd4MVpTQStJRzFoZUNCOGZDQjJZV3gxWlNBOElHMXBiaWtnZEdoeWIzY2dibVYzSUZKaGJtZGxSWEp5YjNJb0ozWmhiSFZsSUdseklHOTFkQ0J2WmlCaWIzVnVaSE1uS1Z4dUlDQnBaaUFvYjJabWMyVjBJQ3NnWlhoMElENGdZblZtTG14bGJtZDBhQ2tnZEdoeWIzY2dibVYzSUZKaGJtZGxSWEp5YjNJb0oybHVaR1Y0SUc5MWRDQnZaaUJ5WVc1blpTY3BYRzRnSUdsbUlDaHZabVp6WlhRZ1BDQXdLU0IwYUhKdmR5QnVaWGNnVW1GdVoyVkZjbkp2Y2lnbmFXNWtaWGdnYjNWMElHOW1JSEpoYm1kbEp5bGNibjFjYmx4dVpuVnVZM1JwYjI0Z2QzSnBkR1ZHYkc5aGRDQW9ZblZtTENCMllXeDFaU3dnYjJabWMyVjBMQ0JzYVhSMGJHVkZibVJwWVc0c0lHNXZRWE56WlhKMEtTQjdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJSHRjYmlBZ0lDQmphR1ZqYTBsRlJVVTNOVFFvWW5WbUxDQjJZV3gxWlN3Z2IyWm1jMlYwTENBMExDQXpMalF3TWpneU16UTJOak00TlRJNE9EWmxLek00TENBdE15NDBNREk0TWpNME5qWXpPRFV5T0RnMlpTc3pPQ2xjYmlBZ2ZWeHVJQ0JwWldWbE56VTBMbmR5YVhSbEtHSjFaaXdnZG1Gc2RXVXNJRzltWm5ObGRDd2diR2wwZEd4bFJXNWthV0Z1TENBeU15d2dOQ2xjYmlBZ2NtVjBkWEp1SUc5bVpuTmxkQ0FySURSY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpVWnNiMkYwVEVVZ1BTQm1kVzVqZEdsdmJpQjNjbWwwWlVac2IyRjBURVVnS0haaGJIVmxMQ0J2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lISmxkSFZ5YmlCM2NtbDBaVVpzYjJGMEtIUm9hWE1zSUhaaGJIVmxMQ0J2Wm1aelpYUXNJSFJ5ZFdVc0lHNXZRWE56WlhKMEtWeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5keWFYUmxSbXh2WVhSQ1JTQTlJR1oxYm1OMGFXOXVJSGR5YVhSbFJteHZZWFJDUlNBb2RtRnNkV1VzSUc5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdjbVYwZFhKdUlIZHlhWFJsUm14dllYUW9kR2hwY3l3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnWm1Gc2MyVXNJRzV2UVhOelpYSjBLVnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQjNjbWwwWlVSdmRXSnNaU0FvWW5WbUxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCc2FYUjBiR1ZGYm1ScFlXNHNJRzV2UVhOelpYSjBLU0I3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUh0Y2JpQWdJQ0JqYUdWamEwbEZSVVUzTlRRb1luVm1MQ0IyWVd4MVpTd2diMlptYzJWMExDQTRMQ0F4TGpjNU56WTVNekV6TkRnMk1qTXhOVGRGS3pNd09Dd2dMVEV1TnprM05qa3pNVE0wT0RZeU16RTFOMFVyTXpBNEtWeHVJQ0I5WEc0Z0lHbGxaV1UzTlRRdWQzSnBkR1VvWW5WbUxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCc2FYUjBiR1ZGYm1ScFlXNHNJRFV5TENBNEtWeHVJQ0J5WlhSMWNtNGdiMlptYzJWMElDc2dPRnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuZHlhWFJsUkc5MVlteGxURVVnUFNCbWRXNWpkR2x2YmlCM2NtbDBaVVJ2ZFdKc1pVeEZJQ2gyWVd4MVpTd2diMlptYzJWMExDQnViMEZ6YzJWeWRDa2dlMXh1SUNCeVpYUjFjbTRnZDNKcGRHVkViM1ZpYkdVb2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dkSEoxWlN3Z2JtOUJjM05sY25RcFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1ZDNKcGRHVkViM1ZpYkdWQ1JTQTlJR1oxYm1OMGFXOXVJSGR5YVhSbFJHOTFZbXhsUWtVZ0tIWmhiSFZsTENCdlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJSEpsZEhWeWJpQjNjbWwwWlVSdmRXSnNaU2gwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCbVlXeHpaU3dnYm05QmMzTmxjblFwWEc1OVhHNWNiaTh2SUdOdmNIa29kR0Z5WjJWMFFuVm1abVZ5TENCMFlYSm5aWFJUZEdGeWREMHdMQ0J6YjNWeVkyVlRkR0Z5ZEQwd0xDQnpiM1Z5WTJWRmJtUTlZblZtWm1WeUxteGxibWQwYUNsY2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdVkyOXdlU0E5SUdaMWJtTjBhVzl1SUdOdmNIa2dLSFJoY21kbGRDd2dkR0Z5WjJWMFUzUmhjblFzSUhOMFlYSjBMQ0JsYm1RcElIdGNiaUFnYVdZZ0tDRnpkR0Z5ZENrZ2MzUmhjblFnUFNBd1hHNGdJR2xtSUNnaFpXNWtJQ1ltSUdWdVpDQWhQVDBnTUNrZ1pXNWtJRDBnZEdocGN5NXNaVzVuZEdoY2JpQWdhV1lnS0hSaGNtZGxkRk4wWVhKMElENDlJSFJoY21kbGRDNXNaVzVuZEdncElIUmhjbWRsZEZOMFlYSjBJRDBnZEdGeVoyVjBMbXhsYm1kMGFGeHVJQ0JwWmlBb0lYUmhjbWRsZEZOMFlYSjBLU0IwWVhKblpYUlRkR0Z5ZENBOUlEQmNiaUFnYVdZZ0tHVnVaQ0ErSURBZ0ppWWdaVzVrSUR3Z2MzUmhjblFwSUdWdVpDQTlJSE4wWVhKMFhHNWNiaUFnTHk4Z1EyOXdlU0F3SUdKNWRHVnpPeUIzWlNkeVpTQmtiMjVsWEc0Z0lHbG1JQ2hsYm1RZ1BUMDlJSE4wWVhKMEtTQnlaWFIxY200Z01GeHVJQ0JwWmlBb2RHRnlaMlYwTG14bGJtZDBhQ0E5UFQwZ01DQjhmQ0IwYUdsekxteGxibWQwYUNBOVBUMGdNQ2tnY21WMGRYSnVJREJjYmx4dUlDQXZMeUJHWVhSaGJDQmxjbkp2Y2lCamIyNWthWFJwYjI1elhHNGdJR2xtSUNoMFlYSm5aWFJUZEdGeWRDQThJREFwSUh0Y2JpQWdJQ0IwYUhKdmR5QnVaWGNnVW1GdVoyVkZjbkp2Y2lnbmRHRnlaMlYwVTNSaGNuUWdiM1YwSUc5bUlHSnZkVzVrY3ljcFhHNGdJSDFjYmlBZ2FXWWdLSE4wWVhKMElEd2dNQ0I4ZkNCemRHRnlkQ0ErUFNCMGFHbHpMbXhsYm1kMGFDa2dkR2h5YjNjZ2JtVjNJRkpoYm1kbFJYSnliM0lvSjNOdmRYSmpaVk4wWVhKMElHOTFkQ0J2WmlCaWIzVnVaSE1uS1Z4dUlDQnBaaUFvWlc1a0lEd2dNQ2tnZEdoeWIzY2dibVYzSUZKaGJtZGxSWEp5YjNJb0ozTnZkWEpqWlVWdVpDQnZkWFFnYjJZZ1ltOTFibVJ6SnlsY2JseHVJQ0F2THlCQmNtVWdkMlVnYjI5aVAxeHVJQ0JwWmlBb1pXNWtJRDRnZEdocGN5NXNaVzVuZEdncElHVnVaQ0E5SUhSb2FYTXViR1Z1WjNSb1hHNGdJR2xtSUNoMFlYSm5aWFF1YkdWdVozUm9JQzBnZEdGeVoyVjBVM1JoY25RZ1BDQmxibVFnTFNCemRHRnlkQ2tnZTF4dUlDQWdJR1Z1WkNBOUlIUmhjbWRsZEM1c1pXNW5kR2dnTFNCMFlYSm5aWFJUZEdGeWRDQXJJSE4wWVhKMFhHNGdJSDFjYmx4dUlDQjJZWElnYkdWdUlEMGdaVzVrSUMwZ2MzUmhjblJjYmlBZ2RtRnlJR2xjYmx4dUlDQnBaaUFvZEdocGN5QTlQVDBnZEdGeVoyVjBJQ1ltSUhOMFlYSjBJRHdnZEdGeVoyVjBVM1JoY25RZ0ppWWdkR0Z5WjJWMFUzUmhjblFnUENCbGJtUXBJSHRjYmlBZ0lDQXZMeUJrWlhOalpXNWthVzVuSUdOdmNIa2dabkp2YlNCbGJtUmNiaUFnSUNCbWIzSWdLR2tnUFNCc1pXNGdMU0F4T3lCcElENDlJREE3SUdrdExTa2dlMXh1SUNBZ0lDQWdkR0Z5WjJWMFcya2dLeUIwWVhKblpYUlRkR0Z5ZEYwZ1BTQjBhR2x6VzJrZ0t5QnpkR0Z5ZEYxY2JpQWdJQ0I5WEc0Z0lIMGdaV3h6WlNCcFppQW9iR1Z1SUR3Z01UQXdNQ0I4ZkNBaFFuVm1abVZ5TGxSWlVFVkVYMEZTVWtGWlgxTlZVRkJQVWxRcElIdGNiaUFnSUNBdkx5QmhjMk5sYm1ScGJtY2dZMjl3ZVNCbWNtOXRJSE4wWVhKMFhHNGdJQ0FnWm05eUlDaHBJRDBnTURzZ2FTQThJR3hsYmpzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0IwWVhKblpYUmJhU0FySUhSaGNtZGxkRk4wWVhKMFhTQTlJSFJvYVhOYmFTQXJJSE4wWVhKMFhWeHVJQ0FnSUgxY2JpQWdmU0JsYkhObElIdGNiaUFnSUNCMFlYSm5aWFF1WDNObGRDaDBhR2x6TG5OMVltRnljbUY1S0hOMFlYSjBMQ0J6ZEdGeWRDQXJJR3hsYmlrc0lIUmhjbWRsZEZOMFlYSjBLVnh1SUNCOVhHNWNiaUFnY21WMGRYSnVJR3hsYmx4dWZWeHVYRzR2THlCbWFXeHNLSFpoYkhWbExDQnpkR0Z5ZEQwd0xDQmxibVE5WW5WbVptVnlMbXhsYm1kMGFDbGNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVabWxzYkNBOUlHWjFibU4wYVc5dUlHWnBiR3dnS0haaGJIVmxMQ0J6ZEdGeWRDd2daVzVrS1NCN1hHNGdJR2xtSUNnaGRtRnNkV1VwSUhaaGJIVmxJRDBnTUZ4dUlDQnBaaUFvSVhOMFlYSjBLU0J6ZEdGeWRDQTlJREJjYmlBZ2FXWWdLQ0ZsYm1RcElHVnVaQ0E5SUhSb2FYTXViR1Z1WjNSb1hHNWNiaUFnYVdZZ0tHVnVaQ0E4SUhOMFlYSjBLU0IwYUhKdmR5QnVaWGNnVW1GdVoyVkZjbkp2Y2lnblpXNWtJRHdnYzNSaGNuUW5LVnh1WEc0Z0lDOHZJRVpwYkd3Z01DQmllWFJsY3pzZ2QyVW5jbVVnWkc5dVpWeHVJQ0JwWmlBb1pXNWtJRDA5UFNCemRHRnlkQ2tnY21WMGRYSnVYRzRnSUdsbUlDaDBhR2x6TG14bGJtZDBhQ0E5UFQwZ01Da2djbVYwZFhKdVhHNWNiaUFnYVdZZ0tITjBZWEowSUR3Z01DQjhmQ0J6ZEdGeWRDQStQU0IwYUdsekxteGxibWQwYUNrZ2RHaHliM2NnYm1WM0lGSmhibWRsUlhKeWIzSW9KM04wWVhKMElHOTFkQ0J2WmlCaWIzVnVaSE1uS1Z4dUlDQnBaaUFvWlc1a0lEd2dNQ0I4ZkNCbGJtUWdQaUIwYUdsekxteGxibWQwYUNrZ2RHaHliM2NnYm1WM0lGSmhibWRsUlhKeWIzSW9KMlZ1WkNCdmRYUWdiMllnWW05MWJtUnpKeWxjYmx4dUlDQjJZWElnYVZ4dUlDQnBaaUFvZEhsd1pXOW1JSFpoYkhWbElEMDlQU0FuYm5WdFltVnlKeWtnZTF4dUlDQWdJR1p2Y2lBb2FTQTlJSE4wWVhKME95QnBJRHdnWlc1a095QnBLeXNwSUh0Y2JpQWdJQ0FnSUhSb2FYTmJhVjBnUFNCMllXeDFaVnh1SUNBZ0lIMWNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQjJZWElnWW5sMFpYTWdQU0IxZEdZNFZHOUNlWFJsY3loMllXeDFaUzUwYjFOMGNtbHVaeWdwS1Z4dUlDQWdJSFpoY2lCc1pXNGdQU0JpZVhSbGN5NXNaVzVuZEdoY2JpQWdJQ0JtYjNJZ0tHa2dQU0J6ZEdGeWREc2dhU0E4SUdWdVpEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCMGFHbHpXMmxkSUQwZ1lubDBaWE5iYVNBbElHeGxibDFjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdkR2hwYzF4dWZWeHVYRzR2S2lwY2JpQXFJRU55WldGMFpYTWdZU0J1WlhjZ1lFRnljbUY1UW5WbVptVnlZQ0IzYVhSb0lIUm9aU0FxWTI5d2FXVmtLaUJ0WlcxdmNua2diMllnZEdobElHSjFabVpsY2lCcGJuTjBZVzVqWlM1Y2JpQXFJRUZrWkdWa0lHbHVJRTV2WkdVZ01DNHhNaTRnVDI1c2VTQmhkbUZwYkdGaWJHVWdhVzRnWW5KdmQzTmxjbk1nZEdoaGRDQnpkWEJ3YjNKMElFRnljbUY1UW5WbVptVnlMbHh1SUNvdlhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuUnZRWEp5WVhsQ2RXWm1aWElnUFNCbWRXNWpkR2x2YmlCMGIwRnljbUY1UW5WbVptVnlJQ2dwSUh0Y2JpQWdhV1lnS0hSNWNHVnZaaUJWYVc1ME9FRnljbUY1SUNFOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJR2xtSUNoQ2RXWm1aWEl1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUNodVpYY2dRblZtWm1WeUtIUm9hWE1wS1M1aWRXWm1aWEpjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2RtRnlJR0oxWmlBOUlHNWxkeUJWYVc1ME9FRnljbUY1S0hSb2FYTXViR1Z1WjNSb0tWeHVJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREFzSUd4bGJpQTlJR0oxWmk1c1pXNW5kR2c3SUdrZ1BDQnNaVzQ3SUdrZ0t6MGdNU2tnZTF4dUlDQWdJQ0FnSUNCaWRXWmJhVjBnUFNCMGFHbHpXMmxkWEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdZblZtTG1KMVptWmxjbHh1SUNBZ0lIMWNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RDZFdabVpYSXVkRzlCY25KaGVVSjFabVpsY2lCdWIzUWdjM1Z3Y0c5eWRHVmtJR2x1SUhSb2FYTWdZbkp2ZDNObGNpY3BYRzRnSUgxY2JuMWNibHh1THk4Z1NFVk1VRVZTSUVaVlRrTlVTVTlPVTF4dUx5OGdQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVYRzUyWVhJZ1FsQWdQU0JDZFdabVpYSXVjSEp2ZEc5MGVYQmxYRzVjYmk4cUtseHVJQ29nUVhWbmJXVnVkQ0JoSUZWcGJuUTRRWEp5WVhrZ0ttbHVjM1JoYm1ObEtpQW9ibTkwSUhSb1pTQlZhVzUwT0VGeWNtRjVJR05zWVhOeklTa2dkMmwwYUNCQ2RXWm1aWElnYldWMGFHOWtjMXh1SUNvdlhHNUNkV1ptWlhJdVgyRjFaMjFsYm5RZ1BTQm1kVzVqZEdsdmJpQmZZWFZuYldWdWRDQW9ZWEp5S1NCN1hHNGdJR0Z5Y2k1amIyNXpkSEoxWTNSdmNpQTlJRUoxWm1abGNseHVJQ0JoY25JdVgybHpRblZtWm1WeUlEMGdkSEoxWlZ4dVhHNGdJQzh2SUhOaGRtVWdjbVZtWlhKbGJtTmxJSFJ2SUc5eWFXZHBibUZzSUZWcGJuUTRRWEp5WVhrZ2MyVjBJRzFsZEdodlpDQmlaV1p2Y21VZ2IzWmxjbmR5YVhScGJtZGNiaUFnWVhKeUxsOXpaWFFnUFNCaGNuSXVjMlYwWEc1Y2JpQWdMeThnWkdWd2NtVmpZWFJsWkZ4dUlDQmhjbkl1WjJWMElEMGdRbEF1WjJWMFhHNGdJR0Z5Y2k1elpYUWdQU0JDVUM1elpYUmNibHh1SUNCaGNuSXVkM0pwZEdVZ1BTQkNVQzUzY21sMFpWeHVJQ0JoY25JdWRHOVRkSEpwYm1jZ1BTQkNVQzUwYjFOMGNtbHVaMXh1SUNCaGNuSXVkRzlNYjJOaGJHVlRkSEpwYm1jZ1BTQkNVQzUwYjFOMGNtbHVaMXh1SUNCaGNuSXVkRzlLVTA5T0lEMGdRbEF1ZEc5S1UwOU9YRzRnSUdGeWNpNWxjWFZoYkhNZ1BTQkNVQzVsY1hWaGJITmNiaUFnWVhKeUxtTnZiWEJoY21VZ1BTQkNVQzVqYjIxd1lYSmxYRzRnSUdGeWNpNXBibVJsZUU5bUlEMGdRbEF1YVc1a1pYaFBabHh1SUNCaGNuSXVZMjl3ZVNBOUlFSlFMbU52Y0hsY2JpQWdZWEp5TG5Oc2FXTmxJRDBnUWxBdWMyeHBZMlZjYmlBZ1lYSnlMbkpsWVdSVlNXNTBURVVnUFNCQ1VDNXlaV0ZrVlVsdWRFeEZYRzRnSUdGeWNpNXlaV0ZrVlVsdWRFSkZJRDBnUWxBdWNtVmhaRlZKYm5SQ1JWeHVJQ0JoY25JdWNtVmhaRlZKYm5RNElEMGdRbEF1Y21WaFpGVkpiblE0WEc0Z0lHRnljaTV5WldGa1ZVbHVkREUyVEVVZ1BTQkNVQzV5WldGa1ZVbHVkREUyVEVWY2JpQWdZWEp5TG5KbFlXUlZTVzUwTVRaQ1JTQTlJRUpRTG5KbFlXUlZTVzUwTVRaQ1JWeHVJQ0JoY25JdWNtVmhaRlZKYm5Rek1reEZJRDBnUWxBdWNtVmhaRlZKYm5Rek1reEZYRzRnSUdGeWNpNXlaV0ZrVlVsdWRETXlRa1VnUFNCQ1VDNXlaV0ZrVlVsdWRETXlRa1ZjYmlBZ1lYSnlMbkpsWVdSSmJuUk1SU0E5SUVKUUxuSmxZV1JKYm5STVJWeHVJQ0JoY25JdWNtVmhaRWx1ZEVKRklEMGdRbEF1Y21WaFpFbHVkRUpGWEc0Z0lHRnljaTV5WldGa1NXNTBPQ0E5SUVKUUxuSmxZV1JKYm5RNFhHNGdJR0Z5Y2k1eVpXRmtTVzUwTVRaTVJTQTlJRUpRTG5KbFlXUkpiblF4Tmt4RlhHNGdJR0Z5Y2k1eVpXRmtTVzUwTVRaQ1JTQTlJRUpRTG5KbFlXUkpiblF4TmtKRlhHNGdJR0Z5Y2k1eVpXRmtTVzUwTXpKTVJTQTlJRUpRTG5KbFlXUkpiblF6TWt4RlhHNGdJR0Z5Y2k1eVpXRmtTVzUwTXpKQ1JTQTlJRUpRTG5KbFlXUkpiblF6TWtKRlhHNGdJR0Z5Y2k1eVpXRmtSbXh2WVhSTVJTQTlJRUpRTG5KbFlXUkdiRzloZEV4RlhHNGdJR0Z5Y2k1eVpXRmtSbXh2WVhSQ1JTQTlJRUpRTG5KbFlXUkdiRzloZEVKRlhHNGdJR0Z5Y2k1eVpXRmtSRzkxWW14bFRFVWdQU0JDVUM1eVpXRmtSRzkxWW14bFRFVmNiaUFnWVhKeUxuSmxZV1JFYjNWaWJHVkNSU0E5SUVKUUxuSmxZV1JFYjNWaWJHVkNSVnh1SUNCaGNuSXVkM0pwZEdWVlNXNTBPQ0E5SUVKUUxuZHlhWFJsVlVsdWREaGNiaUFnWVhKeUxuZHlhWFJsVlVsdWRFeEZJRDBnUWxBdWQzSnBkR1ZWU1c1MFRFVmNiaUFnWVhKeUxuZHlhWFJsVlVsdWRFSkZJRDBnUWxBdWQzSnBkR1ZWU1c1MFFrVmNiaUFnWVhKeUxuZHlhWFJsVlVsdWRERTJURVVnUFNCQ1VDNTNjbWwwWlZWSmJuUXhOa3hGWEc0Z0lHRnljaTUzY21sMFpWVkpiblF4TmtKRklEMGdRbEF1ZDNKcGRHVlZTVzUwTVRaQ1JWeHVJQ0JoY25JdWQzSnBkR1ZWU1c1ME16Sk1SU0E5SUVKUUxuZHlhWFJsVlVsdWRETXlURVZjYmlBZ1lYSnlMbmR5YVhSbFZVbHVkRE15UWtVZ1BTQkNVQzUzY21sMFpWVkpiblF6TWtKRlhHNGdJR0Z5Y2k1M2NtbDBaVWx1ZEV4RklEMGdRbEF1ZDNKcGRHVkpiblJNUlZ4dUlDQmhjbkl1ZDNKcGRHVkpiblJDUlNBOUlFSlFMbmR5YVhSbFNXNTBRa1ZjYmlBZ1lYSnlMbmR5YVhSbFNXNTBPQ0E5SUVKUUxuZHlhWFJsU1c1ME9GeHVJQ0JoY25JdWQzSnBkR1ZKYm5ReE5reEZJRDBnUWxBdWQzSnBkR1ZKYm5ReE5reEZYRzRnSUdGeWNpNTNjbWwwWlVsdWRERTJRa1VnUFNCQ1VDNTNjbWwwWlVsdWRERTJRa1ZjYmlBZ1lYSnlMbmR5YVhSbFNXNTBNekpNUlNBOUlFSlFMbmR5YVhSbFNXNTBNekpNUlZ4dUlDQmhjbkl1ZDNKcGRHVkpiblF6TWtKRklEMGdRbEF1ZDNKcGRHVkpiblF6TWtKRlhHNGdJR0Z5Y2k1M2NtbDBaVVpzYjJGMFRFVWdQU0JDVUM1M2NtbDBaVVpzYjJGMFRFVmNiaUFnWVhKeUxuZHlhWFJsUm14dllYUkNSU0E5SUVKUUxuZHlhWFJsUm14dllYUkNSVnh1SUNCaGNuSXVkM0pwZEdWRWIzVmliR1ZNUlNBOUlFSlFMbmR5YVhSbFJHOTFZbXhsVEVWY2JpQWdZWEp5TG5keWFYUmxSRzkxWW14bFFrVWdQU0JDVUM1M2NtbDBaVVJ2ZFdKc1pVSkZYRzRnSUdGeWNpNW1hV3hzSUQwZ1FsQXVabWxzYkZ4dUlDQmhjbkl1YVc1emNHVmpkQ0E5SUVKUUxtbHVjM0JsWTNSY2JpQWdZWEp5TG5SdlFYSnlZWGxDZFdabVpYSWdQU0JDVUM1MGIwRnljbUY1UW5WbVptVnlYRzVjYmlBZ2NtVjBkWEp1SUdGeWNseHVmVnh1WEc1MllYSWdTVTVXUVV4SlJGOUNRVk5GTmpSZlVrVWdQU0F2VzE0clhGd3ZNQzA1UVMxYVlTMTZMVjlkTDJkY2JseHVablZ1WTNScGIyNGdZbUZ6WlRZMFkyeGxZVzRnS0hOMGNpa2dlMXh1SUNBdkx5Qk9iMlJsSUhOMGNtbHdjeUJ2ZFhRZ2FXNTJZV3hwWkNCamFHRnlZV04wWlhKeklHeHBhMlVnWEZ4dUlHRnVaQ0JjWEhRZ1puSnZiU0IwYUdVZ2MzUnlhVzVuTENCaVlYTmxOalF0YW5NZ1pHOWxjeUJ1YjNSY2JpQWdjM1J5SUQwZ2MzUnlhVzVuZEhKcGJTaHpkSElwTG5KbGNHeGhZMlVvU1U1V1FVeEpSRjlDUVZORk5qUmZVa1VzSUNjbktWeHVJQ0F2THlCT2IyUmxJR052Ym5abGNuUnpJSE4wY21sdVozTWdkMmwwYUNCc1pXNW5kR2dnUENBeUlIUnZJQ2NuWEc0Z0lHbG1JQ2h6ZEhJdWJHVnVaM1JvSUR3Z01pa2djbVYwZFhKdUlDY25YRzRnSUM4dklFNXZaR1VnWVd4c2IzZHpJR1p2Y2lCdWIyNHRjR0ZrWkdWa0lHSmhjMlUyTkNCemRISnBibWR6SUNodGFYTnphVzVuSUhSeVlXbHNhVzVuSUQwOVBTa3NJR0poYzJVMk5DMXFjeUJrYjJWeklHNXZkRnh1SUNCM2FHbHNaU0FvYzNSeUxteGxibWQwYUNBbElEUWdJVDA5SURBcElIdGNiaUFnSUNCemRISWdQU0J6ZEhJZ0t5QW5QU2RjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdjM1J5WEc1OVhHNWNibVoxYm1OMGFXOXVJSE4wY21sdVozUnlhVzBnS0hOMGNpa2dlMXh1SUNCcFppQW9jM1J5TG5SeWFXMHBJSEpsZEhWeWJpQnpkSEl1ZEhKcGJTZ3BYRzRnSUhKbGRIVnliaUJ6ZEhJdWNtVndiR0ZqWlNndlhseGNjeXQ4WEZ4ekt5UXZaeXdnSnljcFhHNTlYRzVjYm1aMWJtTjBhVzl1SUhSdlNHVjRJQ2h1S1NCN1hHNGdJR2xtSUNodUlEd2dNVFlwSUhKbGRIVnliaUFuTUNjZ0t5QnVMblJ2VTNSeWFXNW5LREUyS1Z4dUlDQnlaWFIxY200Z2JpNTBiMU4wY21sdVp5Z3hOaWxjYm4xY2JseHVablZ1WTNScGIyNGdkWFJtT0ZSdlFubDBaWE1nS0hOMGNtbHVaeXdnZFc1cGRITXBJSHRjYmlBZ2RXNXBkSE1nUFNCMWJtbDBjeUI4ZkNCSmJtWnBibWwwZVZ4dUlDQjJZWElnWTI5a1pWQnZhVzUwWEc0Z0lIWmhjaUJzWlc1bmRHZ2dQU0J6ZEhKcGJtY3ViR1Z1WjNSb1hHNGdJSFpoY2lCc1pXRmtVM1Z5Y205bllYUmxJRDBnYm5Wc2JGeHVJQ0IyWVhJZ1lubDBaWE1nUFNCYlhWeHVYRzRnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2JHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQmpiMlJsVUc5cGJuUWdQU0J6ZEhKcGJtY3VZMmhoY2tOdlpHVkJkQ2hwS1Z4dVhHNGdJQ0FnTHk4Z2FYTWdjM1Z5Y205bllYUmxJR052YlhCdmJtVnVkRnh1SUNBZ0lHbG1JQ2hqYjJSbFVHOXBiblFnUGlBd2VFUTNSa1lnSmlZZ1kyOWtaVkJ2YVc1MElEd2dNSGhGTURBd0tTQjdYRzRnSUNBZ0lDQXZMeUJzWVhOMElHTm9ZWElnZDJGeklHRWdiR1ZoWkZ4dUlDQWdJQ0FnYVdZZ0tDRnNaV0ZrVTNWeWNtOW5ZWFJsS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRzV2SUd4bFlXUWdlV1YwWEc0Z0lDQWdJQ0FnSUdsbUlDaGpiMlJsVUc5cGJuUWdQaUF3ZUVSQ1JrWXBJSHRjYmlBZ0lDQWdJQ0FnSUNBdkx5QjFibVY0Y0dWamRHVmtJSFJ5WVdsc1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0NoMWJtbDBjeUF0UFNBektTQStJQzB4S1NCaWVYUmxjeTV3ZFhOb0tEQjRSVVlzSURCNFFrWXNJREI0UWtRcFhHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdsdWRXVmNiaUFnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hwSUNzZ01TQTlQVDBnYkdWdVozUm9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdkVzV3WVdseVpXUWdiR1ZoWkZ4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2dvZFc1cGRITWdMVDBnTXlrZ1BpQXRNU2tnWW5sMFpYTXVjSFZ6YUNnd2VFVkdMQ0F3ZUVKR0xDQXdlRUpFS1Z4dUlDQWdJQ0FnSUNBZ0lHTnZiblJwYm5WbFhHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0F2THlCMllXeHBaQ0JzWldGa1hHNGdJQ0FnSUNBZ0lHeGxZV1JUZFhKeWIyZGhkR1VnUFNCamIyUmxVRzlwYm5SY2JseHVJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpWeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQXZMeUF5SUd4bFlXUnpJR2x1SUdFZ2NtOTNYRzRnSUNBZ0lDQnBaaUFvWTI5a1pWQnZhVzUwSUR3Z01IaEVRekF3S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2dvZFc1cGRITWdMVDBnTXlrZ1BpQXRNU2tnWW5sMFpYTXVjSFZ6YUNnd2VFVkdMQ0F3ZUVKR0xDQXdlRUpFS1Z4dUlDQWdJQ0FnSUNCc1pXRmtVM1Z5Y205bllYUmxJRDBnWTI5a1pWQnZhVzUwWEc0Z0lDQWdJQ0FnSUdOdmJuUnBiblZsWEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUM4dklIWmhiR2xrSUhOMWNuSnZaMkYwWlNCd1lXbHlYRzRnSUNBZ0lDQmpiMlJsVUc5cGJuUWdQU0FvYkdWaFpGTjFjbkp2WjJGMFpTQXRJREI0UkRnd01DQThQQ0F4TUNCOElHTnZaR1ZRYjJsdWRDQXRJREI0UkVNd01Da2dLeUF3ZURFd01EQXdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaHNaV0ZrVTNWeWNtOW5ZWFJsS1NCN1hHNGdJQ0FnSUNBdkx5QjJZV3hwWkNCaWJYQWdZMmhoY2l3Z1luVjBJR3hoYzNRZ1kyaGhjaUIzWVhNZ1lTQnNaV0ZrWEc0Z0lDQWdJQ0JwWmlBb0tIVnVhWFJ6SUMwOUlETXBJRDRnTFRFcElHSjVkR1Z6TG5CMWMyZ29NSGhGUml3Z01IaENSaXdnTUhoQ1JDbGNiaUFnSUNCOVhHNWNiaUFnSUNCc1pXRmtVM1Z5Y205bllYUmxJRDBnYm5Wc2JGeHVYRzRnSUNBZ0x5OGdaVzVqYjJSbElIVjBaamhjYmlBZ0lDQnBaaUFvWTI5a1pWQnZhVzUwSUR3Z01IZzRNQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tDaDFibWwwY3lBdFBTQXhLU0E4SURBcElHSnlaV0ZyWEc0Z0lDQWdJQ0JpZVhSbGN5NXdkWE5vS0dOdlpHVlFiMmx1ZENsY2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0dOdlpHVlFiMmx1ZENBOElEQjRPREF3S1NCN1hHNGdJQ0FnSUNCcFppQW9LSFZ1YVhSeklDMDlJRElwSUR3Z01Da2dZbkpsWVd0Y2JpQWdJQ0FnSUdKNWRHVnpMbkIxYzJnb1hHNGdJQ0FnSUNBZ0lHTnZaR1ZRYjJsdWRDQStQaUF3ZURZZ2ZDQXdlRU13TEZ4dUlDQWdJQ0FnSUNCamIyUmxVRzlwYm5RZ0ppQXdlRE5HSUh3Z01IZzRNRnh1SUNBZ0lDQWdLVnh1SUNBZ0lIMGdaV3h6WlNCcFppQW9ZMjlrWlZCdmFXNTBJRHdnTUhneE1EQXdNQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tDaDFibWwwY3lBdFBTQXpLU0E4SURBcElHSnlaV0ZyWEc0Z0lDQWdJQ0JpZVhSbGN5NXdkWE5vS0Z4dUlDQWdJQ0FnSUNCamIyUmxVRzlwYm5RZ1BqNGdNSGhESUh3Z01IaEZNQ3hjYmlBZ0lDQWdJQ0FnWTI5a1pWQnZhVzUwSUQ0K0lEQjROaUFtSURCNE0wWWdmQ0F3ZURnd0xGeHVJQ0FnSUNBZ0lDQmpiMlJsVUc5cGJuUWdKaUF3ZUROR0lId2dNSGc0TUZ4dUlDQWdJQ0FnS1Z4dUlDQWdJSDBnWld4elpTQnBaaUFvWTI5a1pWQnZhVzUwSUR3Z01IZ3hNVEF3TURBcElIdGNiaUFnSUNBZ0lHbG1JQ2dvZFc1cGRITWdMVDBnTkNrZ1BDQXdLU0JpY21WaGExeHVJQ0FnSUNBZ1lubDBaWE11Y0hWemFDaGNiaUFnSUNBZ0lDQWdZMjlrWlZCdmFXNTBJRDQrSURCNE1USWdmQ0F3ZUVZd0xGeHVJQ0FnSUNBZ0lDQmpiMlJsVUc5cGJuUWdQajRnTUhoRElDWWdNSGd6UmlCOElEQjRPREFzWEc0Z0lDQWdJQ0FnSUdOdlpHVlFiMmx1ZENBK1BpQXdlRFlnSmlBd2VETkdJSHdnTUhnNE1DeGNiaUFnSUNBZ0lDQWdZMjlrWlZCdmFXNTBJQ1lnTUhnelJpQjhJREI0T0RCY2JpQWdJQ0FnSUNsY2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZEpiblpoYkdsa0lHTnZaR1VnY0c5cGJuUW5LVnh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQmllWFJsYzF4dWZWeHVYRzVtZFc1amRHbHZiaUJoYzJOcGFWUnZRbmwwWlhNZ0tITjBjaWtnZTF4dUlDQjJZWElnWW5sMFpVRnljbUY1SUQwZ1cxMWNiaUFnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCemRISXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0F2THlCT2IyUmxKM01nWTI5a1pTQnpaV1Z0Y3lCMGJ5QmlaU0JrYjJsdVp5QjBhR2x6SUdGdVpDQnViM1FnSmlBd2VEZEdMaTVjYmlBZ0lDQmllWFJsUVhKeVlYa3VjSFZ6YUNoemRISXVZMmhoY2tOdlpHVkJkQ2hwS1NBbUlEQjRSa1lwWEc0Z0lIMWNiaUFnY21WMGRYSnVJR0o1ZEdWQmNuSmhlVnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQjFkR1l4Tm14bFZHOUNlWFJsY3lBb2MzUnlMQ0IxYm1sMGN5a2dlMXh1SUNCMllYSWdZeXdnYUdrc0lHeHZYRzRnSUhaaGNpQmllWFJsUVhKeVlYa2dQU0JiWFZ4dUlDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJSE4wY2k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHbG1JQ2dvZFc1cGRITWdMVDBnTWlrZ1BDQXdLU0JpY21WaGExeHVYRzRnSUNBZ1l5QTlJSE4wY2k1amFHRnlRMjlrWlVGMEtHa3BYRzRnSUNBZ2FHa2dQU0JqSUQ0K0lEaGNiaUFnSUNCc2J5QTlJR01nSlNBeU5UWmNiaUFnSUNCaWVYUmxRWEp5WVhrdWNIVnphQ2hzYnlsY2JpQWdJQ0JpZVhSbFFYSnlZWGt1Y0hWemFDaG9hU2xjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJpZVhSbFFYSnlZWGxjYm4xY2JseHVablZ1WTNScGIyNGdZbUZ6WlRZMFZHOUNlWFJsY3lBb2MzUnlLU0I3WEc0Z0lISmxkSFZ5YmlCaVlYTmxOalF1ZEc5Q2VYUmxRWEp5WVhrb1ltRnpaVFkwWTJ4bFlXNG9jM1J5S1NsY2JuMWNibHh1Wm5WdVkzUnBiMjRnWW14cGRFSjFabVpsY2lBb2MzSmpMQ0JrYzNRc0lHOW1abk5sZEN3Z2JHVnVaM1JvS1NCN1hHNGdJR1p2Y2lBb2RtRnlJR2tnUFNBd095QnBJRHdnYkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCcFppQW9LR2tnS3lCdlptWnpaWFFnUGowZ1pITjBMbXhsYm1kMGFDa2dmSHdnS0drZ1BqMGdjM0pqTG14bGJtZDBhQ2twSUdKeVpXRnJYRzRnSUNBZ1pITjBXMmtnS3lCdlptWnpaWFJkSUQwZ2MzSmpXMmxkWEc0Z0lIMWNiaUFnY21WMGRYSnVJR2xjYm4xY2JpSmRmUT09IiwidmFyIGxvb2t1cCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblxuOyhmdW5jdGlvbiAoZXhwb3J0cykge1xuXHQndXNlIHN0cmljdCc7XG5cbiAgdmFyIEFyciA9ICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgPyBVaW50OEFycmF5XG4gICAgOiBBcnJheVxuXG5cdHZhciBQTFVTICAgPSAnKycuY2hhckNvZGVBdCgwKVxuXHR2YXIgU0xBU0ggID0gJy8nLmNoYXJDb2RlQXQoMClcblx0dmFyIE5VTUJFUiA9ICcwJy5jaGFyQ29kZUF0KDApXG5cdHZhciBMT1dFUiAgPSAnYScuY2hhckNvZGVBdCgwKVxuXHR2YXIgVVBQRVIgID0gJ0EnLmNoYXJDb2RlQXQoMClcblx0dmFyIFBMVVNfVVJMX1NBRkUgPSAnLScuY2hhckNvZGVBdCgwKVxuXHR2YXIgU0xBU0hfVVJMX1NBRkUgPSAnXycuY2hhckNvZGVBdCgwKVxuXG5cdGZ1bmN0aW9uIGRlY29kZSAoZWx0KSB7XG5cdFx0dmFyIGNvZGUgPSBlbHQuY2hhckNvZGVBdCgwKVxuXHRcdGlmIChjb2RlID09PSBQTFVTIHx8XG5cdFx0ICAgIGNvZGUgPT09IFBMVVNfVVJMX1NBRkUpXG5cdFx0XHRyZXR1cm4gNjIgLy8gJysnXG5cdFx0aWYgKGNvZGUgPT09IFNMQVNIIHx8XG5cdFx0ICAgIGNvZGUgPT09IFNMQVNIX1VSTF9TQUZFKVxuXHRcdFx0cmV0dXJuIDYzIC8vICcvJ1xuXHRcdGlmIChjb2RlIDwgTlVNQkVSKVxuXHRcdFx0cmV0dXJuIC0xIC8vbm8gbWF0Y2hcblx0XHRpZiAoY29kZSA8IE5VTUJFUiArIDEwKVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBOVU1CRVIgKyAyNiArIDI2XG5cdFx0aWYgKGNvZGUgPCBVUFBFUiArIDI2KVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBVUFBFUlxuXHRcdGlmIChjb2RlIDwgTE9XRVIgKyAyNilcblx0XHRcdHJldHVybiBjb2RlIC0gTE9XRVIgKyAyNlxuXHR9XG5cblx0ZnVuY3Rpb24gYjY0VG9CeXRlQXJyYXkgKGI2NCkge1xuXHRcdHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyXG5cblx0XHRpZiAoYjY0Lmxlbmd0aCAlIDQgPiAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuXHRcdH1cblxuXHRcdC8vIHRoZSBudW1iZXIgb2YgZXF1YWwgc2lnbnMgKHBsYWNlIGhvbGRlcnMpXG5cdFx0Ly8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuXHRcdC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuXHRcdC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lLCB0aGVuIHRoZSB0aHJlZSBjaGFyYWN0ZXJzIGJlZm9yZSBpdCByZXByZXNlbnQgMiBieXRlc1xuXHRcdC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2Vcblx0XHR2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXHRcdHBsYWNlSG9sZGVycyA9ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAyKSA/IDIgOiAnPScgPT09IGI2NC5jaGFyQXQobGVuIC0gMSkgPyAxIDogMFxuXG5cdFx0Ly8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5cdFx0YXJyID0gbmV3IEFycihiNjQubGVuZ3RoICogMyAvIDQgLSBwbGFjZUhvbGRlcnMpXG5cblx0XHQvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG5cdFx0bCA9IHBsYWNlSG9sZGVycyA+IDAgPyBiNjQubGVuZ3RoIC0gNCA6IGI2NC5sZW5ndGhcblxuXHRcdHZhciBMID0gMFxuXG5cdFx0ZnVuY3Rpb24gcHVzaCAodikge1xuXHRcdFx0YXJyW0wrK10gPSB2XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuXHRcdFx0dG1wID0gKGRlY29kZShiNjQuY2hhckF0KGkpKSA8PCAxOCkgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA8PCAxMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDIpKSA8PCA2KSB8IGRlY29kZShiNjQuY2hhckF0KGkgKyAzKSlcblx0XHRcdHB1c2goKHRtcCAmIDB4RkYwMDAwKSA+PiAxNilcblx0XHRcdHB1c2goKHRtcCAmIDB4RkYwMCkgPj4gOClcblx0XHRcdHB1c2godG1wICYgMHhGRilcblx0XHR9XG5cblx0XHRpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDIpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAxKSkgPj4gNClcblx0XHRcdHB1c2godG1wICYgMHhGRilcblx0XHR9IGVsc2UgaWYgKHBsYWNlSG9sZGVycyA9PT0gMSkge1xuXHRcdFx0dG1wID0gKGRlY29kZShiNjQuY2hhckF0KGkpKSA8PCAxMCkgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA8PCA0KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpID4+IDIpXG5cdFx0XHRwdXNoKCh0bXAgPj4gOCkgJiAweEZGKVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJcblx0fVxuXG5cdGZ1bmN0aW9uIHVpbnQ4VG9CYXNlNjQgKHVpbnQ4KSB7XG5cdFx0dmFyIGksXG5cdFx0XHRleHRyYUJ5dGVzID0gdWludDgubGVuZ3RoICUgMywgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcblx0XHRcdG91dHB1dCA9IFwiXCIsXG5cdFx0XHR0ZW1wLCBsZW5ndGhcblxuXHRcdGZ1bmN0aW9uIGVuY29kZSAobnVtKSB7XG5cdFx0XHRyZXR1cm4gbG9va3VwLmNoYXJBdChudW0pXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcblx0XHRcdHJldHVybiBlbmNvZGUobnVtID4+IDE4ICYgMHgzRikgKyBlbmNvZGUobnVtID4+IDEyICYgMHgzRikgKyBlbmNvZGUobnVtID4+IDYgJiAweDNGKSArIGVuY29kZShudW0gJiAweDNGKVxuXHRcdH1cblxuXHRcdC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcblx0XHRmb3IgKGkgPSAwLCBsZW5ndGggPSB1aW50OC5sZW5ndGggLSBleHRyYUJ5dGVzOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHtcblx0XHRcdHRlbXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pXG5cdFx0XHRvdXRwdXQgKz0gdHJpcGxldFRvQmFzZTY0KHRlbXApXG5cdFx0fVxuXG5cdFx0Ly8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuXHRcdHN3aXRjaCAoZXh0cmFCeXRlcykge1xuXHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHR0ZW1wID0gdWludDhbdWludDgubGVuZ3RoIC0gMV1cblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSh0ZW1wID4+IDIpXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgNCkgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gJz09J1xuXHRcdFx0XHRicmVha1xuXHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHR0ZW1wID0gKHVpbnQ4W3VpbnQ4Lmxlbmd0aCAtIDJdIDw8IDgpICsgKHVpbnQ4W3VpbnQ4Lmxlbmd0aCAtIDFdKVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMTApXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPj4gNCkgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKCh0ZW1wIDw8IDIpICYgMHgzRilcblx0XHRcdFx0b3V0cHV0ICs9ICc9J1xuXHRcdFx0XHRicmVha1xuXHRcdH1cblxuXHRcdHJldHVybiBvdXRwdXRcblx0fVxuXG5cdGV4cG9ydHMudG9CeXRlQXJyYXkgPSBiNjRUb0J5dGVBcnJheVxuXHRleHBvcnRzLmZyb21CeXRlQXJyYXkgPSB1aW50OFRvQmFzZTY0XG59KHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJyA/ICh0aGlzLmJhc2U2NGpzID0ge30pIDogZXhwb3J0cykpXG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCJcblxubW9kdWxlLmV4cG9ydHMgPSBLRFRIZWFwXG5cbnZhciBwb29sID0gcmVxdWlyZShcInR5cGVkYXJyYXktcG9vbFwiKVxuXG5mdW5jdGlvbiBoZWFwUGFyZW50KGkpIHtcbiAgaWYoaSAmIDEpIHtcbiAgICByZXR1cm4gKGkgLSAxKSA+PiAxXG4gIH1cbiAgcmV0dXJuIChpID4+IDEpIC0gMVxufVxuXG5mdW5jdGlvbiBLRFRIZWFwKG4sIGQpIHtcbiAgdGhpcy5jb3VudCA9IDBcbiAgdGhpcy5kYXRhU2l6ZSA9IGRcbiAgdGhpcy5pbmRleCA9IHBvb2wubWFsbG9jSW50MzIobilcbiAgdGhpcy5kYXRhID0gcG9vbC5tYWxsb2NGbG9hdDY0KG4qZClcbn1cblxudmFyIHByb3RvID0gS0RUSGVhcC5wcm90b3R5cGVcblxucHJvdG8uaGVhcFN3YXAgPSBmdW5jdGlvbihfaSxfaikge1xuICB2YXIgZGF0YSA9IHRoaXMuZGF0YVxuICB2YXIgaW5kZXggPSB0aGlzLmluZGV4XG4gIHZhciBkID0gdGhpcy5kYXRhU2l6ZVxuICB2YXIgdG1wID0gaW5kZXhbX2ldXG4gIGluZGV4W19pXSA9IGluZGV4W19qXVxuICBpbmRleFtfal0gPSB0bXBcbiAgdmFyIGFwdHIgPSBkKl9pXG4gIHZhciBicHRyID0gZCpfalxuICBmb3IodmFyIF9rPTA7IF9rPGQ7ICsrX2spIHtcbiAgICB2YXIgdDIgPSBkYXRhW2FwdHJdXG4gICAgZGF0YVthcHRyXSA9IGRhdGFbYnB0cl1cbiAgICBkYXRhW2JwdHJdID0gdDJcbiAgICBhcHRyICs9IDFcbiAgICBicHRyICs9IDFcbiAgfVxufVxuXG5wcm90by5oZWFwVXAgPSBmdW5jdGlvbihpKSB7XG4gIHZhciBkID0gdGhpcy5kYXRhU2l6ZVxuICB2YXIgaW5kZXggPSB0aGlzLmluZGV4XG4gIHZhciBkYXRhID0gdGhpcy5kYXRhXG4gIHZhciB3ID0gZGF0YVtkKmldXG4gIHdoaWxlKGk+MCkge1xuICAgIHZhciBwYXJlbnQgPSBoZWFwUGFyZW50KGkpXG4gICAgaWYocGFyZW50ID49IDApIHtcbiAgICAgIHZhciBwdyA9IGRhdGFbZCpwYXJlbnRdXG4gICAgICBpZih3IDwgcHcpIHtcbiAgICAgICAgdGhpcy5oZWFwU3dhcChpLCBwYXJlbnQpXG4gICAgICAgIGkgPSBwYXJlbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWtcbiAgfVxufVxuXG5wcm90by5oZWFwRG93biA9IGZ1bmN0aW9uKGkpIHtcbiAgdmFyIGQgPSB0aGlzLmRhdGFTaXplXG4gIHZhciBpbmRleCA9IHRoaXMuaW5kZXhcbiAgdmFyIGRhdGEgPSB0aGlzLmRhdGFcbiAgdmFyIGNvdW50ID0gdGhpcy5jb3VudFxuICB2YXIgdyA9IGRhdGFbZCppXVxuICB3aGlsZSh0cnVlKSB7XG4gICAgdmFyIHR3ID0gd1xuICAgIHZhciBsZWZ0ICA9IDIqaSArIDFcbiAgICB2YXIgcmlnaHQgPSAyKihpICsgMSlcbiAgICB2YXIgbmV4dCA9IGlcbiAgICBpZihsZWZ0IDwgY291bnQpIHtcbiAgICAgIHZhciBsdyA9IGRhdGFbZCpsZWZ0XVxuICAgICAgaWYobHcgPCB0dykge1xuICAgICAgICBuZXh0ID0gbGVmdFxuICAgICAgICB0dyA9IGx3XG4gICAgICB9XG4gICAgfVxuICAgIGlmKHJpZ2h0IDwgY291bnQpIHtcbiAgICAgIHZhciBydyA9IGRhdGFbZCpyaWdodF1cbiAgICAgIGlmKHJ3IDwgdHcpIHtcbiAgICAgICAgbmV4dCA9IHJpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmKG5leHQgPT09IGkpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHRoaXMuaGVhcFN3YXAoaSwgbmV4dClcbiAgICBpID0gbmV4dCAgICAgIFxuICB9XG59XG5cbi8vQ2xlYXIgaXRlbSBmcm9tIHRvcCBvZiBoZWFwXG5wcm90by5wb3AgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5jb3VudCAtPSAxXG4gIHRoaXMuaGVhcFN3YXAoMCwgdGhpcy5jb3VudClcbiAgdGhpcy5oZWFwRG93bigwKVxufVxuXG4vL0Fzc3VtZSBvYmplY3QgYWxyZWFkeSB3cml0dGVuIHRvIGRhdGFcbnByb3RvLnB1c2ggPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5oZWFwVXAodGhpcy5jb3VudClcbiAgdGhpcy5jb3VudCArPSAxXG59XG5cbnByb3RvLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcbiAgcG9vbC5mcmVlSW50MzIodGhpcy5pbmRleClcbiAgcG9vbC5mcmVlRmxvYXQ2NCh0aGlzLmRhdGEpXG59IiwiLyoqXG4gKiBCaXQgdHdpZGRsaW5nIGhhY2tzIGZvciBKYXZhU2NyaXB0LlxuICpcbiAqIEF1dGhvcjogTWlrb2xhIEx5c2Vua29cbiAqXG4gKiBQb3J0ZWQgZnJvbSBTdGFuZm9yZCBiaXQgdHdpZGRsaW5nIGhhY2sgbGlicmFyeTpcbiAqICAgIGh0dHA6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvfnNlYW5kZXIvYml0aGFja3MuaHRtbFxuICovXG5cblwidXNlIHN0cmljdFwiOyBcInVzZSByZXN0cmljdFwiO1xuXG4vL051bWJlciBvZiBiaXRzIGluIGFuIGludGVnZXJcbnZhciBJTlRfQklUUyA9IDMyO1xuXG4vL0NvbnN0YW50c1xuZXhwb3J0cy5JTlRfQklUUyAgPSBJTlRfQklUUztcbmV4cG9ydHMuSU5UX01BWCAgID0gIDB4N2ZmZmZmZmY7XG5leHBvcnRzLklOVF9NSU4gICA9IC0xPDwoSU5UX0JJVFMtMSk7XG5cbi8vUmV0dXJucyAtMSwgMCwgKzEgZGVwZW5kaW5nIG9uIHNpZ24gb2YgeFxuZXhwb3J0cy5zaWduID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gKHYgPiAwKSAtICh2IDwgMCk7XG59XG5cbi8vQ29tcHV0ZXMgYWJzb2x1dGUgdmFsdWUgb2YgaW50ZWdlclxuZXhwb3J0cy5hYnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBtYXNrID0gdiA+PiAoSU5UX0JJVFMtMSk7XG4gIHJldHVybiAodiBeIG1hc2spIC0gbWFzaztcbn1cblxuLy9Db21wdXRlcyBtaW5pbXVtIG9mIGludGVnZXJzIHggYW5kIHlcbmV4cG9ydHMubWluID0gZnVuY3Rpb24oeCwgeSkge1xuICByZXR1cm4geSBeICgoeCBeIHkpICYgLSh4IDwgeSkpO1xufVxuXG4vL0NvbXB1dGVzIG1heGltdW0gb2YgaW50ZWdlcnMgeCBhbmQgeVxuZXhwb3J0cy5tYXggPSBmdW5jdGlvbih4LCB5KSB7XG4gIHJldHVybiB4IF4gKCh4IF4geSkgJiAtKHggPCB5KSk7XG59XG5cbi8vQ2hlY2tzIGlmIGEgbnVtYmVyIGlzIGEgcG93ZXIgb2YgdHdvXG5leHBvcnRzLmlzUG93MiA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuICEodiAmICh2LTEpKSAmJiAoISF2KTtcbn1cblxuLy9Db21wdXRlcyBsb2cgYmFzZSAyIG9mIHZcbmV4cG9ydHMubG9nMiA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHIsIHNoaWZ0O1xuICByID0gICAgICh2ID4gMHhGRkZGKSA8PCA0OyB2ID4+Pj0gcjtcbiAgc2hpZnQgPSAodiA+IDB4RkYgICkgPDwgMzsgdiA+Pj49IHNoaWZ0OyByIHw9IHNoaWZ0O1xuICBzaGlmdCA9ICh2ID4gMHhGICAgKSA8PCAyOyB2ID4+Pj0gc2hpZnQ7IHIgfD0gc2hpZnQ7XG4gIHNoaWZ0ID0gKHYgPiAweDMgICApIDw8IDE7IHYgPj4+PSBzaGlmdDsgciB8PSBzaGlmdDtcbiAgcmV0dXJuIHIgfCAodiA+PiAxKTtcbn1cblxuLy9Db21wdXRlcyBsb2cgYmFzZSAxMCBvZiB2XG5leHBvcnRzLmxvZzEwID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gICh2ID49IDEwMDAwMDAwMDApID8gOSA6ICh2ID49IDEwMDAwMDAwMCkgPyA4IDogKHYgPj0gMTAwMDAwMDApID8gNyA6XG4gICAgICAgICAgKHYgPj0gMTAwMDAwMCkgPyA2IDogKHYgPj0gMTAwMDAwKSA/IDUgOiAodiA+PSAxMDAwMCkgPyA0IDpcbiAgICAgICAgICAodiA+PSAxMDAwKSA/IDMgOiAodiA+PSAxMDApID8gMiA6ICh2ID49IDEwKSA/IDEgOiAwO1xufVxuXG4vL0NvdW50cyBudW1iZXIgb2YgYml0c1xuZXhwb3J0cy5wb3BDb3VudCA9IGZ1bmN0aW9uKHYpIHtcbiAgdiA9IHYgLSAoKHYgPj4+IDEpICYgMHg1NTU1NTU1NSk7XG4gIHYgPSAodiAmIDB4MzMzMzMzMzMpICsgKCh2ID4+PiAyKSAmIDB4MzMzMzMzMzMpO1xuICByZXR1cm4gKCh2ICsgKHYgPj4+IDQpICYgMHhGMEYwRjBGKSAqIDB4MTAxMDEwMSkgPj4+IDI0O1xufVxuXG4vL0NvdW50cyBudW1iZXIgb2YgdHJhaWxpbmcgemVyb3NcbmZ1bmN0aW9uIGNvdW50VHJhaWxpbmdaZXJvcyh2KSB7XG4gIHZhciBjID0gMzI7XG4gIHYgJj0gLXY7XG4gIGlmICh2KSBjLS07XG4gIGlmICh2ICYgMHgwMDAwRkZGRikgYyAtPSAxNjtcbiAgaWYgKHYgJiAweDAwRkYwMEZGKSBjIC09IDg7XG4gIGlmICh2ICYgMHgwRjBGMEYwRikgYyAtPSA0O1xuICBpZiAodiAmIDB4MzMzMzMzMzMpIGMgLT0gMjtcbiAgaWYgKHYgJiAweDU1NTU1NTU1KSBjIC09IDE7XG4gIHJldHVybiBjO1xufVxuZXhwb3J0cy5jb3VudFRyYWlsaW5nWmVyb3MgPSBjb3VudFRyYWlsaW5nWmVyb3M7XG5cbi8vUm91bmRzIHRvIG5leHQgcG93ZXIgb2YgMlxuZXhwb3J0cy5uZXh0UG93MiA9IGZ1bmN0aW9uKHYpIHtcbiAgdiArPSB2ID09PSAwO1xuICAtLXY7XG4gIHYgfD0gdiA+Pj4gMTtcbiAgdiB8PSB2ID4+PiAyO1xuICB2IHw9IHYgPj4+IDQ7XG4gIHYgfD0gdiA+Pj4gODtcbiAgdiB8PSB2ID4+PiAxNjtcbiAgcmV0dXJuIHYgKyAxO1xufVxuXG4vL1JvdW5kcyBkb3duIHRvIHByZXZpb3VzIHBvd2VyIG9mIDJcbmV4cG9ydHMucHJldlBvdzIgPSBmdW5jdGlvbih2KSB7XG4gIHYgfD0gdiA+Pj4gMTtcbiAgdiB8PSB2ID4+PiAyO1xuICB2IHw9IHYgPj4+IDQ7XG4gIHYgfD0gdiA+Pj4gODtcbiAgdiB8PSB2ID4+PiAxNjtcbiAgcmV0dXJuIHYgLSAodj4+PjEpO1xufVxuXG4vL0NvbXB1dGVzIHBhcml0eSBvZiB3b3JkXG5leHBvcnRzLnBhcml0eSA9IGZ1bmN0aW9uKHYpIHtcbiAgdiBePSB2ID4+PiAxNjtcbiAgdiBePSB2ID4+PiA4O1xuICB2IF49IHYgPj4+IDQ7XG4gIHYgJj0gMHhmO1xuICByZXR1cm4gKDB4Njk5NiA+Pj4gdikgJiAxO1xufVxuXG52YXIgUkVWRVJTRV9UQUJMRSA9IG5ldyBBcnJheSgyNTYpO1xuXG4oZnVuY3Rpb24odGFiKSB7XG4gIGZvcih2YXIgaT0wOyBpPDI1NjsgKytpKSB7XG4gICAgdmFyIHYgPSBpLCByID0gaSwgcyA9IDc7XG4gICAgZm9yICh2ID4+Pj0gMTsgdjsgdiA+Pj49IDEpIHtcbiAgICAgIHIgPDw9IDE7XG4gICAgICByIHw9IHYgJiAxO1xuICAgICAgLS1zO1xuICAgIH1cbiAgICB0YWJbaV0gPSAociA8PCBzKSAmIDB4ZmY7XG4gIH1cbn0pKFJFVkVSU0VfVEFCTEUpO1xuXG4vL1JldmVyc2UgYml0cyBpbiBhIDMyIGJpdCB3b3JkXG5leHBvcnRzLnJldmVyc2UgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiAgKFJFVkVSU0VfVEFCTEVbIHYgICAgICAgICAmIDB4ZmZdIDw8IDI0KSB8XG4gICAgICAgICAgKFJFVkVSU0VfVEFCTEVbKHYgPj4+IDgpICAmIDB4ZmZdIDw8IDE2KSB8XG4gICAgICAgICAgKFJFVkVSU0VfVEFCTEVbKHYgPj4+IDE2KSAmIDB4ZmZdIDw8IDgpICB8XG4gICAgICAgICAgIFJFVkVSU0VfVEFCTEVbKHYgPj4+IDI0KSAmIDB4ZmZdO1xufVxuXG4vL0ludGVybGVhdmUgYml0cyBvZiAyIGNvb3JkaW5hdGVzIHdpdGggMTYgYml0cy4gIFVzZWZ1bCBmb3IgZmFzdCBxdWFkdHJlZSBjb2Rlc1xuZXhwb3J0cy5pbnRlcmxlYXZlMiA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgeCAmPSAweEZGRkY7XG4gIHggPSAoeCB8ICh4IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gIHggPSAoeCB8ICh4IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gIHggPSAoeCB8ICh4IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgeSAmPSAweEZGRkY7XG4gIHkgPSAoeSB8ICh5IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gIHkgPSAoeSB8ICh5IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gIHkgPSAoeSB8ICh5IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgcmV0dXJuIHggfCAoeSA8PCAxKTtcbn1cblxuLy9FeHRyYWN0cyB0aGUgbnRoIGludGVybGVhdmVkIGNvbXBvbmVudFxuZXhwb3J0cy5kZWludGVybGVhdmUyID0gZnVuY3Rpb24odiwgbikge1xuICB2ID0gKHYgPj4+IG4pICYgMHg1NTU1NTU1NTtcbiAgdiA9ICh2IHwgKHYgPj4+IDEpKSAgJiAweDMzMzMzMzMzO1xuICB2ID0gKHYgfCAodiA+Pj4gMikpICAmIDB4MEYwRjBGMEY7XG4gIHYgPSAodiB8ICh2ID4+PiA0KSkgICYgMHgwMEZGMDBGRjtcbiAgdiA9ICh2IHwgKHYgPj4+IDE2KSkgJiAweDAwMEZGRkY7XG4gIHJldHVybiAodiA8PCAxNikgPj4gMTY7XG59XG5cblxuLy9JbnRlcmxlYXZlIGJpdHMgb2YgMyBjb29yZGluYXRlcywgZWFjaCB3aXRoIDEwIGJpdHMuICBVc2VmdWwgZm9yIGZhc3Qgb2N0cmVlIGNvZGVzXG5leHBvcnRzLmludGVybGVhdmUzID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICB4ICY9IDB4M0ZGO1xuICB4ICA9ICh4IHwgKHg8PDE2KSkgJiA0Mjc4MTkwMzM1O1xuICB4ICA9ICh4IHwgKHg8PDgpKSAgJiAyNTE3MTk2OTU7XG4gIHggID0gKHggfCAoeDw8NCkpICAmIDMyNzIzNTYwMzU7XG4gIHggID0gKHggfCAoeDw8MikpICAmIDEyMjcxMzM1MTM7XG5cbiAgeSAmPSAweDNGRjtcbiAgeSAgPSAoeSB8ICh5PDwxNikpICYgNDI3ODE5MDMzNTtcbiAgeSAgPSAoeSB8ICh5PDw4KSkgICYgMjUxNzE5Njk1O1xuICB5ICA9ICh5IHwgKHk8PDQpKSAgJiAzMjcyMzU2MDM1O1xuICB5ICA9ICh5IHwgKHk8PDIpKSAgJiAxMjI3MTMzNTEzO1xuICB4IHw9ICh5IDw8IDEpO1xuICBcbiAgeiAmPSAweDNGRjtcbiAgeiAgPSAoeiB8ICh6PDwxNikpICYgNDI3ODE5MDMzNTtcbiAgeiAgPSAoeiB8ICh6PDw4KSkgICYgMjUxNzE5Njk1O1xuICB6ICA9ICh6IHwgKHo8PDQpKSAgJiAzMjcyMzU2MDM1O1xuICB6ICA9ICh6IHwgKHo8PDIpKSAgJiAxMjI3MTMzNTEzO1xuICBcbiAgcmV0dXJuIHggfCAoeiA8PCAyKTtcbn1cblxuLy9FeHRyYWN0cyBudGggaW50ZXJsZWF2ZWQgY29tcG9uZW50IG9mIGEgMy10dXBsZVxuZXhwb3J0cy5kZWludGVybGVhdmUzID0gZnVuY3Rpb24odiwgbikge1xuICB2ID0gKHYgPj4+IG4pICAgICAgICYgMTIyNzEzMzUxMztcbiAgdiA9ICh2IHwgKHY+Pj4yKSkgICAmIDMyNzIzNTYwMzU7XG4gIHYgPSAodiB8ICh2Pj4+NCkpICAgJiAyNTE3MTk2OTU7XG4gIHYgPSAodiB8ICh2Pj4+OCkpICAgJiA0Mjc4MTkwMzM1O1xuICB2ID0gKHYgfCAodj4+PjE2KSkgICYgMHgzRkY7XG4gIHJldHVybiAodjw8MjIpPj4yMjtcbn1cblxuLy9Db21wdXRlcyBuZXh0IGNvbWJpbmF0aW9uIGluIGNvbGV4aWNvZ3JhcGhpYyBvcmRlciAodGhpcyBpcyBtaXN0YWtlbmx5IGNhbGxlZCBuZXh0UGVybXV0YXRpb24gb24gdGhlIGJpdCB0d2lkZGxpbmcgaGFja3MgcGFnZSlcbmV4cG9ydHMubmV4dENvbWJpbmF0aW9uID0gZnVuY3Rpb24odikge1xuICB2YXIgdCA9IHYgfCAodiAtIDEpO1xuICByZXR1cm4gKHQgKyAxKSB8ICgoKH50ICYgLX50KSAtIDEpID4+PiAoY291bnRUcmFpbGluZ1plcm9zKHYpICsgMSkpO1xufVxuXG4iLCJcInVzZSBzdHJpY3RcIlxuXG52YXIgYml0cyA9IHJlcXVpcmUoXCJiaXQtdHdpZGRsZVwiKVxuXG5mdW5jdGlvbiByb290SW5vcmRlcihuKSB7XG4gIHZhciBwdHJlZSA9IChiaXRzLm5leHRQb3cyKG4rMSk+Pj4xKSAtIDFcbiAgdmFyIGYgICAgID0gbiAtIHB0cmVlXG4gIGlmKGJpdHMubmV4dFBvdzIoZiktMSA+PSBwdHJlZSkge1xuICAgIHJldHVybiBwdHJlZVxuICB9XG4gIHJldHVybiAocHRyZWU+Pj4xKStmXG59XG5leHBvcnRzLnJvb3QgPSByb290SW5vcmRlclxuXG5mdW5jdGlvbiBiZWdpbklub3JkZXIobikge1xuICByZXR1cm4gMFxufVxuZXhwb3J0cy5iZWdpbiA9IGJlZ2luSW5vcmRlclxuXG5mdW5jdGlvbiBlbmRJbm9yZGVyKG4pIHtcbiAgcmV0dXJuIG4tMVxufVxuZXhwb3J0cy5lbmQgPSBlbmRJbm9yZGVyXG5cblxuLy9UaGlzIGlzIHJlYWxseSBob3JyaWJsZSBiZWNhdXNlIG4gaXMgbm90IG5lY2Vzc2FyaWx5IGEgcG93ZXIgb2YgMlxuLy8gSWYgaXQgd2FzLCB3ZSBjb3VsZCBqdXN0IGRvOlxuLy9cbi8vICAgIGhlaWdodCA9IGJpdHMuY291bnRUcmFpbGluZ1plcm9zKH54KVxuLy9cbi8vIEluc3RlYWQsIHdlIGp1c3QgYmluYXJ5IHNlYXJjaCBiZWNhdXNlIGRvaW5nIHRoZSByaWdodCB0aGluZyBoZXJlIGlzIHdheSB0b28gY29tcGxpY2F0ZWQuXG5mdW5jdGlvbiBoZWlnaHRJbm9yZGVyKG4sIHgpIHtcbiAgaWYobiA8PSAwKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICB2YXIgciA9IHJvb3RJbm9yZGVyKG4pXG4gIGlmKHggPiByKSB7XG4gICAgcmV0dXJuIGhlaWdodElub3JkZXIobi1yLTEsIHgtci0xKVxuICB9IGVsc2UgaWYoeCA9PT0gcikge1xuICAgIHJldHVybiBiaXRzLmxvZzIobilcbiAgfVxuICByZXR1cm4gaGVpZ2h0SW5vcmRlcihyLCB4KVxufVxuZXhwb3J0cy5oZWlnaHQgPSBoZWlnaHRJbm9yZGVyXG5cbmZ1bmN0aW9uIHByZXZJbm9yZGVyKG4sIHgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KHgtMSwwKVxufVxuZXhwb3J0cy5wcmV2ID0gcHJldklub3JkZXJcblxuZnVuY3Rpb24gbmV4dElub3JkZXIobiwgeCkge1xuICByZXR1cm4gTWF0aC5taW4oeCsxLG4tMSlcbn1cbmV4cG9ydHMubmV4dCA9IG5leHRJbm9yZGVyXG5cblxuLy9UaGUgdmVyc2lvbiBmb3IgbiA9ICgxPDxrKS0xOlxuLy9cbi8vICBwYXJlbnQgPSAoeCAmIH4oMTw8KGgrMSkpKSArICgxPDxoKVxuLy9cbmZ1bmN0aW9uIHBhcmVudElub3JkZXIobiwgeCkge1xuICBpZihuIDw9IDApIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICB2YXIgciA9IHJvb3RJbm9yZGVyKG4pXG4gIGlmKHggPiByKSB7XG4gICAgdmFyIHEgPSBwYXJlbnRJbm9yZGVyKG4tci0xLCB4LXItMSlcbiAgICBpZihxIDwgMCkge1xuICAgICAgcmV0dXJuIHJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHEgKyByICsgMVxuICAgIH1cbiAgfSBlbHNlIGlmKHggPT09IHIpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICB2YXIgcSA9ICBwYXJlbnRJbm9yZGVyKHIsIHgpXG4gIGlmKHEgPCAwKSB7XG4gICAgcmV0dXJuIHJcbiAgfVxuICByZXR1cm4gcVxufVxuZXhwb3J0cy5wYXJlbnQgPSBwYXJlbnRJbm9yZGVyXG5cblxuLy9BZ2Fpbiwgd2UgZ2V0IHNjcmV3ZWQgYmVjYXVzZSBuIGlzIG5vdCBhIHBvd2VyIG9mIHR3byAtMS4gIElmIGl0IHdhcywgd2UgY291bGQgZG86XG4vL1xuLy8gICAgbGVmdCA9IHggLSAoMSA8PCAoaC0xKSApXG4vL1xuLy8gV2hlcmUgaCBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBub2RlXG4vL1xuZnVuY3Rpb24gbGVmdElub3JkZXIobiwgeCkge1xuICBpZihuIDw9IDApIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIHZhciByID0gcm9vdElub3JkZXIobilcbiAgaWYoeCA+IHIpIHtcbiAgICByZXR1cm4gbGVmdElub3JkZXIobi1yLTEsIHgtci0xKSArIHIgKyAxXG4gIH0gZWxzZSBpZih4ID09PSByKSB7XG4gICAgcmV0dXJuIHJvb3RJbm9yZGVyKHgpXG4gIH1cbiAgcmV0dXJuIGxlZnRJbm9yZGVyKHIsIHgpXG5cbn1cbmV4cG9ydHMubGVmdCA9IGxlZnRJbm9yZGVyXG5cbi8vZm9yIHBvd2VyIG9mIHR3byBtaW51cyBvbmU6XG4vL1xuLy8gICAgcmlnaHQgPSB4ICsgKDE8PChoLTEpKVxuLy9cbmZ1bmN0aW9uIHJpZ2h0SW5vcmRlcihuLCB4KSB7XG4gIGlmKG4gPD0gMCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgdmFyIHIgPSByb290SW5vcmRlcihuKVxuICBpZih4ID4gcikge1xuICAgIHJldHVybiByaWdodElub3JkZXIobi1yLTEsIHgtci0xKSArIHIgKyAxXG4gIH0gZWxzZSBpZih4ID09PSByKSB7XG4gICAgcmV0dXJuIHJvb3RJbm9yZGVyKG4tci0xKSArIHIgKyAxXG4gIH1cbiAgcmV0dXJuIHJpZ2h0SW5vcmRlcihyLCB4KVxufVxuZXhwb3J0cy5yaWdodCA9IHJpZ2h0SW5vcmRlclxuXG5cbmZ1bmN0aW9uIGxlYWZJbm9yZGVyKG4sIHgpIHtcbiAgcmV0dXJuIGhlaWdodElub3JkZXIobiwgeCkgPT09IDBcbn1cbmV4cG9ydHMubGVhZiA9IGxlYWZJbm9yZGVyXG5cblxuZnVuY3Rpb24gbG9Jbm9yZGVyKG4sIHgpIHtcbiAgbiB8PSAwXG4gIHggfD0gMFxuICB2YXIgbCA9IDBcbiAgd2hpbGUobiA+IDEpIHtcbiAgICB2YXIgciA9IHJvb3RJbm9yZGVyKG4pXG4gICAgaWYoeCA+IHIpIHtcbiAgICAgIGwgKz0gciArIDFcbiAgICAgIG4gLT0gciArIDFcbiAgICAgIHggLT0gciArIDFcbiAgICB9IGVsc2UgaWYoeCA9PT0gcikge1xuICAgICAgYnJlYWtcbiAgICB9IGVsc2Uge1xuICAgICAgbiA9IHJcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxcbn1cbmV4cG9ydHMubG8gPSBsb0lub3JkZXJcblxuZnVuY3Rpb24gaGlJbm9yZGVyKG4sIHgpIHtcbiAgbiB8PSAwXG4gIHggfD0gMFxuICB2YXIgbCA9IDBcbiAgd2hpbGUobiA+IDEpIHtcbiAgICB2YXIgciA9IHJvb3RJbm9yZGVyKG4pXG4gICAgaWYoeCA+IHIpIHtcbiAgICAgIGwgKz0gciArIDFcbiAgICAgIG4gLT0gciArIDFcbiAgICAgIHggLT0gciArIDFcbiAgICB9IGVsc2UgaWYoeCA9PT0gcikge1xuICAgICAgbCArPSBuLTFcbiAgICAgIGJyZWFrXG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSByXG4gICAgfVxuICB9XG4gIHJldHVybiBsXG59XG5leHBvcnRzLmhpID0gaGlJbm9yZGVyXG4iLCJcInVzZSBzdHJpY3RcIlxuXG52YXIgY29tcGlsZSA9IHJlcXVpcmUoXCJjd2lzZS1jb21waWxlclwiKVxuXG52YXIgRW1wdHlQcm9jID0ge1xuICBib2R5OiBcIlwiLFxuICBhcmdzOiBbXSxcbiAgdGhpc1ZhcnM6IFtdLFxuICBsb2NhbFZhcnM6IFtdXG59XG5cbmZ1bmN0aW9uIGZpeHVwKHgpIHtcbiAgaWYoIXgpIHtcbiAgICByZXR1cm4gRW1wdHlQcm9jXG4gIH1cbiAgZm9yKHZhciBpPTA7IGk8eC5hcmdzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGEgPSB4LmFyZ3NbaV1cbiAgICBpZihpID09PSAwKSB7XG4gICAgICB4LmFyZ3NbaV0gPSB7bmFtZTogYSwgbHZhbHVlOnRydWUsIHJ2YWx1ZTogISF4LnJ2YWx1ZSwgY291bnQ6eC5jb3VudHx8MSB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHguYXJnc1tpXSA9IHtuYW1lOiBhLCBsdmFsdWU6ZmFsc2UsIHJ2YWx1ZTp0cnVlLCBjb3VudDogMX1cbiAgICB9XG4gIH1cbiAgaWYoIXgudGhpc1ZhcnMpIHtcbiAgICB4LnRoaXNWYXJzID0gW11cbiAgfVxuICBpZigheC5sb2NhbFZhcnMpIHtcbiAgICB4LmxvY2FsVmFycyA9IFtdXG4gIH1cbiAgcmV0dXJuIHhcbn1cblxuZnVuY3Rpb24gcGNvbXBpbGUodXNlcl9hcmdzKSB7XG4gIHJldHVybiBjb21waWxlKHtcbiAgICBhcmdzOiAgICAgdXNlcl9hcmdzLmFyZ3MsXG4gICAgcHJlOiAgICAgIGZpeHVwKHVzZXJfYXJncy5wcmUpLFxuICAgIGJvZHk6ICAgICBmaXh1cCh1c2VyX2FyZ3MuYm9keSksXG4gICAgcG9zdDogICAgIGZpeHVwKHVzZXJfYXJncy5wcm9jKSxcbiAgICBmdW5jTmFtZTogdXNlcl9hcmdzLmZ1bmNOYW1lXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG1ha2VPcCh1c2VyX2FyZ3MpIHtcbiAgdmFyIGFyZ3MgPSBbXVxuICBmb3IodmFyIGk9MDsgaTx1c2VyX2FyZ3MuYXJncy5sZW5ndGg7ICsraSkge1xuICAgIGFyZ3MucHVzaChcImFcIitpKVxuICB9XG4gIHZhciB3cmFwcGVyID0gbmV3IEZ1bmN0aW9uKFwiUFwiLCBbXG4gICAgXCJyZXR1cm4gZnVuY3Rpb24gXCIsIHVzZXJfYXJncy5mdW5jTmFtZSwgXCJfbmRhcnJheW9wcyhcIiwgYXJncy5qb2luKFwiLFwiKSwgXCIpIHtQKFwiLCBhcmdzLmpvaW4oXCIsXCIpLCBcIik7cmV0dXJuIGEwfVwiXG4gIF0uam9pbihcIlwiKSlcbiAgcmV0dXJuIHdyYXBwZXIocGNvbXBpbGUodXNlcl9hcmdzKSlcbn1cblxudmFyIGFzc2lnbl9vcHMgPSB7XG4gIGFkZDogIFwiK1wiLFxuICBzdWI6ICBcIi1cIixcbiAgbXVsOiAgXCIqXCIsXG4gIGRpdjogIFwiL1wiLFxuICBtb2Q6ICBcIiVcIixcbiAgYmFuZDogXCImXCIsXG4gIGJvcjogIFwifFwiLFxuICBieG9yOiBcIl5cIixcbiAgbHNoaWZ0OiBcIjw8XCIsXG4gIHJzaGlmdDogXCI+PlwiLFxuICBycnNoaWZ0OiBcIj4+PlwiXG59XG47KGZ1bmN0aW9uKCl7XG4gIGZvcih2YXIgaWQgaW4gYXNzaWduX29wcykge1xuICAgIHZhciBvcCA9IGFzc2lnbl9vcHNbaWRdXG4gICAgZXhwb3J0c1tpZF0gPSBtYWtlT3Aoe1xuICAgICAgYXJnczogW1wiYXJyYXlcIixcImFycmF5XCIsXCJhcnJheVwiXSxcbiAgICAgIGJvZHk6IHthcmdzOltcImFcIixcImJcIixcImNcIl0sXG4gICAgICAgICAgICAgYm9keTogXCJhPWJcIitvcCtcImNcIn0sXG4gICAgICBmdW5jTmFtZTogaWRcbiAgICB9KVxuICAgIGV4cG9ydHNbaWQrXCJlcVwiXSA9IG1ha2VPcCh7XG4gICAgICBhcmdzOiBbXCJhcnJheVwiLFwiYXJyYXlcIl0sXG4gICAgICBib2R5OiB7YXJnczpbXCJhXCIsXCJiXCJdLFxuICAgICAgICAgICAgIGJvZHk6XCJhXCIrb3ArXCI9YlwifSxcbiAgICAgIHJ2YWx1ZTogdHJ1ZSxcbiAgICAgIGZ1bmNOYW1lOiBpZCtcImVxXCJcbiAgICB9KVxuICAgIGV4cG9ydHNbaWQrXCJzXCJdID0gbWFrZU9wKHtcbiAgICAgIGFyZ3M6IFtcImFycmF5XCIsIFwiYXJyYXlcIiwgXCJzY2FsYXJcIl0sXG4gICAgICBib2R5OiB7YXJnczpbXCJhXCIsXCJiXCIsXCJzXCJdLFxuICAgICAgICAgICAgIGJvZHk6XCJhPWJcIitvcCtcInNcIn0sXG4gICAgICBmdW5jTmFtZTogaWQrXCJzXCJcbiAgICB9KVxuICAgIGV4cG9ydHNbaWQrXCJzZXFcIl0gPSBtYWtlT3Aoe1xuICAgICAgYXJnczogW1wiYXJyYXlcIixcInNjYWxhclwiXSxcbiAgICAgIGJvZHk6IHthcmdzOltcImFcIixcInNcIl0sXG4gICAgICAgICAgICAgYm9keTpcImFcIitvcCtcIj1zXCJ9LFxuICAgICAgcnZhbHVlOiB0cnVlLFxuICAgICAgZnVuY05hbWU6IGlkK1wic2VxXCJcbiAgICB9KVxuICB9XG59KSgpO1xuXG52YXIgdW5hcnlfb3BzID0ge1xuICBub3Q6IFwiIVwiLFxuICBibm90OiBcIn5cIixcbiAgbmVnOiBcIi1cIixcbiAgcmVjaXA6IFwiMS4wL1wiXG59XG47KGZ1bmN0aW9uKCl7XG4gIGZvcih2YXIgaWQgaW4gdW5hcnlfb3BzKSB7XG4gICAgdmFyIG9wID0gdW5hcnlfb3BzW2lkXVxuICAgIGV4cG9ydHNbaWRdID0gbWFrZU9wKHtcbiAgICAgIGFyZ3M6IFtcImFycmF5XCIsIFwiYXJyYXlcIl0sXG4gICAgICBib2R5OiB7YXJnczpbXCJhXCIsXCJiXCJdLFxuICAgICAgICAgICAgIGJvZHk6XCJhPVwiK29wK1wiYlwifSxcbiAgICAgIGZ1bmNOYW1lOiBpZFxuICAgIH0pXG4gICAgZXhwb3J0c1tpZCtcImVxXCJdID0gbWFrZU9wKHtcbiAgICAgIGFyZ3M6IFtcImFycmF5XCJdLFxuICAgICAgYm9keToge2FyZ3M6W1wiYVwiXSxcbiAgICAgICAgICAgICBib2R5OlwiYT1cIitvcCtcImFcIn0sXG4gICAgICBydmFsdWU6IHRydWUsXG4gICAgICBjb3VudDogMixcbiAgICAgIGZ1bmNOYW1lOiBpZCtcImVxXCJcbiAgICB9KVxuICB9XG59KSgpO1xuXG52YXIgYmluYXJ5X29wcyA9IHtcbiAgYW5kOiBcIiYmXCIsXG4gIG9yOiBcInx8XCIsXG4gIGVxOiBcIj09PVwiLFxuICBuZXE6IFwiIT09XCIsXG4gIGx0OiBcIjxcIixcbiAgZ3Q6IFwiPlwiLFxuICBsZXE6IFwiPD1cIixcbiAgZ2VxOiBcIj49XCJcbn1cbjsoZnVuY3Rpb24oKSB7XG4gIGZvcih2YXIgaWQgaW4gYmluYXJ5X29wcykge1xuICAgIHZhciBvcCA9IGJpbmFyeV9vcHNbaWRdXG4gICAgZXhwb3J0c1tpZF0gPSBtYWtlT3Aoe1xuICAgICAgYXJnczogW1wiYXJyYXlcIixcImFycmF5XCIsXCJhcnJheVwiXSxcbiAgICAgIGJvZHk6IHthcmdzOltcImFcIiwgXCJiXCIsIFwiY1wiXSxcbiAgICAgICAgICAgICBib2R5OlwiYT1iXCIrb3ArXCJjXCJ9LFxuICAgICAgZnVuY05hbWU6IGlkXG4gICAgfSlcbiAgICBleHBvcnRzW2lkK1wic1wiXSA9IG1ha2VPcCh7XG4gICAgICBhcmdzOiBbXCJhcnJheVwiLFwiYXJyYXlcIixcInNjYWxhclwiXSxcbiAgICAgIGJvZHk6IHthcmdzOltcImFcIiwgXCJiXCIsIFwic1wiXSxcbiAgICAgICAgICAgICBib2R5OlwiYT1iXCIrb3ArXCJzXCJ9LFxuICAgICAgZnVuY05hbWU6IGlkK1wic1wiXG4gICAgfSlcbiAgICBleHBvcnRzW2lkK1wiZXFcIl0gPSBtYWtlT3Aoe1xuICAgICAgYXJnczogW1wiYXJyYXlcIiwgXCJhcnJheVwiXSxcbiAgICAgIGJvZHk6IHthcmdzOltcImFcIiwgXCJiXCJdLFxuICAgICAgICAgICAgIGJvZHk6XCJhPWFcIitvcCtcImJcIn0sXG4gICAgICBydmFsdWU6dHJ1ZSxcbiAgICAgIGNvdW50OjIsXG4gICAgICBmdW5jTmFtZTogaWQrXCJlcVwiXG4gICAgfSlcbiAgICBleHBvcnRzW2lkK1wic2VxXCJdID0gbWFrZU9wKHtcbiAgICAgIGFyZ3M6IFtcImFycmF5XCIsIFwic2NhbGFyXCJdLFxuICAgICAgYm9keToge2FyZ3M6W1wiYVwiLFwic1wiXSxcbiAgICAgICAgICAgICBib2R5OlwiYT1hXCIrb3ArXCJzXCJ9LFxuICAgICAgcnZhbHVlOnRydWUsXG4gICAgICBjb3VudDoyLFxuICAgICAgZnVuY05hbWU6IGlkK1wic2VxXCJcbiAgICB9KVxuICB9XG59KSgpO1xuXG52YXIgbWF0aF91bmFyeSA9IFtcbiAgXCJhYnNcIixcbiAgXCJhY29zXCIsXG4gIFwiYXNpblwiLFxuICBcImF0YW5cIixcbiAgXCJjZWlsXCIsXG4gIFwiY29zXCIsXG4gIFwiZXhwXCIsXG4gIFwiZmxvb3JcIixcbiAgXCJsb2dcIixcbiAgXCJyb3VuZFwiLFxuICBcInNpblwiLFxuICBcInNxcnRcIixcbiAgXCJ0YW5cIlxuXVxuOyhmdW5jdGlvbigpIHtcbiAgZm9yKHZhciBpPTA7IGk8bWF0aF91bmFyeS5sZW5ndGg7ICsraSkge1xuICAgIHZhciBmID0gbWF0aF91bmFyeVtpXVxuICAgIGV4cG9ydHNbZl0gPSBtYWtlT3Aoe1xuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXCJhcnJheVwiLCBcImFycmF5XCJdLFxuICAgICAgICAgICAgICAgICAgICBwcmU6IHthcmdzOltdLCBib2R5OlwidGhpc19mPU1hdGguXCIrZiwgdGhpc1ZhcnM6W1widGhpc19mXCJdfSxcbiAgICAgICAgICAgICAgICAgICAgYm9keToge2FyZ3M6W1wiYVwiLFwiYlwiXSwgYm9keTpcImE9dGhpc19mKGIpXCIsIHRoaXNWYXJzOltcInRoaXNfZlwiXX0sXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNOYW1lOiBmXG4gICAgICAgICAgICAgICAgICB9KVxuICAgIGV4cG9ydHNbZitcImVxXCJdID0gbWFrZU9wKHtcbiAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXCJhcnJheVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICBwcmU6IHthcmdzOltdLCBib2R5OlwidGhpc19mPU1hdGguXCIrZiwgdGhpc1ZhcnM6W1widGhpc19mXCJdfSxcbiAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7YXJnczogW1wiYVwiXSwgYm9keTpcImE9dGhpc19mKGEpXCIsIHRoaXNWYXJzOltcInRoaXNfZlwiXX0sXG4gICAgICAgICAgICAgICAgICAgICAgcnZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiAyLFxuICAgICAgICAgICAgICAgICAgICAgIGZ1bmNOYW1lOiBmK1wiZXFcIlxuICAgICAgICAgICAgICAgICAgICB9KVxuICB9XG59KSgpO1xuXG52YXIgbWF0aF9jb21tID0gW1xuICBcIm1heFwiLFxuICBcIm1pblwiLFxuICBcImF0YW4yXCIsXG4gIFwicG93XCJcbl1cbjsoZnVuY3Rpb24oKXtcbiAgZm9yKHZhciBpPTA7IGk8bWF0aF9jb21tLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGY9IG1hdGhfY29tbVtpXVxuICAgIGV4cG9ydHNbZl0gPSBtYWtlT3Aoe1xuICAgICAgICAgICAgICAgICAgYXJnczpbXCJhcnJheVwiLCBcImFycmF5XCIsIFwiYXJyYXlcIl0sXG4gICAgICAgICAgICAgICAgICBwcmU6IHthcmdzOltdLCBib2R5OlwidGhpc19mPU1hdGguXCIrZiwgdGhpc1ZhcnM6W1widGhpc19mXCJdfSxcbiAgICAgICAgICAgICAgICAgIGJvZHk6IHthcmdzOltcImFcIixcImJcIixcImNcIl0sIGJvZHk6XCJhPXRoaXNfZihiLGMpXCIsIHRoaXNWYXJzOltcInRoaXNfZlwiXX0sXG4gICAgICAgICAgICAgICAgICBmdW5jTmFtZTogZlxuICAgICAgICAgICAgICAgIH0pXG4gICAgZXhwb3J0c1tmK1wic1wiXSA9IG1ha2VPcCh7XG4gICAgICAgICAgICAgICAgICBhcmdzOltcImFycmF5XCIsIFwiYXJyYXlcIiwgXCJzY2FsYXJcIl0sXG4gICAgICAgICAgICAgICAgICBwcmU6IHthcmdzOltdLCBib2R5OlwidGhpc19mPU1hdGguXCIrZiwgdGhpc1ZhcnM6W1widGhpc19mXCJdfSxcbiAgICAgICAgICAgICAgICAgIGJvZHk6IHthcmdzOltcImFcIixcImJcIixcImNcIl0sIGJvZHk6XCJhPXRoaXNfZihiLGMpXCIsIHRoaXNWYXJzOltcInRoaXNfZlwiXX0sXG4gICAgICAgICAgICAgICAgICBmdW5jTmFtZTogZitcInNcIlxuICAgICAgICAgICAgICAgICAgfSlcbiAgICBleHBvcnRzW2YrXCJlcVwiXSA9IG1ha2VPcCh7IGFyZ3M6W1wiYXJyYXlcIiwgXCJhcnJheVwiXSxcbiAgICAgICAgICAgICAgICAgIHByZToge2FyZ3M6W10sIGJvZHk6XCJ0aGlzX2Y9TWF0aC5cIitmLCB0aGlzVmFyczpbXCJ0aGlzX2ZcIl19LFxuICAgICAgICAgICAgICAgICAgYm9keToge2FyZ3M6W1wiYVwiLFwiYlwiXSwgYm9keTpcImE9dGhpc19mKGEsYilcIiwgdGhpc1ZhcnM6W1widGhpc19mXCJdfSxcbiAgICAgICAgICAgICAgICAgIHJ2YWx1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGNvdW50OiAyLFxuICAgICAgICAgICAgICAgICAgZnVuY05hbWU6IGYrXCJlcVwiXG4gICAgICAgICAgICAgICAgICB9KVxuICAgIGV4cG9ydHNbZitcInNlcVwiXSA9IG1ha2VPcCh7IGFyZ3M6W1wiYXJyYXlcIiwgXCJzY2FsYXJcIl0sXG4gICAgICAgICAgICAgICAgICBwcmU6IHthcmdzOltdLCBib2R5OlwidGhpc19mPU1hdGguXCIrZiwgdGhpc1ZhcnM6W1widGhpc19mXCJdfSxcbiAgICAgICAgICAgICAgICAgIGJvZHk6IHthcmdzOltcImFcIixcImJcIl0sIGJvZHk6XCJhPXRoaXNfZihhLGIpXCIsIHRoaXNWYXJzOltcInRoaXNfZlwiXX0sXG4gICAgICAgICAgICAgICAgICBydmFsdWU6dHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGNvdW50OjIsXG4gICAgICAgICAgICAgICAgICBmdW5jTmFtZTogZitcInNlcVwiXG4gICAgICAgICAgICAgICAgICB9KVxuICB9XG59KSgpO1xuXG52YXIgbWF0aF9ub25jb21tID0gW1xuICBcImF0YW4yXCIsXG4gIFwicG93XCJcbl1cbjsoZnVuY3Rpb24oKXtcbiAgZm9yKHZhciBpPTA7IGk8bWF0aF9ub25jb21tLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGY9IG1hdGhfbm9uY29tbVtpXVxuICAgIGV4cG9ydHNbZitcIm9wXCJdID0gbWFrZU9wKHtcbiAgICAgICAgICAgICAgICAgIGFyZ3M6W1wiYXJyYXlcIiwgXCJhcnJheVwiLCBcImFycmF5XCJdLFxuICAgICAgICAgICAgICAgICAgcHJlOiB7YXJnczpbXSwgYm9keTpcInRoaXNfZj1NYXRoLlwiK2YsIHRoaXNWYXJzOltcInRoaXNfZlwiXX0sXG4gICAgICAgICAgICAgICAgICBib2R5OiB7YXJnczpbXCJhXCIsXCJiXCIsXCJjXCJdLCBib2R5OlwiYT10aGlzX2YoYyxiKVwiLCB0aGlzVmFyczpbXCJ0aGlzX2ZcIl19LFxuICAgICAgICAgICAgICAgICAgZnVuY05hbWU6IGYrXCJvcFwiXG4gICAgICAgICAgICAgICAgfSlcbiAgICBleHBvcnRzW2YrXCJvcHNcIl0gPSBtYWtlT3Aoe1xuICAgICAgICAgICAgICAgICAgYXJnczpbXCJhcnJheVwiLCBcImFycmF5XCIsIFwic2NhbGFyXCJdLFxuICAgICAgICAgICAgICAgICAgcHJlOiB7YXJnczpbXSwgYm9keTpcInRoaXNfZj1NYXRoLlwiK2YsIHRoaXNWYXJzOltcInRoaXNfZlwiXX0sXG4gICAgICAgICAgICAgICAgICBib2R5OiB7YXJnczpbXCJhXCIsXCJiXCIsXCJjXCJdLCBib2R5OlwiYT10aGlzX2YoYyxiKVwiLCB0aGlzVmFyczpbXCJ0aGlzX2ZcIl19LFxuICAgICAgICAgICAgICAgICAgZnVuY05hbWU6IGYrXCJvcHNcIlxuICAgICAgICAgICAgICAgICAgfSlcbiAgICBleHBvcnRzW2YrXCJvcGVxXCJdID0gbWFrZU9wKHsgYXJnczpbXCJhcnJheVwiLCBcImFycmF5XCJdLFxuICAgICAgICAgICAgICAgICAgcHJlOiB7YXJnczpbXSwgYm9keTpcInRoaXNfZj1NYXRoLlwiK2YsIHRoaXNWYXJzOltcInRoaXNfZlwiXX0sXG4gICAgICAgICAgICAgICAgICBib2R5OiB7YXJnczpbXCJhXCIsXCJiXCJdLCBib2R5OlwiYT10aGlzX2YoYixhKVwiLCB0aGlzVmFyczpbXCJ0aGlzX2ZcIl19LFxuICAgICAgICAgICAgICAgICAgcnZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgY291bnQ6IDIsXG4gICAgICAgICAgICAgICAgICBmdW5jTmFtZTogZitcIm9wZXFcIlxuICAgICAgICAgICAgICAgICAgfSlcbiAgICBleHBvcnRzW2YrXCJvcHNlcVwiXSA9IG1ha2VPcCh7IGFyZ3M6W1wiYXJyYXlcIiwgXCJzY2FsYXJcIl0sXG4gICAgICAgICAgICAgICAgICBwcmU6IHthcmdzOltdLCBib2R5OlwidGhpc19mPU1hdGguXCIrZiwg
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment