From 05f5d6ca4f274ae741c74311bc3a55cf5e5c40b6 Mon Sep 17 00:00:00 2001 From: Laan Tungir Date: Thu, 18 Dec 2025 08:34:52 -0400 Subject: [PATCH] Version v0.3.21 - Fixing errors with adding entropy to file --- include/otp.h | 1 + nostr_chacha20.o | Bin 4568 -> 0 bytes otp.o | Bin 1480 -> 0 bytes src/crypto.o | Bin 38208 -> 0 bytes src/entropy.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++ src/entropy.o | Bin 27160 -> 0 bytes src/main.o | Bin 12160 -> 0 bytes src/pads.c | 79 ++++++++++++++++++++++++++++-- src/pads.o | Bin 56792 -> 0 bytes src/state.o | Bin 3048 -> 0 bytes src/trng.o | Bin 17744 -> 0 bytes src/ui.o | Bin 18128 -> 0 bytes src/util.o | Bin 31952 -> 0 bytes 13 files changed, 201 insertions(+), 4 deletions(-) delete mode 100644 nostr_chacha20.o delete mode 100644 otp.o delete mode 100644 src/crypto.o delete mode 100644 src/entropy.o delete mode 100644 src/main.o delete mode 100644 src/pads.o delete mode 100644 src/state.o delete mode 100644 src/trng.o delete mode 100644 src/ui.o delete mode 100644 src/util.o diff --git a/include/otp.h b/include/otp.h index 8f443e9..4ec19ef 100644 --- a/include/otp.h +++ b/include/otp.h @@ -208,6 +208,7 @@ int collect_dice_entropy(unsigned char* entropy_buffer, size_t target_bytes, siz // File entropy collection functions int get_file_entropy_info(char* file_path, size_t max_path_len, size_t* file_size, int display_progress); int collect_file_entropy(unsigned char* entropy_buffer, size_t target_bytes, size_t* collected_bytes, int display_progress); +int add_file_entropy_streaming(const char* pad_chksum, const char* file_path, size_t file_size, int display_progress); // Unified entropy collection interface (updated to match implementation) int collect_entropy_by_source(entropy_source_t source, unsigned char* entropy_buffer, size_t target_bytes, size_t* collected_bytes, int display_progress); diff --git a/nostr_chacha20.o b/nostr_chacha20.o deleted file mode 100644 index 9ed69116b6e492c9119c7462cb5136fde0f0e6a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4568 zcmdT|Uu;uV7(cfitkaEFT+AZGG)84aXtps8A|XS#?nuBW*o3I0bX#%Dwr+H{W+QH5 zO3kh}HG9}hAAHz@(LEW0feaGJn1ll1Vd25>xCb;PTXY6u7F?X)@7!~`ySvsHebFyF z_nhzd{XO6L?&-}w)(^h!(KMz=V|&;Nr%=YS8&=j$V%fy1SS5Slf96q`n?G`MaFJX3 zqW=Q(Uzov)r=~Q)OTQ%Aq;9#LeV_r7xMVT^J6~@@n2^ zb8s$^KmqYcq^5v)hXW%kE|H^|d}xLj%tQ10O+9bv4|$ens?*qzNKl)xd=zXgO3{UG zqeFK=yJZrdU#m?%ig;GKt9;a#@}aaV9T9I_oem)6e9@3a5>dLVLfUB;*(9Z1#54I2 zx~qKHX&3RKv|VXeBJCnI`HxrI_y4SRx#{ftBRn-9q~>3s7bs64B?H^&gHXCNwt(b2g#6AQX?g`khD1^o26tMBnOm) zvVE)0((jobxv@r???PpZQn`!5NaLN5R5>MTW4j@F@CaKT;nuOmn}thE7M`k=oXzP= zxMt=WagWVlL{LMJj7!iJXNW5vyoEB4@EL5vyoEB4@ELv3F-aDN!yhbs1Hw@PB^$kLBfDx=WUD zZigk-JZp`L!zr-)(`Tu7q|mg5DZ!F2nEQvWacc~nAdi4rN)>Zb?A8h|w(%FMMUxoo zL<_8HuyIk6!C^CbhFZ(+i3}R%ped3*Xl9NR=Weu|o`w7SIAWeTbe6J!twmleo!ZDg zb5kEp4URIyXX&H&zlN%nhPO*iSidsE{ms+VQWHFl8N2>|0>Cm0vTSe%Ueumz(Gb~v? zNoLD)Px91dq{RH`MwxUW|LUoN>C5*i= zhBgS$Kknv~D$9K%)P9=@#{j*JhrS{3sb^o+dJiWJ zTecfG(Gfff@&g6=`@o47(W*-B{lx=?AVD9|0G&d+E4iNXdb_lOk8vmvy@!X=@fGeFKR_t z1C5QO{}s(3Q6rk)paJ|#c|f8zgdLOkQ#eQ>Q4g9wqyhbt5*KwKEKLLF?xrsYfc_oa zAw;4sSj2n!j6|fhJxYHKb)i<)GGN5|B1TUnxuYS{6=Rr)vtitmtTp6>2goUnM05ev~Bw_P-m z$K(&qE2I>!eM@l+kE% zg0$xNA|To+4eUA4x%jRt)FQ~P?dMf^G%PEzsV z-$`;i!Up&*8VYmj_5IEK50DXF5ob@sPrtMef^m?lpMqLwf%tCwtcveS&TWr-x!C!g z#@8Crggr5wA8eJqI=^DEVUmRbkx$0Qw;}E|w>{EypB+JL90o++*i+%@+75eyB*pA& O<^N&23YPZ5ZT}}vP4J5V diff --git a/otp.o b/otp.o deleted file mode 100644 index e5233df7b3fb6d506b73acdc6aa02f4b09935175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1480 zcmeHG%}T>S5T4ZfQ&09Lc!?(!?2?pv@gRXx+k<#3cq{osMVo|V1NNe?;3N4MK88Ml z&cqoKHVEQX2e#kLH}mauhso3A;=E&7AZEcC)RC|Nv$fjyD%XQ;=t1U3MV7W=je$*=EAWp zJmUf47M_;g(230Ke~by@94TP*SWo$;iC*volj1k)?tj>Sf+E@lvpi$MZeEH$y|ro7 r+tgD2naLR!la46S?=s&*G-pStSJq1%m$%;9|3?4D`YRDKnzQ-@z}P^7 diff --git a/src/crypto.o b/src/crypto.o deleted file mode 100644 index f147e39077dcfd2a55d52259b92245125b6b334c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38208 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 diff --git a/src/entropy.c b/src/entropy.c index 88e38f8..fa70998 100644 --- a/src/entropy.c +++ b/src/entropy.c @@ -560,6 +560,131 @@ int collect_file_entropy(unsigned char* entropy_buffer, size_t target_bytes, return 0; // Success } +// Add file entropy directly to pad using streaming (for large files) +int add_file_entropy_streaming(const char* pad_chksum, const char* file_path, size_t file_size, int display_progress) { + // Get pad file path + char pad_path[1024]; + char state_path[1024]; + get_pad_path(pad_chksum, pad_path, state_path); + + // Check if pad exists and get size + struct stat pad_stat; + if (stat(pad_path, &pad_stat) != 0) { + printf("Error: Pad file not found: %s\n", pad_path); + return 1; + } + + uint64_t pad_size = pad_stat.st_size; + + // Open entropy file for reading + FILE* entropy_file = fopen(file_path, "rb"); + if (!entropy_file) { + printf("Error: Cannot open entropy file '%s' for reading\n", file_path); + return 1; + } + + // Open pad file for read/write + FILE* pad_file = fopen(pad_path, "r+b"); + if (!pad_file) { + printf("Error: Cannot open pad file for modification: %s\n", pad_path); + fclose(entropy_file); + return 1; + } + + if (display_progress) { + printf("Adding entropy to pad using streaming direct XOR...\n"); + printf("Pad size: %.2f GB (%lu bytes)\n", (double)pad_size / (1024.0*1024.0*1024.0), pad_size); + printf("Entropy file: %.2f GB (%zu bytes)\n", (double)file_size / (1024.0*1024.0*1024.0), file_size); + } + + // Process in chunks + unsigned char pad_buffer[64 * 1024]; + unsigned char entropy_buffer[64 * 1024]; + uint64_t offset = 0; + size_t entropy_offset = 0; + time_t start_time = time(NULL); + + while (offset < pad_size) { + size_t chunk_size = sizeof(pad_buffer); + if (pad_size - offset < chunk_size) { + chunk_size = pad_size - offset; + } + + // Read current pad data + if (fread(pad_buffer, 1, chunk_size, pad_file) != chunk_size) { + printf("Error: Cannot read pad data at offset %lu\n", offset); + fclose(entropy_file); + fclose(pad_file); + return 1; + } + + // Read entropy data (wrap around if file smaller than pad) + size_t entropy_read = 0; + while (entropy_read < chunk_size) { + size_t to_read = chunk_size - entropy_read; + if (to_read > sizeof(entropy_buffer)) { + to_read = sizeof(entropy_buffer); + } + + size_t read_bytes = fread(entropy_buffer, 1, to_read, entropy_file); + if (read_bytes == 0) { + // Reached end of entropy file, wrap around + fseek(entropy_file, 0, SEEK_SET); + entropy_offset = 0; + read_bytes = fread(entropy_buffer, 1, to_read, entropy_file); + if (read_bytes == 0) { + printf("Error: Cannot read from entropy file\n"); + fclose(entropy_file); + fclose(pad_file); + return 1; + } + } + + // XOR this chunk + for (size_t i = 0; i < read_bytes; i++) { + pad_buffer[entropy_read + i] ^= entropy_buffer[i]; + } + + entropy_read += read_bytes; + entropy_offset += read_bytes; + } + + // Seek back and write modified data + if (fseek(pad_file, offset, SEEK_SET) != 0) { + printf("Error: Cannot seek to offset %lu\n", offset); + fclose(entropy_file); + fclose(pad_file); + return 1; + } + + if (fwrite(pad_buffer, 1, chunk_size, pad_file) != chunk_size) { + printf("Error: Cannot write modified pad data\n"); + fclose(entropy_file); + fclose(pad_file); + return 1; + } + + offset += chunk_size; + + // Show progress for large pads + if (display_progress && offset % (64 * 1024 * 1024) == 0) { + show_progress(offset, pad_size, start_time); + } + } + + fclose(entropy_file); + fclose(pad_file); + + if (display_progress) { + show_progress(pad_size, pad_size, start_time); + printf("\n✓ Entropy successfully added to pad using streaming direct XOR\n"); + printf("✓ Pad integrity maintained\n"); + printf("✓ %zu bytes of entropy distributed across entire pad\n", file_size); + } + + return 0; +} + // Collect entropy by source type with unified interface int collect_entropy_by_source(entropy_source_t source, unsigned char* entropy_buffer, size_t target_bytes, size_t* collected_bytes, int display_progress) { diff --git a/src/entropy.o b/src/entropy.o deleted file mode 100644 index 69c8fdd7d5834bd5b1f3d4a75b66639a5578b1d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27160 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 diff --git a/src/main.o b/src/main.o deleted file mode 100644 index 50237eb5ed0ac08b6cac38e8e15976d2bc20818e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12160 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 pad_size) { - printf("✓ Using Direct XOR method (file ≥ pad size)\n"); - printf(" Method: Direct XOR - entropy file will be distributed across entire pad\n"); - target_bytes = file_size; // Use entire file + printf("✓ Using Streaming Direct XOR method (file ≥ pad size)\n"); + printf(" Method: Streaming XOR - entropy file will be distributed across entire pad\n"); + printf(" Processing: File will be streamed in chunks (no memory limit)\n"); + + // Store original permissions and make pad temporarily writable + mode_t original_mode; + if (make_pad_temporarily_writable(pad_path, &original_mode) != 0) { + printf("Error: Cannot make pad file writable for entropy addition\n"); + return 1; + } + + // Use streaming method for large files + int result = add_file_entropy_streaming(pad_chksum, file_path, file_size, 1); + + if (result != 0) { + printf("Error: Failed to add file entropy to pad\n"); + restore_pad_permissions(pad_path, original_mode); + return 1; + } + + // Update checksum after entropy addition + printf("\n🔄 Updating pad checksum...\n"); + char new_chksum[65]; + int checksum_result = update_pad_checksum_after_entropy(pad_chksum, new_chksum); + + if (checksum_result == 0) { + printf("✓ Pad checksum updated successfully\n"); + printf(" Old checksum: %.16s...\n", pad_chksum); + printf(" New checksum: %.16s...\n", new_chksum); + printf("✓ Pad files renamed to new checksum\n"); + + // Restore permissions on the new pad file + char new_pad_path[1024]; + const char* pads_dir = get_current_pads_dir(); + snprintf(new_pad_path, sizeof(new_pad_path), "%s/%s.pad", pads_dir, new_chksum); + restore_pad_permissions(new_pad_path, original_mode); + } else if (checksum_result == 2) { + printf("ℹ Checksum unchanged (unusual but not an error)\n"); + restore_pad_permissions(pad_path, original_mode); + } else { + printf("⚠ Warning: Checksum update failed (entropy was added successfully)\n"); + printf(" You may need to manually handle the checksum update\n"); + restore_pad_permissions(pad_path, original_mode); + return 1; + } + + printf("\n🎉 SUCCESS! Your pad now has enhanced randomness from the entropy file!\n"); + print_centered_header("Entropy Enhancement Complete", 1); + + return 0; // Success - exit early, don't continue to buffer-based method } else { printf("✓ Using ChaCha20 method (file < pad size)\n"); printf(" Method: ChaCha20 - entropy will be expanded to fill entire pad\n"); diff --git a/src/pads.o b/src/pads.o deleted file mode 100644 index c3c1b78d6ae9b951b8eaacd8fac2ea8748a5bb68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56792 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 O;|gsuW$Dr{|9=6(4yNV+ diff --git a/src/state.o b/src/state.o deleted file mode 100644 index d4aed06305801b51445a237ef50c0e4bdaf6f945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3048 zcmeH}L2DC16vt=VYNNIqMNp_pR1gKbG^JoEMFS;f5v@fiidf<%S)0XX6Lu%sh^azF z2vy0!g9i`2*`qf_JQReA-@$_yp$89&mrx4zz1cUL?IfiKkNRLTGr#x#Z)Rs+HhGl1 ze6d5*m^6)@XU&1?QjpsX%PJIf%{Ew(nt2T`JYJ>3; z#zM03VFNN7wH1mrYM)n8vm%tN{w2^ZD7k9Y^@ZemP0)IC2{lZegRE9=1WMRJkOJ2g zRx)#*9RKhCy%U&#M?Q>?of;b(iJhLzlpS7<#pC*rKF}X8i)nmra8Mr@Izw0-QWtzi zpGzucTfSSYALvs}|3mU0!d~jfoBr3^=s#}b|4ROo*vtGk{ru!=>F}M>#eQwH zH~@6Eed8dPr@2|x37J$o4nPaX!-b&jf~JMyrLrnG%_YheiZnD&_2c80UIPP z=c6!3OF_f>Q0*!J%yWetGA2iSinzEt7*~jM;xhgj@h1vjB>s}PxFZ~U+~k&?Www{L z9d5a1mfQENbfK8D*tEsd*|O_e4o~9?F`ctr=Cy^~b+V<3P_(2$MGM5-uw21*%$f9k zJIC`v9H6{qPv^NxJ8DH3f&xN?y59N8Ga9LMx6uwUJZxt@%Vh-1xcGFm7SzHA7HZ3<%SEX*;ds*e!By@gGk$H9q94TOVW zEcKW_Y_u(*K|TUavT)pxx*>9^v6p~%LsK4;4U;}bI@!tdlk*G=FsG`&LHdRaq+Zoy z{kOZnI&KPV$?q86A8Msu-e0@5Q8GaX{fZtK-#Pf3qw0~hJE~Rjrad2B~Oy~;=A{O zaT>%vUbnYz-z>A;bp3ekLsOK0d*yT~>es7umzhY20lWws8DEp?%BD$;7x7R`RX z=brQO&B?ozY27oEchCKt&-tA1`JV6jaqrEOv3u^St*H?@)ri~0yR>mUX)l>CL&2LR{rkfo=rFpcynCS#?@u6{L_PXin7dHiv+A|{TNGcH zQ0E8c{O&y&U-HsF{_cAeU-(_;7ti8igqdBC6@)h*Ie|LDt3!^eiF{oULr=}7K zeXG3Nx>CzEV4!$;^??sm2Riw?`1Om|0xt~EujpN)^_!*hOF~U3+dmAu z0{33P{s$*pD(#}CN>bf_Rms31>vRhXwcv#!SJmfp;VsPcm!J7!jh=pi)5}-TjI<|x zk9pEc{woa7MMR40V2)}#veP0r=<%xBA+!G%A{E9L1MxL^WR`I<%llkzU$l)p|E;NSV$Ve>?K7MH`^48!v zJ96{j*wqwL$9`29t+6jTtl`7wBAW)!MQFDW;#}l&hf;QA`=AbW|5e;(1}CkS;Vqpt zi3PVqMT1Fx}K)+}M94cO=iq1r4pa(<6MtNUDosn~GiL7j|k_B6@FkoN8u!*YC znlSO+MBpmhKU$eC#WpG}4A4dNezr2AGxM{~JY8GyqPIeoR4QJ~Km}bu2#YgmXz6D1 zi}c(wgM?LBNfk#wxX0&pa?`uf6jM`=ct`enCEWzwbjHSzw$ zL9$b8+kSCV(6S`1l6T&p(cELy+)!~D#K`=y7%kFh4fYad*NjBISFc8=f(=K$Ct9#i zW6T(H_)GP6LDs4PQ`to#xo`b{IO^ZX9e>(Uim__MTc`&kd{oCAZF!9xE?uJqFb!YB z#Kgo5yEvG)&@xQ|+U;pu(W6@#e2v^Hr-FM~VL;B7$j;;ECsdg0Pz|C-kE|kkv*n~5 zyGNUF`?MBi!;|5rTdW>o7jZ7Y_WuY4wLh@`Jsc=sd;!0<-@gYJbHgtc2_2${nRfj1 zi^Ej0FhCdV7mq?S*gwB1r%Z7~77t#20Gk|Y%Qb51w7D65`ID?jv7YIb+b*YhLel;* zJJ`hz3fY}0oAfJSJT*YS6Nvonv(EgOCP2A=jB1w4Z^(<%sSG9^d%q6eP;n6DL8prW z)!Z%-8%;1IkgHM{2{a%k&U{(+KU`?>g@on?Lg=9wTL)sOIg2i&QWvOT{l=ayI~Upc z5}6f@a7oyS5!)ZJ4~^DhDZpihzW8*Ip+F(PFP@-WDY#%=z}*3I6dPAnTI#1}e08dk z`Cy~B{X<$n?t%yIs9Jw$2OU7je_&G-mPEOY797g^^~lKZ^R=i7qydU2;n5}(R9aP} z_>TPj7W^8OE@rM2-h9OG+w14|m{X&?abGF67Y8V10gh_w2)u`EF30vAtff=8HqZo0 zvHgYNWqxcwGMDX`BSethaq4`KDU7}xWN0mVQfBwTKp#Y5mRe!v!`y=uM#`d#>wS;y_wBd+{65>?xX1SIeP*2>+ie&6 z_LGkbefxwr50__zHyf8dmB)a`=%j$2RXIP$UMcjwB6@Et^z9a&KDucy`G~d{+N-*& z2dm4KN?IM5W3TWbxK*m+@d+XqI%AbkEr^^z^bi~~c}SKbH%XE5F8Q2TilOsWjk1Sg z!{qOm=|>(;@JxOJbx+_ra;BDqdC{m{+DOHt?CdR1ZFE)}PDPsKI=OYRw87lLOtb5t z4y`@*lGresJB|G51M*>S)rcKge;C+Vw6_oVuw9;8i~Lz=@Pk)u90NBlB6!Q7>@SJJ zI32szWAe!k5pbzDcQT*99d(9j=%2!veUyT5nHcmKh%VR%{*9gXI#H}5>E*R8% z_ee+cy_)LBNN3o-HMS@61zIu3X6_oR*)`b}+4^!Ofmo~TNr7VZ&@08BK`o4Yy`0RG zkN()=+sHHi!0`K6_WTzI<)wc=F6Kgpg%s$)W^zYm8WvAbg~9+`M82LDP6Dw0<1#h} z=Re9|IqsK4?8vfsaz~b}vmM!1lxokNqg1yrK$pq_La))FF6}NAC4-+JWPfEq7RGD5 zt6`s{OqtWP3>pO=jJ>A=d+8$bYIWTJ>HUP4in2J|*ef-K8#^}NL}5IvztH;~zwdmZ z@B9q!Ci>lm1><~;HwVA9-lb#Ls0TbeHU@9)#&EcoVLLWkWjh~w@^1Y*_*zp6{>kvPa4|K5;Ky^G7`c8-^RgGCv>%v`A z7M<|($Fc92hEe-@-7y`r!8(2?7DN=+M2dyLf5VtRCtk8;G%d6J<(ODCuiEA9b0~Af zE*zO-m$sg@{cUIM@)L;b{~fm%|G{27Qgf{E`uL$UGyEUA(tY5B{+ z+e0j{N0mEa$E1^F?#v6+>eQE}L$Omduwz~+cItvhE;K~vtwR^b3w9}R3xhS)x2Zzx zR1L~+jUE5|P8yhy1tmDimSex3^6HqLgw)|?l-!DP?RIQBg}&2b`yA{%5Z_*XSe{2M z5JG!g-WALp^jhvxw41@V!yn+lArP=qUev%!LmU(xLSMFWTXMA{kC}0N@1w2Ox6p=Om#+;Kj1u;cU&4i)d8!q(#&GZc|74b zN!RLuikp7IL1CBbGe%4%rL#7kp%$_|PKHGg{HA?Z#UGhex+9N>bDdloK|x^z6LZqp zxh0!J^~oC9Cn9%elj&4C5%<#BOwiT?7-yXqVne4R$!;%t*=@ypdYpL9rNH0pSUD%2 zT$;^v^+v6=olatll}=e6DkO91t&Wv;p`Oo>b0&#_RYJ5mx$d;1Y|bX+aw1$F1sr^#M{tG-GCmto6I}Zak5akqbuE=_N4C+#NFZacfb7yQogw615&e9Hn~M0J_22 zgwcj+IYc@<1xI3Vf-aN&E8u#}`UK`K&1quNFu+Y+*#tV`!n5%XrwQ|;GoDEhC+#&6 zFH@=BbKD+GS*&T5dh3GW zm;Rirs7DVAiUW2M?I_~Z6^W0kT50}*xR5K4jJ#k&NK&9o_j9$4u*xQ?_N8X5aLtLX zxa&5<%kVDw9fz9cXtX(MMc1Lk~H6g_9$#rQvba%m}?Dyvv-K~YuB!}8aHmn4v@E6 zTB0kW%a*p}^4~{#8r51n=Fsa(dC~}U)dg8L!( zS3>ZA3BkV=g1;Do4}{=HLhz#@_(|a8&mQFmxyHZ`zf*XveEXr+7T^o8##9^Mg(3LO zA-M2znT}{es9m_-!!tdQc6|s9UL&-}ySm!-(WjltgPqD1J$cU!tK3f8xMGU-cGts! ztv%7Xr9FkMF|<-}?!pmuO7#xMYsYa7e_p46k_SO2m&;_^={!$oOrSX+*#2?W4Ne@= z(%><)ogPC)-tBUn9+9HwS&^bsq)5?ONu=b-P~eGZTYFC~+kvB%D^iKBtm_CO<6(^S zGl}jV;bwYpg7#8^YPRRy&8my-=}an1EJ-4APp=@mwNC?|wP)hpj;u?fvI)v~2~gvn z2MC6FS+@s|=s`XmB|3BPN!raOR;_AJxrultCGZl% zt2S;TI8an8LND;F7ssm*94lQfnTDfanJeO67K{DEh&@VlCZJsi|4ATIhCn2QnLI0K ze5*tQK7DJ~_`fP#^PAND^CA5282nGEd-_mJiR|I}g9IXJ{r2Ei{779jo>cd=KTy(m zS8yv{S69-@iKJ6Ej=wBEpnf)DMIGts5oV;b|B-K5w zi?z%@!p(N+ zBQzz=pQ&`Whwz_eI2~cMod+3CM>CBNF+9TXpDJ9pdyi`OG~@GeoJWQu(S`OKt-oC1 zTE|m5cQ8KJxrgB&W;%~BoQ@J&KV#^BUFr8S{^g9n*Wm9}{FfM?+jEfNQ~bto?zdxx z{z;{OlJU9zFBs1C-!^pKR64(Bd>+sGs87XQXP$Zlpz1Vq>(uyNsc_nt&J zb}F4)7@zB`W;oZe4V_n%P8;KMolhJ5Hx)k~!tXTrjmlp=A^dFyU&r5*A^cqiU&qte z7@v>ta|ZvovS%;j^ZtI<;Lla}{~p30W;mZO?;1LvQTH>bF(fjB+j*bcNtDcT8+;oqmjsd9#=Po;LQx@^K_NMb$^em ze%;0Rl-2FtYw%|(`!+H@@7H#Nf1BceF@*nJhF{6rJ!a^9Ug?}$5BVy-^cI;4F8&;lSCP%J&b=H z?zPSVgRjrk{}IA}!{BTEw?p_d=um~E{h-g)^At{g;Px~be69b<5dPf;e~=nO+7QA& z%y0`l?T4Q;{CbAhs`pD|C+B~X;WsdT7sGF4c#+{e4qsyULdHMA@CJsTVfal9Z=*#P ziR@g2Ki#iK8Q#e70>imIuQQyQ(mL-joU$5!pW%Gnj?fK~9(R2%y;k95Cxy7yxsBoc zT>7w~qtB%sjL&r*V>n-DiVWxH(&r5Q-D=)_hw-`o4;aq(!IL5QI}BgU`a4^_?9u+2 zsn(Gz4g3{l&jN*$-}rjl$Z+1@EW`P}TwpjK$A1jLp9#T#sBmrnd1dD@#^-kal;PaY zvkd3<{GQ?DLLDbFs4|jnSDy#!6>i4WM-6_H+83{5d~WArhErCz`+%XdLFqiq_*^H+ zaIW(;hVyuMUg5f5b5%SXWqiI5{+8jC)pmZEf*Xna!1>oHT~CUx9_K}d-wZ9S zf5gx^rF2d(KHsO_F!-0yVuSQH*)qb+j*(twMzHyXE>Rz+r3}m+Hb2> zzcv~88imIV{62+0YT%z$__GQpd-%RE#BjdO{1?M{e4b}GNo)ICs4|kazbUvCs}xS{ z^7-|W!S7Xe9$|bQ&;M=k|4#9L#`s+SQ*@X{()N5?@i!@)?BV)72LFKK_l59xGJX_V z+7JDV-^}oR3}43ZVWvZm+&@w6jxav&SB@SwkaWL(srXMS-0auW3@56#(;^Wh(xE?{ zT2)5l`g`Fc2Clzf?l5ruJ?|L<*WW1z4P1Y(8Z~hJ{Ry97WYYHN?=hBv>+dll>h^Yf z@y)n;x!~HVb2+Cg9`*3QQzAsphiEMW_zOslY{=v?P;#>Pt`GG{; zcVzNWe2BpRGeJlfY5e-&POnG0Oxv%oYfzx`nnTxxH}Jd3yvcn4MYNun_BX2f z)?`(gGwpvAC~2DYZB<`?AJ8&peTu?rK)xYmaotmzkGj)?{XO<_!>( zRvD%`jyWe<^|)QMthHO#bt~H{D3TDsL$a-{VGp`&o83*%5lu*hh`O?4C2M5c;VUGg&m%~?U}bS9g^JQ&-%`W{Iea|_81BN%V9S2LVsp!XD0cYKee?} zc(zx-WT~yM3HxS$^BA1YpXtcY?avbCNSDWq@9osqwD?)kp6_ny4K6dk^v;Ujxs zWY2uxr}v)B8`oddGQ^?Auuu;1nKaj*y#$3rluxyxm&hG{2=3*1gC(~`y1(xMpn3NA zPI=nemG2((z2|B3y_f1;nmRjm)A|e~&D69bR?e6mUF?6--|Wm()OG9m9x1PXzH^%E zoXVZkwc4z5(*8>{w54ys`Sa)f+4Y!HQ)Rvm%c;C)+L$tAVZK)r{eN?tPt}(1@GQSe z3rb#%LQ3X!$;-=!Yp9(i#_zeVz5g=UAN)s8rh1C}7abz_&>7Di?Polb zzY24UGoHUZc*Zluw+lw^s`Yy!kRgJCrZ&`{l)Z4Y{r3;VCJONd-79B& z1$Etrhny;G(K||I(z`!6f4(EV1CCO;R4W3)p5o8SF4DGtf_#KKEsz!Ie}$=rt>war@#JWnS&ksJGwGc$KGllHB2W5$(Eb&)^K;$O2?PA8Ry?^G zT87hQ(@1fWo%Y`J^ElY)Aw{wh?E7dGx(~G}_N0%&%}8CNrBoqLb)zEsu2wEhc z6eap2dAAkv#2+wUXe9F~h1wwCx#bJRK`AN9y_DC-*{w#w1S3nimoXZtRy?_-+#bl? zyy=?fFMONVE4SmO-@&+yEMvYQXO<&)#yr;U+0&j$KMR6Vt#}mn9DnoU7yxw6CzxMH zRUq30E*M_+^j|k}uD`i?@Z+4+eU7Z(kS-|aBc~Tguejx|UHCCjgSz7IOu8L3&o-ka z{_Nv;<8OXRT9Zx7_~h33E=d^zX444vPt_tM^Weg}{mSMYGetX0cK?8w3{FZ-oGDh` z(w#gFK*g7Q4CKQ-xEGh969gw&T$kY^$O5Oph{DSdI*8!eBeu7D(m#d_ainGr;?Q5P zJtXsn?142?ct4sUr)$PBIP@hLijO0ICKuo%>C-eN^bXev9^#mJa%_R#Ou83kXXWV# zRMA`9xt}Mg$B~35lvF{IRBAYymmMOwS=J296wKsT^M*RPnlltL`GC_4B=<}%?8twY z+gVNmYML*P`d(F=9e8rzbh(M^y219I9*v&wNTU|O!OOFB*__5K-8Xof5JMh$sI*KK zIf_k*PC#pvZ?LpdNKsd9hnS%6X8o(FKj%%D%a7j7IZeuA{z^OEbn5ZEwOByTV95{O z9G3i#!b?VO!XpRJT$!kSk2u?%TrrTFY}fasP1)B>2LCaV^|+H_c>0pb+T}>X)Bj_# z7T$KRXSt5qlaJjO*+co>32*-T>*D9VnWP6#z4HlW(DLjjFKCm%Nxdb zNA~RR1u^jK$CKN;%3Smo(qI$AQ{G#d^xGVFO028`FZ46tK=SEcZgE-RAYmZ!Pbj zQ6np(#yk58j-Wje3vX3Mbpj0U9H_ZdMj;JyY(!<$$heq9|C5vI{&*?8VppOzI6RX+ z4)bN3QCBFG@CFMdd6$+EQ2Tc#{rYe)tH46J3Cn82nz)rn7`}*Y#SJ@Z1fvl<97$SU zuU9Nsu)ruu7;u^(@B-*!!sj=!JQ@wvG+9?8e??@Y*$@sH!TM-8XnBn_4VIa(3_IRr zn0012;ziOQp{)Yh#wsh4G|G){u3KYltnl98t(+%}>37a;TsQsBibiX*ZCH_DyeVco z=rTmZ4c1U}spK-+8U)NxLKr@jwONj`#e}t1gB7%mXv_{rBh`jjZbhuPXYm>3Y z3^_(Rj*gijBN5(W8Ku@{voY3SC8~|e<%{PSH?G4&Wz{M;RaMNrxeNsP;_+y_+E`|S zZXt|O+=AiZNGu7nQZM;gO0A8?8%>)u2uJFS5^q(lv3#)s6GLQS{j84KR<*GnLNRMm zCl^|$=mU@NHaiX!*v`w*S zBdBTCfEQt^M72;}L4!-9aU)hZ+sZ&6IlwS!yw}J%(8MmIHXKjb-khIR=s*L*Zi-pe z!l?8b>oBN|prl!638TtuECZi`f>L3bfktU%c@=tL5C&0pbFR;ao;SW&vvDBm%fVDh4Wo1=1~cy%7q>Ay*ojq>dN_+0|%9K<~J~ zHL=WWXu!bLn8CX-4$zl08<+@;SQ9!QZIj86?_^1XQ_d<$%rYWT8!SpjLI#)xYU6zk z#1(Q0w^QW~vRm51?3VW~cB`S$qzxH~UW44LrX`KWFAhgcSns9Ys2wYV^@vGe#Wz|B zrLh%n3?~xcvxJZiS+sV^iWLssYbJs?#D>6@C(K&#l#|;f36zH2!nqXRRP%$y5wj5z zLN;0#+WrIH1GiP8FRHv^ZKD~tjir{e%H=r6ugYRrb|FY^qcmnFU_m?jneoPGylhV1 z>vK?=mf$t<=q43j$OLF=F)xWG8$vQB4Q4VDtaqg35`auY8-+LIC}xF3Ikv^VLEL?b=1leG-*g3$aA)->_s7u#wjpcD+R_0(Kh+|E4e`pd8{`y>ytEvTA3NLVY;J z3fy+2;*i17x(IAyA;U~?pP(C@O+T0LUT5K`ghDxPe!xH*Rw!&o<4D7O!GSPfFjYC` zE-X1TEuW8q=c^p&9J&^XQ=Ok`X&;R91TDdMnB+lk&FmyH!=*in(P9mP7Cb z1nN?O1+yxL9WnS4PqwM*T(srSMbYNTMbjsa8{Yzj#ub3$2iq1r_$E#Me({p8 zjxGLcU^so>Kpfibz|ZxM@)sci$8Nw*Xrp+4@wwdid!26aD4uijGr9g9s(%9?KWc4G z{(jYe3XP-jqfU&W`MXvB(jooxbN!#H{u_qKzb+^L3dEu90H@{U|DaeZD0_w?-(RJoQ!rKp`Ce#8wDj4LHgtxiW@;9R&jl z@$qqA2*29}$80ae$N383+g$J`T=1t{@ZEr;UB6PXleq`jK^H!}*h>CyFvieiF2eau z_!QFfcP{wvUGP4@QJ+&DxPT^e4bGpz2l1d*Ugm;Vy5Kjv;0s;wRWA5?7kq;Y9(2KDF1SdBy+IL#Iiq~^Oeg+q2dXbNhYK|8$B3N%JT z7K%xTM16Eqpb=i30$Bg!gyD#&h2aTdN0YG_C;_hnp#}@YZMFmI0ZbS^?sZJnE{;4k z7OMHg5TH)ID$%U*U?LU~F*Ba90{B7$?g59?fgR2(RRAQ=q)G=hR94^E9bg8E+PGy2 z(~gD(u~B{DlwJX;HkDpxFbJ;?A`y`xsFkh@S+!=e!FGr-6TF8G#bH=z2C$$CC{Aty z?9I^WB6qZe}LhaGrUFN zc)~|N+4UsjbG!at<8Od5*nZ~1?_@Y%N8JqPaqrdSA9KWuLB@yIhMc|U7|!JssX7L` z@p3@Pxk%v{UvAfAjbE(tW10*9Dvdu)@n^a4y&9j^+dLQk0*!x@lJ9fjuhjTH#s4MtCC|dKA(4k#y^G+6KF{d$2t<*HYSJr zC!_H{RDAqnI5s@-d7okUmC#4}?_oG!cRdW}aUW1P*?XH>S06GykNYPYf2HD&Qm>%c z&GnqBaFUPpCAKRyoa9`~*yWE=j({x!}NHKQ~8Vd4Cd$A z3P<%&&PPhm8#R2QT5k)O9D~VOukmLq{&yIk$Lk)3U&G|IFr4SZ3!408O8#EP=knV$ zen9b$xbT0i@$XUmH(mJM8lU3Z$M`(HgN)DPI~o@=G>i+6?_`BjTxg%1#`xUcN`~|J zuF>SQD7)@p{FyK}t;afz|Cr)O8K2L)QRDAd{1oGJKRm?v+z(GPKKH|OjE|zp4?kyo zuFo$uK0PnqWPJX-ct_)t{vR+t*Z&;jbNwgbW(rM@uHTo`@k*@AB_e=+s)({a8L7gYW!;yzl-s?y}#G^w<><0 z3x81K({uW)3;(>ve^|*MhsHz0TdvO}g;Ts}T~B9x?zb6?&+}m(n8dfW|+d_(xs%rx`wr$(g9WevtC8b9(~}FJp3ShV$n_N|WEM^vN#{p22oUkAF9U5_(- zCc}4X@~Ljy#rRyGE{4x$a!zP+9#MWCWPJQ?fb4p^{(i z!e8aWzr%&Uh2i}BnHEjXkJP+>%lPG>E7|o5!}+>oH^^6~3cm=~BV0b0NpI|um+Y1V(d0$ua?qz(ge<#Da zoIZw^vw1&OILY@=eTHAULDTbRlERVC*Xaz#=j-%VhF8HD^5?f0Uc&IL4Cm|OQH7J9 zl;=+|{v0M}w+sJO7k;F&eugs zlSAtw%lLd-*EKG$=L#^0g%+g$iR)c904KC9vM{`fqTV=z5m z)A;oM_&VcrJqH+m4U7|#8FyTZx;hm{|`&G_8^QH@XUS(_Mt zCew49#;51zLyXVu-NkUeZ?tN1sLuZ-<6|jDd38eLQ@l=VIMw+dGdTv6<3Z)1k$J!i9g6#-}>}HW&UfjZby{Y8U=`jZbxc4dZjag&Cjk|63WK@BbOb z=XKg6jE|QTm**HhgWhD@1K5+ zPy6Q@#^-iD$Z%fIKgDpqPWLjLuhZ?)D#tFg?R$8D_Mmf;_9FCCg+Hv}_bI$Z!(UMN zV;cSog+Hm`dlkMz!|~r>uRXP)vZ{l z;q-f@yEL4B?{lAq)9-qAYWQ8aSfRDcW8QE3ap6Ggk;gnvzsG@}=E#O>SUWvw|4ibzu!Y>zW;f0^KT3+}8 zU%C8cg}SecB)u{CowF6Uo76z7K2RHnzv4Sue)*#TBG5GTSj-7rsIFSoI;IZg2D%l~ z;R;>4Fo!r7UHCAEHi!gh6XAnn$Kwq&`a3r6VTh}6VV7*5Y4Z}U&p!t`Q05mMKM%&D zOpNuAh7Sj5J(^=kf2UW7O1LOwfBS6?al8c+7$3K&u<;KN%F{xKLD+Q%E& zPv_;(N!Oe=QTd%?c&&541sLwny8V;Ycmw))BmD`B!Uf9I$5*KFH)|8>4bpC08^t-2dN?s#T}@ zfF}9!-S6&?u5-@6|GoBFYp?x0Roqj3!~A|_Wy+;8b*(BqIaH}7>k9W(`nF1)twyM~ zLzld_%*(#!rH?J~vUeZyvZ*dFyKMIpgO!K^;~ zR%qlv@?xRN>cgu?xW~6bqpA<1%pot+wf3x7=*_OTywH_hy%&1f{oZr0r@PC%q5B=Y z|E{!GPU3)jIdk%kx;N*Ch*RK5w$M5bBHBF=B z9Ht+)KK;XdLvB8{9jrPpH=uk1ZeYa8sgTjJ{M4yay8)=j&e8C{zwQ0A*PbElWe*f8 z(E>AFsnNO2TI7|h<4Rqls+39%wWQv`j-6X}vd)`$o~|f4P?r>%q>oKONF7B;bt9yX z=xnM3pB~*?sg*FX1P3Q8fgbVNmz?r)i`W7v@{EhMLKfh%!v~b=z0%N@L0AgmS>3%b zi}rfXYySx3!svtARKG@>k1grfhi{5}>18v!--l1qoxG@IjhE9vXqRg1N`A`Ab?EH& z%yF{vRqj=gTvV^;D8@**^gJud+12wIbXDg|+pqqT)&GL7a?zFPqCNSiLq$)Ai=K`Y zJ$3WxVCE<;^!>ri_v~Ho%ACIUwt2Y+o-*S92(MjKkkV$PSXcF4n%45mN(k_En+^aB zT&Igr^cCG|ooi`B_R$u7>8QuW*MV&CX10)#?&L+KF3h{jH1TeZygh#hk#hLlk3iU| z1-tOvTLoTmtfaLHD!Bq7LS;;}Ep$T*P%%!{);;18GA`K(*_CYPJXITX0+}g z#(jPHU^}Zzck-e_ZI98dxlBF5_7>`)^K+RNBIv5wxAwA$T>pa;cQ7Z{p$R$jqz4!X zWtK`#hd@ozLz9tIb{Newdsym%KJzd<0oOHK$2pI?N9RNvHPA@)#(c2^5nHs@c8GK_ zBqFVM+J`T5#tw110rJBR5eGBf^dZv0%;WZsg97jW^g+Q%DIFA;gF(SZ_~3)W)*+0M z&MogSY98IBFCA-f2^bW%lYuD2MWrVA8^sN&qUCyifSJ5xjL`K2j}Zqm4}ziN7vZJJ zV%iqH(B_u(7dYSsj$KqUIg|m0yTWAN-m#NH+dGfrvM_tt%kImYvR`-HLLEIHXUF_Y zRP-Z6&*>^!_-C@H7j0|2+LzxJ{F!RONI>tp0Vu1RG~LODRmqW?%?(@|%B-e?(dl)Q z*hP&T{dX_}gA_}K+C0-7j8U{&u0!YMG7Md@jLLL{+CqlOocv;`AUD^cGt3ZZ%5$iz z2xb1kw1du0ca;&X3}xDh!lrjmopM9FnJKZNOTwY18m}MLpX8AGI|i3ntL;?-AVV(L zP>zP^#bA3o3ph!_7QwOAIHk4iZm6{$bdRp%$dPv%q<@Gq@E-#5bjylD$3~AEtQQ5n z19ji|j9jKy!EWDxf@Rbpn5#yjii4TMyftno>Vn40W{&VN-N_3=GC2jZGt9S0H(z5eAssq)>5yX^h8W#b*g*>rt?AgR3cAuGBw!>@JyJWL1 z)8S@Yupq^R`t`0*cHbVFWR_gTv!I|%44`OXr|)Rq=3~06q=%1FxIg|u_I6X=&@sdd zd}~(h%Qyn%I&>Cd?@chozOH0=!dONMm>i`9a|px~4P=&5+BVtD45J4x=)zyadH`eO zay)6*7VXhB%<8ma`N2AU@>FW9h4;R}o^Kly4Q~zG0I@a>Z98W(o~f7@MCA#TJD3^C z2c({_QA{qgM02{%?PG@E9Fp>}To9#CUKh&Tf=pXy<`&Ay>5HB)Qa3u`?cTZYxXy=R zZ=Z2a$Yw5vtj(SLJO!&l_wA#;z4)LDfR@ZZH|6VUL0#>pt`1UJLRa~lGt5NU%munu zezMk$i+eZZrG97&&eO8^sb%%w+FNNg*+Zc86y|_Fn6T{wx3Xz;^EroSZA*2s!BlcY zx^pCNLTxktpdByCHqRc@=qT&CoegQ6QQFi8+6K}~j(`SiL)-rbYJ_%a|INNEHL&M@ z*%knE?=`$H=vDl~^P6=Mx8FTWdBGCd=R+78aO>CIIOj;-z&K#yfpw{DhOQ zi>IN!0MNeUqq%0s7?2#;bDzjHU7hv8*G3D>|Ica@&;qe1=74Ms+Mm-ZV{@2& z;Hkr=2(|MdB%hUQ(^-3}SV>_?=+B4tRfx2-mdF6nE_8b0l#g<8%7=^YI`ma-=)Pm7 zEhQNXbdpl*g#r2bOuO5tpU3ngPb1VGe&n}NqP?uanL|bkUQ{xK3N#>tsOLq9Fe;R# zE&@aQC7bDD$(+9Qe3!Kpyqi~~pxnXCc2thc(Q2ZDHKU-8aC2oU#;D^ z;mN!$CNd9ZzUjn{$?1D3)^O4qha6I^oac2lXXqd4V^w@7;agZ?S#*d~H*M*;k>_{q z%XkEgJw<+QbZ;k)@(lyuOdM^s1;(O4?{LtMn9+tWH>!{5!7Vw#G)iuyg}l(-F0Ty# z4u`(4Lf`KyS7D_PvirP))!i66;c{Cv)E2=rR$Dm2u0F8`y;?@*f$DeE!Ri+Ps@}_T z)h~G4Lc6XTcmmRGJ7@Q6bj#9#C(_j~locp#U8!d&v9GZ!c~MYKY6KPJzN+V^)Z~v9 zfW=kMm;N{b!?XrURrTKZM^r!3)2+)lSy=gY_lERiZ-elA_XmC}^H%8AYQ#aMo=g*i z@n&gKSMMcw*J9uL+`dmkp6;r!c9S<1FRo6v!NXc}t6mj$ZsC>(M@0J4u@)D9u%c4} zEq>jBv4;gP_TZwDwI1Fu5SXaBm;tx(X>%tpJn&h47IuT~0dtYg&b8~xF(r{)7zVM7 z)CkUQnPFa+4EGE#c2HFmhNJxC(nY3~RJvG2#8;g*SFb{~h?0W}E*JN(k7E1*1MWrj zM&-ULN}fhkR!ivJ_$QXX_O#{0!MUb>w3;>~)b>l={S6`4^feHCokr}-vD{B0mY7( zV!Wv2a*#AIQEQI)-D$FU8KZ+&-?8m;9Xc=9PMzs%9t9T%FOi%PVS*QHG)dnxhJp%Z z4rD@@vJqAtT3GJUwG@p*Azt#kv*L}J%e6fqee$f(=Wpj)%x0v!&cf26XCa|^MV%&tt1L3L7^%fdQ4Gp)3w>)GZYMLRBk zT70IrkDfO1LEHUM)*oNpv?|@ni%QOiVj8gX6G{(WGZl@e!4Kl$p0oAD+-{mgx5b{b zirdZS>z9qey773VgOfiK37fRP^G6pbmgm^k(qYo`AO!@CE$CU7*d| z54rNh!!8X1>JE##3qC_o{n&aOHuyb$)Oeg1<8ciXN)OQ<*Wd^8xM|${c`3y18B*eL z>$-Oe&L2{Auya~7dwJ%TcYfh$mWCAKUUFmudAVx7i#1DDaoxE^czXop*J2aMS*Q}C(!u4ysxnxmy zj;$rPdu5Di;Cr|d5NSpHL{MR~g-HO4uUhGn| zuWU@{^;3S}D;(AKarW;H*1kKKUe~V&N@qKsFVF%@&`a>tc(^o7MfIt!F$`OKt$Kb4 z=)Hqw(5hzHK7(V0e!F1pcvMR;#fnaNiY9^Hak4HeqNFa#v6;Gov}byLI!FhBc5P0- zBIN9+we8r=3p#+lbZpUJrpx3VGI?7~-ZqnW*yJ5CdD{)xjZ03ypTPONzJDB_>F(cV zGrT#FIf&1)1DON3(3Pfgystz0OE&c(gvbBaP5o=G`15P)57AQ)S!f&Un?8CmMzSTe7ZyYA#;nny%xny9dhp6-Zh;2&_IBK+I|3`LHt8QwOX&We z;91snrg+&O7%#aD>%(D)HqzU+~`4=o4&`Dc>A;5j3>l4G^0$nPt{elD9qG=;&8e4A^_O{8X@c)5n%{%?+ zNBY=E9Lt^bu%0WO)v=TwV|{F9=TQZZYZuv9;YHsQHS)44e%-cjnKNo1*bp zyY388fbUKY*Pf}zs~?05FD;VxuIB`%+?;;2 zhstEyDbmYk*76ZwoFqNe_5_bRGn}Nc<^p71XoT8U6(I8#f#N9-FBo_Sf8%lnN0w+& za(KnvKHqd(c|y${tOW-_xIoSS!~|@<_lq+QKu%2#-_V>8U%QwiE@aJh3ZFxadX|pVZA8fM}adFaZ)Zzura@aJB3feAbzCCc_?T3lS5=(nmZ0#LjEtQ!Vt&9Pk zyui|%F#(_|$wAnr^DHF8cif-h080Z#>&gX6L<|Tnp>He6s}%6hxn9O;)*bmiZwJw6L`Z@o~SHO zsOsw$E?xX-wWhwIwmw{*2wz)S7hPQ$Pc=4%r(HXKs=8_6jmzfTpjJ0D;ZMaQ@n#im ziqt05%4l6f(&$j#+S=SYEBwjka5B0!8D>UvYdF@Niq}-Wf(lVdC2OcqmC2@-%I0KC4Q17oH`Y}EP;0Eoi(8`chWJXV z8$lUpG*EYwK(89{AHVQ}AHYAa^rXg7$ zj?yIRwkDDY*GA&C(ZY6#3RUdmM>|HMiSAy zb*Aj3FbYo!qx2+-Z;VwaH6O;)o)wYWRpDea<)k8wMrKQd+QgHs>x5TWTiz>5`TU`E zNkki?waJF&xb}!Kw6-pMd3oaU@c8jzqfB`6aBt0RpKb%^2wH&Kocx7UdxXwz83%2X?wkWtan0F9fP>!QQdJeL!W6qRU*hc{MM zAj}wQ6)ZnYd5afSD|8LQyt*9Tn;tVv*;;Fy3B_^NjOe5diEv#*E83vBb)8lm>T1-O z)f7qA*0a&sBE!_2)scoq-5ONpbKhmu$EcFRG0(AUnOiz*Z^HYKea}~iI!+>L#(0J^ni8EDLAnep|Q3?U9Ya6 zs}`w6bJYU1V6IxKmd;g`P3WAFN>$mKis$c};>k+2?8dpX(8?S6hpKR)QOexnQw>8y zmSePnQ;}(&aIZ#`Cr00PJ#I$dR$g}OY0lp74}tJBdKIFnxUZ<-EUoZWi%dbjc@>nz-OtJI(@%l zT{u}E)k0f1$VQrm6}3O2*$P+3|Jt;}tyShaWsbRa&r=KL&6^dTuxv#to=k`h zc*s_)o-PK?Kc=Vgtg6o*`T2hHMhxoTRR)UAo2_$|`Xa9`zu#tN>-^ho{+EmLv-$iD zHlJr=`SSe-_jB?ewE3f`tdrk=NPn0AxXm9R_3QV$y!@AJ{#+WIFF$jDEB||&KaN+I zf156D?5A9$C#C%UKPcF5^EVgeug&N4+m1}!Ddy$(-<7X_gUt^Y*>`^4KE7aN;t%`^ z<+tYj^SI4lid|J9|N6nszL#wNw};C7hlaZR-`o5p$j+DVw?I4KVn7$OUZglboPYX7 z^ZB!FKBk>QzR5Q2Z}Tr=J+6HJQF;Gtu=(2NFAVl zqj&axLjOL0sm{K@1}aWGAT5))p!Cq}3rgZjcZ1mGFq)blkfUylXA zz8b)PC;;CPfIkA9@_%dFPmd+Qo(|ye55Nxv;M_F#W$(`d@Sg|ZuLR(~22TA4F~E@Y zSchvr#0l|X?Au6sjKlS#0rB&(0Q|B5d}093uZghU8%F4A)i`rea{~DMp&0osmaoTB zl;OAb`|?{&03Hj#;{iB-GSHX&yMR-l=^>-I9=mayv3SoUgX=L3w_gpA^H2c(tpI#y z0NxpZ(@%Zr|33oo=Yi9%M{OZJ=Rp5g1Ng58;C$)dSG|MLKl{Q%0r&;Lsn63NH~!RP zIBu`7cv63JPboe30q0!Om;CDj@Y}4M2QD!3^&E-YrT~620RLP7{zWT)@@OMp&#}1O zZt=}y4X)=_-10kzed+&X0RBt>{$c?Bivavr!0G3SHg1;~wbXAdewW4d9FDvJSZk1f zJ|_qyJvZZep~a`#z}Is!38`d5V@0h>)HkoG(aTos8&q9GES79&imF7it~r%du~=g& zQICCmvW6?-L`{CX0!AdMYHDz)T~$+Czp5sN-HB$ptq)6J|C6i-x3#vum6v#J%Q}^a zx3o6IlQGTa_5nNTXr122H@6bRA%IG(OC+OBEK`?iQH_yQytclE+jz%|aTBFtEvaNe z#cCU|Lsc>E-&HD(o$@L^M13`AjqDEGi7djXC=L-~&>^9ZxD2)%H^$bq;#5L4Hd91lTces*p}BM=wJCTwp5$&+x1pl% zm`U|{)&Ap6BC;BdCWLTz&vG>@)@i(9EscxQO=i=sGtr#b8R0Ntbrc)9)(XbvL zNocr|1(MBmh?ZKO5!9@xp^K8usg@QTlrXqZv)KjXF458$S*KApO+3;Rt>JM?jdc{h z=8O{XeJkz~_O2<~)YOcs*;MtBR)wI@SIRCJ1BFW-OWa?F@T*PMU{7C@tWPzqsHtnE zQJ1jKAaS|DWjS8s>huYMNW?jnJDlq-CUjT5s@$Mo{wuXiqow$hKD^EH2V>l3a&qpq z_&@q^SMPT%PJOt9aQGg<=Wf*D`vsrht91BTtPsi7d!>0)=USZdIrTgKlmPxrA3nv( zStR6~E#x!`9LLXj`I`mK@z~YNpC>U4FiehbH}>jg!I$!50_POz~rzw+GUQ#ogcXWVOl8oT)H^^X9O{ofTh&qSObB5Wii+AHm95%|ZD z=lJ&soO6W3+b!<=aGuqtL-1vsd{f|34!`-zM15qv`+V|eTlr55zLbAN;8Omt1uo_5 z$;{R(`^DvUzv}Gb{*CDqKAf+%ndbTMJ1zbxAI^Op6aUK`CMVzZ_itF7evt9-uL76x z@DqW{{yxC&t0_m?b*;e1AkVeqO%`|hY_NKMR`8{tqdxxQmfsY>-z;!8g{!y2Cx`nz zrhgKA>4*J3zB>baR`7Z2i9eNf1e{&~d5cX7B!@MXP6e0*2$+dlkGTkk+Fo{;?Ze#GL= zZ!XTmf-md6*2j1C-s;2ewe_wNa-_ZM1upx=Kl$Xiaq`~;UyhSU1wIz`x%fHdlk>3E zXBZc4Nc6*H_;dUl1wKyT8!hhqGYxr6TLoX*^*w>h_1@0~F30WH1un<8cLgrT!;n4C zqW)6OB?6anCJS83nJ;iT&iq$_k4GKOKaU7}g1}!E_!R;lM4?F3^Gf_VIpYN`^|?#n z69s>(#p(Y^0{^Dq%XS}b&(~P5lwTom7IpgECh!V@-zD%$fj=N{#=euYN8r*AKeo7w zpPjrxdQtGF;@Qc0Ti`N&`j6Dbv_GX?9~C%b)5#fYaaPBpFo#bTIG0q9TYat(a;6LZ zLV?SAZx(W-{8a*{{9{&rLdf}qkiTB=rJVZ&PB|Cbb^qT4$azHIvVC9i$?>e5*9Bkh zQ$9wgBT;SEyU6k@EzY=-{e6Ltzs&M)4dAcz@!j~=D)@4I`@X>0)m%Fs7Wh>H|E0iZ z2)tL|GX;JrjX`quy7-)AaoRf-f399n;4;o{7PzeU%Rc$jSQ*kc1)sN0{__GKC-5QM z%>vx3j1rL*@f zfy+1_$Hh95ljHhJrN!wV*0j^TzhL>TKHSM!FXV79<>Y)-;BwwM;*;af zeO?oMssCA24$0X&o(@5}z~X$A{OLaabjzPD_`G#`E*H4e^FD#gcz#~sbA+4_2Yn<~ zHy3|SenjB1-9IPrd4m6Ki#vNiYxRFr@MV90(#KzJ`OgOMdwu*`%l|(C{DC~&L2~*; zEq|oN`6%_7KK&&9(t0+;ddj>Vmy-8$!#;B&}#a?azS5|ZP$TD!(roR4xGo95%M zxBP1Y_)C2J&s+X&0sOmte5cQr0RGnk`2QHd@AUDV{)YniKM&ylDuDmKkMHaq!p#_x z-=Cu`?)>lg;{*6N3S7?b8+~$|-?D-)+wmI$mvVmQljHo;E%;K-y8@STrf?9n_DVb_ za2dBx1mLe(-1+BT8$WLezFaq!@ledxE9cp(1Mr&#el5zmei0YAl#>m>cLd-+w7Ap% zD^~xX3BJ_-Re{TT`-N$hiJvLBIz7jRi5gt;7lbvO@7I58>s@MbKFWI62wb+yzXag_ zVR2^{bz*uotS>sw<#_&vz-NHs^zTO!67`Y%F&207|C`nSO2Lr9OkkYP0hG|CW_A%Hn*K{KWzIT>_W$!jAvisn;)m zR{;KU0De;7^C8l;*9GH>?RwbSRc>)U4i)@Kg3lvKCuh3g^N7yjR|~#8=UFWHG~MwV z1)o!_+aIkFe466;|0;0l|JQwTb`3xwq;~{gw)@A*O+IN-&MyVN0C}$7{yaoO>W4q- z>HId*;*=x(cD~?Czl{-m>9_HMFa0)4@TK2w7JTWq6@oAQ_MpI}y+8BGaejM6@TK2| zTnq&U+VL; z;7fg;6MU)9t=!ZhQLKkQ7bo{v-1*@tTkpMsFYA58$A8B19}nRFQ1GRmKNftc=PLqV zDD-?I057K#k(~Z7Sbe5hoR3ofnSw9%nIrg8pP1mYUH-$$PYC`{;Le}x1z*bloZw6O zUl)AJcmDj2;13n@I|X0Le@gJB{9}So`Mv=OY4N2w6^_IRalG@aqLG^;|1( z*?;$0-0APepJxPLjz1>^F6ESS&_trWa-N-QaVOuMn=KN2E&-ffw+McJfyV;yxRApm z94F^*1fOx@>U~J?WxY=bzO474;7fad;^VvXx)*&oezvRAOG3_Uq2~!7-|63PGDt}D zo788R#p!2h?Hc zhx08?yQH2I1uo-ixlhh97DS5s@V70#!H56B;*VOKk2CS-{4=VO(hB3Sv-dKKlP~R^ z<>Nbjss&%h+wB6E^=|jc>CeVQ`e(tH`>g!}=Md=he<=XJ(rz@I|D9d4E$+ALdVxzl zR|))TQSbc%m+ihw;FAAT0RD==X9@X(rs4sKdP+HCE$-}c?LJxXrT?!JxU_4FPmc5d zR|H@Bf1i)<{Q11#%Q$&O;IiI+wxHjx@d6(On_c@Z61eok?E&~YflGh>y}+fM$1Lvr z>HP4d;7dRJT;S5K-w9mGAM~iOO zZwbCU-z%T4)y%KQ+(B@Glhn z!JjY$XYXJ;o`ft;{dw#BbES_z&hn=P@Mj9XoTok+fG-oco~Nw*sE|)noIXi`j}~~l zz-9Y}!C|7k{BxAMSp4RprCo@1K_YaQFM6O+MWHUT3=xcfY^s^5O1xGu=LX^H^aJZk_(__bXun z0(ZY(sq*3OcUsGRxcgnpCLiv8*RtJ*yWc0Nip096WMl=d_z{A>*1NmbXk(;8|7xQ` z|D>a01%7u?(b{YtYMYz*zfhay#wvvAL{LkJ?- z*Jp~y48+-YWqRIMugmk-&*dv+`pb8_@>EWwu(;Omi!amfKhFI=iY|9#t-h$Fx#U0n<^M0uU_)B~