From 12a91f42b6982134236bfab2c259d7ef62f812d0 Mon Sep 17 00:00:00 2001 From: Pavel Maslov Date: Sun, 24 Sep 2023 12:10:02 +0200 Subject: [PATCH 1/4] edited c++ code to return qr code type --- README.md | 12 ++++++++++-- public/wasm/koder.js | 10 +++++++--- public/wasm/zbar.js | 8 ++++---- public/wasm/zbar.wasm | Bin 338179 -> 338031 bytes public/wasmWorker.js | 3 ++- zbar/qr.cpp | 22 ++++++++++++++++++---- 6 files changed, 41 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 4eec5cb..e1f7a8c 100644 --- a/README.md +++ b/README.md @@ -107,18 +107,26 @@ docker build -t maslick/emscripten-zbar-sdk -f docker/Dockerfile docker ### Build WASM artifacts ```shell -# React app +# Linux, Mac Intel docker run \ -e INPUT_FILE=zbar/qr.cpp \ -e OUTPUT_FILE=zbar \ -e OUTPUT_DIR=public/wasm \ -v $(pwd):/app \ maslick/emscripten-zbar-sdk make -B + +# Mac M1/M2 +docker run \ + --platform linux/amd64 \ + -e INPUT_FILE=zbar/qr.cpp \ + -e OUTPUT_FILE=zbar \ + -e OUTPUT_DIR=public/wasm \ + -v $(pwd):/app \ + maslick/emscripten-zbar-sdk make -B ``` ### Clean the build artifacts (if necessary): ```shell -# React app OUTPUT_DIR=public/wasm OUTPUT_FILE=zbar make clean ``` diff --git a/public/wasm/koder.js b/public/wasm/koder.js index a359eec..4f8e668 100644 --- a/public/wasm/koder.js +++ b/public/wasm/koder.js @@ -2,7 +2,6 @@ class Koder { initialize(config) { return (async () => { // Load WASM file - console.log("Browser"); config ||= {}; const directory = config.wasmDirectory || "./wasm"; this.mod = await CreateKoder({locateFile: file => `${directory}/${file}`}); @@ -12,7 +11,8 @@ class Koder { createBuffer: this.mod.cwrap('createBuffer', 'number', ['number']), deleteBuffer: this.mod.cwrap('deleteBuffer', '', ['number']), triggerDecode: this.mod.cwrap('triggerDecode', 'number', ['number', 'number', 'number']), - getScanResults: this.mod.cwrap('getScanResults', 'number', []) + getScanResults: this.mod.cwrap('getScanResults', 'number', []), + getResultType: this.mod.cwrap('getResultType', 'number', []), }; // return the class @@ -26,7 +26,11 @@ class Koder { const results = []; if (this.api.triggerDecode(buffer, width, height) > 0) { const resultAddress = this.api.getScanResults(); - results.push(this.mod.UTF8ToString(resultAddress)); + const resultType = this.api.getResultType(); + results.push({ + code: this.mod.UTF8ToString(resultAddress), + type: this.mod.UTF8ToString(resultType) + }); this.api.deleteBuffer(resultAddress); } if (results.length > 0) return results[0]; diff --git a/public/wasm/zbar.js b/public/wasm/zbar.js index 0311179..317f975 100644 --- a/public/wasm/zbar.js +++ b/public/wasm/zbar.js @@ -33,11 +33,11 @@ c)?g(Math.ceil((31-q.getDate()+(La(V(c.getFullYear())?W:X,c.getMonth()-1)-31)+c. var Pa={k:function(a,b,e,f){J("Assertion failed: "+P(a)+", at: "+[b?P(b):"unknown filename",e,f?P(f):"unknown function"])},a:function(){J("")},j:function(a,b){if(0===a)a=Date.now();else if(1===a||4===a)a=Da();else return Q[Oa()>>2]=28,-1;Q[b>>2]=a/1E3|0;Q[b+4>>2]=a%1E3*1E6|0;return 0},c:function(a){var b=N.length;a>>>=0;if(2147483648=e;e*=2){var f=b*(1+.2/e);f=Math.min(f,a+100663296);f=Math.max(a,f);0>>16);ra();var h=1;break a}catch(g){}h=void 0}if(h)return!0}return!1},e:function(a,b){var e=0;Ha().forEach(function(f,h){var g=b+e;h=Q[a+4*h>>2]=g;for(g=0;g>0]=f.charCodeAt(g);O[h>>0]=0;e+=f.length+1});return 0},f:function(a,b){var e=Ha();Q[a>>2]=e.length;var f=0;e.forEach(function(h){f+=h.length+1});Q[b>>2]=f;return 0},h:function(){return 0},g:function(a,b,e,f){a=Ka.O(a);b=Ka.M(a,b,e);Q[f>>2]=b;return 0},i:function(){},b:function(a,b,e,f){for(var h=0,g=0;g>2],r=Q[b+4>>2];b+=8;for(var t=0;t>2]=h;return 0},d:function(a,b,e,f){return Ma(a,b,e,f)}}; -(function(){function a(h){d.asm=h.exports;K=d.asm.l;ra();sa=d.asm.s;ua.unshift(d.asm.m);R--;d.monitorRunDependencies&&d.monitorRunDependencies(R);0==R&&(null!==ya&&(clearInterval(ya),ya=null),S&&(h=S,S=null,h()))}function b(h){a(h.instance)}function e(h){return Ca().then(function(g){return WebAssembly.instantiate(g,f)}).then(function(g){return g}).then(h,function(g){H("failed to asynchronously prepare wasm: "+g);J(g)})}var f={a:Pa};R++;d.monitorRunDependencies&&d.monitorRunDependencies(R);if(d.instantiateWasm)try{return d.instantiateWasm(f, +(function(){function a(h){d.asm=h.exports;K=d.asm.l;ra();sa=d.asm.t;ua.unshift(d.asm.m);R--;d.monitorRunDependencies&&d.monitorRunDependencies(R);0==R&&(null!==ya&&(clearInterval(ya),ya=null),S&&(h=S,S=null,h()))}function b(h){a(h.instance)}function e(h){return Ca().then(function(g){return WebAssembly.instantiate(g,f)}).then(function(g){return g}).then(h,function(g){H("failed to asynchronously prepare wasm: "+g);J(g)})}var f={a:Pa};R++;d.monitorRunDependencies&&d.monitorRunDependencies(R);if(d.instantiateWasm)try{return d.instantiateWasm(f, a)}catch(h){return H("Module.instantiateWasm callback failed with error: "+h),!1}(function(){return I||"function"!==typeof WebAssembly.instantiateStreaming||za()||T.startsWith("file://")||"function"!==typeof fetch?e(b):fetch(T,{credentials:"same-origin"}).then(function(h){return WebAssembly.instantiateStreaming(h,f).then(b,function(g){H("wasm streaming compile failed: "+g);H("falling back to ArrayBuffer instantiation");return e(b)})})})().catch(n);return{}})(); -d.___wasm_call_ctors=function(){return(d.___wasm_call_ctors=d.asm.m).apply(null,arguments)};d._createBuffer=function(){return(d._createBuffer=d.asm.n).apply(null,arguments)};d._deleteBuffer=function(){return(d._deleteBuffer=d.asm.o).apply(null,arguments)};d._triggerDecode=function(){return(d._triggerDecode=d.asm.p).apply(null,arguments)};d._getScanResults=function(){return(d._getScanResults=d.asm.q).apply(null,arguments)};d._main=function(){return(d._main=d.asm.r).apply(null,arguments)}; -var Oa=d.___errno_location=function(){return(Oa=d.___errno_location=d.asm.t).apply(null,arguments)},ka=d.stackSave=function(){return(ka=d.stackSave=d.asm.u).apply(null,arguments)},la=d.stackRestore=function(){return(la=d.stackRestore=d.asm.v).apply(null,arguments)},M=d.stackAlloc=function(){return(M=d.stackAlloc=d.asm.w).apply(null,arguments)};d.cwrap=function(a,b,e,f){e=e||[];var h=e.every(function(g){return"number"===g});return"string"!==b&&h&&!f?d["_"+a]:function(){return ia(a,b,e,arguments)}}; -d.UTF8ToString=P;var Z;function G(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}S=function Qa(){Z||Ra();Z||(S=Qa)}; +d.___wasm_call_ctors=function(){return(d.___wasm_call_ctors=d.asm.m).apply(null,arguments)};d._createBuffer=function(){return(d._createBuffer=d.asm.n).apply(null,arguments)};d._deleteBuffer=function(){return(d._deleteBuffer=d.asm.o).apply(null,arguments)};d._triggerDecode=function(){return(d._triggerDecode=d.asm.p).apply(null,arguments)};d._getScanResults=function(){return(d._getScanResults=d.asm.q).apply(null,arguments)};d._getResultType=function(){return(d._getResultType=d.asm.r).apply(null,arguments)}; +d._main=function(){return(d._main=d.asm.s).apply(null,arguments)};var Oa=d.___errno_location=function(){return(Oa=d.___errno_location=d.asm.u).apply(null,arguments)},ka=d.stackSave=function(){return(ka=d.stackSave=d.asm.v).apply(null,arguments)},la=d.stackRestore=function(){return(la=d.stackRestore=d.asm.w).apply(null,arguments)},M=d.stackAlloc=function(){return(M=d.stackAlloc=d.asm.x).apply(null,arguments)}; +d.cwrap=function(a,b,e,f){e=e||[];var h=e.every(function(g){return"number"===g});return"string"!==b&&h&&!f?d["_"+a]:function(){return ia(a,b,e,arguments)}};d.UTF8ToString=P;var Z;function G(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}S=function Qa(){Z||Ra();Z||(S=Qa)}; function Ra(a){function b(){if(!Z&&(Z=!0,d.calledRun=!0,!L)){U(ua);U(va);ba(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(Sa){var e=a,f=d._main;e=e||[];var h=e.length+1,g=M(4*(h+1));Q[g>>2]=pa(v);for(var m=1;m>2)+m]=pa(e[m-1]);Q[(g>>2)+h]=0;try{var r=f(h,g);if(!(noExitRuntime||0OBqhNMe%+LcpDD61+N4M5)d&kU`Is^ zf(n8f47ex=0U`uJ35tpw5)K6sBp@m($L~`;8;m~R_r3prp{HxAyQ{0KyQ{0Kdot~_ z#4{y{IaxkU8yc12{#HE~B(j`U)H&(AdCt@{K^o~o({xSOH7(9^43X9vkQPq{83yp= z23^+;!>dyiiUc$*+N*m!(I{*Ny*{5AWsq~1XyhSLMXO>sb3{^xmka9AnxPvpWQgc! zJw{a3bYU<_P3Q?m0>x6SPN1xjkEIki_;rB+7SJz`S z&ConT7kZpVMsf`PM^)0|>j}lbCh*hH98JrpPceprD5k2{ z3s$_~K~S84Fqk)wPiI2lRcJ=FlxitajMr0jL|#NX5$S#r<9CCWAPkWpOe3m6!%8CB zjII=Ike7tBRIfjbWy>^CKMOfZG&N9rloso0)*N&+a41Ok=%$CfzS!s(PnB3R0gT`u zilHKkwxXjUFGGX0(RLB%_xodFVxpp=475l%&5ac2dZW2B*=U_%x<3OFL_i1X{2vu_ z5F$x{jNt~oI%$TH6i0D{mK#wtno32fFd>ypk(ntxUdkXl|EKN37j<1MjQ~3%wNC_% z(zY1%h?Yj9wE~02Xn&YAR=Z%*IPI*NLF2*m1nn1-CTi~)^r*JRph?tZf-|638jW^K+okPAjX8vUMKWZK}Ki5mmL*_T; zL35XWz}#={GrtCIulb4omH8!bUjW);er|qd#;y=^%-QB4+y*lp}G zJ~4I}+l_6;N5&=bocXNzo5(b;7#Ww1OU6ax1^o}>cjGr>ivFwdi}AB@-uTJrf6h2- zoD(OF6UK4lJL8yf#5gOyH{LZrHNQ2E8i$Q}l$Q34Im?`BW}7q2r_JeRmidA{&75jZ zG1Gn(zlvNT@$Z5mMOvA0#>f@@`~PU17ip)BQ|jdh<9vnymEC5ExyuCbiMi9m(7LdH^x5WOXFi>tMQrfsj)!(C|)x8`J$P&kM_|GH{9^N-v9B(|N8PZ zea$HgRLWmoUNCdbG-*C>rY$h%n`w?Y&rF-D&&BXao7zOrK|GH(8=IJq6=H=bG{VLQ z#zrG;t+CG7V5GfotT#S1V#?n0opU~mnv}TnjJLkfddE^g3s8Dc3+Q%u9Ib%9r_9zIOW__mx*lpmVFgV@+;VP!k#47St9JHU(&Wh{p8b_Br|fHK9{yk%dGT z{%50woXtQsF+LQfvK2ZrV%L}lz}o@Gj=PQ4J1@qyuX75N-K^1ELzjS2UqpvQfNZWa zB0%RtTu;dAy7;H7U(L_iAbmHRYX5rYaQuDIidBfk>2Fm<9rs(UlUOi<1qZ<>3Hkj# zbU?oKFt*{=ttYWAGBimX*#zZP>-)RX1{~DE zvIs;C50PyR1e&WL)k)5_#HKN*+U>I<=SpIWTIg0L5ZxO&0SBU0NzRU*xA!;$t90x) z|0m9a3=0+DC!d}7lecR|Tja_GkeQc>pTV!l8t~cvbbIs|d+(cHylIYOQp`XM=!)?6?VoKaRt}+-?3cwX1zhy^c zp?ASh(Z`2$n+FhPD-V+p4+_9#j8ZTboAi)Zvje?iH6JG6hU7Z5$FXY$&AlMI)QPFq z81HSX1x$B>{;OKO<|;*X6{vAsgRuc_#;{T1Y6lZ;CDl3sL zwUeM(ZmnI+FTu2AymUz09N+;MELYz_1HyM@9`Hn@UcF9hRv!_~<=k0k43v`(<4ChA zhYTLWnswCqrp`d>OsA>W?REUW|{_drU#(8twm0)`Y%vN=l%L2I_w;%KPT>dsZtR% z1~NQf>P%|TJ?8yb`@Q&po@y02TN|WhY|(kDuB{P-+DGRCvXia1s0RjH$yH>@pGcm{ z#fO+G%Bd+T#@o4vFdH?{wTgHtYkS-&dB|&12Til{0U#$@i9G1IL*5|ObZZ5C zwOV8=XC~j7(XeBsveJmcKx?deKD(^6U{AvhCLM5`=ELcrbESE!nBot;ZpGP7=N47l zyd+%dh%^nV9`*SH(P&-BgX;Y0R>z3c?UK`8>u%^PqYDOOi8HH3?Us!CjKHM5=QQ&= z+!hm%9x$y;omB;=&!S*dzzc#wo`EG!X^ZOK(;}p+MaD6&Nuv!;!)sEg#OZNOouuyt zFE?#4ov=g%M12OVQ%)wb&39hA<{mofM7L~EhY4R45&AGkY$H9ShumQi;RRLQ(lXQ< zIRm`ms_&@&DsNk9_uS|DJXQn8Q!WI zl=1Xd&0;!&K4yflIyxI#RjYSG_gQXJtsitddAyxG!PkdGhTDyVZsbXH$hq9A24y?d zTQ{adPVd&E;*aYo0nHa1DSFb`+WJo4_qxvu1gbpcG;Z@Gb#~rt^C~^#^lw`aE8>K< zw`2X=)%Nbn2Lv}diq#3&XLGFB>C&!Mh*x=Kd$6kK@$6>9#ExVua-MIOr6#%(aFLVN z{`zu#ZUmxOpX*G{wIZ|Hv&~l2KGW6eEPPf`Laic!=&M?NSck0`()BxL(NE4>9h=aB zg8dzPP#eE$3JUS0aodFjCIWTPd_FgW^*z-4xbl}%&Mlp{IrXotXDvMJwMHoIV$Wx= zVDPo^CVf?KU$>8`YCO|swF8zDG|d;K>gwtA=#eYRikw3|MvED`GpOfl^o8?l&&Jk= zdWz4NP|lF`q0_S0ld;bzF=_z=WAYj2!(M9>I%80(ImbGMr(40(*ZYVTJM((mc<$*v z3r!r-rvaWb``qD7@7u#U+NT-4?o{sEAZD!|GOfz!yw{!NL80o_>lC0~v8)2EccJFs zgFu(D$_#i5w)bsG1-1H@5p{E{f$c%N&%gkl!w0s+^Ob?G`HoNkW=CU9vyM0eZia8J;q)71heAY=k;e*z#~xWvlXV1>%B@;+W)Dh@TkD#Jgx;hCt6o1#h6cVX@qm54b(0Z5;^YHBCd@!^o7K^Wk4yXMx<7P^> z_G`V+6b+L$g;$(?&d6a^X^z~8H0R}EO)X{~T;ZvPOq#Q8Sjf3F>@~`BmfSNL+OEdE z0X(n0x1G6@$C~rpy(?&m)A7F171CPPbjh$@R%Dtd81C|C7pX!q_pg*stftBZ+wbpb z#=K+%VfqFtTQ51)hToQy2~FxU&}FzAcOPzLIx~h}N7D+n4Nov*xB=XzcwpYL0Nb=lQbQ5Z2g_63*5jHI>B@UgAY_Qhj!GI$VFQ-dIAutG7F zYPmX?4PQ1qKpAXc+b3hKB7xmW21Wv^1&pD?Fxh1_(%I(UOW4P{1FO2Ci9tljnr#FT zmFM~x<43cj``W-2ygzOZ(RSzh3GL{!f+-W87xcB0Jn3;~<)m8loU?OM!_;I{rW$6= z>%IO^}^hZ_p>>oHkGFrLIo=lWEX@Uu85Y z8204d6xS{23&dard4ob8^yMc{9ani$oLw1TM8B^GqXRMazJisRDMY0O+on{ft4L>M z<^ZStv^I3a89gl@&tTR;Cv8kU=W^C;dck>SdPh5#D>-;RJwI`)99Z`y_|P0&aMSI)t{Yu&Dk31!Aj_7jw=TeB4aD)zdFo<@%GxS zyfg+A8L&&7l4p0(7AJ4cXgm|1>xgIn=X%nXg89$YCdzTv=8UJDf+lm5@lw!pUJ~Q( za_+)&os$C%-EV#hG|GeX(~Lcs2+ni!>m+9zu-_~+5z7f4iTpsPTyS>IA4Y`*O&7Ez zQC8~Q`+Pr+Ry|*fHaokY&!MxIK{0Xh@Ya zlhd*4p_5!7-7c-_7|W+(($84lmZYR$DIlF zjA2FTR;K`z3ic@&dN2q>tlg9et@9esJ6^T1L2q<)Zhh+ka+pryKhbecyfq2>W7yk| zLGB0MZk+KU>j+^D0Y$Z-Yd*{`Xj8T&lmVvuj(e3-v}Ygwb0Y)Ts^2446J6}g3TVIz zZ5PAf4e%589PbLQ+K_C*cGcSItVqFohTq-`o0hma-wS*1kMP0pf&jM=I?OsP?3yr# zt?JmTprEpYXOUggItAU#N|&u~1t1k$29&#?sok+={eZIAFW9A^`F^Z5Aw`wGJLsC} zS6mx9gJ4A4IX^JBc-rS*W^NT&a>#4dvVwN5O2pHizepuAxHpoRrxI5J!))8j7+?ax zW5lTJj9d0oH2SkVf$c%2od1LOVbqJrE|e-SgKQ#l>RLq_PkT?UN@Q?pB(YE>;%Vp1 zSBb?yq;ds}TN%k!qH^JBpLoIfF+Vlqz>6yLUSQTo@|3DPCxCf-uhx;^2?AK?5|7mXG8=DxU^h= zDm4$7WqFD>22Vs1m#IWN?Td?5B73@w7`;s#FG-MG}iuBA#~9TPl&k{77PnO2pG%`?g9{U?g#`O2pG%`HpkfyQ!ii z-+Aoa)Qt11RMrznD2Ze(Q(5t}a|=`=gL@;17gS;<#(SpPQrke-D_>Lj7<<448Jig? zlC9=j4icBTMS!qZzoCj`F#4DaGdep`CRdfo!}D8V;`QG(-O7}(thHn`RU%`eiycbI;MAjfQ0m_xE zKdt0~mTRk%wIo8PmP@9jV95K`sdYE|PbwLT3al|uVJ)esT(zH3K_z%RS#dgFf6xJj zX5zXV#1-9nVBOa=yP(VZZPbX*e%X#zDq@7M9vX`mNahQjR~!4ladwfy053c4G~JMt z@TH4hS&lArZr)HEcG~0(*HFH*a>GL=Yorm*_>BYTJ!i|t`c&YY+E};VMp(}9JYoIf z?y>#D@l1!Lk6{%fYc&>e!HhbcXS6}N@iW?EU-b5j>U7N6F{6n%tvkQZNa^~25fO@r zyG;1p_1Nm6c3RdMvSNLS+{kR_&B9t#T<~$>V*(q29$OB;8VnU}q^yD?MGv#h({F1E zo)2yvi{)_N)@I%^_P4R|?o`^gNt~%s@Wr+`Jup?++5lJ_It(6IZ>mv$+56}_mg*ks zSLe+gVajyw**R0a{kXHM)A5r=T)`*Z@Lcgpj??GU)->D6{IpKSY~_YyM-Uq_>F&A_ zL28x(@1M`ctHPJNC`A`LTRHx0?U}T}imf2o`KbW{K{+bkgzX& z2?hUMWUQ1bz`h6^uW=~Obsr~p(Pv(c;k}G`nSIb}FFdGt$vPNWx{(MapjgR8vSMXE zfPZ7pcH5qKc1w}d_a8?1(LNbb#e2rB)12D>6*axNlHLD?a zkn;;p=8`#W=Qm9AqDylrG6KOgckV~E`zn;dizzN(Obmr?1= zrb_vH_0}H!-{~{*-xw_?{%_or)8-Mz?%pD2%>m=0s$7)JEK= zJe?uT^@p%wvrT8|XOp0RYJ5HzPw$?aoo%1n3c3w`zkBw~g8%UJo}82mMP6&2u68Wz zKT?CD3_J9O7(?MPUBz^w-SXFNqK%XLMGOBPcmN_U#m}5Cz8HuteVs4gqM6R;U*6p% z4_+zzJPhSmdG_XrbZa4F@&PDJNjY!=z;aH?)YGju7{~>%)EV>DokHqPm&>oy#|6hP zch;#y))92|U>YrhLos0ViWRO)Q4SH*ly=HF0v9+=ot2hOkrQg!NGBXo%U5;k@wYQ- zWdW))D>=xZYV9MZQ~&EJwJNSouef;cKi!?`i25(?&e~2@pB1aKFA0e_8MYOxsWR52 z`~Sx8b0+=e=vr3sP~_|y-rw@GYq&P~P+GXhEOL~G)&$h)R+RFW{PpNscaN@RwIC=IK&M}~&jvh2!LRIF2l&qYjGw%}L#})wU^P1%_<}h{ z?=Wbq^ZoH*biwI+VmRRNiD&Ta_Wh^H7kHUOQ{k^p!#*s^&LsB7Z*>}+ya(B5pInS} zvFQ&#in3Uz=BdtDa{qPeHoD}jIn|=-Z@m3agiDHNTndk&ld(SR)i0e2f_kmfyXfhH zGpBnIeeSe9lLMzq@tNv4)cW?!$aq(w;Z$HzJj|d)&akrY=@X~#*=2a1KRblJbOxWB zMqd`}JvWNrH}7@+DcV`E^?V(EIra0iczNs>osjvdUmvGW3V#3fVL@Lx_x(N%i`0%jA9LVnwrIM&W_n*LD}`TGA+uS$77%tP$vJre^loIdl9Vc_|P zKlV{s!PbjuL{B?ET)M&h9Hv9Eyv|D#XoFnir4JE}i=o-n>3JVjp^h@iN6o0S?CGO4 z>LiEz@aW;Ea5HQTp;FcMk5wyPt(j^c{m&@bD3;pPJb`_2`Kk-6u;O;_!;GU*{O}3$-RQ#@HwKJ^EB$r#%nTq9ci<-9Q z^CJQOLy(UbICCykEO;Xvk|`S-Lzk>8fN>nB5P)WqbzBZeppG@Z6TZjcZnj~7e9d`zbYSu{*K?OK(14Hbb<@$hdx3}D&Xe(8Ss7LVL46wfRr!0aXE>*y=Fa4_|+sx~=!f3}8q z_al5;oU);v<%2g<)&G9p(#!{a2k~)>PfGn3OpE=}z6I)MF1IN~cDt3TbALVRHoSv2 z@y~`Q$)sDU5<2aF$eDdB<$4_@g2r01d~*Obk+y#HBUz5fg^l|w65Z!2i=T4X+G+l0kGZT?fpE40mua63+%cJ#aH0=lvZa|-q zudE8|d2EZys>sHTXbKYEZbavZ-jIu%(4CYYzSM-03~{)Uta1&AWy%|`p)NHu6IC(H zbzxtjF?Na8msc_OB`2JJ4GqRhBh6MckamV|ZbiEc#C6(3rB*IUa;rq8=EUK4EtHmb zb)X_z9u9S+TZxv-$2!pxQ6glm&XkNe+`coxl>1r^xsLkK?(mz}L5yOTkn6h8aKz#I zHr)%?b%K1hE8Q+W74k$^>cnx~ZuDx^k6A7GtT@aV1^Qi39_mI7>0=qwon8rU$8rKo z0~rNUh4tsV?!L>9yHji0{(KKQLW{yjd(ar7Me^oeG&KeT6*ce;2l?pTG~Rj<*Opip zVh-`h`&#~SH`S1p`_XMOc?dm7hvf}JsSBdHLn&2$KbRWI6O2FV;*TnP98X(!=LmPM zkiCadEwbgI`=BA`4Wn0Svs`gMq%lrr-h-;T%EcTVkelzJ?KDWvz8Bn%lbi3Q4hekH z!j#yiD!Zb0B>DTj)C%itv-_Y!JIPz`qn=oN7u`q6jeML}Wzu{vnG_RI{a(13#;@Q4TLdZGe3YK^#6E_j$)&_{CH!_+JWX9o~?&~N8H zpAPKn@|tuSNx3pFovuOjc{<%vo+rxAl|Kxp8gSaYE&`qg@Mhx?ZLJqz$o0S=$B5zB zA>_)JhEvbK6|9x=mtxyksr^H-`ttD+)VWTCF^@XK<~;zba6W|5tyJp`5rhGb+76CD z7w5`LBdBKr-zmU`g$+ZsyniKEJwn(1?}So3rr*HPrrb7?X3~dp&?tJ_gd56wO$N7! z!A1dYWXM5?B0rp8xipns%nK9&-zKcnLY?wKoB zuJBzVj6Iyd@NpA_ZgrMJ$5Oq7PCl%opuqMBhN#t1=8mP{{T&0QT6p7qd|=^D94nJ2 z4jgR1K^yZCC70{US5eh3!@8pTT40?iKffck;L3Nz$jztD?AQ0%Sc(El*k$r=^ga{Cll!gL^U6!ey|sZKMI}sk(~P|HO*LCqt_UaD{&*- z_EN97>D6nD?|T6|4NWDeb6itDji{$p2G>#UlZ)Szh|{i#Nwz* zba5rb$~t89fDGlelhE=Lv2y4n>UhnGSnFF{aO1V(CqF<{2OBE$YrqewW4mBC<+DCM z;N>}Q&zGM}LKn`L7bj6Db$;XuTfhe7-a!?7K*ssnPo{Rz_G2egM_LztdooSajji~A zM3zm)2pIb$eM8&BgPx+51UX&Kpx@zT_$`yVA?iE@7E5mUfhmOD&2E`Kl@|=TW-9c+ zZdrR8HH+O15#UTOn1B}TmP4jdU!<&^7a=rY+%f)9DLOmGz*{ z`YApj?EDBECx2W@jlP`3>L=h_zw(d)@>8c2M@+5v6aKrf|W62~Wa_h#pYH!oo8s#s3URqF6qF1>+D zX1_qgA*u^6V40_UIrt?k1|Q2OUZQd0#2I<^C3*>~|Fa9JGyEgr9g9c^@bYOMrGS_3 z^QdO~S;86x;pCa=fg~_sG|)3merB82K0byo!;xkrAfS{xpMb)F#2!*-%9whx$0{rvD(66Xa254-v)l5acj+PNUq#V! z@4Hm><`QgW?UED9G3u%SOQEvMQFmP3NE%obHRTm$rO-wMP;&kmRg$j~gmBRu{#R(1 zmGYGWswamRkd?*`-9NLh{P7>Muj1@&s(r2d8nOL~g#eCWwNX2vV~cmA{IP)QdT_%p z0w>AltD!6o$|qM-jjA`M`ko~+A}hBE9x-dJeR9=mO2YIhUadCQr&rU=xEp!?Myw3q z9kR(9N^`E;*nn=7kFKE_;$0z^uc7h2{j4GP>*H`WPA-0r?(-dB!~unHIur)r|G%@a z{`G5cCIC|vyB@^uDGsw9IXbYyk&~T@xHIHy$Q)$5&R?ZwUyyyn*!DGe4_$Obj(ZO- zJY0#b$|IdO={}f48S0LmbzaU5Q*z3A9XQmeC>4L}_8cp0mr^sfq;T^Dn`Jm?_^J&~ zL<1UIC5ha4>n!&;S%m}|MM87tu1*OjuBClC{UOh+qn(J>ucuzH)r}7^*MAS+{UN@Y zfz^F>0}Q7cMR5U24f#XRayFKnE4b5&+o0O@siA0Vqa0jF3+SvoSx93M-L;AK((kg( zW<`3;@@3&y6T$C|InC6$|wjwn?kQ8VqKD%i2jWRc#d-ks!qy8r(T1>=hm;isL>Odl0mK>O%1dE@ zL5KdWYL^nYA?60N{!!e*JA3^nr~CVBdzYi+B6=mv&N6b=LEj$V4LRo_W6EyvJ46cW0g-9V$8AI&IJ^hP>ny|8`tdx%KfJSy z$@(Zfe+Q*gOk2kC{2MRZeL_uTqfepIFUl`JrF&yP5}|l|jJusLt-dBA=C&guwFMo-T z1Q8FyMPzy|Jnk!6F6dIY#y;#?=!Nj~{j`wl&dMll8AaB~L5WTF6Rq*!=G(;+*;jqlBjfbYfXo(8M z*B94^;Kc^a(`mdcGQ@ypDp>?-2duv(b1?z$R&ATGHpkjKwRGzWN!t`-%L~6)H$a!qj~+$}q6 zitj{5o*-|AeKro4n}cR;%?{wcahfJr*CeO&iJf&?4|&kTyxI~Q2JoW({lpIkj?k?C zgg4ao5FbeVy+|mUkL&uu2;j3827~T-UipQ89c#Zj@Mg~_3^c2o9k7~X5j1ekKv%0N zmb^BiA6vQXt3V^L0XiGU90H88^WobG^h|}O<11?Fg92+Le}lot_SPS4|J$|yjWOF) zw*)*m;73OOE+V`tD0&$2C58APE4qm$LLv}nEt6(lQLoZ6BNXQj!Z@7Yct&9MURxIn zSy@teV_or$f!VXDk@yDUezLLnE*9~99YjkJexs9sowGx>zE=E9g|g9guvbbG<)Q0D z5OG*^5u=4{(p_v9=ZoZp?xIGE3#|9KnHlQ72n+&DtBH_@X@3}JP2fW(>t%d^!b==% z0_%e8*+VQ!{heC@WPL~p-`=6|ff#nV+n{@;hp3)ZriMny0|bve{D&6(Mz-jQx%aYs zxTpAm47iF!UHV2o(M$BHv=EH&@bsa|7%P?u?d>IMWniZXJ%;kkfvHw?L~84a)fUHq zSk}?i?EBp#?}aXV(X{oF@<9}(J3$s4QWZdtRps9PObaA_x`^LI3W z(T1R|C~HXhust?CnXlJWz6-lYhBn!sYOfKxhb$rv>Px6D_;yPT& z|Gl?JjhQ2OE$5|HX3i0bvSlAp6KOa05$&+_KhsA%g(#-4xRaih5A+odqO<)(7ulho zc+Z8WBg3Qp#k;giHXI;&AsRaX{k{ucV9_yt7hflWD6xL`hFv4`2Z@xFoJgg99&zY9 zq+ zR1UgTBv;{A`*bvu%W<;-Az!>j)Ts0%2AG|B^$4*+l&I1d(p<#B$&z0w8@h9k33SWc~+g}f6k z3ttNjX1HBe;Z`l+^2@d;c9k>0E@vqESI&^4IO81P4C(gXwJe^MfG#L#Eue+(Gp-2G zY6X=5+6gEl***a9fI^-CRHmTwfU-W|BAMTN?K}m|22`w|TtFujv=q?nb(}9BP`-lJ z11eNdF`yC!?EzG(pi)3wak701P+5jTUI3V>x-ts_%~4PepgaXF1eC9!Wq=A5v>H%} zf=)s5Xf;cog$Ee`6OnvQxwOh9U-qpl`Aw|5>=TE*8COM&mvYIY*i|%OSMn(OSIHwq zNuG0{R;1fYqA?UM0(g;u?C-qx8$JN@0nB3{55V`Fv=YFFegGM30j*$E5r9oz03`sv zW#9mSJq(-xaDajH0M0OwdE9HyV2ZN=>|;W?0CHjgECo=)dGZ0M%GLw;h?9x|Jj12- z0NBGoX$GKGoOTL8F&Dc4z+oT@W8h0BeT=8qw@Sh+B(xQnh=fm+OQl@Gg~wb8|4c05 z(h5TxaJhg{Dk9(v%q=vQ@0Z&s`d0}f#hrD?fm)GnXT8TmXD6UM1?>g2UO~qI9Z*mi z=L>Vbi-49XC>xzpq@ekLPADi3P{suXt^}CvP8LA93MvA$OhF}p)+*=#pkfz-P{0rm zJ8l@*J8)GfYs(u_E|i?3u27CEq3o?7lnlI-O9jQQ4m-fEP*C)*LP3fW3gGKLg7EywAXD0Gk*n1dz|bP5?(3*b86>0~yCS6Ayqg09P2e2%v!bJsZ;djDh(8 zBoB!^0J%JFRsz_`m^}~!SYR=5OTZ8?JT{b1ZJ|>CKAd}Lc9>TT7oA-JZNIJX?pKv; zD^3xSuPXU+1YUTb-dOWS;%N8c#aX`5pxia*!ZZIR8pqMk^1XD?KYAy8#FT1nk-p(# zK9G6CMI(AXymPpCm~e@t%}9|6UwL?>_=0|s&yEt0(l2525v7+TACv5u^>wfE#jWL}@}3mc<>kpD zw*tL1rWc6NTlpAvirt=nTnzO*eYN(G%zj)fOq%{rER2*Lo~X#e%TFj4K6pahQT-3N zGy*XgH~hURe{TotA7)M!d}P&4Hh)s2m)8Nd-mXBt0!JeyI7*gJJO!I=zg+*6xCLg{ zi_=7{Mr;PLWv)J>@xYJQ3DzZBo%}tG2LOLegF`u3rSh%}?26~gi5X&`f00msy9D1t zS?j9hiW>BR9FZx~aPm7hQ}h7x z&gmE_hvm6U!7jXqridX`p4EAur`g4^^);=H7AC-(d2R~#O-jTGT$8g^f2HgZ$?KV9jE)2&a{mD=8a> z@CMmF8w?zkPPQ0CFUfDSMRRdXmsMwq1Jz#9{mB>^u#xduT9n-mSLayv)*^Xuu4wAv z{;)>NF0(}cI?LvHaZ1}(Pe#7H2#k8|+z8Ac;N{3GvqVkL=r*FAKT*z{1#^6KxaKqB zJfV-?m@lsFQZmnLH@0eqJg8LJ+^CLyYaY8XYT|NmSAvkk+K%n*C|p5zE9MF^<=kg6 z7)HzdXGO2XwUHENDL(?s%x6VoBfxBToFksCrf8b{_loejU4<6DEDz5SXR$pTC`B{b zFGu)gT#kst$SOyqz>I$|N7!vg``{#FcRm~o9&G77_Ma7du2yUTzw9cj9y?DS%2BLd z&Jiu6y1|9!wJOQH=J*2DniGOS$ zzp@;(Km@~k=ZQ}VeabRT%$ny_BRwANyENC^KtnId77Ikxl*;LrDy3vPdmgWY9W+0( zWy^*j1Iqmth>?gsSRiIqQ(6BM)m3g5%e$TzkI`be_jz%*uUiniaQH7EP#K>iI%5E5 zNKuVmRf5A?{~Xa+{wzgf&<*8c1dfq+BClBpk=gO>H=#p`Ae=a;i zW2NT>(bT&rmfau*_U@fuz|L=pYtgDB%wQA0lWq8N-j1!rG{Dj6#;y(l_*@h3nc z`R$j)2xNTwCGk3<^re_DV-|`VQ(ngm0khZzvXbr24|o4QRvug^B({3H7AbmjUKX|D ze~z%YkXbxCSFV3qj6#-9ud6KG7l~Q_r9jdv6$>nS1)J2P^5#6zHm8B{v_G)4fN#ILMz@7?|F`~ z|7L-_BToe6jAf#IJb!}2U$DcjgXesl+_g*`p||9_%f&R$tL#E4mi7l&Xl{B_tj17_ zUI9h*lGmQsvpVQrzKvM{lnyZ7+vCLY3tWZ;A2$F>gK}538!m z^L7gNeg{g5R)y#0i$z3h!p-01_&t8lqwphZFtYikP?2aT3*HlL6S}F7iT-R!2DhZG zd~&0xB2$+GdMbW}E#dk@v|NWi`t&(U+Diav}52}6`Gon-Rc}w}Z8T?{5%KWWj8)QCdo0vl@WmK_f=)DmuI+i`_ec7Q{Y)0axVv&Q! z&DoA6_C|U7V^IrH><&>?p4=|p4u0zX@f6q|fLfx@QFbM)$Tk9|4d9LP{f{y8Dwa&9 z_hsE3;+^1USIYv5lwI}rvVj^k@vZ7!ueAoBrywd&-?8u;K25O-2y zcMWTH3Bm&w?zU6l=E>Udub)6xsCU9H=)ezT-Y)Sut(W6V#ESUmaHL`f#)QmN`+(1W zO*Y*vy3ytE*xh1M6m1Uwuvg$FD0IetfxDIi7gW`TVCnp^g z#}N(v2Il!WdH5UgBBCb_!9dKFFB}pB+wRug+r{NB^N0r(u14z(_4ggfnt_`>)++rD*X+>nI8Tf(A;BMO zu_byyQ}==FLak>kyC_SvUa<-G$9{hzryc|rXEAmr{$z?}e;wLL)e#M{V~1_dwz`H>$4Ze_@jMx zc8os?e0m8~g8 zPzd}{x*{(=>A;iS?`SR{2q2{KmyY#CW7F1rOaVPzU*NBrW&n~SkBVwF6h?#N*cb5} z!>I>5lHKzGA&(yt4`$qbwKp_A!1%Y`(6~1=?hSMV_Xa6Tm)*5fAoFr=@prlux4>{6 zFkDm}*Z|@)B<9vSgHM6poaKEGGLH7W7qw;9&Mbs*(NWP?gqwbc*(7f{E_#}{_3Y~* zUp_8+nK_p43z8{6iWI4z5Fe(NCHNAXx45QdtJZDWwrk%ctwXb>jqI-7y5qumc>f8p z5BEW<$nZ(A9oJ;1`~W)v=Lj25iPPe2s(kyjcs(^UPSX-KP3zY5=D|Iiw8J2%;S=-Y zz+;W@BR`5>dd#{spMKAK7+s&p!n2|u)MD&8u@1Lkwx1I-<0vP56X}WTvED!Qq5cBR z4~q?Yer@_h797@Zrxh~xhW-|NUN;a32Hw-`r{@?xai)%D zzb-p`tEZU7cyA?lx6)hbxJMy#zSX}+OCS4AFThl8dR%W~UYuw6n#;0cBP1_YH{zn; z%XAE1S2?AF-W4x<=kv>9ynw(O+4O|o18o_9LT^zO@#|OgX(_ZR+%Uy>Oc!UK4ZmK) zC}=EB9S`5x$N0RnIB_)GJlmK@H7|eX@g)uo4h!BByf=7X@c!Tf!3Tp61s@LLQ~Ki` z+5EWP$}BzZsmKZHds+6IWz2#5dH*cqHB>j{8KaKSi_duE6W{5p%&fDXKN&ryUYJo_ z0r~lt@Q-thVU=ih_=d&C2g5wehN7cN@D-QY3+wl7x>>Ku{=?Be!k{~jxJqSowWc0k zKZ6>cNLz3Oc`VIdELZAgs&^N^R?_VKvP3u2y3RWq?Tbr6=9CnE;s;0f79c56vv(n` zQk9YF;pM@kh7{5+ah@d2o+;ZHW|P34V|c~Tx`;TMFNyFEf0pyxXx}?AMXiMVFwSfr zrOLM!@}%EvpAoIzG_750p)~^B7~uj+abO&5X{{+jzm`H9icp?E6KSw>wdNJ_Gp+^R zuR(YMd21B7y9xyu*B5n2gvdH+jsK3C93NgMI!HLMLfPnQayNh6?B`*}oi}TLImP(KTi5D6?7} zrc_!Xjd{|~ql@rkKCeUEMV^f^s|LCLc0hF*CbSX+{;kG)JmMY*J>`18ncBM-!0Qou zBcvi!M;LI^_?AP4T+^cYkRjv7-}msSdnP>4``#WsG;Z=jkibAdE=^0upJb?kxDP^K zc_q$FP3Q-(Kf(Y6Y_PP3^8IKtwFQ^NJtj?y@SX{n85xLh141PP9`igj2O%U$@|u;+ z8v))VYk19CO_;)cC{zHD074KUgm8owmZPkskX$Ncd9KK!9>U;b~=KE3c-V2a+D=r@HAE;pZE(jACBZ%m0Z1x~1@ zT4piaA$=3f2EnueLK}fvMk0(t;9nMSk02h6FiLKTH*4c>t!dh+{z99K_%VeZ8i!G~ z4}ZUk2b8uRMW!O2#%Tyy2-6XsMwo$+jljQB<`9PQ54e{gGxSyM49%n&t_bDBXnK?p6TStm_&^I28m`TMQ2fj&J&3FSCP)z3UpdQFwF8B2ux?0 zT*P!fOf=K_GanYx`S+j7FN>6a2YI-BKEf)5cM%E@RwJxIcuzL1V%Dq1B(wgBq#RYn zY?Q&t#s8EX;W#oi+KhPQ-eDu|Z#`tl!y`xYY+@<<(LF4wNS?O$J~Cp&u<`d_ojT3` zL;9nUsdd8uaZN=6t?wN_d9+(xQ(ZC|1o&4`6lttFg;`t3$d7&&^vsC&ov z<_hrRJjIbb{N5dK81Y&JmfZUYA0Vtl;NN{nUyt}h1Ww<8uo0mULH%xUdv24ac~pkY z@??_PNLH(AjvvfJY3o3DDCHyOAM3u-2+V>W5rHeV=LB%}(mbzk2knW_{{+Rj{!it> zsvz%AHviR+i!Vhw|Nc&PXarx8?0Vqr3yZzJL$rR7%l6kO%4GM+{A9D1{5(0r^;D!Q z?hx~j$uEq+jISSoE0SLdoL#!a>%$*>xX~ql1jU&AQ7Nl|{0G${Tn|P%|Nc(air_1f z#eq6@Pp^4>FZr@=650LM<~ZC!jZmvjQmCDUd|3W1zLZw-RN^_DwM5t76&jcPqhX0F=`nS1k zw2u(zfViW4pq6=W7nX?!$xNp3pU5E1-kFa~gqo?pO3 z6Yp?|c8w72hPXQuy|+74ITxX_@*k-9QPf_$+Ut8idUk|Lj|i2XhK8X7w^pm6D{7~!K&VM2iel=uH)MGEM_xe89d6t)} z3Ln?TlMPc>&Q3L}u_3L@1b9ZY0SE&*j@W{&U<*DpZ0!B_4Y~J`38TiV1%(B%N6NZp zJ!K7FfQ50r+=kbxywuc3sE)wDeu!^CHB`^6QHK#FE<(EvRosYh6T)DG+Y#q9`yj5Woitx zLz?}WJYUbeD`WL0uaB@>+KCuP#hS))x$RzLIL0Z6&m*p|8N#3I^Lcp}$3HHJcP3DZ zxRR}~E|G^o1lt#T_7<fr5DKt^wrqKvomEFEKDc z2RQ^qK?RHkcu}r^fB``eQG*5ucT|obD5xmEPxZVYy6$)P|9{ZaHC^4+-PP6A)zv*Y zzb|3@{)C(fzKAUMr#+;-`%-`?-g%eWCSEpwFf~n(M!L{6UDI_dySiug4x(yMzsk))Xv@RHAGMi|b6qP|B^70syP%oK@Px|cvyi_|nj zH=@W8k&(KHs;XIypcpAwx-Z(8PVPd z^6GjN)6+b$LMNdaNm2MOL_{SmuD0rdrVDfl9m>+QIuvDinWPEoNCv5RWD;l-YKqhJ z2tiR*yej0iX+~Cx1lsGorq_8GBs3I7U;tDbfvF-wi}5sWLYfy{Cy#D=h`fd`CNj!XCC1b( zG?xDXM-&+eHiK!JiqLya#70L)M@2=6h=>RyUN}vRB&WS$I9-iKq&ZI+&9XGp{TUG+ z{x8VT`9GM>K_r5j;RZd8*=Qujq9!d?7!fp_j*6qgj3CMu+1bM5r7W`dUEC>r5v`(W z2>38m`&7^q+ANcXX&E$JTW8P+?KhJ~Y8Oo!g;r;c)_yYSN$q`up3({odRhw^-f1Rj zHu*}$HS?1Bh54&_Nfa8tm{-l8A&8gFE9Up+1+(1TAkLeo=(7H!eo61u>zsK}KWlzZ zXAnLR-`#-u7MO34T840e-WTQidA%a;caGMI)A~uhBL0wm);YW()g z^SF7;JZkRKOU)zZVe=5uO3Y96ug$NJb`Vgp`K9@}8M9pEm^00z#%xbY)^B3A`I7mI z7-zm8z+t9#%#*Sc+s3;PB*8SQ_U&nWOI_aNS|m#&#wX?;bGP}ixlUiF?=p9qMdl83 zyP2`g{LtKLZZTKutMx*2v$@IKXl^hw)|(%g@0$f?$XsWxG4sug_snnja>sjV8;0b`#rPh1d-O@1yiGfJq0`t<4ZvfgX#*gw8}OEOO=BdI z6cFe0oBV>7aA81hVa|90g_E4Oqi*`WMdqJcbSbJGopEmQW&g2VpZdo7Dk>$=xhJ}H zI`=A|i7f65Y6}XR{4_d9BRX;aoV@6@!5QBp3yJpp&qfb9n}KX%bTC3?D|IHvtTnHq zZC4#T_FgJ+UXE>9a|S58StGfI_I{&|hztrp*<5FsfzFlK&frzMxJhZ(^K&+E-_54_ zU*a5%do)rt6>M>OSyfTTV^*_7W{hCQfia3h(a}B(K%VtD_dGRzG}w?6Kb}gRgh~#Q z^53lFAx6Dh`7TuJNvMSk4HJeoM0wTwUM{x*2Xr)9_#*}f$+mhUnX4c*NX|zIjiOMs zJ7y=GYY8`1$FMSi$Zp69*dM7%a(0ZoeaY!vrFG9W7da0yY*0Wn`Ru}r-VRwUkgEVd z_L6M;41Psczt4`&w1({v7fc>243(HElCey7cE~$2wJGp|It?}&YmC8bf zG{sk+tpzlD321n@uL}VvcC%b%aY}Z%m-zw~^4p3qFZA{h6@7G2w^@KNTa|RNPyo*1 zBn4w#$qafm+utQd^I-yRN~%eh96LQ=UIG1WPE>LOythd9o9+aCAh~uEg{i2JN6T%# zpL*QbY;f9>84%3O{N!c=(YMLdJMw&w#6;Yb^)c#q8FzW@7R zu5b>dXa4tAr8rMjU+A_B)3BmtteepIik3C;pA3Yjo#v0|6{C0!Ht>|?+AAhreM9%z z1-`Herb%y~6X^uIMM#n})X$4aDqjYMdcdukN%OCTc&FRe1R`YZI58uWkx z=DR%id%|2#tJ#dzM_6+?{cDb>G)MR#N19bRXs`@x)=B4Z&EC}3X;dpUp|#HkmRgw^ znlDQ8^LSfdI1kq9M~j>_wVKnr`QO!wqI#c^&u_T7PQYNy@{?7l2lN`6Z4C~Z85-1? z?uX{KmN?bx%%?Wa`*nhJ+$pIuGj`5Vr6OnqcsS>%^Gw~_ql#nf!*PB+)!OdtsGE_s zP3NgvTrB{#kHH0GCt0hg6NIh&dSdzSi9D6djxbe}Q&UuowhNA6Hfo@2ZRe#BAm*fI zd)z5`#A{P4O|$m_Ku&j>W8jW>1C;L83ix`p$X3yqea_^1tt;gm4J!=v#;WbJbB^X8 zsJF?aLypsAFdcTTHMu3KY@^q$c!ksUrmD?f5iWN`h6YuSxf$(`MDKzgR2Q9TwFz_G zEg((nRrI2s2}^`u)M3Cn?_?v}T<7(hAEvWT zWYfAeneeY7OdsZmZDa=Zpeq*PwxFthO@qyl)2~}+h*K5+7wJk%i9s#)K-fUvHi ztl|d5@kQpBTe9NK`T_(!)Ej~OAXHqNG7l52mX`z*Js z)>++78f_;%>FZ7+%N<6-F!Cfi>il*~HJa+AHETdeoo>yZh%3`m{F*N&T=a~yqgj97 zx4O@Z1XOv>Y0&&RYVEw${8gIa^lDKXE8>$a?!)@Gx5a?UhXr>!g4GF{&*oT})Be_5 zg1pKr+k;g-%d?x!HLy6_31{A|6Vyak3_jsxwCq};&kcVB>vNs+xmIM8BQ>1mEz@9+ zY-^eAYIYs~R#QT)B>u?jntf2K9T4a`ttZeA&Z^c8=}`XHtviv|?M^Gr=TvW-R3+N& z+_%u@qkQ3)b56guA4Rbeu{U6r40Y0Ot7EQVDF3e8;!G;ef3)K+sv4n+cJ{?_%=!jx zjn_1%Q>R>!v)wt;X}Gv5oW7l3$0%Ly+`!tTr}%vFst__;o1CUyo{O2G_@?;{2;mH8 zW0!*X){sIq$ykZ-{K}uy)kpNIGrOCO=Yek1(4T?b>*6`J`~6Ox9*yaB=iVN5qu$Yj zrd1gu^|~{?M~&3i$xmHkSlwBxpwa?f9v)VYey?+^d*}RJJ#MC8kSHt`JiA#i$eKjf z2}rz~SIhsU=LI6$IeSM-)Ly%{AJ4A6o8tMe-mm+PlOL8y15LAzI}Q5GMoTvLX%O|+ zjV%dQ!lVzPRX4Q9soU3fUhJC^TkINygz=;J`24kfcj#imcIUafZ%Lo9-L;ea6bJpb z-D@}D37F-pjCNX|=kLAyQ=&c2(tC32w#7z(CA77#fhO8B*f~aHbqXt*u*~&#w<*@* z{DK%Y6?KedGlDcf#|Z{ddxD&dm>;r#<<>2kQ_`$?q|s1tMqsz}I|JM1}l+ z=iKzrtyJh_K2#gCU^bp@oev&L#}aYyp}|xlhhrB~t(pk;U}naPMZoL>elr=`wo508PCtM-T=&)XikHTevSoa!&e1)5i7 zZxU~4&e%uZre#j;M~B~--#np&HR`dIbR<9Y*u7@dLL&fE*I(IM=p+xmH*p*^r(13N z!ESu}U~8N+d2li9LY#<_ptdorZBIL?{X4ET0A3I4;-b$b4_kD7nps$>=r^mKT za;pn!)--Ns_<2zHxEmwTvF40e!;C8wM{W7a?`jC>1mm zat9QRvi^oz)PjOR812;mS21;T-pWdG(w~dMy1hHAVSc~o22iXW@cE;#Of09M2LrP8 z`O_-j`N$9SK%_s){yKkYb_&ta{0%Rp(e*@UY4#mXqw&pQnv%@(tu^GMVq)cju=lzpx+UP8tv^s8)P%8!29qU6%@jIoPnu`MAT-%iBG};`b zEl%IfX~_D-=7vT{1ckG7Q_=%lFk~=ezyp>LJ9;plnKoG)p{0a%9#8Bd*?{9bV2Yxw z`3#=+m5{{Nl@^}tn}sj&_as=ZGbjIz;+$iX>p^Z}rX-m$cC7VVe!VFjh^{z8r`oaO zp<^Kg0=m{?73Oc4>LFht-cXS(tSio*X|0=GrtsRWva+FQ6|&K3vnRvNO4g5IJE`n&Dr$g zaN6!Pp4l4D!81G4_Wbu|)*#ArzIbUg<>mLtNy1D1qq7n@ZS3p^@jN&?hjuubP70LU zL?^?z7-Q{lRyj43CL1vHEOZge5FQEqz@Yr>eCrIN()^xtnv%#l>bx+wCr5kdR!9Bk z=jPBwCwpE4JXg(|NFO>)<=gaO{t>yJ5G|Nrg=nku?#u1)yzp{Wu~j%@7o<8h7rc$a zpDswl^V|X_4*K5R;ARD4eRi>vv#?r|?CsoNh=2=Nzfb^Eym)Ik)di61r;&`f>Ks}a zpkJJ83%5G`-?)P;x21x<2Jt=Ng_m-psQ%E^EBtvtHx7=$SR^zw+<(=lt)4ow!xc zKm$!#^(>~KzPdsDX4Waf8W`@QUvuuu@05ipg~J9mJCt#z`%ZL+s%R#zxfvU1T@ zb|~BeRejp46tBJVh7Ay4s}5_l_V$t+k^!q^y9|c1pP#S;c{g$0_GHtyLzdP;XKl@P zj(r8TFmeCS2>Z%8_-=SnaTS48F6?xe(L73AP}$GZ$WFJ;L;tg4XRBQSz+$U`a#u99 ztJbV@D2siDosE5daf~%QMU@^9fO(&V%-L{Ra$y+XcHVc~T0HGJi@CK5EI;D4s#^iO zKq2w8*SJUquY{3>3b`98+-$pu0VaTSNT8y{X+;+!ApjMK4Ow6llisIF<7t;lm6t)b zG#Oc}ka*gcaut%nZDC}oLgH!X%~8lQB&2c$oVGiht6b&6)1LCO%EjP;quwl4!4-wY z)4u9r87v7G%|62{nR3Q!uP)YF6C6tbOWnF=0GE)WQrPC;#^$Q*OU`&ZtcG{4&}8=< z((Ea7RlO_R5}d+TO_t)TDpG)?17W@b%r1556)Gg2cF__=fx#(ZWRXJRX)kk7c#@2GqXmWK0Xt7(C!U7n|q43>qFQxp5bRGFKs&AZ3Z#yW3evv3I|&GIH`&7v$6>;W8^!nLMOybITyXKCoOB;nWE$ z6v(M7!bJ*HkwQGngpC)w@J*G6!Mt#uB9$j=pPLD9cF9{R6N3feOvNe_o_5I^g=8>0 zEJ~#ciKl&FtwJ(5r9#e*f?sD<@QM-|9w2hNOTNI@!QS|@9fuvg#}Njxc7UDbw8 z<}{%3-*qx-)+-`xVgE60mVnNaG+X$cpYzYTn?aa5bIEx>KP|s(O*|zm6@DLlM)p;$ zJ2n_5b~$!=e$2X>REO>69N5i*?Pl19%Lx0QJJAm4Te5yPvh(i`rIEEPOsBd_raXUA zK^nER?cb?nDJrn*K!uf~qH^8zMg^5%j4Hzkr=ZUAu{Ffoy7T4xt!S51>4QEZ+i)KJ z;2^Eczis_TR9o$9SwRf-)kYt|6ZGo~ofjwj>S=bYVs*?ZbDC^SjQ`S2-d&LlKi+ z>Vfj@|(2gzQrS$xak79NIcwuXI zz{=BMKsUEz={cpPZj|g=n1f?#ENrTie|o!s3C=e~R<`?gpsq?cE*m zJij|9HWqYXa;R| z(cWI6{Ds(hzzYf3U2QL&;pHVrf$%zu&Ah#>#A{uFYtuecg85&froo94cTWvu7H0Ta z;ZT;>y1=bldB|&TIHX#)>`-_upMbP7w{ZmkRpZtG__xL( zBN~V2UpDRv8pncdm!lyID`Ys&ZCuu+-&+R)Xq~+cRa|j7DeOx~JE+@5#n6uc^MrjB zl?i+0VXsxJ+Y1kZsYriE*lP~6epdq^>=QtvSUJ#0=VG~ELx~^c7P=cAe!-DnRuUu6 z9A=seF^-_Q?JMvQg+TKR3gPwlLU=);B*uZ&zo+9RlN)K3!K}FvftO5fr9%9c6+Ng809+rh+&NAv=<{J8$gUN-LblKW&q=0!KD5Zh7oAOeEqXENH`0XXB@- zb|oM=*yz*) zQD^cOH%EUCpJ~`N`I)o*i{5Y=RQYlhO>;i{azOjp@OasmU}-N^6J2Cl(>Wy%fJ)g{ z0h9rFl~LJxrnQiPTmbW&LB;*WB;DC{Y#3V8>UcZ)-g)+TCp-&}H-g*g{P8rJ>_ngF zPY0cUo>&8ASnXsr`qXKC(gysTf)|`z5BQ!_oc`pgR)F&q{K=_JdZhJJ{!6ECA)1lD ztt%^w~HJmrU_*hJL(@tk-m)=9bC7CpH4^1X1Dy?gnl zs<|=XRRWwYaFW<5d_F%l)`yMbPnQEAka}e=P0s)BN*AI7PSc-r(qA^PLgFC9WUXp+ z#qlCkI>gul8Eb)a^yi^*?i_-Pdq*60B0HQ1fBA;?I$f@=z_a}7K>E_@^Xqu}GXKD@ zPY`|LbiDRFeUiWRT1~vnEu$Cdlh9K{I?-N((aMy-oxE~ccH6m4}Wl>^R2sQjYW5u{zQp19t9_ zSlFJR&*hpJ8YtU(X*6w?!=tE*{K!iyTzE#+w(vBdKiHi@xUe|l6-G)MS=mR8skQ9r z1Esd|pFToTEG?GHd=zS2u8vyNE|2viUahHWfBn}(wRMJDxg6F^5r9 zv(Cy_;;Cv?cPGmHh_q4_8yMOm_r%lRVy5c;80%lkTWWnN8&;wmIx06+qL%b!=t?Ep zMRZ7hn1IPRLk_Egs95GCQ&qXT3i&E4(;1q>HJzgXbdYv3CCUL+$f9Zg-wH&@GgT-$ z)E>MRR2oWdLT3oE=Vlt9Q(@?_W;EKMJ)y5!(wzoWLc`l=8cmV~w^18JKio#yh@NUk z4~j`bTAe9De$$TnL-}-SPkYFhlgQpV*pNAivRVgv0f<*R(Dy_;fQQ4-=%y}PKUpr2%) ze$<^VgckIpI1+0Nx$+(wj5w5hFFgX^UM2bbeRQA5H{`+ls13(e@26L*?&b;Nvtl81 z3XFC^x$l0eN4w=O_tPtZk1_MQtNnlgR#?Bk>+ZW;-=CV%$MQmdI!3RA4m?03h+dJM z2hccqr3!V3nZ*M0{0#zAR}N34r4W}&RS9Q5b8Z;+U}d#0QX<0pqU$13i=6)@o8RYS zTP4cfg4n5ao5?%-p>pIvy3en6OvU_OVQ?(aebv=m#H_K(?NDt#5|?5BKz>GgAv*3&_`t_JmzFFi!{s;Zu_ zw_~WfBcXg7Lwz4QR9lU@Sc1Oa=x~DtlJ1Q|k2) z)k;0aRRuMBIrU_<3vBdIJ7O4$`((jGD0qSkwjX%nKj-toXDfV?aG=BkU>9pveNa53 z;VPR2dzU)kmJybNu-R+7>sSu1Q;CLJBp(D?)8+U7pj&D!<@*1d1+2^IgQz-nkZ%v7 zkLg4C^uyG><7mI>hdqHlJ7g2&VsNX*^1;WZy^WW-RLy9);d-D_1^BojbJgn~JTV&dy(d_~=?w zGtkbmwvumwNm1eT$&1C>W7&ZyK8@xBuo%oVG`y}H_!zw!ZoTaJcbI$~<>0^5Iy4~X zA5>l1|DaKEe1H%8jSX2C9nqnl|D>)&Yh~dute<(0!^jvp602uxxpX9DMBxMh);G9$ zQtll|4dj`}=_Y9R^h|0Tg<}hJG7xPS$a^x8{HC0mNkiezxSWX|7RY*osb58=2xOWz zn5w6|Dg2(g*jD2aX>Af1DOaL^A3Fr~7Ra}TP#u{vgwp?1wpyBI{h@RbcGQ1W`mvhf zmU+}kI-81YHz;AYQmwZ{045yjD<45=hKX}idDl?tEZ-VR?f&Km^2$j zwd33RFbNcJ z`J|iu{5~7H7snkX^5Q7En~Fo-MpHgfdFa(yHL2G(z^kvve!e|NYNWYuXr^_biRq z>7!7}^O*ItE7UTJRuVXIDw}?$3-ag-)Dcn5aa4y2LU)Ygo#O?0=Xf@Vno0|w$TUoOZl6Q~C;&IEcK(XSII8Bx`V)I8=wc_iC#u-kYJ+&>YPZGoIK zk?y09Z6|kv3gePk;+~W~Se$tLK>f%r*Uq{wmfU`RP*ddAclLiaAgseXpWb zD?@c&rPm0ryI-TfqpeMs!9rRkS1hC6O;-t9>zZow9VLH)ziJ1qgJ#X*yOL-!Zu@Lw zCBpNsVOVL zQb{Xhc|Ij&u>X>&H5Y#5TXSCJ<4XZSwr=vegn$}iSXEzemO7HjEYXWe6!TVh6{vuFZxr21a`cg^&* zj!zMWsf(FlXcVu@(Ee6ynYWgBBmMbWDD1xSgLPD`%32XNhpeBt_tu9vE zg!Nd7J_=Xm}mRkbRtT(w^Nn#w>3%VtyvCT@0!+GHK#QioJ2_oRh; z6;`L#`{C1<8`Cb3uO9bih3igMZCD6L0NXc7ZiGvp{DzZqUx2eh?<8RP=ClO7YSwq$ zc3kZxe^&VZ2;Z}@esFI_;$s3GWszOid=&@-8QhA?PP!w`o&V1j^A*bq7bmej!iF(! ztU$eP6Pjor{wJemi}=vg_vtI0uF6L@(r!dIZK5vpjvTWI+ToYbXPfZx4Yry z$K|Rm@K9}$JGanWx+n*3rICpCZ>3^L{M#QQDv%SlVT1OoEZYWi`;Z*49kTYT%-Rlx za80(^p(gf<9W;#fT~ZM?Ck3)k5$0uq99%>-V{Y1_5jINZi|(S9Z}s zXuka)(TcB-0iVbKiY9*+@-6z#Fj0_l&V=kB`B2N z;wvUQW!b0nThqcMURC^YBQP@C6wDW})U}>yj2AA^y^zey78FFCA(_aOoh*|-qt~e@ zwD~hi6d?OM(V#%3CqIWNOEYECm-Ma37SbrD_c$&nhBVC#eN{|v3c41W@HPE|=>5={ z657G<`A66+xfWVqN^u^v`QuY`QY=i7@13T{eJ`bP8~lMxyD(I%jJg{%H8kQ3JwS** zIZICyO$&8C58odo>Zx+tnS3lQGl0V)`#9oA#3v9(AU+wo_X6E6VE!z+2zf7;1s5@= z%0t&KQa?d2%YHv%{_T=AE`z1J(A7l z<7q$B-5ekNnTGb82)oCchyjHq7>pT(TaHRR(lFpLNFU|SjqsHrh_rimXt4cK68F%w zH6I7QyJBFk0xAg*fP^YW( zypGmxyGE}>Us59*)NRAsId_<-7M+vK!yZn^6&>+uEl&+rl)uv2uS9pE39_aT{*(zK z=<61Y#x|{%A7@xgbl$6>tTiDtPzawu6@v}Y0?})R_#2|jhIp5rly90M714H6v`>B# zD>~IZB*&(+c@@M6}qzg4j4l{1T4SL)~LV z4;H_9mgr+9kB4#44(&uo3n|EZH9sDPHC|q;A`;^m9myAnf?j_FW>7|=s7E_Py%Pnd z+0M{|RmD3x%@4(-3RviiLhaJTFg@BGVfX?tK=Om?B1N94F8b2$P;UNS<#c48(DLFBvb#SbuJmfHdovWo2AK?D$op6?)r zi~KzYCcwaT?);*;Ja@a;DdudK?{^Z_Zo0_Y9*ls(=R03my&yzSL9?26Nvt(I0O7M1 z;ByS#_Fz%9F3O0`VsYvvs5l#mbs+fo63s#sg}t-S2HnEWA}ujTZG~}Hc8&sA8in<> z{Jt|}X@RWQMSMr5OzbLZ(buwVSJAyvE*ipv;X{>CRtyuG-&Iu4f*FF_lqk5sJrn&V5t3_0@``8 zly`}TtKp!{H%y(b@Tf<^m_v^tUVO$eOYZ9}lIV#1rZ)uVh_w2MhVc8{)<@ioXha`z zSNw)eI4Z^p%cfa0*l|XF(MJU6Oz27<(SfqO_;%~K7Y8oB#u!q2$#G`3dz%8Vdz%6o z?DBbDYcVmN54Vv5^Uj{&mTbf&b8aXJ*e!_+_Sz`EYRE|_hy*Tp=~%c*>AhQ|(L!14 zZqd^CHQE|3AGupJqbqVgCoIA(Mfn9M9FWodM9W5JBbinnN`uz2V_sh>%;N970ZnIV zj2>)7LmqR!^I}c+`JR)5`iZ1R(Kckc-YdXv+mOvIXC=U6f^xucIgZroyO$O2A5f}) zoCWMd2K!0@_is0#-1iwO2DCvzCjcE#P&uG83c3pDs)D9`13rAfCFTHHrl2K&3Kg^x zP?>@X08PnS&l$G?T&bXafc7b<1W>7h$^exs=n|mp4O}7{9CIt40VqeMRoJX%&Au;#B1EgT|nDcoR?7A*Rr(Di&QJkN0 z1Lpx(a2}Wm_4B%}}IRRjc7eG0HlMGx1aDag+r*VUjfjI!qGqB{eH_M*P6jvhYCni(? zASVjIHURrL(>?&IvJwE>8C3>gI+wZx-~a>J82on`H3L8qm&yg;Ft7~34@`LiPmfcI z!OSFd6)APHTn5u&dM)j9-pufP|2Us*V0Qj1LA^`6*Z~(v-21)_sF>nUJF$S&x_?UqS;LH{t+ME-Z zE7urWh@^ZT(iH$MFt7%I z3qixs0tL)b~NrAQsES z^MggN$TRSKQmVC0el}RlLE=A$i25W$bB2h=2{$Ny8!EDKfgtM%@i~ro?;a+erk_H4 zhGDq|vhE16g{1s$gm@HDpOK;f=dIpRAaE3ZYawAj?inSTAo^{TXrb@>DN^noB^og> zZ?s7DC@04+a@uIrTq>(S2}>A`wpAZ6TXID|EP9-LgfX{2_SZsi7xn-<)$TQ`SwZ_P9 z{}KxmC;wH|L*y_2y0Pj3 `%J}2%^+l~#qKMJzLpJ(Ds53GoUol^y$71{E_b0V{% zA~a_;t|F@YRj$)7@ho8i3b3G zQi1~_7^N~j86kj2)?CAFUzh=M(Ku1f99=Pxb7`x*dps<>rSf0n#bmdWwZZxZ6Ceh;+}9?M zh8Yvk1J#j4y$Q~UH%$^!uvmBjZm{5`zIP9JP5 zqj3*t>lE0!o8`|_(0~*2uBq4!z9Qe4Dw>EjLKaUIC350y5f^nUzSveQUn&>R7L7d2 zWNU<^>7tihFkN(PJfgX{H9CRMKFel%aYEQaPXb&ThEcg)9ESO8vVF2}I>uu}=*V<& ziEtAA&$;5Z#^tlUb^|LNAL}d67|#W4r#z5>2B?fHz(u?WJI`SS)?CQlGerX|?+*A)3$uBa?q%@U1UjPSwr6ZYJB-~{vF6R?VgcSIV0@R754{SIAQxTyDW*I5?<7ziwI}T6^)=Fv1kXLNNqIhb%{9Wkk*!pjYZLVu(y!E~ft1{E71Fat!(PLPJ)Fb)GfsmzXP4mkPh^`le_ZSMkj^ zv@*QNqh-#U;ux;Mje1Lr_q>M8c9HCxht((HZLtP2y7O&l)^}x}4=}#%SBfcao&q<| zsg)|vf>p@#p8Ro@cLEAKn(joqWTc zj7jUnhtP7}Lt;?8`>_mvs_r&Bi<{j-o__-ON+S!zLzoed7hqeRCtoQ*Ki=Se>~q`L z{(ZFZb@{{l75x~ZKFNkAm+L;gk#6@9R7ziY z-$&vjzTZ>?XX9#_S0w6r`@-pqRnb~6j~9upF0!(Ge%NDyt28unfOH@bnuU%q$ zV6XefL|}dZY6?3KWmm(YjtjL4-XdSw4LKb5v8Ws_nbH@Bjjgm>V8%dAsI?knhYPo; zbMMFEoxo?;NdgL!%>OgV8uj=KiE=pi4tlM1>XQt9!$%f)!@a5w?zJNPWdbWE6uU>{ zljj3AzE??Wk4Ol8{Rxa^S})u0gR0yh2k#S~VQkucD&CG;9RtPe9}zTD?Gm58P5$($ z=m>9f+x_C12s#>CcTnJd+R@OCuQ1qD7`n4W;L_X!@|i=TR}z0(vOn6|i_4J$X992& z!8yskxE+VYV{}P2I4n*hN;m>@{*s(~M7)fsNhyrS0@CW9b>VLTcWwi zg<9vBIK1!Ey2QlWyQ0~GBKr_hV-RQKzJX<5iHWZ4vzNw3SMu2}#74*a?ENv(md`#A z8;w6U@>NVUK04nR8x3FhTKtJnpIsCKGs#{U8y)47`A0?NtnXr?JwAI?Y&0%QZH>mY zCy;L0IY#*GH(~;~w!pXI?78?LVt5KnE@8cCV2}~xk{Let!7%3<-2K1Ci1rvVf#yH~ z#|3fRikHekZIrF!qc3PKeMFY}b5R%yjAl^h8?Tre*n6M^%mw%}*}uoRVTrJ01aV_v z6r73#2P++onj zM}|H6n19qGgPwTev624ApLl%q}KuyX645og7$G?{W%ypg&jR?`wR zP3zd`?z=iSyp?ZR`NW!7v@$*P^;ywHkNP^pr$4+7Qh!!9xFC9B|32n|SRb*Zwr_m3 z>}~SsPohrfk?%$SSjtKmfdGUB ziO1x_C-jWgGiMsUxcY%6{$aI-*2=8q_XqszH2V#tit{z`r4E1u>stJ^O4ll1OSo3$ zTH>{;*OIO!U(@U|x#fi33U|-1p3uJmKTe(0^UadkhOdbnajV`W0)M;E;g@&am)tpq zuY)|>QtzO{s{$tLUGb5~%cu2D=wj(<{U%%l3st(Nk57R*otJDptBaRrhALGv@*9X5 zWucF{8K1QkQ%-~yPBvzfSbSPGnQA1Pg{M8g*Oy(!FI-=wW^csHWRi+R&#sYZ9W zQMybsUPmQorx`VcUUuFi%TDU=n#(SD!VNQU0PwwxpJ{Xvb1#SPpJ@!Lgd0v9mKYxl z@)SLUp(~gF5@r{yo!f+2yYDYYBYgxxoO~?OSEVurUsDfnG=mzRz^w(2EY04+dE$_4 z@I&)j{M7IS?mXwIq}jj7HoBPsJ8F<_CU}n@M`{AF@_F4%^)5Pr*F?>JQ@*O34gHt+ zH4ZF38R?6>7XE4W3B0}&b>bEw8^)R~Be)KKGa>JfHd|&z@*95lHWOL{#Lz6-6_n(_ zX^rrX{ew27snD_!D)KJ@t_jj_x*++8yu( zXj%(|-N;;eLjnG?Pq!kyigrZe{v)^JZiIda0fZnz4TO7SR;*doycghoOr&}& zmp&72hrJ|}?lo7DXJ0GKvwfjYqwt5mW8jnY>7};r4bqZN#-N5a42yG}TdIDh>0{@mFZ8+i)2*acqZ&t4|hSTwj z2I^VFV-beQmhon4+i{$ZUkOm-5l=v1N)r(#AxuV?f-n_9{dx;+8i45t!{n@ZvoiiD z*wT3O$I8p3*C)NZdkAe7aI+QutxDlRT!Ul_Y~Wwdo^BRLWjR&JYz(JTrOIagmMkod zfMxkgL(D&ZGEt6iN1B_eX{BK*OOQTHK3myLrR8#VWwV{4vMEeu;a^ZGzJbbJz1+5} zP*h?QK;<1-E5WSYi`&oySpMDEh8s&4g-hpgX@qwX-b2VoSc9+@VI4w9z6_GdOmf*@ zk(6I0nDrI9>@U&jRm|#HEJY14O3aKq{x-Vlz=1cncx2d+A%jLg){VuK@qPXSzG5~E z|0BNHBcsO*cS}QIqjfpJ^Y6wEhnX%nR56p4qS?koVsToS(ql5dlYa1;`b4l zAs-;DN7#VCzX`x^M7#-s@tY9}5w;-k&)>%#j;(-)$@>${`nVlDF426t4~xbr$R4*6 zC+8|RD=`fv_{Zrp!s$1*J`#9)+Y+zuW4aV3{t2=Vlf9~f_(Az(RdZlhF1#&F=+8v6 z!|68?En%X$uX=q)sHCsk;;$4@f09`po5wau;TFFNtZErz{xR_lVVKjqhT$8DZ$p}$ zz0B*|Ov~+a;YR+9kyNa}55qPwJLr`l3T1*H6K}RqUxO(K5S5r{EPgY7b2Y2E+9|H}p(~p>c ze^uuc#)a#=;LX0~X>EvN%DlfjLMeKY+BupmF zB{QlT$kb#qDJ^d5gsILnmi!kQP401+?^ZSu`EoZ ziA$q@I%u?1H0-B)K773?Q~nE?uJ^i4X{E@p=T_6&$o=W&Bkh?hwSeXxmHrhO;OsMb zkXt$vrqVV{b1<;YH>(H zj(^Igc&*HfLsx`02>cr|5H}lZnbqpv8>UtcL|?%7A^Z*DE`+-g?nmg4@PN#(W!Arm z=@cQLyrR<+oaJHOO$t&H!$DjB+D0aRM z@8v_a%?Gm%Z1MUi3X+BxhumsYqdoHoGECSC4B|P6Z`gm}PxSe`yj9{K{9R`_8wg~7 z==D|Vpi*5TQ$Pee274tC26Psymbol_end()) return NULL; - std::cout << "decoded " << symb_p->get_type_name() << std::endl; - std::cout << symb_p->get_data() << std::endl; std::string data = symb_p->get_data(); char* str = (char*)malloc(data.size() + 1); strcpy(str, data.c_str()); - ++ symb_p; return str; } + /** + * Returns the type of the QR code + * + * @return char* containing the type of QR code + */ + EXPORT const char* getResultType() { + if (!image) { + std::cerr << "Call triggerDecode first to get scan result\n"; + return NULL; + } + if (symb_p == image->symbol_end()) + return NULL; + std::string type = symb_p->get_type_name(); + char* str = (char*)malloc(type.size() + 1); + strcpy(str, type.c_str()); + ++ symb_p; + return str; + } } int main(int argc, char** argv) { @@ -89,5 +104,4 @@ int main(int argc, char** argv) { scanner.set_config(zbar::ZBAR_CODE128, zbar::ZBAR_CFG_ENABLE, 1); scanner.set_config(zbar::ZBAR_CODABAR, zbar::ZBAR_CFG_ENABLE, 1); scanner.set_config(zbar::ZBAR_DATABAR, zbar::ZBAR_CFG_ENABLE, 1); - std::cout << "QR/Barcode scanner initialized" << std::endl; } From a5a07d17198ce85280fb0bc4ab7c4b9a51817695 Mon Sep 17 00:00:00 2001 From: Pavel Maslov Date: Sun, 24 Sep 2023 12:31:49 +0200 Subject: [PATCH 2/4] version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fcfe3d1..d7dd96e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "koder-react", - "version": "1.10.0", + "version": "1.11.0", "homepage": "./", "private": true, "description": "QR/bar code scanner for the Browser", From 95602b54b5b292356403b2d48e4198516ae5ebdf Mon Sep 17 00:00:00 2001 From: Pavel Maslov Date: Sun, 24 Sep 2023 12:43:14 +0200 Subject: [PATCH 3/4] minor --- src/components/scan.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/scan.js b/src/components/scan.js index 7b428d0..f967187 100644 --- a/src/components/scan.js +++ b/src/components/scan.js @@ -8,8 +8,7 @@ import "../css/scan.css"; const BTN_TXT = { START: "START", - STOP: "STOP", - AGAIN: "START AGAIN" + STOP: "STOP" }; const CANVAS_SIZE = { From f44ab98bb7fb3ce14f86b4bf515f994e9891e4c7 Mon Sep 17 00:00:00 2001 From: Pavel Maslov Date: Sun, 24 Sep 2023 13:05:07 +0200 Subject: [PATCH 4/4] minor 2 --- public/wasmWorker.js | 1 - src/components/scan.js | 1 - 2 files changed, 2 deletions(-) diff --git a/public/wasmWorker.js b/public/wasmWorker.js index a61aecd..f7d0116 100644 --- a/public/wasmWorker.js +++ b/public/wasmWorker.js @@ -20,7 +20,6 @@ importScripts("wasm/koder.js"); const scanResult = koder.decode(data, this.width, this.height); const t1 = new Date().getTime(); if (scanResult) { - console.log(`Scanned in ${t1-t0} ms`); postMessage({ data: scanResult.code, type: scanResult.type, diff --git a/src/components/scan.js b/src/components/scan.js index f967187..c739acd 100644 --- a/src/components/scan.js +++ b/src/components/scan.js @@ -144,7 +144,6 @@ export default function Scan({ setBtnText(BTN_TXT.START); await video.pause(); if (video.srcObject) { - console.log("stopping video...") video.srcObject.getVideoTracks().forEach(track => track.stop()); video.srcObject = null; }