From 97931bad2230b8c805a3376c954fc2205ecf8e02 Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Thu, 14 May 2020 17:34:00 +0100 Subject: [PATCH] C++ify imagequant memory management --- codecs/imagequant/imagequant.cpp | 105 +++++++++++++---------------- codecs/imagequant/imagequant.js | 106 +++++++++++++----------------- codecs/imagequant/imagequant.wasm | Bin 58475 -> 57557 bytes 3 files changed, 93 insertions(+), 118 deletions(-) diff --git a/codecs/imagequant/imagequant.cpp b/codecs/imagequant/imagequant.cpp index bed1fd87..2150174c 100644 --- a/codecs/imagequant/imagequant.cpp +++ b/codecs/imagequant/imagequant.cpp @@ -16,37 +16,41 @@ int version() { const val Uint8ClampedArray = val::global("Uint8ClampedArray"); +#define liq_ptr(T) std::unique_ptr> + +using liq_attr_ptr = liq_ptr(liq_attr); +using liq_image_ptr = liq_ptr(liq_image); +using liq_result_ptr = liq_ptr(liq_result); + +liq_result_ptr liq_image_quantize(liq_image* image, liq_attr* attr) { + liq_result* res = nullptr; + liq_image_quantize(image, attr, &res); + return liq_result_ptr(res); +} + val quantize(std::string rawimage, int image_width, int image_height, int num_colors, float dithering) { - const uint8_t* image_buffer = (uint8_t*)rawimage.c_str(); + auto image_buffer = (const liq_color*)rawimage.c_str(); int size = image_width * image_height; - liq_attr* attr = liq_attr_create(); - liq_image* image = liq_image_create_rgba(attr, image_buffer, image_width, image_height, 0); - liq_set_max_colors(attr, num_colors); - liq_result* res = nullptr; - liq_image_quantize(image, attr, &res); - liq_set_dithering_level(res, dithering); - uint8_t* image8bit = (uint8_t*)malloc(size); - uint8_t* result = (uint8_t*)malloc(size * 4); - liq_write_remapped_image(res, image, image8bit, size); - const liq_palette* pal = liq_get_palette(res); + liq_attr_ptr attr(liq_attr_create()); + liq_image_ptr image( + liq_image_create_rgba(attr.get(), image_buffer, image_width, image_height, 0)); + liq_set_max_colors(attr.get(), num_colors); + auto res = liq_image_quantize(image.get(), attr.get()); + liq_set_dithering_level(res.get(), dithering); + std::vector image8bit(size); + std::vector result(size); + liq_write_remapped_image(res.get(), image.get(), image8bit.data(), image8bit.size()); + auto pal = liq_get_palette(res.get()); // Turn palletted image back into an RGBA image for (int i = 0; i < size; i++) { - result[i * 4 + 0] = pal->entries[image8bit[i]].r; - result[i * 4 + 1] = pal->entries[image8bit[i]].g; - result[i * 4 + 2] = pal->entries[image8bit[i]].b; - result[i * 4 + 3] = pal->entries[image8bit[i]].a; + result[i] = pal->entries[image8bit[i]]; } - free(image8bit); - liq_result_destroy(res); - liq_image_destroy(image); - liq_attr_destroy(attr); - val js_result = Uint8ClampedArray.new_(typed_memory_view(image_width * image_height * 4, result)); - free(result); - return js_result; + return Uint8ClampedArray.new_( + typed_memory_view(result.size() * sizeof(liq_color), (const uint8_t*)result.data())); } const liq_color zx_colors[] = { @@ -73,12 +77,11 @@ const liq_color zx_colors[] = { * and bright. */ val zx_quantize(std::string rawimage, int image_width, int image_height, float dithering) { - const uint8_t* image_buffer = (uint8_t*)rawimage.c_str(); + auto image_buffer = (const liq_color*)rawimage.c_str(); int size = image_width * image_height; - int bytes_per_pixel = 4; - uint8_t block[8 * 8 * bytes_per_pixel]; - uint8_t* result = (uint8_t*)malloc(size * bytes_per_pixel); - uint8_t* image8bit = (uint8_t*)malloc(8 * 8); + liq_color block[8 * 8]; + uint8_t image8bit[8 * 8]; + std::vector result(size); // For each 8x8 grid for (int block_start_y = 0; block_start_y < image_height; block_start_y += 8) { @@ -101,25 +104,22 @@ val zx_quantize(std::string rawimage, int image_width, int image_height, float d // For each pixel in that block: for (int y = block_start_y; y < block_start_y + block_height; y++) { for (int x = block_start_x; x < block_start_x + block_width; x++) { - int pixel_start = (y * image_width * bytes_per_pixel) + (x * bytes_per_pixel); + int pixel_start = (y * image_width) + x; int smallest_distance = INT_MAX; int winning_index = -1; // Copy pixel data for quantizing later block[block_index++] = image_buffer[pixel_start]; - block[block_index++] = image_buffer[pixel_start + 1]; - block[block_index++] = image_buffer[pixel_start + 2]; - block[block_index++] = image_buffer[pixel_start + 3]; // Which zx color is this pixel closest to? for (int color_index = 0; color_index < 15; color_index++) { liq_color color = zx_colors[color_index]; + liq_color pixel = image_buffer[pixel_start]; // Using Euclidean distance. LibQuant has better methods, but it // requires conversion to LAB, so I don't think it's worth it. - int distance = pow(color.r - image_buffer[pixel_start + 0], 2) + - pow(color.g - image_buffer[pixel_start + 1], 2) + - pow(color.b - image_buffer[pixel_start + 2], 2); + int distance = + pow(color.r - pixel.r, 2) + pow(color.g - pixel.g, 2) + pow(color.b - pixel.b, 2); if (distance < smallest_distance) { winning_index = color_index; @@ -183,41 +183,30 @@ val zx_quantize(std::string rawimage, int image_width, int image_height, float d } // Quantize - liq_attr* attr = liq_attr_create(); - liq_image* image = liq_image_create_rgba(attr, block, block_width, block_height, 0); - liq_set_max_colors(attr, 2); - liq_image_add_fixed_color(image, zx_colors[first_color_index]); - liq_image_add_fixed_color(image, zx_colors[second_color_index]); - liq_result* res = nullptr; - liq_image_quantize(image, attr, &res); - liq_set_dithering_level(res, dithering); - liq_write_remapped_image(res, image, image8bit, size); - const liq_palette* pal = liq_get_palette(res); + liq_attr_ptr attr(liq_attr_create()); + liq_image_ptr image(liq_image_create_rgba(attr.get(), block, block_width, block_height, 0)); + liq_set_max_colors(attr.get(), 2); + liq_image_add_fixed_color(image.get(), zx_colors[first_color_index]); + liq_image_add_fixed_color(image.get(), zx_colors[second_color_index]); + auto res = liq_image_quantize(image.get(), attr.get()); + liq_set_dithering_level(res.get(), dithering); + liq_write_remapped_image(res.get(), image.get(), image8bit, size); + auto pal = liq_get_palette(res.get()); // Turn palletted image back into an RGBA image, and write it into the // full size result image. for (int y = 0; y < block_height; y++) { for (int x = 0; x < block_width; x++) { int image8BitPos = y * block_width + x; - int resultStartPos = ((block_start_y + y) * bytes_per_pixel * image_width) + - ((block_start_x + x) * bytes_per_pixel); - result[resultStartPos + 0] = pal->entries[image8bit[image8BitPos]].r; - result[resultStartPos + 1] = pal->entries[image8bit[image8BitPos]].g; - result[resultStartPos + 2] = pal->entries[image8bit[image8BitPos]].b; - result[resultStartPos + 3] = pal->entries[image8bit[image8BitPos]].a; + int resultStartPos = ((block_start_y + y) * image_width) + (block_start_x + x); + result[resultStartPos] = pal->entries[image8bit[image8BitPos]]; } } - - liq_result_destroy(res); - liq_image_destroy(image); - liq_attr_destroy(attr); } } - free(image8bit); - val js_result = Uint8ClampedArray.new_(typed_memory_view(size * 4, result)); - free(result); - return js_result; + return Uint8ClampedArray.new_( + typed_memory_view(result.size() * sizeof(liq_color), (const uint8_t*)result.data())); } EMSCRIPTEN_BINDINGS(my_module) { diff --git a/codecs/imagequant/imagequant.js b/codecs/imagequant/imagequant.js index 9cac4d86..9a675ae2 100644 --- a/codecs/imagequant/imagequant.js +++ b/codecs/imagequant/imagequant.js @@ -6,66 +6,52 @@ var imagequant = (function() { function(imagequant) { imagequant = imagequant || {}; -var e;e||(e=typeof imagequant !== 'undefined' ? imagequant : {});var r={},t;for(t in e)e.hasOwnProperty(t)&&(r[t]=e[t]);var aa=!1,z=!1,ba=!1,ca=!1;aa="object"===typeof window;z="function"===typeof importScripts;ba="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;ca=!aa&&!ba&&!z;var A="",da,B,ea,ha; -if(ba)A=z?require("path").dirname(A)+"/":__dirname+"/",da=function(a,b){ea||(ea=require("fs"));ha||(ha=require("path"));a=ha.normalize(a);return ea.readFileSync(a,b?null:"utf8")},B=function(a){a=da(a,!0);a.buffer||(a=new Uint8Array(a));a.buffer||C("Assertion failed: undefined");return a},1=d);)++c;if(16f?d+=String.fromCharCode(f):(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else d+=String.fromCharCode(f)}return d} -function na(a,b,c){var d=H;if(0=g){var n=a.charCodeAt(++f);g=65536+((g&1023)<<10)|n&1023}if(127>=g){if(b>=c)break;d[b++]=g}else{if(2047>=g){if(b+1>=c)break;d[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;d[b++]=224|g>>12}else{if(b+3>=c)break;d[b++]=240|g>>18;d[b++]=128|g>>12&63}d[b++]=128|g>>6&63}d[b++]=128|g&63}}d[b]=0}}var oa="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; -function pa(a){var b;for(b=a>>1;I[b];)++b;b<<=1;if(32>1];if(0==d)return c;++b;c+=String.fromCharCode(d)}}function qa(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;I[b>>1]=0;return b-d}function ra(a){return 2*a.length} -function sa(a){for(var b=0,c="";;){var d=J[a+4*b>>2];if(0==d)return c;++b;65536<=d?(d-=65536,c+=String.fromCharCode(55296|d>>10,56320|d&1023)):c+=String.fromCharCode(d)}}function ta(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var d=b;c=d+c-4;for(var f=0;f=g){var n=a.charCodeAt(++f);g=65536+((g&1023)<<10)|n&1023}J[b>>2]=g;b+=4;if(b+4>c)break}J[b>>2]=0;return b-d} -function ua(a){for(var b=0,c=0;c=d&&++c;b+=4}return b}var K,va,H,I,wa,J,L,xa,ya;function za(a){K=a;e.HEAP8=va=new Int8Array(a);e.HEAP16=I=new Int16Array(a);e.HEAP32=J=new Int32Array(a);e.HEAPU8=H=new Uint8Array(a);e.HEAPU16=wa=new Uint16Array(a);e.HEAPU32=L=new Uint32Array(a);e.HEAPF32=xa=new Float32Array(a);e.HEAPF64=ya=new Float64Array(a)}var Aa=e.INITIAL_MEMORY||16777216;e.wasmMemory?G=e.wasmMemory:G=new WebAssembly.Memory({initial:Aa/65536}); -G&&(K=G.buffer);Aa=K.byteLength;za(K);J[1548]=5249232;function Ba(a){for(;0=b?"_"+a:a} -function Sa(a,b){a=Ra(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function Ta(a){var b=Error,c=Sa(a,function(d){this.name=a;this.message=d;d=Error(d).stack;void 0!==d&&(this.stack=this.toString()+"\n"+d.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c} -var Ua=void 0;function S(a){throw new Ua(a);}var Va=void 0;function Wa(a){throw new Va(a);}function Xa(a,b,c){function d(h){h=c(h);h.length!==a.length&&Wa("Mismatched type converter count");for(var k=0;k>2])}function rb(a,b,c){if(b===c)return a;if(void 0===c.Z)return null;a=rb(a,b,c.Z);return null===a?null:c.ra(a)}var sb={}; -function tb(a,b){for(void 0===b&&S("ptr should not be undefined");a.Z;)b=a.ha(b),a=a.Z;return sb[b]}function ub(a,b){b.W&&b.U||Wa("makeClassHandle requires ptr and ptrType");!!b.Y!==!!b.X&&Wa("Both smartPtrType and smartPtr must be specified");b.count={value:1};return cb(Object.create(a,{T:{value:b}}))} -function W(a,b,c,d){this.name=a;this.V=b;this.la=c;this.ia=d;this.ja=!1;this.da=this.ya=this.xa=this.oa=this.za=this.wa=void 0;void 0!==b.Z?this.toWireType=mb:(this.toWireType=d?lb:ob,this.aa=null)}function vb(a,b,c){e.hasOwnProperty(a)||Wa("Replacing nonexistant public symbol");void 0!==e[a].$&&void 0!==c?e[a].$[c]=b:(e[a]=b,e[a].pa=c)} -function X(a,b){a=P(a);var c=e["dynCall_"+a];for(var d=[],f=1;f>2])};case 3:return function(c){return this.fromWireType(ya[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function Fb(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var c=Sa(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c} -function Gb(a,b){for(var c=[],d=0;d>2)+d]);return c}function Hb(a,b,c){switch(b){case 0:return c?function(d){return va[d]}:function(d){return H[d]};case 1:return c?function(d){return I[d>>1]}:function(d){return wa[d>>1]};case 2:return c?function(d){return J[d>>2]}:function(d){return L[d>>2]};default:throw new TypeError("Unknown integer type: "+a);}}for(var Ib=[null,[],[]],Jb=Array(256),Kb=0;256>Kb;++Kb)Jb[Kb]=String.fromCharCode(Kb);Pa=Jb;Ua=e.BindingError=Ta("BindingError"); -Va=e.InternalError=Ta("InternalError");U.prototype.isAliasOf=function(a){if(!(this instanceof U&&a instanceof U))return!1;var b=this.T.W.V,c=this.T.U,d=a.T.W.V;for(a=a.T.U;b.Z;)c=b.ha(c),b=b.Z;for(;d.Z;)a=d.ha(a),d=d.Z;return b===d&&c===a};U.prototype.clone=function(){this.T.U||Za(this);if(this.T.ga)return this.T.count.value+=1,this;var a=cb(Object.create(Object.getPrototypeOf(this),{T:{value:Ya(this.T)}}));a.T.count.value+=1;a.T.ea=!1;return a}; -U.prototype["delete"]=function(){this.T.U||Za(this);this.T.ea&&!this.T.ga&&S("Object already scheduled for deletion");ab(this);bb(this.T);this.T.ga||(this.T.X=void 0,this.T.U=void 0)};U.prototype.isDeleted=function(){return!this.T.U};U.prototype.deleteLater=function(){this.T.U||Za(this);this.T.ea&&!this.T.ga&&S("Object already scheduled for deletion");eb.push(this);1===eb.length&&db&&db(fb);this.T.ea=!0;return this};W.prototype.ua=function(a){this.oa&&(a=this.oa(a));return a}; -W.prototype.na=function(a){this.da&&this.da(a)};W.prototype.argPackAdvance=8;W.prototype.readValueFromPointer=pb;W.prototype.deleteObject=function(a){if(null!==a)a["delete"]()}; -W.prototype.fromWireType=function(a){function b(){return this.ja?ub(this.V.ba,{W:this.wa,U:c,Y:this,X:a}):ub(this.V.ba,{W:this,U:a})}var c=this.ua(a);if(!c)return this.na(a),null;var d=tb(this.V,c);if(void 0!==d){if(0===d.T.count.value)return d.T.U=c,d.T.X=a,d.clone();d=d.clone();this.na(a);return d}d=this.V.ta(c);d=gb[d];if(!d)return b.call(this);d=this.ia?d.qa:d.pointerType;var f=rb(c,this.V,d.V);return null===f?b.call(this):this.ja?ub(d.V.ba,{W:d,U:f,Y:this,X:a}):ub(d.V.ba,{W:d,U:f})}; -e.getInheritedInstanceCount=function(){return Object.keys(sb).length};e.getLiveInheritedInstances=function(){var a=[],b;for(b in sb)sb.hasOwnProperty(b)&&a.push(sb[b]);return a};e.flushPendingDeletes=fb;e.setDelayFunction=function(a){db=a;eb.length&&db&&db(fb)};wb=e.UnboundTypeError=Ta("UnboundTypeError");e.count_emval_handles=function(){for(var a=0,b=5;b>g])},aa:null})},p:function(a,b,c,d,f,g,n,h,k,l,m,q,v){m=P(m);g=X(f,g);h&&(h=X(n, -h));l&&(l=X(k,l));v=X(q,v);var u=Ra(m);ib(u,function(){zb("Cannot construct "+m+" due to unbound types",[d])});Xa([a,b,c],d?[d]:[],function(p){p=p[0];if(d){var w=p.V;var x=w.ba}else x=U.prototype;p=Sa(u,function(){if(Object.getPrototypeOf(this)!==y)throw new Ua("Use 'new' to construct "+m);if(void 0===D.fa)throw new Ua(m+" has no accessible constructor");var qb=D.fa[arguments.length];if(void 0===qb)throw new Ua("Tried to invoke ctor of "+m+" with invalid number of parameters ("+arguments.length+") - expected ("+ -Object.keys(D.fa).toString()+") parameters instead!");return qb.apply(this,arguments)});var y=Object.create(x,{constructor:{value:p}});p.prototype=y;var D=new jb(m,p,y,v,w,g,h,l);w=new W(m,D,!0,!1);x=new W(m+"*",D,!1,!1);var fa=new W(m+" const*",D,!1,!0);gb[a]={pointerType:x,qa:fa};vb(u,p);return[w,x,fa]})},e:function(a,b,c,d,f,g,n,h,k,l){b=P(b);f=X(d,f);Xa([],[a],function(m){m=m[0];var q=m.name+"."+b,v={get:function(){zb("Cannot access "+q+" due to unbound types",[c,n])},enumerable:!0,configurable:!0}; -k?v.set=function(){zb("Cannot access "+q+" due to unbound types",[c,n])}:v.set=function(){S(q+" is a read-only property")};Object.defineProperty(m.V.ba,b,v);Xa([],k?[c,n]:[c],function(u){var p=u[0],w={get:function(){var y=Bb(this,m,q+" getter");return p.fromWireType(f(g,y))},enumerable:!0};if(k){k=X(h,k);var x=u[1];w.set=function(y){var D=Bb(this,m,q+" setter"),fa=[];k(l,D,x.toWireType(fa,y));Ab(fa)}}Object.defineProperty(m.V.ba,b,w);return[]});return[]})},t:function(a,b){b=P(b);T(a,{name:b,fromWireType:function(c){var d= -Z[c].value;Db(c);return d},toWireType:function(c,d){return nb(d)},argPackAdvance:8,readValueFromPointer:pb,aa:null})},h:function(a,b,c){c=Oa(c);b=P(b);T(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+V(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:Eb(b,c),aa:null})},d:function(a,b,c,d,f,g){var n=Gb(b,c);a=P(a);f=X(d,f);ib(a,function(){zb("Cannot call "+a+" due to unbound types", -n)},b-1);Xa([],n,function(h){var k=[h[0],null].concat(h.slice(1)),l=h=a,m=f,q=k.length;2>q&&S("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var v=null!==k[1]&&!1,u=!1,p=1;p>>h}}var k=-1!=b.indexOf("unsigned");T(a,{name:b, -fromWireType:g,toWireType:function(l,m){if("number"!==typeof m&&"boolean"!==typeof m)throw new TypeError('Cannot convert "'+V(m)+'" to '+this.name);if(mf)throw new TypeError('Passing a number "'+V(m)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+d+", "+f+"]!");return k?m>>>0:m|0},argPackAdvance:8,readValueFromPointer:Hb(b,n,0!==d),aa:null})},a:function(a,b,c){function d(g){g>>=2;var n=L;return new f(K,n[g+1],n[g])}var f=[Int8Array,Uint8Array, -Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=P(c);T(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{va:!0})},i:function(a,b){b=P(b);var c="std::string"===b;T(a,{name:b,fromWireType:function(d){var f=L[d>>2];if(c){var g=H[d+4+f],n=0;0!=g&&(n=g,H[d+4+f]=0);var h=d+4;for(g=0;g<=f;++g){var k=d+4+g;if(0==H[k]){h=h?ma(H,h,void 0):"";if(void 0===l)var l=h;else l+=String.fromCharCode(0),l+=h;h=k+1}}0!=n&&(H[d+4+f]=n)}else{l=Array(f);for(g=0;g=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++m)&1023);127>=q?++l:l=2047>=q?l+2:65535>=q?l+3:l+4}return l}:function(){return f.length})(), -h=Lb(4+n+1);L[h>>2]=n;if(c&&g)na(f,h+4,n+1);else if(g)for(g=0;g>2],m=n(),q=m[k+4+l*b>>h],v=0;0!=q&&(v=q,m[k+4+l*b>>h]=0);var u=k+4;for(q=0;q<=l;++q){var p=k+4+q*b;if(0==m[p>>h]){u=d(u);if(void 0===w)var w=u;else w+=String.fromCharCode(0),w+=u;u=p+b}}0!=v&&(m[k+4+l*b>>h]=v);Y(k);return w},toWireType:function(k,l){"string"!==typeof l&&S("Cannot pass non-string to C++ string type "+c);var m=g(l),q=Lb(4+m+b);L[q>>2]=m>>h;f(l,q+4,m+b);null!==k&&k.push(Y,q);return q},argPackAdvance:8,readValueFromPointer:pb,aa:function(k){Y(k)}})},v:function(a,b){b=P(b);T(a,{Aa:!0, -name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},g:Db,w:function(a){4=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);d=Math.max(16777216,a,d);0>16);za(G.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},l:function(){return 0},q:function(){},j:function(a,b,c,d){for(var f=0,g=0;g>2],h=J[b+(8*g+4)>>2],k=0;k>2]=f;return 0},memory:G,r:function(){},table:ja},Nb=function(){function a(f){e.asm=f.exports;M--;e.monitorRunDependencies&&e.monitorRunDependencies(M);0==M&&(null!==Ha&&(clearInterval(Ha), -Ha=null),N&&(f=N,N=null,f()))}function b(f){a(f.instance)}function c(f){return La().then(function(g){return WebAssembly.instantiate(g,d)}).then(f,function(g){E("failed to asynchronously prepare wasm: "+g);C(g)})}var d={a:Mb};M++;e.monitorRunDependencies&&e.monitorRunDependencies(M);if(e.instantiateWasm)try{return e.instantiateWasm(d,a)}catch(f){return E("Module.instantiateWasm callback failed with error: "+f),!1}(function(){if(F||"function"!==typeof WebAssembly.instantiateStreaming||Ia()||"function"!== -typeof fetch)return c(b);fetch(O,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,d).then(b,function(g){E("wasm streaming compile failed: "+g);E("falling back to ArrayBuffer instantiation");c(b)})})})();return{}}();e.asm=Nb; -var Ma=e.___wasm_call_ctors=function(){return(Ma=e.___wasm_call_ctors=e.asm.x).apply(null,arguments)},Lb=e._malloc=function(){return(Lb=e._malloc=e.asm.y).apply(null,arguments)},Y=e._free=function(){return(Y=e._free=e.asm.z).apply(null,arguments)},yb=e.___getTypeName=function(){return(yb=e.___getTypeName=e.asm.A).apply(null,arguments)};e.___embind_register_native_and_builtin_types=function(){return(e.___embind_register_native_and_builtin_types=e.asm.B).apply(null,arguments)}; -e.dynCall_ii=function(){return(e.dynCall_ii=e.asm.C).apply(null,arguments)};e.dynCall_vi=function(){return(e.dynCall_vi=e.asm.D).apply(null,arguments)};e.dynCall_iii=function(){return(e.dynCall_iii=e.asm.E).apply(null,arguments)};e.dynCall_viii=function(){return(e.dynCall_viii=e.asm.F).apply(null,arguments)};e.dynCall_iiiiiif=function(){return(e.dynCall_iiiiiif=e.asm.G).apply(null,arguments)};e.dynCall_viiiiif=function(){return(e.dynCall_viiiiif=e.asm.H).apply(null,arguments)}; -e.dynCall_iiiiif=function(){return(e.dynCall_iiiiif=e.asm.I).apply(null,arguments)};e.dynCall_viiiif=function(){return(e.dynCall_viiiif=e.asm.J).apply(null,arguments)};e.dynCall_i=function(){return(e.dynCall_i=e.asm.K).apply(null,arguments)};e.dynCall_vii=function(){return(e.dynCall_vii=e.asm.L).apply(null,arguments)};e.dynCall_vif=function(){return(e.dynCall_vif=e.asm.M).apply(null,arguments)};e.dynCall_iidiiii=function(){return(e.dynCall_iidiiii=e.asm.N).apply(null,arguments)}; -e.dynCall_iiii=function(){return(e.dynCall_iiii=e.asm.O).apply(null,arguments)};e.dynCall_jiji=function(){return(e.dynCall_jiji=e.asm.P).apply(null,arguments)};e.dynCall_viiiiii=function(){return(e.dynCall_viiiiii=e.asm.Q).apply(null,arguments)};e.dynCall_viiiii=function(){return(e.dynCall_viiiii=e.asm.R).apply(null,arguments)};e.dynCall_viiii=function(){return(e.dynCall_viiii=e.asm.S).apply(null,arguments)};e.asm=Nb;var Ob; -e.then=function(a){if(Ob)a(e);else{var b=e.onRuntimeInitialized;e.onRuntimeInitialized=function(){b&&b();a(e)}}return e};N=function Pb(){Ob||Qb();Ob||(N=Pb)}; -function Qb(){function a(){if(!Ob&&(Ob=!0,e.calledRun=!0,!ka)){Ba(Da);Ba(Ea);if(e.onRuntimeInitialized)e.onRuntimeInitialized();if(e.postRun)for("function"==typeof e.postRun&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();Fa.unshift(b)}Ba(Fa)}}if(!(0=e);)++d;if(16f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e} +function ka(a,b,d){var e=E;if(0=g){var m=a.charCodeAt(++f);g=65536+((g&1023)<<10)|m&1023}if(127>=g){if(b>=d)break;e[b++]=g}else{if(2047>=g){if(b+1>=d)break;e[b++]=192|g>>6}else{if(65535>=g){if(b+2>=d)break;e[b++]=224|g>>12}else{if(b+3>=d)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63}e[b++]=128|g>>6&63}e[b++]=128|g&63}}e[b]=0}}var la="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; +function ma(a){var b;for(b=a>>1;F[b];)++b;b<<=1;if(32>1];if(0==e)return d;++b;d+=String.fromCharCode(e)}}function na(a,b,d){void 0===d&&(d=2147483647);if(2>d)return 0;d-=2;var e=b;d=d<2*a.length?d/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;F[b>>1]=0;return b-e}function oa(a){return 2*a.length} +function pa(a){for(var b=0,d="";;){var e=G[a+4*b>>2];if(0==e)return d;++b;65536<=e?(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023)):d+=String.fromCharCode(e)}}function qa(a,b,d){void 0===d&&(d=2147483647);if(4>d)return 0;var e=b;d=e+d-4;for(var f=0;f=g){var m=a.charCodeAt(++f);g=65536+((g&1023)<<10)|m&1023}G[b>>2]=g;b+=4;if(b+4>d)break}G[b>>2]=0;return b-e} +function ra(a){for(var b=0,d=0;d=e&&++d;b+=4}return b}var H,sa,E,F,ta,G,I,ua,va;function wa(a){H=a;c.HEAP8=sa=new Int8Array(a);c.HEAP16=F=new Int16Array(a);c.HEAP32=G=new Int32Array(a);c.HEAPU8=E=new Uint8Array(a);c.HEAPU16=ta=new Uint16Array(a);c.HEAPU32=I=new Uint32Array(a);c.HEAPF32=ua=new Float32Array(a);c.HEAPF64=va=new Float64Array(a)}var xa=c.INITIAL_MEMORY||16777216;c.wasmMemory?D=c.wasmMemory:D=new WebAssembly.Memory({initial:xa/65536}); +D&&(H=D.buffer);xa=H.byteLength;wa(H);G[1468]=5248912;function J(a){for(;0=b?"_"+a:a} +function Na(a,b){a=Ma(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function Oa(a){var b=Error,d=Na(a,function(e){this.name=a;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});d.prototype=Object.create(b.prototype);d.prototype.constructor=d;d.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return d} +var Pa=void 0;function V(a){throw new Pa(a);}var Qa=void 0;function Ra(a,b){function d(h){h=b(h);if(h.length!==e.length)throw new Qa("Mismatched type converter count");for(var k=0;k>2])}function Xa(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a} +function Ya(a,b){switch(b){case 2:return function(d){return this.fromWireType(ua[d>>2])};case 3:return function(d){return this.fromWireType(va[d>>3])};default:throw new TypeError("Unknown float type: "+a);}}function Za(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var d=Na(b.name||"unknownFunctionName",function(){});d.prototype=b.prototype;d=new d;a=b.apply(d,a);return a instanceof Object?a:d} +function $a(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function ab(a,b){var d=c;if(void 0===d[a].R){var e=d[a];d[a]=function(){d[a].R.hasOwnProperty(arguments.length)||V("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+d[a].R+")!");return d[a].R[arguments.length].apply(this,arguments)};d[a].R=[];d[a].R[e.W]=e}} +function bb(a,b,d){c.hasOwnProperty(a)?((void 0===d||void 0!==c[a].R&&void 0!==c[a].R[d])&&V("Cannot register public name '"+a+"' twice"),ab(a,a),c.hasOwnProperty(d)&&V("Cannot register multiple overloads of a function with the same number of arguments ("+d+")!"),c[a].R[d]=b):(c[a]=b,void 0!==d&&(c[a].$=d))}function cb(a,b){for(var d=[],e=0;e>2)+e]);return d} +function db(a,b){a=S(a);var d=c["dynCall_"+a];for(var e=[],f=1;f>1]}:function(e){return ta[e>>1]};case 2:return d?function(e){return G[e>>2]}:function(e){return I[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}}var jb={}; +function kb(){return"object"===typeof globalThis?globalThis:Function("return this")()}function lb(a,b){var d=U[a];void 0===d&&V(b+" has unknown type "+fb(a));return d}for(var mb={},nb=[null,[],[]],ob=Array(256),pb=0;256>pb;++pb)ob[pb]=String.fromCharCode(pb);Ka=ob;Pa=c.BindingError=Oa("BindingError");Qa=c.InternalError=Oa("InternalError");c.count_emval_handles=function(){for(var a=0,b=5;b>g])},S:null})},r:function(a,b){b=S(b);W(a,{name:b,fromWireType:function(d){var e=X[d].value; +Ta(d);return e},toWireType:function(d,e){return Va(e)},argPackAdvance:8,readValueFromPointer:Wa,S:null})},g:function(a,b,d){d=Ja(d);b=S(b);W(a,{name:b,fromWireType:function(e){return e},toWireType:function(e,f){if("number"!==typeof f&&"boolean"!==typeof f)throw new TypeError('Cannot convert "'+Xa(f)+'" to '+this.name);return f},argPackAdvance:8,readValueFromPointer:Ya(b,d),S:null})},d:function(a,b,d,e,f,g){var m=cb(b,d);a=S(a);f=db(e,f);bb(a,function(){hb("Cannot call "+a+" due to unbound types", +m)},b-1);Ra(m,function(h){var k=[h[0],null].concat(h.slice(1)),l=h=a,p=f,q=k.length;2>q&&V("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var K=null!==k[1]&&!1,y=!1,n=1;n>>h}}var k=-1!=b.indexOf("unsigned");W(a,{name:b,fromWireType:g,toWireType:function(l,p){if("number"!==typeof p&&"boolean"!==typeof p)throw new TypeError('Cannot convert "'+Xa(p)+'" to '+this.name);if(pf)throw new TypeError('Passing a number "'+Xa(p)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return k?p>>>0:p|0},argPackAdvance:8,readValueFromPointer:ib(b, +m,0!==e),S:null})},a:function(a,b,d){function e(g){g>>=2;var m=I;return new f(H,m[g+1],m[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];d=S(d);W(a,{name:d,fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{Y:!0})},h:function(a,b){b=S(b);var d="std::string"===b;W(a,{name:b,fromWireType:function(e){var f=I[e>>2];if(d){var g=E[e+4+f],m=0;0!=g&&(m=g,E[e+4+f]=0);var h=e+4;for(g=0;g<=f;++g){var k=e+4+g;if(0==E[k]){h=h?ja(E,h,void 0):""; +if(void 0===l)var l=h;else l+=String.fromCharCode(0),l+=h;h=k+1}}0!=m&&(E[e+4+f]=m)}else{l=Array(f);for(g=0;g=q&& +(q=65536+((q&1023)<<10)|f.charCodeAt(++p)&1023);127>=q?++l:l=2047>=q?l+2:65535>=q?l+3:l+4}return l}:function(){return f.length})(),h=qb(4+m+1);I[h>>2]=m;if(d&&g)ka(f,h+4,m+1);else if(g)for(g=0;g>2],p=m(),q=p[k+4+l*b>>h],K=0;0!=q&&(K=q,p[k+4+l*b>>h]=0);var y=k+4;for(q=0;q<=l;++q){var n=k+4+q*b;if(0==p[n>>h]){y=e(y);if(void 0===L)var L=y;else L+=String.fromCharCode(0),L+=y;y=n+b}}0!=K&&(p[k+4+l*b>>h]=K);Y(k);return L},toWireType:function(k,l){"string"!==typeof l&&V("Cannot pass non-string to C++ string type "+d);var p=g(l),q=qb(4+p+b);I[q>>2]=p>>h;f(l, +q+4,p+b);null!==k&&k.push(Y,q);return q},argPackAdvance:8,readValueFromPointer:Wa,S:function(k){Y(k)}})},t:function(a,b){b=S(b);W(a,{Z:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},u:Ta,v:function(a){if(0===a)return Va(kb());var b=jb[a];a=void 0===b?S(a):b;return Va(kb()[a])},k:function(a){4> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";f=(new Function("requireRegisteredType","Module","__emval_register",m+("var obj = new constructor("+f+");\nreturn __emval_register(obj);\n}\n")))(lb,c,Va);mb[b]=f}return f(a,d,e)},j:function(){A()},q:function(a,b,d){E.copyWithin(a,b,b+d)}, +c:function(a){var b=E.length;if(2147418112=d;d*=2){var e=b*(1+.2/d);e=Math.min(e,a+100663296);e=Math.max(16777216,a,e);0>16);wa(D.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},i:function(){return 0},n:function(){},f:function(a,b,d,e){for(var f=0,g=0;g>2],h=G[b+(8*g+4)>>2],k=0;k>2]=f;return 0},memory:D,o:function(){},table:fa},sb=function(){function a(f){c.asm=f.exports;N--;c.monitorRunDependencies&&c.monitorRunDependencies(N);0==N&&(null!==Da&&(clearInterval(Da),Da=null),O&&(f=O,O=null,f()))}function b(f){a(f.instance)}function d(f){return Ha().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){B("failed to asynchronously prepare wasm: "+g);A(g)})}var e={a:rb};N++;c.monitorRunDependencies&&c.monitorRunDependencies(N); +if(c.instantiateWasm)try{return c.instantiateWasm(e,a)}catch(f){return B("Module.instantiateWasm callback failed with error: "+f),!1}(function(){if(C||"function"!==typeof WebAssembly.instantiateStreaming||Ea()||"function"!==typeof fetch)return d(b);fetch(P,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){B("wasm streaming compile failed: "+g);B("falling back to ArrayBuffer instantiation");d(b)})})})();return{}}();c.asm=sb; +var Ia=c.___wasm_call_ctors=function(){return(Ia=c.___wasm_call_ctors=c.asm.w).apply(null,arguments)},qb=c._malloc=function(){return(qb=c._malloc=c.asm.x).apply(null,arguments)},Y=c._free=function(){return(Y=c._free=c.asm.y).apply(null,arguments)},gb=c.___getTypeName=function(){return(gb=c.___getTypeName=c.asm.z).apply(null,arguments)};c.___embind_register_native_and_builtin_types=function(){return(c.___embind_register_native_and_builtin_types=c.asm.A).apply(null,arguments)}; +c.dynCall_vi=function(){return(c.dynCall_vi=c.asm.B).apply(null,arguments)};c.dynCall_iiiiiif=function(){return(c.dynCall_iiiiiif=c.asm.C).apply(null,arguments)};c.dynCall_viiiiif=function(){return(c.dynCall_viiiiif=c.asm.D).apply(null,arguments)};c.dynCall_iiiiif=function(){return(c.dynCall_iiiiif=c.asm.E).apply(null,arguments)};c.dynCall_viiiif=function(){return(c.dynCall_viiiif=c.asm.F).apply(null,arguments)};c.dynCall_ii=function(){return(c.dynCall_ii=c.asm.G).apply(null,arguments)}; +c.dynCall_i=function(){return(c.dynCall_i=c.asm.H).apply(null,arguments)};c.dynCall_iii=function(){return(c.dynCall_iii=c.asm.I).apply(null,arguments)};c.dynCall_vif=function(){return(c.dynCall_vif=c.asm.J).apply(null,arguments)};c.dynCall_iidiiii=function(){return(c.dynCall_iidiiii=c.asm.K).apply(null,arguments)};c.dynCall_vii=function(){return(c.dynCall_vii=c.asm.L).apply(null,arguments)};c.dynCall_iiii=function(){return(c.dynCall_iiii=c.asm.M).apply(null,arguments)}; +c.dynCall_jiji=function(){return(c.dynCall_jiji=c.asm.N).apply(null,arguments)};c.dynCall_viiiiii=function(){return(c.dynCall_viiiiii=c.asm.O).apply(null,arguments)};c.dynCall_viiiii=function(){return(c.dynCall_viiiii=c.asm.P).apply(null,arguments)};c.dynCall_viiii=function(){return(c.dynCall_viiii=c.asm.Q).apply(null,arguments)};c.asm=sb;var Z;c.then=function(a){if(Z)a(c);else{var b=c.onRuntimeInitialized;c.onRuntimeInitialized=function(){b&&b();a(c)}}return c};O=function tb(){Z||ub();Z||(O=tb)}; +function ub(){function a(){if(!Z&&(Z=!0,c.calledRun=!0,!ha)){J(za);J(Aa);if(c.onRuntimeInitialized)c.onRuntimeInitialized();if(c.postRun)for("function"==typeof c.postRun&&(c.postRun=[c.postRun]);c.postRun.length;){var b=c.postRun.shift();Ba.unshift(b)}J(Ba)}}if(!(0Lg_AEcbTyCe12aL`aG3n4$e65>F~Z&w*!dt|L^bQ-doG5Q&p$V ze(#@mTkkw;4P&iK7jVWHf6O{@7SAwTJTpsVP{IvGD???*OaXNt>KV3XSam5wEkL!* zRRoNi->a-y+Npi~cbQGRgtzim=EHq93*kP8aop#!Fz#)p{UVlw^2Me+j|r6L8<;fn zquh>#wek)Fv%tVCWHwqZG3|>C;%MvqoshOqIlrPN~pvwp-u%KY&$>n2B&>ih6bP^wE3tgS$qCeBfW>_|K+8j-QdlAw4022hGR4C_U$B9P zVnb_~PxKuoY6WM_%(najG^8J(xZqr%j`^97alaMh!Ey_CJJ-j3Cx~Fqpb4obkB7sd z5Y`zA^FRP787~wWDR8Zou*dcr+(K3l0tU75JADeQU9$Fk=*AIF~M zd_3F5`2?2c6WK30pTsiHa6Xwm&G{6zlk=%;2j|n+e{epXJ;nK{>`BgNu+=;~lQYHb zRJZsQUnQR4+j;tNK6(>hFV=`Vc=J^F3N&e=Cv>tt-#gJf~9M8!4o@TqZK03pNG1aff#%_+p$Rk!o+`salZA z<)VfDKpcYd0ZMcxf(EK92?7T7ZPi8k)#zPAHYC*s0#cbQeOQ#K=Toi)w!lHK1XH23 z3!;G^0I4!qj;(h!^wZZiUaw1&30a3TW({Iw!efIQ^yK6u-mULQy5-#*oJSOI5NFeE zX3WQI$7gs^A8NRbU$5Uujvjdzv5CLY3Jnt>uf&Gor2G!r<-dp{oh3&)B}&wJm(bJu ze!-jcsHRq4tT#6e;AiPKnhF8|tVx#ZkDHqL?Yc5mUAl%xxUH!5Ha<4W%5X-kuT>)J z^f{?oeuM5xC6Y3>l{iiZ1uEeOPccE^$_J#oOLiIZ#>vl34_ zEbcNAMmaFSeHn-Q6|?g|>`ii@z}dbbhYi`9q?IH%oe2{y4ksD1Kv81BEYCRsb+scd zUyKQ9%iy__V$CEU%VR70^&+5gI2kj}@_4m(Tq1CEWZ(QVtBB*cCk?I;8Gv!e*O~D3 z^4#Y9!F?biL5w1PC8>)8wI@hpKquf|uc~R(4;IUDZ>K;?fb6FyQR+bI)|5v>qM#9XrXHms#7K{3QPDb%oS=mcoZz+bx_O?- zW6&@-#p!XP#VYU~&90cs)UK36as_bH*sDs_<|H@_b5P%IkE=)rz#f9xA+1n3B-GGz)sp8Cf z&GXSUI^6Z42OD<2=tRONJ1R7j4LWV!%lVvt$-jBIe{aFy|wD+|BJz^c6L;d!Lx8Cp0UfCL{B|I-~6}J z<vx%%U*`hxX?9w7CF(sAl*fH>5spQ$O2lT#!> zJL7G5_6mD3)YIS8yl~udEa>eY_zJZWh?_JVSwNOGQi*m2FKeDELKOuUld6fUmiw-yb+W z-+~h|DQZDyl6`bU%+f;#xq)kWg2^HJ{6S*?ch8`z+-sl!=pf-B1m#5i+MpYY{%Ff0 zEYX;32EP0z0*BP?X&>xZITK+XLun;|W8Kh^gH9kBpyMYTE*=bP4v#dXg0Ki7Zw`*WM}`f}Iia^YSbsUJ4r7ak z&)_HNdBdj{r3f>56i{Nc(nvbNWlFy~ydM6`H^Ya(tLQu8WZq9N9Pvbce>+Gpp|m}e z!}2n@@99g!k@!EPD)*Qcq4pO6Ji_cS zP~ya7p&jA;N{9UiY$gBKp7)y-aBoqgc!|y^2j$J`Yx_?H4v!}y zjx7)AjVGTu@IV2~niE!Caxv5pcXQN-)S^BrPzMUo&KDlmgw85G@RWt4OL45y$w3&y)BqfAkkEJemP&M>p}>hE79yaC z6E#3iFVHRqApOB9^|blm*t7D$ifkGfia8;}hYQA*f%#UBoyf20d2?*c%742)orEok zI^vmx4TJi8z5Zsxr{b0Rp7$rd!TE3WBa8*f~l99 zdZ?L|dUa?>^oN__o0|SO)%8!Od{%fc&u}+RO~Ny5fp<`8>#pV^OCi|no?7eX$!6Ow zH-03XY;r8Ha!$v5HkJ>cTf5V5<_W!Z`f}XsPOZUx@~QLqsrvC#*ZXGz;fZ?2i~+nx zUpr&4Jl!D#5ci}g$M9VJ>lwAde!%CKr}ca_Bh5u|nO;3j_grxL0H5e;(A{TMhy(RK zkDOJ&#liZX=g+PY{1-icJZA>yTl9(NjhvWoRzv#V zRI%OZdBtCQg3aVQY)7uvndXU^3&8%^Iq|uH55*W_)u~285;TX4>5PBoz%2r7Ry)9N zZV=}g>VV@L#4K!%9F2d1%#LS?$z06q;qoYdf!%t9(m(2ah}(8!??{?jo^LipNaU#A z-M1s|mgTlBnZr&tk&c-mWcNW}2f#L+Ij^#;jmDFl0x}nnRLn6C{n~jo$sTU|&}tM! z3{w3#hi~q?3gJsv$iy!K!y$LFNW143gB3@dzamVckGUV=nzt5-&lCEqS#@Gt~LuM$D6_!cs94U7H3w~D3oE>e+bn;Fj#TB z5|`Rfai%tus$axqfx53$?T9O=TZm%5+{@+fxcn`b?{N7xmv3?TCYNt;xrfWwxqJm)b?5>)bHD=xW5LCUr=d9SbbkEWAat59;}c{)t(Bu zSpBU+E>d??%1hKUm2#nauTn0MuW2uer0^BTFMC(j!Q(5vQsz)#ob&2NmH2F<=QM4_!u0CGS~m!f zc)ZNG9SwpuNd^HRr^wZG!~jb8$1v74`h3Ngnk6*|$0XkV!S!_=TX>^xSTGD^n6;pm zJ3Tin=p$y1pnlTPas-~eWi3p_Ywm3vexz;q5y0Uvj))>LoZ5mOBK_qh=lYDsn6_vD z59-XK;^6i|)y-vGZ(P)7Nfp!n#R;;Jjf)osqo6NSNKY(2fv?qXEgn?5mO~R0vkeu} zwuxU*frB+rS1uXA@6gkijFM2>$nmI%(IPl9y>ZE4etXXwOQKx=Zt9b|ec6rT4xtY% zyVJ^%%{{j*$I0C(de&T#FN&*)hGDp>nBo+c{mE+m)RklS2K|pKtDU@K-49NO`JOS6$?xu}%LE&^&Whd{8xr6^6`mxMdK^e?hJYI^CQY4m`oA z6O6e5(E}Cb-9p<}e`SSbvp#%vC$H6=nJK!xYZ0&O+28ed!Ozyey{-$c-&reKaw*@c zHp?_bF(iw7e!gNAN1|xZ4J!)!C)ijxzLXrw0aGLR1Ib^yVT<0CDdG?6-(?a!p#Li~ z68B+U)tNYDui*F>B5)Zh3T=A?Sk@Cw2GN8YZ4y@s;qzgHVus#u2SEdQ4$!;Una8on zLuaj(&lO;Hp^)7N0^&|24NatkY%ApkIpu@<0b2fh26kbhuSK3qwi7fM;008WHgl+Q z6i6f}OtMcpZe6q>1g%J_{r{}3(X0bAV9mzZ<4F~L;KqEt@WylWnJXJJ4`42DGt55C z<2cgGMzG64YPABih6W_=EpWWY zW}w|DkYMs=WNb`P$eTzfJ{&cxARmnuZ&c$*0HEMGEcRgF_D;>D8;M1^+{(@I+(+qM zSjo?G&}Pf?vYY(Td9|^jM-R;RqXU~j2X_B4=fx8OJ~6yvN~3KFkpqS^6tHjqMcpji`{HNnSObZoD$2+hrEjo?8GP|Bb318M9T$zRf_kqM*@9Jq+-M2=Hp zYFItd#l|y$D~xiE*%hPRI3e0GVSr)H95WC290ZC@*uGAKxYf>T*rzQvE;-){~1d&$9KCnF7+nJ$fXe{1%QJxZ%4W^xtPOfUm zK<5HB=!C|31aOEu8`APlE|UpT$EebAf(7J_Xv4CMk{0rM_*dx1XulHz&FGwHJ0VhW zXc~(634P=qwI78fw&;a~cFu&z0uL1>1{5l~9U~+Xsx&iAB(DPwC@2`~u58Kl;gua$ zRV0_2UbzgkjTv49(Zfd>GwkGcfU03IyCXWBsK>n=0Fq{ajmGjW!~Q*d+zF+L*@y*T z1W3DNtzoWr<_OIxw;l6pv{cy&zit)+?+cw$iio|Q!bF~9^#UP5EM+Hfnn~pn=o}I_ z+2P0>IUD6&7Lq|)tR55%fUz(qgpkFA9)-SrzqdNGLz` zQ`&nJ}61FfLm$7^)^?QU#SIaRiLmJNxWfZnsFWZ-(!x;fkGlUSiyhuw7CDsDD_ zYs>TmT^qXIR92Sh0-Xwd8z;oym71PIrgE@UUy7bTn93)m`T<=Z`n{>_E!F#UW9SW2 z*;T4@*4Bl7Z7Q#n>fvkaL%U4n@lt*9+WO45jX-ToahbfdcV!N#118TPw&Hm8B_N(A z+5rQ=_QmZo(4ABfcEQ6)j&V~wo;vMIf{okSVqjxL@s>Gd7^FjK+o#Sw?Uq2N0 z3)Y{g27#+#KadWcNV?MQF#9x1MeKVN=_wT0(Fze0;H)sfY*1dV7u{XUFV}b6ov1km z8h&*zJ${Hr@4vewiSYDm-rG+b>800?c8IkP(9<^DpE&{o@NwQ+=+$7B$|P7&6Yw=- zVP@YWOpL2qa8x7?=z%|RB`H0;A{J_yDUrw6U5pq2NW36XZ9p{yy+j^GA=%l!#wl}r z>5R)jc?%G|+fhg@3@1;Dq!W`+uE4yC_7;H#bKnkAwsG^G>Im#HkR`E@foe)%JicWh zH0?x;22t*fZ=mst!N?*k_R3Toa1^Q|tU;8xhzq%DX$MV& zy@`9W1|nHC^r{|IKrhZ5p*YPA<}y$D2~TjnWn&Vt`|BI45OICEaR4vV&ZZd^qanh` z{80KAS{T_fR7a!1&(!`tI2SLv_*{j9QMaSnjYM`!^iovUZx+YF$M_f9*Z1da*Z z-k_6<*Cn>o2ZzN}Pod)U(F*MU1Q@pHbOe_ce1{>hcOfK;tL__&-1O=9T?iyS_l*Y< za%-R>BR%P0P7!s34xOVw_{RVmgs)>C#z|R1y0O??^Qy%0oz4Rn<3X6 zP~o(K2ZXHhPw(%>G?53=yh~sHz@`gmOcZHwFH3#ww$MRD!HVetA2$nQK?vciBJYxJ zhv;}YY#3MCB2!K;X}l!%(g*wUuAZMg7~}ext!l3g2}w&jsrwJjG&p^8YJpha={(1w^1pGKLFDL{rN za*@e$aoCV&ISo4`m&a~C&d&d^UhSIaB)d(Umeefh6u@(TUhubKjfa-E2DZ-0IYukD%o{5KrU zV_s+|UI7)}Aeu0NDIA&L+80jb*Xd_o_=|66R8H4V{ALcHp-XqyVA!bLrj^K;1M+Pz*4h6`$Z--8IZ}W0Vr}ZSJh%!jD8Tyj^$rHX*W-OH`3reHCCKP~Bt<%g z^DW){(%D16Mo`_^Jpa*H-vsf7*cZh-*n)W6JkF>x(PC5wP5i$ zePk~uzf#M8q8Gn1IJzwlGr7I{-1bV*sTEOtSi!)#w0F!*>VP-14NwVE!{WF|0jAiS zj@g_Cf}VAttIzXi{qRaG(!bf{Y4NN5Vh=|>(ZeS%Ox@;y&}Y8tW*!mTPss`xHS(h= z^hWSwKKxL_v$0YTVhG~Ux=oyfP>x!BCQd>`Meh+2NRqH#XCkKt98(veDIwQy4vp+c z__8l(guD;-0_(jO>&+Nf-G}%d>DLC);GqH|V!|w!vvx#6)Q3nYj15vk86*&(rQuYT zMra6;2k8;+Kx3uYu|bX?{}X3PQ7}c8mKUzj0E8eUxM5)6fELofTyQgf=1RmQ+5`{xn*L(}L)Gj~QOW(Lor{BB|uNc30lU_H@d#eWbTi+U_ zKUn%MKTki|>F{;>-Ol0SF5Xjc>DiY4P}=L;4fI} zrjSCOC!{_L;Z=_x4eLU1_BMyqMuH4VOYTFO_SVWWWS&Cy7NOPK6`A?-*}({7tsNbg z%xUesWXZ^xqnewuwYG+(^RH;Tu+v%C=+rN)ciNWCX=|Ii)LGEFZ2p2v7dT5VU9{+u zC7o?^9fD)?>30!hD}0Qt!bN!La-xil#Fg)7Y%ZQ#&__Q`*C%@0+vEMz{ki`B?Z(n+ z0|&G%SUP9P{6(E@3kP4;+A$WcN{;=8Uk`g{M0gQU5bQF&=AC5nM>F-#cE+V5@;CGC+QorJYOWFT9vt);0%JXG=ThHa8P} z7j@3RWT7_&vl%Nwu^3kgF4}lV4}7<{vSw3Om1!}TcY!*Ma)ir(|Gz42pu=b^1h zuX(q6EMZxW8jY#N>8#9__u$!$i++djEXT6~S0%10Tn;W5R{~eH{`}+`p%5$>iM^T=aE$>9RHCx_| z^3rViZInB+Our4;?bo5) zyA22BdR)j(vPN9=TLF05ZW7nAaD7p4!j-~BTki%O;RJ7Ac;TF$m);+01?U*wmb%}E z753b*W4*)uj_L{1RTDE^3wpbz#PrqKu1>Ej-P^SxreDi;J@0jO_I7<9)0H13jC2+1 z)Q6RJYj4j;yd3x_5hHQz%yKk|<0tx_k0zVeJ;$|H>iEYg)6-M{K>R%TZEsiT%RWw; zo)tgr`MC8bpVr%D2S)t|ZdZF%>-WM1|?_ucHt0}_w~0!oH`7hI`ZNFYF7*aA_&sxK;46hvSU zaR;?7*jDtRqNoK$rHU1mTC7XyDpkMMy7aSOTl@Xb+!q$@@B1FP_s(+W%$c*znR73{ z*k^unz-(si%NKFR7=Ob&eKt=pTs$$`NYLF(B+$SZRoQG0YIsm1Pi$;1-*`!`$xvF} zn-!!k_s3?3bz$QNze(KB3wS$kXD03)EP(qQ#&Ms^(s1u&Ww_7Nz4JjpJ71v7UCfJe zoCR_3W(MvH^{7S6gYsexvqZNnWj0!Rn1%Z?jbSUc>A2`8Xyk zVri!7<8?d`8CJziugM1t_f~t^Nc3^Wy@MY52XFL-Mgavyj)sOm5~FIYv>~%LW-0<$kQw&pkmu zV=XLTW_x^T5Wn2HbFX3fJ$$FY5!k7s*1 zpTK^~`9$_S=ablToKI%Yay})&=J2U(59ia^)0|IdyE#9TJ;nJ9wu|$b>`BhgVoz{> zHe1Wn=5Qvt)wI_5f$?wtH~uC6lt0d&;XCD|H8lK zU-AFuf96Y_kNKbYG5!%s-}~P0`EU7e_)+fsfjc?xbLW@*UH)tC9O1v>AM)U%_n50y zi>KJQHl${G8uJd-$u%L{kW4a>D72Xr@d_qF>Q-OO{39Qi-0r!N^ZQlIH#|{LX!CKN zR5h zkbyV=z(mPx4<@KFvLk8Kz-*(&uq7W~6g5NKIu3ghWPT)|p<)ikV=aWHo3Pgy#qRi; z^9X@kt~gO_IDyukWP&@YALn}oqaiqzBHwbh2Yz%*D zSg_aF8&f|Cj&DCi=xOMom~8?|?vLRQZ8nQLU^u3u1uttdNG1oVXF}MNdt;J1(V(9h zBv#!?s1Bx30SL34YfUc!rH&uVmwGi&0>k#4pm(p8XB>#BcdZyb{GprvZ|Zl3R#_=R zI8AU`csNZEWkv$42Z7K!Zu4G;_dq9!AvcDfiGm?fZnV-ruz;XEfHHa=zlH)=I@6PR zM`H2_b;?9)^(@R}UxONykz0zs1lDX>*Lb*@fRy??XM($6EEGF4`M&QjT-}g2$iRfp zTRFA$~IQ?04=l++)-8eEhL(b{M7^d5zsi2 zI*l`3uJw;|d?!X`7o1l{Y~ZdSqK1(G7`HvWj;EgyHxvxXfpq*Ny1lNHLSc(k;?08j z#<78_rEnq1;Gx0|1{zz6)}t}`YLSOi=b_@WqkD-vwzvCC7y|SwKN^5~p#TMR<*UY) ztQ?@B9BzBTpcFZp1sDk72x`Uj29W_>{!>XTm{KH?XIbfhGOdDyUXND?N#QcQ%YpGy`OF!|1+kefW8(wxPkcWGF6|_Q)eUezC*5oUq*A z;Og&}gVe{Rr6WHZM4~c)?3gYEY%}hp*@0lBKrftR?=-N63j>O?GbS4_TgYe0oee1?l!@_SuWd$sAXDuq8ya%wriC0E zq&_JtGj=wpkX;r@4VH8C zf&3r+TYhtA6$2(5nx@9ShFXI) z)Ao*a>0$u>7PUZ}1omyAu5M7dwF~}Vvhr23_C8G-KZP{b>-hTJ{qnlsrQ8hs8Elq> zOrGsjH&d(buJ;c=VN-DAfpKAm2b^9p6vXJ2wAW(qhC>85-2ep|p?6#LVg1YBq83VX z%I35$wx{6u=4AWP3o5<+RNgY+Ws=Ip1M|osUp8>B_VMI4F(DYA0K6CQw!1FuJ?9P@ z5`~ZV5c^V2mXwNiAq$?6f;gM0X&D23J`_ZWdPb~Q-_Q6#MuhW(^oY~QjbX6*S4O3% z2TKqwjdaNB3~{X*EGF}H>PitUUB@ZtGO2qO-Oh=an82eauvV){kx~3Cbz`Kc>^9)D zy|reb*~oWGTHu6{iLG4ikNlYrQpwDAUZ8Ta8nP~Ua+o$n*dO*-gA7o$Wwr42>h`Si zf}6DeAJIdk~Esy=rL z->z2V&dVaVjE#%gevJ2Z+ootxpXFW}YqcmW1Z#!Qih>{H25eRoW#lqMnS+qk=3dFH z3=s9upwGFX?r4~h305a2hfVAjgv&M}hWfH0>bsgdObk;+jbi}U)>xL_$I%N$A{O?G zDQaEg^||+kMBWLlVe%(o@VPo!JJ>dZQ@~ER4FfpN9y)SxGr0#iDUE{|EvArUDe`jx zxoDEK6Y3gfXj1!zj^)kD*EED^@d3}Mro6l+cgqe)KlVcG-!unD-=e0bU~_-9N&UE~ z3S$p9&E&1Bs`<>^2EuG$D}^%ylTdIt*tWL08iGqU4+XRT)I6Fus@Sk6f`hFljsS$o zBkGG`bu}d*+zN4ih0UIVe(`&)UYEO%xXWi^BWZ(Dn=Y7?GX}u&+7O8d{}BG*)M+Jq zhA-s-gyKvLf&LzCnMAu^{fHg;2q$?sVh1o?pvIW$@EGHcU&PdZjd+^J)Pp16#r^8j zUp8(QYSI}u7~8Vd;WL);A~j*uwYa}F>I`0}f~_{n^{t;HCwkzJc{C`uQ;WPeTW-rnJMVFVMIo>y4~Od?i*Vq(fZ&vJndG-TOfoN5Rt zWQR47-4C>v0Z4U?sV0VO8gqUfw2@7RPB1$_s;G6-K!lEP(CBr8QNP=zvc^v0eaVZ* zM$F93b#aVzpnlIg7C=|mslEw+G}hH67fgJU^A}aiE9r#v^@h@KI~?= z<8MJh*9&w#(83DbdZDhTwZKYse-YJ{Z_2T(okD9pgezcE;Jt_{J~f|?o<&nD?ObuX zWff};fn%XS3yXn*kgGA^XVf2i_NcpOY*HOlZ{X$X)2XX)pEs=n_qEd&@N?9c)3$nN z0qYrR{b^T(s@>sJ5N$$))qt4m&eZWcFo)+M)`S7GpEa?h-poIj|-7mN(# z;1~iOy+rM~u(a_KBAmQQiDgxidkwkn6-`>Zbr4Dmt2Gd-;+&?wxUgc-PdIrYw36QY zq45!Tn_V0Mz2{0CnEL_Zns}6Hx zq|gH~>{w9mumJrL7eOM$NNo(3AQUu+Frmj9=Grm&DJ3qS*|^QknRdr z7SqvubwJS3Tptfe%HM7kX95>=Kt%r&O7Jvc&?*V3yXmqTRns<%Pgm`2**U3Zpd~f{ z0G@N8y0NXZ`d{!=KI9lC8OYdNc`^={7*Yg7oT(m~Q=hoNorOzUAt6caEMU&fhGS9- z`D`ZEBcylTx3~#DSbh}NOEpujicaBT6aY}r9?P=IfXqb;8n24WZ}^mDh+AFG#w_b5 z&W#eiL~`n4lR=YlF;K(ECqkk{eLR0E->8}wL`@H~)$K z{IgP;^t``H8uUCClpN2*!74auit!*&#QT(SNe4NkjJf(@J;M?66v)4oh#a}QNdBV) zNe@b$WQ)UGyv@a1T)fG}AuitF;^$nv&c#74UgP3bF8>*je<&3J`J-C-S9%_m0y5-~i?o2QbGRz}#34m`BP1^D-ANacfFSYMNv6NP#GJC>+qIY+7D@ zKqi*=pn;T6^MR5=1VQ>n4T2h?@Qa4}=_NC{Pkq%kmVaNh%pMuZ1QeYw81foGDgG;Y z-)w_(uX><;DE5-~+v{-;bPT}0*VIwRC#m+14&3*5Ov{~w-OYz-$c^J4%~lcdtLix& z>g_pWc&W;pTaEjuxfiRS&uu6ekfLa!E*xPDIl9FdC5 zUl@-H>@$d5M3uS%Kvn92&PIS9>HLtNub!G$8#)hL$C?0TA4H@2bY4mLZe%jyJ21!) z*Q=)aDl!5_Eq~7_BLZYxT%)=c+?-t(^&@@&OK?_me>Qtx;dzt#CtBkKvrSayx z(n1}E)EGn%Z3I~2Sg}?ujF%aGhPo+!KOdk5cQ=Eucy}eQN^a=RG0quD=|AB0h>>{q zmv1$6#cl3y9C5sD#Bsn8*bi}P#&Bx$yNJ}^7hUMl9&py;hB6cpmK(SzRSz!iH1lM>%2?viMmc23Vt+O`!epj;Xvt}OgZf~}VBE#hJYJ@1mNxKB z>U&Gi5SiMI$}H^>Va)2mr9=3Z2|Q&&a}mLQ3K{tCxU14S$D!HII^!KCkWGF z)CtwOLkAcT{Ow%Hm47vbI9&~0)ywPDj#X3h9!6%L+!78o!to&F^*}b_AtkPMxL*yq zdL-^kuPzs*6nz5-5fe^p*_QfhRS&OE&cFQc2Kdr`WgjBP-(K08PU&H}O<+f`u^}WI zu3ExT43iVcCJ(on2QxrMA6!^ z_2#9^`p8HLYxjs_)toXEN2cSO-j0(uJ@t=k>VpphojXq5u)5l~jjP92SEc<}^ASfP zb#!%2qEzQCO{}7Y!86E!NO!nnI86R1*WJyJq@JF*_=FIyLE;+zLvGHK83M-`A2#o; z0c(s)nBDDop`>0&p&jW{5%1S_Z1`~1)FNg_Q-z6z2?($at+qbESw{j!VS--)-W)Yt zL|j}P&4NJ8g-$*KJ*PmFMI&-AjxEs~Y*(%eK}VF5^L%2o2$r8o=fXUjvMI2s%x)R5 z^K5f+k&|s_#-qq@M>7EBmD`MX0xCO_wsXVIAh-++bxLewauMR#Y{@1AMTRZn(Nc`c zwKJn3j1>KzE3`10Zf8V&8XK0H8+U>TYJGM(&NsbITHFaEzXrxap|jw>_%dXSbqi0m zBn&ih-DISi%w=(1$Nr3GG-%U^Xqru^qKKD~3r$1=l0rCt)G}KUnQ@xUFE<2fq#f=S zqhX61-C7!I+fd!)R)bV^%5F=UY2v7ygC&;jfCVEm@9SG>Ier^QYTG~A@fStO$O1MB zft2~l3_7~H%(DZSmrN2H4})=%UgSzo9E?JaHtzWB(un}JVCblY>|$L5^=ViIwlbs( z6A2tW7OoR+C&DB^8Fa!VlmJKzMg4#Z+To}VBhu`2aziLm zKlM>tz-_}B)=r!3_=>0rc8LP@`>O2_j>NzZ0t4>aG)Jv*c=w~j8ZP~D+fwV-)Fgbi zAFw{#8jn>8#hrAJ2eCs_#1e2Q9f#V*(02=LAz=`~h&DrH4NbEupQh+Zv?{4AWg-_2xSFZa?lcrlNM>oLghT9y%DXui8$$?x4!|JOLbp= z9ePW39Gu8IXjd&<@gsO6!^n1PdI_QnPIHW%E*97&IDQyzSDuq;n{F{jlwj2)`vROM z=iBfYZE^#ux>3x7)2HaN6WhTMv>i1l794ln2l?QGpb79nK9Z1+fN8gY7Yd=L-wWx& z#6rXl1FtQx0!v~M9GxO=xu3)7-)YHXR@TWdJ}rmuwh3lY zxT~eba3sz-F%1rFsq-UO=dImS^A3*!Qqy9yleR?$88P{3Iiw)hRY<@3U|m_@bzR+6 zp=Pg(27eu;zV|Dnm->SHbagdO9xiAZ^?q5U-dh)qd{|1APm3uW3}J8dtJZb-jYo9r z(NwEP_%Wg8N$mLM>{9Wn20UD>cHdMPcu7|d6sv1*8W7m6E6=(;yL4q|vHAmgeyA(= z7pubc)q#6-WoxmTw7xd5QCAKXsms?_1%99_>x$Jw0PEA0{YC1R>#GyHVxUX`H#On@^GzcXLt*sTs^Lf{ks@1b-RKTpje@`;rqw~5 zPeRpi)g{M5U>QB*Y-8LqKp5_LI#Lr9?9_--5>lV+Lk>&mBaVASL$H@(UP!E>SKX%d zqIvu?0EFyDE0&FKEDGGofSeK~v@tR8{sXQva9#@c@VaSSn2rx1SHs}g@}2b%T*ARi zBr+2h4p6i{#GLei-7fFJdl}nA0XcMel=Wayl1JhHuo}S8q5y}*W3eWkm^B~hlt%}$ zgJ9mcs28UuI5iwmh^3~>5}KC{z=t-(EdaZ?#Ct$ahb$Mr3$G8bF8sH_SDgfnB|{|g za2}4kdL~WW$*sB!;UOG{4@3?~AbNKlElz4~x;LLvGu0HzL5}o=gnLrbT$NhnAgws! zL$m%kBK4U9P}5FAZ+#&XxY8(+o*wsG1+NZj(PTh=5Ea&qb>#Qp>~N8Re0dZq2m#d}9nRmi?##vTl zO3m=0$O#)2DKzvtU5_W6sij(<^Zp@ZZ;+fj!*>kP-q@gOHa{Fb4g&BA>ch=tYWS@) z`8E~ZlAn{0^S{I#V3>YtfvKrmVn`UQ+ERvG!);p{c)ogd%gnhFnF6E-Da}`dOkDs^ zA<^Jv@|Ij{I2a<=bL|T_ZAbi+D52BmW@_>Ws@VJ1BqZbrd0j&=& zIMwsFmKs}Q>cd;#rK9iDTZbbB@x|7m{1#Pv+pyw8*<@gz;~DNu`8Ku4ce3T1>dMmh0YJ8K}^wzfsorER;I~V zTzo(2x&0SjUZH+<&-sNX!bQsQ$7oA5ekqLy)~6xxEeLJGW23iIn1LcvmqF5`dCUEFzcFKZxI(1Ms|i>&j{V zEQD)W-5?m&Xho6br%by~ro|<~ZsgSG-n#*4zq&Wh_o~_V-F*p-3FE~8C3jAx86C7@ z#D(<0c`OBEB94mSyyTeiZaVVo41NZpF`OltwENfXrtmMizn0S5BlADS)EO!ibzmM+L#^pctT*KV0oEz@8OBN^1MV<;XL=^zik3s+zVV zUlbsm!>%xywlutys8W~ipmfwdJJ#{PtJos|PR@AbZzgX{PI&acd1WeHD|hQH#uMQP z`SpH)Iz@IdhjiRwLlLg2{cP9t&|50}&&*#%r{jOS7yenOonsJ}`M2%XzYg`DS zbV@p6Me>bZGdRCM*-u``KUP;f`6!>EVo!bDdMsUjoQ{>?V=^*7yxzs-L7U~;I=ne? z<P=l7^zKU2i7Q~!9z&db5D zK#|O`GgIeU#^x4@bJgHIl}Pi=+H)7~f7^2ox7CzqW4<3}*dbA^u6%YXuS>rA>{lG^ zd!Mh#yIzL`_{4!+5d4;Q+2T6&@8?Hgo)JI&!t+&F%v6K-&f({(Eqg04Y|q}a&iDb? z2!yM7loSTF5G*E)dJ|p^Bg-}16nJP4=eIq>OoJ88Hn4e!7?_8Z?!Qf zKW_7SQ#>iwP&h&F&FRptlSn4H;V%Q~u@`0yg=UeTrC0-0-P`}NK)(i{E`0fkpRkGl zkhMuinj6&_FP8akpkwHTYR-$%{O=Ak+;=#4zF5g`P%pgLg177cda*u(&>(sdwozwH z6>C)U{&D;Pb>;rkA{SvFg~Kviu>|NW61p$!ujCi0WBZ3xe2mvqq#Am)q#+dF!Y>bC z6O&_ZzpVgDYpYQ&74e(Zg)bEpZq#mHCzQO{dv(swePN;2zceuNQP^E8wiYJW+u-W! zFGUlta$<=*X32xlQTZ}_tlUo}ed`OzeK=K#41&2Kpi}=iRl)OBQhB$9cLFF25A|;d z$eqRVIZJx+-9aUl(eIAj2|UnAY6}HdyRZt=O!|Xyie9>2lgD?Uj${_se}L4Kd`ISEgsJM^uWDAB4nA*ei@t+@y*Q6zBaF4HV(dfvd(Y z4zJxFgz zdkzj(jc?9u3^1|55WhgA{)SzI%w)jYVxHB$V$!1a`JJre(s}bbm$4OHb9)!C1)W{< z7xXf9=*^O|=Pm2(Y+Kg3{L+QJ?6R&d#@PN4WABF-8{p1ukl%Yc{Sc za2a04?#FX8`sl}T9af9pn&740_tn#H)kcOLCqjcTrvCBPa6k2*WGTIy9x zKPXWbz8zWsEwHZletXXTc|m0t5e9PEWhfBVFG277poQkAaWkfzn3ejzMj!oj-|?>G z#<#1CV!2aT*$caRz=cKaOP6*np5M<8c}TtSi}A+xh{}7Xa_V~#i-(x}C}QP+LyYNL zn!ZyRUAJUfJe|qynN|+wWFES)G%OT9+|l(0AOw@|sWtDEkJ^-FrDvimGn4N4r7`(p zmc=c=Wm!2vYSOnfi;4_)bo~nunCpgY_3=B1FI4U?hbQjLv3M~C=U84!j{Y0koNH~) z?r2}$HK%QP?=q~3E$^M%($cwdPUq6zt|f~#!ePKzf>J52GF&8+Ri<3ZsQ(nagNFm}lCH(Qoy*#Kmvpq@e_eD?@x&yjf`g=amoA<|GB_Csq%bxMlhK0f zarG}ahVo^&h=937jI!RXPn?3Y@njNC%sX~5>%c(0oFqohNtO4aydYIRi1G|n$VQIf zqTiv^b2pYs)C|DYPt8D-+wq@0G|~WMxEu|{uWXciQ)L@vvPx=?p&U<@hoQVMRUV7- zqEvYX%J4B7{vwp;rpgOYrr%*Kod_9(%Ozxts|XEfXv8%b7yb5Q009oc)lV@g%xSoW z;%dT0d^`lW!^!$zjWT_thuN9%JdQ4oq+*FRZ`?T78s=uIy{WEsZr8&8u3ec*eCUpP z-|gz^@A71+*{QBrmPWX|zw4YVwKLUqh3?9oLtW%UcV&S*{5UT1p(U#3*8?NeBeHeJ zNj