From ce68225a012092f849898bc799ab9831f013df60 Mon Sep 17 00:00:00 2001 From: Joshua Nwachinemere <217677783+dk3yyyy@users.noreply.github.com> Date: Fri, 24 Jul 2026 11:50:37 +0000 Subject: [PATCH] docs: refresh README with web UI preview --- README.md | 252 ++++++++++++++++++++++++------------------------ docs/web-ui.png | Bin 0 -> 104864 bytes 2 files changed, 128 insertions(+), 124 deletions(-) create mode 100644 docs/web-ui.png diff --git a/README.md b/README.md index b741462..44d8c12 100644 --- a/README.md +++ b/README.md @@ -1,169 +1,173 @@ -# PassGen - Secure Password Generator +# ๐ PassGen -A powerful, secure, and feature-rich password generator built with Python. Features a beautiful CLI with rich formatting and a modern web interface. +**Generate strong random passwords and memorable passphrases from a polished web interface or a practical Python CLI.** - - - +[](https://github.com/dk3yyyy/password-generator/actions/workflows/ci.yml) +[](https://www.python.org/) +[](LICENSE) -## Features +PassGen uses Python's `secrets` module for cryptographically secure randomness. The web interface does not persist generated values, while CLI history is disabled unless you explicitly enable it for a generation command. -### CLI Features -- **Random Password Generation** - Generate secure passwords with customizable character sets -- **Passphrase Generation** - Create memorable passwords from wordlists -- **Interactive Mode** - User-friendly prompts for password creation -- **Opt-in History** - Save generated passwords only when explicitly requested -- **Config Management** - Save and load preferred settings -- **Export** - Export passwords to JSON or CSV -- **Categories** - Organize passwords by type (wifi, email, social, etc.) -- **Custom Wordlists** - Create and use custom wordlists for passphrases -- **Copy to Clipboard** - Cross-platform clipboard support -- **Strength Analysis** - Entropy calculation and strength detection -- **Pattern Detection** - Warns about repeated/sequential characters +## ๐ฅ๏ธ Web interface -### Web Interface -- Responsive, accessible interface for desktop and mobile -- Random password and passphrase modes -- Clear strength and entropy indicators -- One-click copy with inline validation feedback + -## Installation +*The screenshot shows a generated sample; it is not a real credential.* -```bash -# Clone the repository -git clone https://github.com/dk3yyyy/password-generator.git -cd password-generator +- Random-password and passphrase modes +- Responsive layout for desktop and mobile +- Keyboard-accessible controls and inline validation +- Strength and entropy indicators +- One-click copy with a manual-copy fallback +- Generation limits aligned with backend validation -# Install dependencies -uv sync - -# Install dev dependencies for testing -uv sync --all-extras -``` +The displayed entropy is a pool-size estimate for the selected generator settings, not a guarantee of resistance to every cracking strategy. -## Usage +## โจ Features ### CLI -```bash -# Run the CLI (starts in interactive mode by default) -uv run python main.py - -# Generate a random password -uv run python main.py --length 20 --upper --lower --digits --symbols - -# Generate a passphrase -uv run python main.py --passphrase --words 4 --capitalize +- Customizable uppercase, lowercase, number, and symbol sets +- Ambiguous-character exclusion and custom exclusions +- Memorable passphrases with configurable separators +- Interactive prompts and a quick-generation mode +- Strength analysis and weak-pattern warnings +- Optional clipboard copy +- Explicitly opt-in local history +- JSON or CSV history export +- Saved defaults, categories, and custom wordlists -# Quick generate (16-char with all character types + copy) -uv run python main.py --quick +### Security defaults -# Save your preferred settings -uv run python main.py --save-config +- Passwords are generated with Python's cryptographically secure `secrets` module. +- The web interface returns generated values only to the current page and does not write them to history. +- CLI history is written only when `--save-history` is supplied. +- History and exports receive owner-only permissions on POSIX systems. +- Custom wordlists are constrained to PassGen's local wordlist directory. -# Load saved config -uv run python main.py --config +> [!IMPORTANT] +> Saved history and exports contain plaintext passwords. Treat those files as sensitive and delete them when they are no longer needed. PassGen is a generator, not a password manager. -# View history -uv run python main.py --history - -# Explicitly save a generated password to history -uv run python main.py --length 20 --upper --lower --digits --symbols --save-history +## ๐ Quick start -# Export history -uv run python main.py --export json +### Requirements -# Clear history -uv run python main.py --clear-history +- Python 3.14+ +- [`uv`](https://docs.astral.sh/uv/) -# Copy to clipboard -uv run python main.py --length 16 --copy +### Install -# View version -uv run python main.py --version +```bash +git clone https://github.com/dk3yyyy/password-generator.git +cd password-generator +uv sync --all-extras ``` -### Web Interface +### Start the web interface ```bash -# Start the web server uv run python web.py ``` -Then open http://127.0.0.1:8000 in your browser. +Open [http://127.0.0.1:8000](http://127.0.0.1:8000). -## Command Line Options +### Use the CLI -| Flag | Description | Default | -|------|-------------|---------| -| `--length N` | Password length | 12 | -| `--upper` | Include uppercase letters | False | -| `--lower` | Include lowercase letters | False | -| `--digits` | Include digits | False | -| `--symbols` | Include special symbols | False | -| `--no-ambiguous` | Exclude ambiguous chars (0, O, l, 1, I) | False | -| `--exclude CHARS` | Characters to exclude | "" | -| `--count N` | Number of passwords to generate | 1 | -| `--copy` | Copy password to clipboard | False | -| `--passphrase` | Generate passphrase instead | False | -| `--words N` | Number of words for passphrase | 4 | -| `--separator SEP` | Separator for passphrase words | "-" | -| `--capitalize` | Capitalize passphrase words | False | -| `--add-number` | Append number to passphrase | False | -| `--category CAT` | Category for password | "" | -| `--wordlist NAME` | Custom wordlist for passphrase | "" | -| `--history` | Show password history | False | -| `--save-history` | Explicitly save generated passwords to local history | False | -| `--clear-history` | Clear all history | False | -| `--export FORMAT` | Export history (json/csv) | - | -| `--save-config` | Save current options as defaults | False | -| `--config` | Load saved config as defaults | False | -| `--quick` | Quick: 20-char password with copy | False | -| `--version` | Show version | - | -| `--interactive` | Force interactive mode | False | - -## Project Structure +```bash +# Interactive mode +uv run python main.py -``` -password-generator/ -โโโ main.py # CLI application -โโโ web.py # Web interface (FastAPI) -โโโ pyproject.toml # Project configuration -โโโ README.md # This file -โโโ tests/ # Unit tests -โ โโโ test_main.py -โโโ templates/ # Web templates - โโโ index.html +# 20-character password using every character class +uv run python main.py --length 20 --upper --lower --digits --symbols + +# Four-word capitalized passphrase +uv run python main.py --passphrase --words 4 --capitalize + +# Generate and copy one strong 20-character password +uv run python main.py --quick + +# Explicitly save this result to local history +uv run python main.py --length 20 --upper --lower --digits --symbols --save-history ``` -## Security Features +## ๐งฐ CLI reference -- Uses Python's `secrets` module for cryptographically secure random generation -- Does not persist generated passwords unless `--save-history` is supplied -- Protects history and export files with owner-only permissions on POSIX systems -- Calculates password entropy for strength assessment -- Detects common weak passwords -- Warns about patterns (repeated chars, sequences, keyboard patterns) +| Flag | Description | Default | +|---|---|---:| +| `--length N` | Password length | `12` | +| `--upper` | Include uppercase letters | Off | +| `--lower` | Include lowercase letters | Off | +| `--digits` | Include numbers | Off | +| `--symbols` | Include symbols | Off | +| `--no-ambiguous` | Exclude `0`, `O`, `l`, `1`, and `I` | Off | +| `--exclude CHARS` | Exclude specific characters | `""` | +| `--count N` | Number of passwords to generate | `1` | +| `--copy` | Copy the generated value | Off | +| `--interactive` | Force interactive mode | Off | +| `--passphrase` | Generate a passphrase | Off | +| `--words N` | Number of passphrase words | `4` | +| `--separator SEP` | Separator between words | `-` | +| `--capitalize` | Capitalize passphrase words | Off | +| `--add-number` | Append a number to the passphrase | Off | +| `--category NAME` | Label a saved history entry | `""` | +| `--wordlist NAME` | Use a custom local wordlist | `""` | +| `--history` | Display saved history | โ | +| `--save-history` | Save generated values to local history | Off | +| `--clear-history` | Delete saved history | โ | +| `--export json\|csv` | Export saved history | โ | +| `--save-config` | Save the current options as defaults | Off | +| `--config` | Load saved defaults | Off | +| `--quick` | Generate and copy one strong 20-character password | Off | +| `--version` | Display the PassGen version | โ | + +## ๐๏ธ Local data + +PassGen stores optional local state under `~/.passgen/`: + +```text +~/.passgen/ +โโโ config.json +โโโ history.json +โโโ wordlists/ +``` -## Development +Generated values are not written there unless you explicitly use `--save-history`. -### Running Tests +## ๐งช Development ```bash +# Install project and development dependencies +uv sync --all-extras + +# Run the complete test suite uv run pytest tests/ -v + +# Compile-check the Python entry points +uv run python -m py_compile main.py web.py ``` -### Code Quality +For pull requests targeting `main`, GitHub Actions runs the test suite and a non-blocking Python compilation check. + +## ๐ Project structure -The project follows Python best practices with: -- Type hints -- Docstrings -- Modular design +```text +password-generator/ +โโโ .github/workflows/ci.yml +โโโ docs/web-ui.png +โโโ main.py +โโโ web.py +โโโ templates/index.html +โโโ tests/ +โ โโโ test_main.py +โ โโโ test_web.py +โโโ pyproject.toml +โโโ README.md +``` -## License +## ๐ค Contributing -MIT License - See LICENSE file for details. +Bug reports and focused pull requests are welcome. Before submitting a change, run the test suite and keep security-sensitive behavior covered by regression tests. -## Contributing +## ๐ License -Contributions are welcome! Please feel free to submit a Pull Request. \ No newline at end of file +Distributed under the [MIT License](LICENSE). diff --git a/docs/web-ui.png b/docs/web-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..da72ff8a1c56322f94ec632e9ab1daaedb3ddb4f GIT binary patch literal 104864 zcmdSBWmsEX^XN@WfflEfQZ%I$C{o
%R>cpZp(=SO4FH!vE7-9nz_<=(iRA3}~iTdYy5yWc5Y z2u-^i7@~&m@5ln%5itd;IZe*eu7&S3+L0sCqW2Q3qYt6^Ktz)U3)4!g(d<&LW-&k+ z{QHDnbOHGJZi2aX|Nb^O@nb1gpMp1&?M(#*XH=pdu}sLd ;;tQ4Da9Fw-WTb zHahA@m8D#HT0H{yTRXp0h^cLAhYc37CA5-Df7~<^n*vi+b(?NS*JKRY*|)uWu0NSL zCB{U4yRTb;Az&a>2VL%;1+-|i+4MgX8};pK(O=lHH%RyXtXbEn+WD=g-{f( mXeFPA|HDB)B7<7bn<$Hw*~uS_eD zhC@ypXAAwH^zw?e%M2op*)pF80t!CA=K41Hl7(aouN^2?(~Up=26^827#^xD%ptcy zQ@8UJ3c|uoFaw(%PYG|YFYn}dT`)R_w0C1J6;@eCo1V~$NV&1CBwlE)`wtd&xqi5A zjo(hhftP{AkW2nVTp0)3Jtu24g@P=Hxyq-mwHhaoTIZ9_6uY0y2aR>Bw{BkquVS9A zp4$R#ZZ<^vl{LnHtRt)p*LwD 1vek2K15YH6@)hZ_us&|8R@7aBvyIJ%x?Cri@BIyiaipnGiBh67694(( zzAeOY539msYuV#?41W1jP{Y>kX1x7Q2QD5UbqSCj4U!jL{8cd1r%2SM;&ihSG$Q}J zrsC2EQD#W}SX#4)2k1b4{wJ0BE~?A`xy)+Nsk@%*LpM|Y!xlG{UCiCS!`$r1+x(^v zZ;+bkTbgS}ygb0q= V(vesmQD($nrY?xft9wLI%`ygZ&5Yq(t; zjTi|To-5Zb9a ?>)43G)TNET6{e;tU9&KiqfKI0T{Wd{=o3nC@RyLbFu+92A`%a`FD{iy9N@AD^7 zhlIWJG``d(6D^0)Cyb4g!0D(;yN&VRO`!Dv+Ykio^$cK6Vn=F_byiTnCqPulFqL9V zfBg%zDRI|URAq;EZNF+8yrOEhi{ZiTx!qBgD-Do#s?*Q#H#rpYc;_`xtb!Xbue)xs zGMq~kJ>8Hv49Pxj 8J!xim0Lgfl6o}oIiFtvathn z#Jc_3E?amfpGCtR+M1*?IY4&7mlOukq3gt$mF9TRC22-s-|M>yg^||{AaJ=WC9j-U z+obPhj^OsSX><(d>M_*&r+Nn!BQ ZTvN!Fm1k83f1>~nvs3uh z8^=iOiza|*CL-{XV% ZufPZpy1ELJf|yY%0VABjYn zFi=_gMRJE-sa=gafxoo1f+DNyk#6P&N#p&Sb|nuu!XFJNns%Fje89t3%}#lx CJ zOp!tUn;BoB&g;8__PfXL9h>PstzAa> ra!j zdIiFj$Q >LmO|n4@378d{>X86|5Ah&H6JpSztL;X?w#RmIvZcCTNi#>GoR(= zyuDt D` {3C}s~v4siUKQE*`wXuY$iu7{Z~Iv1Q}zzH0pQG zL23df_1dK}ml^BM wz`lsdZ}Dtx2!4 sQ3w|HFUN7Wi(+c+uPYW3o5?p)PB ztG$y7?LB{1WWPT{#^4vWF`d*cz7xh!iS>Y_-SV* H7QE%2w1PfD8e|0><4ZFioysgxE*5%z|TJ3$s2u31Fn;lGL;^f9 J6HGLk;|H) z)93itT|u)L7?=D DL59i^>~9W8$Ucd-6{Sr;gGk=p4koBQq7z*XGQV*U_-u_LDM zS*GCjPaRw3fyj=x-d-O6b=rbI;^0@V!;-l?`=er{-mx-PaV`HN^k^2swQFdQ`nwyj zdo*=kHn07{M^sIgqubG9k)TH*;@9YNxFbQx-z %CsYB=)(pVC Plh$9fuZ_ zvm+(o4UgL&lo8QyaeHqq&5OG4FZFK13VsBUMm^GL_mtm%0u|9~;o*v%o+@8%VFR}R zr&C1rHp_Akgn#|%N{Yu(-ZIPx06H*vc;_4wrm}!AH*2H*X4UJVhpLCa!~N^Ieg;0} z?;LDXWzZx|TpXI>swY#FQUU04*}A+shEB!y+YZ$}v-^yCPz~IY2dVSs``Z@88X?-p za=j)_mecH>%vh_6!CPnK-k01TpeyKV#f(8|o6l)yfcJw{byUv{gYruflK6ypgJw0~ zn?VxkfX<08Yg=2>H6aZ(HC&d-_`B5a+du1-&ruW(VTSP9?p@@J4QualJACjv2Ta5R z2gk&|6f?KD?Eg}7FPZ_BeTT0qcL=(@Kwce49t)>*IR^zv!u;qKH{4p?l$1Wk$Z%_M z{NxUTxbe!>E`FObA7qV>PfP?du{|J9I?}(x9FN`i$Fp0^-9 ^x;@p=6?|Iu>Vsxx&>8Q%MqkX8Nbq#GWfhMd& z5ioQG_$+ei!!0kA7 qKQ6N4p$UYnx+OjeM7kx&c)^dz z*iB@{0|~+ef5_ZH=j*s!RTl#!u$0pTdsRyHg))>;**4g{=)Mw|jF{6}^1x;;V5YIN zgjbjQ!wo}KHx3tYp-*spYzL^Cr{D6cdAvky7usN3p5xlv7|)FQ+)ZvbyLtzQF0~zQ z^s014+~ea@^INR>Kk5cxA5AuKRY|~@+05C~zGsC{huz$U7X!js^{!7hqq(Z<=aTf1 zP=N|D0aH2Xh@Y(N0<3>Wtj0Ea`)E1Wdw$+AI>IxlKusM-cX=+Zj0cb`%*c0=G@^de zdf!JJEv9tfbUL0btE^zkNXW|zi^aeRrRs|yF!mywIy6XrF)f82RF<6V9p`O%?z@ex z%Pgr$O8W3S@D}R^14Hz!OKawI(7lcbqK8<)+E1sYzQR7U7(g8Bdw w9)8`DST zCiMjdozPur==&H`*c}BEY_6U6p()kPjH_hjIGI0NEMa;;M39M?O`oo#wyG?;51o%R z64@vKl$_tY*Qc+)E0*dj)uXnfGE}12)e!?IHBwpArJ>g7D`$$#-Nf2gMV~Id)!u49 z%rYl#wrJm8x}GVBU5qNY`Yn#)H(z#;<19;p%jOIjmkl-g@>YMQ-@Pc!y3ZG)BAl{X za6WjdqN3yO>Qd7@@~KrhK}rZdz@QaYvn-b{5;Sz_rNfgC1h611HfRmmI<9jXjio0) zEjAe2 nm;#_gt zK)=g=UT+~t=8VOj=3>Ho7*ckVVL0vn*BuAe-ORNpO~y)29hm(tA1R-o1LUZx(r bgCeu|hP{TsJsx;1RTAMfY89zR?=x}WqCU+gFL6egy zG+N9Dey8JA*n Jcs&^|xy@YWV@jEq z2l6#$C|VI)aCQ6*V_lWHp+*$gjR3|1JYf?+RaIGH%himsU!Qfn+5*rOe^_k)6j?50 zJ=@KzS|_$`m$PoPH4iM{GG+*ZWZF%iUa(O}Mc^sQ-RF<~5^~=i{}uj{t)6SS@UNv% z(Q)Cnbup&dwzj`)L*^Ww6nN0g+{`Ul X?Dq=M-LOQ^0i7UBlrAj|nce_Rb7DHR DK9!lZp=QvI#t}vst6tX0dLFAERFk8OoIlGC!pno@n?ovM z;qpiMF!o4+uQ-=x$KASv0GCYCSvkRoWiEYkwGmd*4s=FN;e~BFaIIZioNd5KSxsb7 z&x%i8Oqn13S&&3&f@2#L1E6_$-nY`4SfRz>2I?Fe+gY^rGb0qTF-{We^*ep75|jNC zfdU` 7Q{Se>Dr?tPNm^({0=YAE8M-7>3m&_f?_A;BSZ#=|! z<&c2Q!5yD6IaLEty4k|z+C=Sz;yanm@#|
N$ z5KHr}J?|H #MQB6TjprB&ptf^eq0Oe~L>5^Yg}0ZVh?@&Zfvs*(of3N6 z-{QFr1sN|Gl+%kZ?ye5%O1$ASB5$XT+g$lJ_&d{b@tW((9x3Kpyh4l=YfV~IS w8!FM7|)s7-XibHk>_)0byYZvA}Yu%@VPeSK x`>;wNqUFCCCR@c05{Ty|Ll}PsdymE?u`UScx5zs=|F{*x`47vs=fvTZ~WrT5&yA zS %*yNZPm5Z6!P&dy<5jBpcsO< zA0?d~l;nk`F$+H&$+KllXw^JVZ4+anQh^XT%ujHa*4Dyg3|PI%P=dkTRM`|Z>m-nN z*igDp<&k3BJ5!_5zfmehOmy>hO47w*XueFjqG6?P?nOp8&|K3@Ji6)k1dU>D0xNK( z_C5diD0odovyM522i$-T?}x1Z)%+Rc_vGh46*@yyDH1_qqWPn~99OxrtGTM+MIS7? z!_L|CDTf8G{lxwr?ksJiSPNYuhtgZSc#)BI8!zXT7H*Zl2Dm#DYLL|zq?*AE4K1mW z;z%|FmgNRNF(maK)kKFHuMUookid-l $G3Jn42&jJr|zHO6QtwZu6nT*EMSGr{DP&1kfr?ZoBQiy5LN^tOP4=6R b508{w zxsx AXX#Kj {=M^1Rq>Wye2ie^R_fCC$c;veCWJZ&NH&e>O11f8;ovn#FDDGYu85uX66dJ!_ zKp@CC=Q}i&GnF=!pdPI#SE&CY+J0=*?Bty^8{P=NZy`yxpu;> |#f zpi=VlSYh!3M)T|`pQqrN%$nun f0pF-XMV_KcV11ZV(aU8 z{VTlJR_T12ph83%Ef1xrS6mTQ5Bj}CaZba6{YY6&iSZn(J~i&sy;=2x<72yKuewv8 zb@4i{-EzvS^)D!^`n~>rZ<=-kcXY88he_;!#p3B y;cLLebm0}PwcoAdVq6i*JY9?W?vHMF=HJl)_1_#5 zLz#6v33$o$pYljBjoN0+PNXdm0q0n=W)R{&k!p+kTPvJv0z4|Yjsk@!56>%WB*A=p zwzPfi{kiU-v$BXHdB|+tiq`|Epzh6=5OpBP)>$r`t^Gd5)InND?7?M%fl6P$gsm00 z_Ud{q&^Hk4{hg73YKs@SA1>&tO!p3U{w)2y%owhG0AQ{(J04mL0C`{L0Au@ |?Clq4Ju#Gs+ }Rvp?I5p-rA`=YyAB1N`((L!pQR)CR)y>=~Od(q`sY?R!6VXjuC}yUrEH zR2t{RmoKmaI83`HYG-?arSiN*owz?}Lg #`~aMxE~V^atl=f)!uzU73WKFdW8ZKAMq! zaRrILE7R&)4bIjKqplp062!u(%6$jAUA>UutsR8IR89ol8iFpGdXL%U01c zM s#AUtjJ>bja` *Cf=vvd0^?K4sm zH17IQMplv$|G_q?0m?LFnh1l*kBN=d@)j)?=5y~Ek{9Od3#|-p1FOf9m>r#?Z~iW6 za5$+vpZ#*zq`Ek0>z$#QGg{OHtweD{QBhZ1_GbnhrFbrvQ0&tNd?whK*h8z3pQwCU zh3nxgkX2VMm$hINgJ?Zgqe4%1)#qu=$!vKO%DB3ugICpml+$V`KS26|kiK;;$(%w+ zI9|tXr68-dJmR;A_v9}>DjuUAwvIa~t)K|XrmfuQMF{!)uXfUj)yIGn>O8Vq+bK6R z2`@ &uoHnIJvX3{Vas@CfCKqoeh#@fnQvY&2{ywXi*prmF|MI^i9Jf$xLcK zA!eX qZZ!;Q!I4@fp(IF^`FSRr>0K^OJ%)g6o@_VcjO(ro?S(n{ tI7lO>q0V+kQ9X)E%y;k4W$Hk~g-x0 DXBiT; zoW7=F!NmWX#*&b4D;ZUG&xq~WF<8&bg90(;WPp@?3@K%tNdA4kXJYi#9ek`0uqh=Y z4nxVqhpFU?Pbw3ZF$Fd~qUv+$_olawu1gVnq $Q@~?!&eAWlosju#>(`0D)7-G-Vm`ocN+`!r5*ZY?FHV%nz?7TIhoSQ zI?SI@RE(h%lljE~t#r~=TB>_#^{6TkCUF(c1!Uw0E$-+bid@d5! >_d+Lu`aeKq>X8d<0twAi{l 44{s6XHjN3-a0s#EHajMl;$Y=(A?6bPO`VE zZ0CHcq?4Fil{NB`OvuS5&VDXxcdAXAEz_V5`Jyr+#`E)tR^k fK-Yb( zvMzTSsQrAP1Y$o6G&l%Kpc6mvsRV|(dB?A)c<;5Y2YoCnXPR9P$pcl#`Nlv 8A zxOM?^2{w*ZVMIxUl<{PRjj`t>--<72y9ZxcOaKbTqtG%dL!g*egIiiD`pA=xyL0(f zitelxU!vG9>8g8 *D2==;s4Y*k?ct}7cQ&kaVNOCR-U(VM_Og+c zx|%dkjhHXAQk7$`RC?z$`?yc~%0&e5p7L7+MKZ=!g^av>qVCcxpC=GWNo}LNnI-*E zqT~92IpNuhtD}|`=!08E Qi_{jkPWvIgDGn0t-Kc%OVRZ?|1!&DD}7Ws2xQN z9$u0~r+CM{ZOQ1^w8!piXRJbhn%S3>$g3KCuats?G~#qw!bATQ7~5B W6=Y=pQk()a+Rv0oiyD`SR=!8~9;#;-K=_?$Jeom}5XVx02Y&EvIhZ*{VR z7S>gZQ_~9I4{zS>AUDOEqU)#EgW;|&abJ}IJ>^%JlwrOR-CDB(Y{p#cwPvlCpc^MH z-z(_bmsr Ity`)mn1iGy@jEaIe4bzVt?Pe zql54-K!t^uZSO*C)5DhQcSN9b4a%k+8KRsNV|#4zgJu#D61dLjNDp{n1WLw`C6A;> z^H3`FipX=u&0H5{`Y&cnV4+6xeq7?}h4XVkPfyS47mZG2e@}rgg`xtqHm_d3FsTtZ z&Hy3zB3BRe(f3B?#cX&EU(fo}{^TyA^=zW+r85=O_w;O9KQ~Ry?WYo6ic`NkN*CH4 zP3^BuSP|Ff_7m4fzBboB92@Hp4&){;W3|E_lU-VpC1zx0%vL{CNk5*XTh2dsy5NDR zQqLysp4XG{fA}q0A@16CSd8^jzp+#FrDbepWXR*-$ #oOmr-Q>No+ R=S*2q65cUvIj5c2Yb+1&D{3gmTf zCk&SY#D`B=dxreOZB*Dgb}85RkR?u`Vx^Sd1es0uNg$HK(wzRfV8039GdLlWLhZ;> zoUgo#3Zv(Bhw^`8djs=O-eG057ew(u{AhM_)>9!>ZpNmxt|*%N%QSYNlg$X;(r(|U zN(JxSDjBGomcrd7lXUll{$v$j(P{ZZ{>em}(2$KNHzdVIGlZu8x3+z>9raba(-WV1 zz5wf;zbAeEo;OFg+1rLr)yX@q_mTgX1tcy?G^+QI=`tv{3cwJkKu?_x#mN5t4s7$a zWvzsC)Z2%IYVVVk&6^P+3sYOL66vtlrfb4uuySU$`_2Lu@bxS#n+Dx)dJg5B#5}?R zu@+fUOx4>6q@==ubfj)hFR`I)EU4It2EDe|=ArFK*;J`HEh@l!I80SM&Me>Y%dcj% zKpY*XLp<;f6OWQ}zG8F%z=X;UA4Wxzs=#>@CVBCFgI>mmvt>vG0)a>VsRMDj4=GTj zxU$7!!bC;i1~0c^d=1F5x bEB%>DIm` zlNVv06kHF@e}!qbAX?ua%~O=2T%4ukzd}Iqo89U6)e+T<-_q5tTWYTq1{Z#_C4&xE zXwsF*^=5SM!}TUqnNLPCC=8^dt+?KV3aChGO~~wBeaA=~q!2}CtrOlk%%%+))2;k! zt~5%OVfT4-^fJ}EF_23)(4p=3XX61|eu|S}&-7`aqpU3IKLG68;09m+6oy8NU2XHN zR%)&l83qIx9~@wRf&4uuoG5oWGZ?QdC5cBy&5erI@!2UE@4NL(u60P|7MIMGGr<@3 zcsV`RMq1$UZSq!-cvUX48|#iivw^`K3X~IAfX{-maG}_t#m=s-hT8Ig<3W;^MW}m4 zNrE-^%!Kie0{tF4DxpOPNx6YeofVHsB{W>!+l?aiy*ni(B@;tS5x2{aNPN?lcpg6C zPIkQaA{khix xC+? %@hR2PamZG~5K YebdfkhxXS`yoR7%x2k0dp>5OxRwBewW?%>xHVgbLaU%i6bIccW3>A+E}nQVoFp z9+RzzOu{R9`(0NsTNAmnz^Yk>8{cY{2Q=l-6qOJ$?nCI{Z+o|W*F$Byw3*`?oZeEQ z+@j^O-WAijv}pR)&dyEA)pBZMED?kXjOEc?qoBj8er4y5#p`%heXEs$PsNpdyoOF! zX~7!NC%3PQFd4vzy0tZ@g@dZ#p}CUZ4L3HzYhrJGXNvpAY8rKmP)7%vNX^=vLbFw* z?dQv*Zs?r`)h792Jb#yA1i6sirWr*nHiu%huCY;!e!bo1)MCNLY``-c-e(J-!>9NP zcd8aPY634T(mP%V8?>S0+v!(*yljoI6|-HeMiD$HlXrlZD`1V+xbyeC$1dB +rV4Jriz>w5KyGt=VAenZWpmgCE?{1k~)M2HtkF5lxk z#{bG4VOV;p-%_FZ#ck`TTKjb&QFnOx-FnFUOo{AJwxGuvDw=Ah14+__T{`Wnw3&DE zykeDZyWVK(y2#771dhpdf#6kb6L)uTu`Mw{igQuW9K$XD@%raU3kW9{AYG6r({m*f z1s+Nf2Zvsl)|EvHn!JaRe4=+7;p9WfOwH0x&Lw;cl?%$*eqx>wUFO@rs@(BF?Gndj z?I)Bd2nmnZT +G><+v<5%&xZw)r=3@?sSIx;_5MF8Co z0A2O!CCH=ZV_V1~L +G@MD-L~8<6bck~C{Wzpp}4!dJH>-bDFuobcY?dS zySux)O9*b?>T^HuJN7rm-hX!fGRPnyD{EeJ9_KNy!ZL$qf@roQr5_wqlyM&sOK{AA zimWXLT Bi=>bE>KYSj9!!#4}dJ-iYB9?b%fxB$#30 He_PKC;iPHxU2Xvf5Ee`-98dgj;~T_+w 7zc$<(Zd`xVp#^mf*&3!ORXp(i+tdm za@M^ )z{J%xI2mJtXjufxzmH6h*nO&7SipDafmWQonu42-XiYuQjFo6RtMibY z#da}{e$K-&LWp=Z+}agf3-`W$fkh%{@w%64c4;AKc9~lXv1PV+W1Ma30`|QpdlVmc zU3YUjGLDQ|9`>yuD*Z{Xcat=Ve3@fZ^!t@gS88}hkF2CP1hja!9_A%T(+y1LD$oz+ z>(BE;`CVL{NL>kUI=aN}i*34bE|%+G$HxOp%*#cu_8F>fHWpe*Da_aPeV=oc*bD^r zLqqhESRVU1`}U`R 0L!9d-JL=cyt=L1t7Qjjr+6b6B zC1T@ZIdZ0Ic`5@VyC7VI!{d;bXy84oJ&Pw!!JBB;SLOM#`3&+RZ+G04YHlLQ(MqX! z{*KDMMpgU9z>I!ubS1HnKXW#T_E$F+=rS4^QDH#DbxnaZ9<{b;KyvRmf>3mp35;2N z7F+bgZI~B7rBch7H(xCwc$ZnRnnI|4_ps*EZt`=GtWrS2^eRTTV6`w7hQSO_GiC$@ z&gs3Jx4)jPREMqw*De+ib5j1cl{kv@*?Iyz6SVL3Ja^-`r^AQUlbIPZ>i^jvORDB3 z4_qq)KM&FJgDZ#r>V|B!g%2i?Z%;7NALeFLh8Ws&D@uS SoW-9FNl-%De&+B_%1DEVE+cvYTm -U4V|>`WV4=hEWnef&)1Ke%Eh7w8qn?ZZ+qETE6_PpO25CB7Z&*<}MOjJbLBclW zc*v2JL1{96`*Mj?C3@qSq0<$LDptY4L)-%sebK>e`V=NpCPFe!?t# zLWX}J+pS+3jvH!E%saBNe~o>HUHsr`Gatdh#hW^_>ox5iaZVfMRqL#&x*DwpmkoAz z8QdRE9BRMa3>rM1n Wa8iI_;Cx4grv{-pMs$RF81BRQ^SDvR$Au zB|k{~T2mTuA!WCR`4-;TE!LgFTfa%DHQqmDF)sopa8RN@u}{*cMxJ)g@)h@?jBbBU zEjcYjZ<}k^=QZ5QE}oLA&6}OiM$qjij0;|}^Mh(?YGN5V-680O`7!zM8gm{q<{|Jd zBvC9u-G(?8+t9^ozSh=Y?+6y;u_-rH4p$G+15jb>(S{+LHv(S|<6-b9t-l$X_an4$ zRc5>V`H> uL*B$x=PJx>^R+Yinn4=;q4}&!7hq-%%q+!|2e}GzVoZ zeaP>FKj|FjAvEZa)EQdYsI~sWDvTh-7=nbnAsXh-Z6bu&%yN^BMva%L%yeWFuVHfr zn-{uY^@RO}pUCFe%vLYyEDwu*W-+5}!uO_EbvXF(m7ea?krhFqB~L$vN`pybov)+c zzo+KCN1D?uoKmiGvO5`~p#18VaTibib+=J~K~81b3L1z(WE&-)MsLo~D4oR32MTS< z_;VIU<9ziI8;iNZx^xb4H(57j>ab4K1HoIQPzL4m*JG8-KloWR3)tYCk$OT?4)=?m z&-&`egG>onl*-I;6l_|p0mnkf{0&=Q=*ToLD{)ePyz#NE(-KzalHA?y`e`b3JPNAb zbW^i3lk?kqC{*}I{^EFS?Tz1Ihs{~Y&bp)4-Y-zQ!(14JlCe=Nw-9{1cfkn(AzN3| zgi^_ayQLgGABzqX-(Y5U&bwyhDUWcAHv1+C^R193iPoog?><1T+V!HmqT7fl=#pY^ z82N;vQ4(xo2i@ cu^hSZ1(Tc9%%E(t+~il`EFdk;rMZm^g8)KA}+~ zK*pw qNldsoEpfZ=GB~Bx>$YIqBo%AORO-fBH)`^tl_+U20DBuvv@rDuZ z8_>Z|)MN2Ft>bLsHR+r2D~sD-xA)Su+4@-iTQifRtfV$YW`z9My!g(Yda$9OA|# 4{&1PUE~a(xtrBYF98y|-uJv4S9aG!XUX>THsf z#B1u6|H)#xPj*}Ytyj-Yzcz_E@NO|(B3GoiRl(-_ok6vepFsEXtKTQS)tl3LGbb4s zrcZ4k&d9bBilZM7pMh)fy-j^R6Sn@YPu!FOK@>b|kS}-_co|HTpflF1JDBV*XKQ z+mxY!{4WZloBeQm%k!sEkD;X~AiQE!cYb|r$M_1xEe zu&-kzkulYTyxwi|KTob<0Y^{FW$Fq)=1W0@dg|?x%EBIc=Tml51Zq|~F!^I?eBL3c z1=G>56B=l1N}!{n8J$q|0ccY7dN}-L%?@ClP{p&juhx!6WeNEu+@0Sp&2fo_X+}Y| zlgfeSRLD&yYI^Z0BK2`ErJCg3N(eKWlGAYMrsz@fj1DYVp{bZl*`JT@2vPE|v3~4+ z`+&t#tpPcKCXMkq%{^|`Z5h^#H;NFP!3@fdWcD<3E(l8i*OA{VScZEP9@>aG?tN@C z(t@U3nTyHAqNrLq2Ig%g3>Zrp?F0 z;jh^XeWhfIIVF&S)P}CAukPMXvaF}#VQhU@Dw9^j&@KT@mh|M%X(=l7KwZtn WGX_9GLG2MQ|GI@i>v1&S~z@1wNhV*!}<^M+th3#_xp0 z*sKdChpOOBIR^9E^qp|*iw7a@V&zP1@7#ojARTt?-Xeip-5%hQb?kp1=4frBV@r <7IE2XA7Dvx+ieo4JQ_=!19c_^nr191hTlDCteKSsg}_B zAEcRkXll gm7)$8Y=W}*Jrd{Gk(ou3*xp6FlmJ~=YSq>~b#`60Q)9%)lfkZ&{l(E3 zQ@ZJ|%(cLIaeZ<2!=Vk5zirxXz0|I$5>f4>V-OV*=_iI@0R3b*98O}UYWHJfiSj8) z@aZqp&Eda!sg2C#lla>cyB6(mfUQm(a>k5MIO#J#9~eJG{mk8!A49s{t4-{>jV)C} z?lJxNi+Y_hIuZd2!h*-|Z8QF9Di`QwDwtF$QA)q%1{?V4+A%Zbj#B7nPO4B`(}YOa z2bj|3kH3V(>Blu!oMdKJ+)>&h;;VQ~+Z6E`=_@E! TMmX;+dbLn8V`<>--hi$*dk&I_LI}X)kjN|8!(<6*f;M%YP-pnV60ncZwhQX+cmc z5tq+`7pgKuQpWprLH}rr^5iQ59Km)kSN0g4*`Zd4y#eB4TsRuJ(yw2iVmZ0s`Ox91 z#&hVH7Cir8#;D0hhH5()bd5nKurOtajxDVj(aU-mB*Ylt$1}^UH+L`;7I*puDK9a# zN&r&5Z00>?<+_Ey@xANyCBh%b@wKx?I^QG4&To_XlnZ;&HPkjybrCRwH`D%MLo3X? zT_eBjfo=xQjFi%R8}Cu;Lu>v&gkjeK1ei>IXDi%I;YVSjsOb2V*(nG-kFc<}dsfKB ztn)-ueb#}To>VROTD#ZG4=hLTswL*sb>@F?3N0S|@k^iEC%d}c(yobvT}Lm+X=u*4 zN17qFIPkaheKNG$gbj)gq@F(1nA3VGdknXlCQ4aEc#_6t<}m;Xe|UTkizq$5VCF=J zh_v=--?_AKUc_Kx*XeL~fFire6`aD;7+!;Qe9-z@PhigD %S%FNL^ QODqPn)JzlQcrOFtZ+a7zH@qOcYVZ^w}= z{PHzs2D{*#(43gkF(iCH2@Q7%vpQ=-@5@V(Cp?}4?(sZS7;oL+f9BQUbXt3K0t0c_ z!ALamG!pu i E z`gBVD^b`_`un5(6$anDP4#O}}rmX{i=e+QDE$Hk9zd=sQ{ibPfh)d~IdVCv8gWl|D zP1usAj(J7}jFOSMVf+`Gf2wDKF9_k?{;;CAMvYb7068#2Q5xP#2Zs~W zS|`|2<7J&@@kWOG`t`29h*B+*ufQ&Kk{(8 z+B-X=bFZDBoSb|`=jQsD79e+>jFJ&9Owg@3T|K(?aSQ198WAbS=tUHLL{Aph@%qX4 z7Pb{M;xnuZB*IPw@K}FPQgX_=dRAp@oN$dMRYQ-RcVa2hQ<(z*B-c(qzP6NWo~Zbs zD*(Xl)A>F3pqj-1pmoH6H-)nYV?=Vi8cMZcG1|C$GU;I^lokF~)}pm$M2#hh*r$%B zkK-oq&T4lE7vc8oG4zoA e0wAmC|oaY}|>~ zc|ltk+}2hC`wwS{hN2074lD$)=GqN;U3+shLnf5M$r;qsVv=8CdaZ?2ehDNv)aM@U zuob?i_sN{xRN{#006e%=BH^RaNVBe;DDOqY_(&=R0xG->)<&AC$->RX1s!#EGRKF6 zq5JTVL%&>;yrbT?lgi>V_-3iX_zkn;U%G1zPNk=0PTGI6*{8HCX`HfkACssz6jsH( zCo99e#))v&G0u}Jyd6e9a|9?f&}XbwRJ3<@G2Ho; zlne|M;d8l8`}tt6=-dvVU#>T`4*9mZ-CrFmFQKDu4iPHuA2v3cnwm!Qm3x4s*kRJ? zJ@qx8^FB_60$~dxezTF#YO|;Zd&eT qri^%0NT1t1m#ay}zuU {fQ;=+GZg`zSW4 z??)BMFO^sdFy(3H0E&-Q@kxai6$A%nOkdFx9p$1MTm8LH4){7TOicFIxJ3e9L>`V_ zd(G3#l5qUH^KY}lwT?Fe;=;IPD+9K_?janc*=NzrtQB-=eF_l$fYhovnp+PYmO?ax zZ41pG@ih{0R{7CDtFLNNbvBgK+(=`@6n_Lov<~0y$VE0OJW+Af?e(9dwxFMn!}&O_ zIkhU__7rw-v4$VctUvse(O318BwK- +5CyoJMryic zw`CXo(4z)9uZTs1w91B`QMR^L$@CZ}>J#j+ZGX(at2k~uCpw#cz)QKH*1PI$!Yg<0 zUTj@#p3x%td>JgLoz;99E4w6=Ci(>(Qeqi+Iv;i|D9Z1H>L^yYlsjdg6Jjeg#n@uz zIr?ol;0MeR`$$``Vjv&%v*j-UexbEK^p;3*4GgZWOgDY$4^`s${uRWfIKfKl!T$ @1`LBm)N#FxrBTqG-(0&b||6N~3__Zrrez=>A{-x$-`n`d`)TsaWr!F8w zXpNI+#OJ&-;KZU=mG9^5<8!4}jQMgN<2C1w*!FUx?NJZT?Jx+)iqY`m84t8$NE*e( zt&~G_+UtJx7CNb;31V__I5ugW-I=VVQT7dyZ@+u$DfE!}QsoMcwp7iJsAq*>0bkh5 z&90|LK(w-wi$7xhTi^0soDGszi+JO>nPG}&Hj`giZOTFrVCZoA^ZSUo-cG;C=)JTb z?9;QiCQ+`T*e9Z~s`x#lD}J30rHzhEf4lZq{zkeF)HcZ7hE7vkONjJVXQOkUt7YcB z;krNPD--#qw(buMSL+u$eU5+izB#-hupv#9NqfRZRF+V-o{#8 9KB^+9qOi3NHaYAYkP<4cFR(gDk*3T2b!Dwj5n=f z>O~|__=6&TP$a%(q^9I&m7}nvt=v)kyD3q6r`?H_uRfMKkZY~V!h x0^x zWEss;%f88K@99jBY8rAc4=JoxclPZ$fdZtmQ^nSxO#O=Ng*l3!gN|%prEt)OJ#{G& z8&8?bz=X}Ll$w~Goc>Xz5!BeI5~FXi#raY51L>xHqmIW&eyO&H@a6w-0mAIqz>rlt zgi|L%RA2ReZr64wr@x$mPQiAB_KQ(t{e&MyJWUT&CC6+x9-GcA+w44fVd0-y_hYaa zS}BbAX(`(n+_WDT^LfZ_jRudc#_`UB uE+1n=tFs&D!cCf1#V$sc3OfF(|x56&KG>SEkoI>Eby>%;8#QmC;x{ z?%Y8!k5mqmib%X0Z`{;8ZayljCgdLV0@uvpVKe-YRA_{)wCqyGj0PvZI*~h81UV@m zg?cf=eA-f6yw8G&{B8ILj5<9Q3~{UH@C|embL)oIT~xd)IQtTcRf{xlF}s=y{1)B6 z70KV50^W_n#v=k&RV3*|k!tZq#+NBLP=pW|ddvW@o8s%-2UMkQJtZNvP7yy!2zU;| z8~S{)cQ4(l^^>@OF<&D56A+d{>z6Mmx&UtFLgGOSsrL0#d!^d?p4MkS0hR)v!w~ee zWS6uICxa{CXK5mi>A22MkyPAJ)As^|^oUwt`S~D40SVCE^-@hVG(72(m}+zRR&ttB z29I-YNTa!cX2ph|mecdZ$T3j9 ;)l>)X$>*zQjuccY4cI)Ci~7kEiKq% zb?ZN&f-oQOtL)^G0885}*AJRiZ6H$FgQUytny1gM-U^U>K(sA{Dk$sx Rv9D88?9n_{+Eq|e7`nj94metntbT lwOVc5Qah~ymx~V4NO!-)nd&lj-9N~ui76>hZDZ!504MoF3|_hh z@Kq`Jm_P(-L6^cj9dC-M`e~)(9P=~#nDjU7b32{}*kAJOxwc`?ZZQFHIi1s8UGUQ} zN~r2R;od7LYU#O-cFHazRVE0V+>+1aL4!1XvInfJBtO$b!g?@LO8k{2TAsVaA2sCz z7BdDj4RtaSbR35{NyA|KP#8~#GM6lq2sgD$Q;^3;mllb=N2{J}Goy?X({X|>zgX*@ zLFtkluFz;0(t8+KRfwJKD -(@BE*K66JA+$)D}3Tr|o9O)DFg_OsEe?1k`+8 zR#Bv@K0o{{UCB*Bsy`( sI+mFHi7KGemR`_~xa=h+Rw4woYYb;u`cqmI?bKqxcmEL}CL zUUJ*&I=)=!eEr6^18jNPryos|ukUR!Bav66g5eP}C%mLeiJs2D4ffs2d5{>@E~kn2 zVfUUZmPwJv=CGZ7I= cpjwODGS~?q)`YD>bxzx#j@E=SuR&a}=Z66+c?T zLM243kx*S-yG^?T5PG>hUFR*3iJ%k0wrSi !)2~?f)vPf$orAG&aV8qs@!(DuVx5StbD|Wj*c%a_v@;! zy@5i#E#VyO(GL0PlB&AT;KO>Z^m}tTAa@Cbr0C~aTuwY}rgCoAee(Od1gfjjQxtC# znP*t!`R^Z!%PSKMU&%_(CWAK-*1QuePj5edq{Ud3VkP?Mbs_kmw{x~vHlF})xA!Aw zYrZ`(1e*jsI8SCxOtJ|CRJ8{Rxb3h0zOXk6`WVUQ(opt+yz4Qbo6tjHuGn>dENyt0 z0V9>anwacfXY;=3T@7J+N lj@9LB?GeTK^@~K1l?RaFu(8z f0?cqCOaitEYUzL_WNsn30_y5-HNUf@d_kT`CSiD6_o$9|?kV|T%?|GwP!q+1;E zGBlx&pI2MlejjLQui3z(IposYZ?p4j#_1Ev)giR!li~q-BN}z;$Vl(d-EPuK@MPrR z>G@G94?4K$5}D}KUAv#NEV4 IxR<6` zy|M#=4j{qlpR_+&Fg0Hvnf=XR+@!3Q0>1QYkV@Gx*0bKMVsuYh7^wI0V}R3eS(+^? za9g_)nPE9GwQ!VLUpz<{t%ZVK00%0?1fI?(T3-%91R%gw-jn_#TYtR`l!u4miDw|+ zF}XS%O17GTIrh3?AwuX~SRKn{fAQs+ dR}?4_c2X(sP&0>&WjdBtxBetHr0KXKW_Tc7JaL@@TYe(JO;oH_RA;en_a zxNFF`S{1NA@A^B#BxCn&ylD<=noI;s4h)cEi}5=isd&&tv&LrmzWz 1>V*$ zf9p=x^>op1n<`-X-O>a~Vdnao+mW!|lgiM qBkRxajkQzvu zgTkNQ{$q{?0B~-MfZX}XQkt-xAcs%H8ui$iT(y3>B(5Q}K#{nULw^e3xpZh-7l!iz zBC`7(Oujk-frYC1We`!+UL}wp`tHJ*Icq8U>I1Sp+t^^7h#-_ Z$L^OYByIotUmvG9e-1y}X`A01AehX@=n@jtiHa_pLh o za+}^wV^3>v{+7>n?R-&t5Nl9Se;D~2I)eG_r~!(=5JkVz!AS}esSHL2hhFXT_FFX> ztIV&QRa)zaJe& YN2-qN4}MgC0TOD{&B4DgpXUcV%@& Hpz7n{bz2@K;wt`o ggSyq*qiVg60wajvaaa91IW*z@Go25pFKj&JVPy&0$#c$nH_H#e zML-rLwST*^ BM zGZf9`I@Riv=C~em(3fpscT@kMfaBTEhcO3)FgM-jbhqPYWX$Pu4)amCtJ{{x w_$N zv0DVN*zOMH6_M83t=oz@L#yO%BAJ*xb_T8mUML-`lX(`P|MZnVM6{~*cDx0Nqq@vF zmXe(obS^DE2CG5V)2|+~?ypV@gQ_!Bbsn^z0ENa*T?WHE2AJ+t_f<_GI}rKRYO!jl zp`y==V-}~Jebme2`*KZgBZemqVZyvVJ%vj~knX-|E&BzI#eA+SDz`V*mF#x4U2@zL zK9QZ1BY5xPXqd&~mlS~4{gq60=+S1|RG1JUUaTm~Pd^&dURBI}zMfI8u~IkwHM7Vt zZqu tU0Vj%#-@AMAoYQ*N0Vq#|_{3tjgmVkxrR!qYlj zz37f)r--a5tQLW6AF;6|6W+Obj{D>)5{MlYJ4&rSzK<9d(B?iLZJedxFch@gXup9B zv%(o$aoRtQ_u-Yd#(7Ky{adUSD+Q3&w6JHn8wWQjwjuEz79 zlf9OU8saQsF<)0*p{-@#m+Nj~^ONRb&s!dQ^TDd1hvS9GxWbFw;RH#vLYC-^a*|~K z&yO=n-> _jUdw(rd!hst+CrQFE0Pe4U)i8G9>@7)(q~W@ANd6QW;} z0XS-0;2Ovhlxp(0o~^`nGk1ol*W2=Wd&s$&=r{ov*Y+j4u^ zsioUS1(0|26Na&otGzl=mZy5S^)!EZdP1YH;U5xy`!=m7jN{L7vBzTs04YI_Z);@R zpW?e%`|`_WFj0Apx*8lnb1` )sz(iR>!X*wk=` zOvq|xBC+9*jQTh+^ptancA##nw`RM$);i=Z9y!YdG0J`W{4gnw!(tWt{Qa8+qRY2e zpPP})=Ktvh&`vi`9dSQ?<6`68*neH_TThx>aw={Q96O7?-D|tvsviHoSoi&QjgQOo zrt0b4)RCzjIK9 rVSO|3 };+fUCQeA|qAkp-T6R07BC1Tyqr1!2%bUSQzIu>i%~ z4^Qm8-~gW0I2v_8$c3JOo}kkrVa*Jb(2dQFlMf$TiS5Sspw)m3YnwHJidP>B;Lr8D zb*F2iF>20>DY`2@HD=m6N=juM*qAIGg&$*^hx1;Ein zCJf(focZ$D=y>{cDwosVLNJ;-y?!Q^H0_y0d4hZ-;WYtIymyGK2N4J&f~RaVW$nFp zvIuwu^4ZJ}Yh6&`EeXb}wK-By68T<=s~rI7YSGCYlrVJt0Fh1@D%We(svQzuirZtm zA%fwVR-L}wzRxu^ZIVua#+!atChJZV!6goNX_snBE*Te|&yVJ85-@)8KVqwU&W( z@gAxbsv}}+RGB9G%eJ~*<&gnBVL~UbrKJVZOXYHUKpcl!fc%i>aBzX5+c;+6eawa} zEA}w&_mb}7d@8Z-dtQJg@T@Gc9sxfN&Tq`QEDByv@54PkX#bC_ZI1MB2Cd<*VDASH zl4r*yaDNi}74%n@2mA}H7(e`1WB=y=-%iMkwXpZ?-q1^kKAV^$2MbvG)#I#6-w`oq zawLB`fn%~v>+^Q-Os mK_i0E*qlYQ?LspAmYK!HxuE6@foPjPY2m5dL@l zNO#m}ckR8i)<_8c_frfV@C6qz=myRl8+mY%H=7L*Nd(h%Ra@%%)H27>mu~XHuHiwy zH*fI%yOc8AkbZc4B`3CFvdAvYlq>p2#Wy?KYchO7{Si`E0a(NQGNCD>*?nq`0IPiI zzo1|!5w&>7TLr9tf8V~I87v(cK8SHI?JQM0N5x6KG~QdV*i1#It((K5$@#9b#?IgX zo5;F#vV ei`|yk7Lm8>6EhFYTLzeRT3dTM1{t~Ka*+|??uV-Qz z3Z?D;2k=Ee 0TDiUe z0Ui+(N&R3Cjgj8OKpi& yqg$I zG&PUm&>lAuHg UNWob63CnXz{u>0@AAZvKy3J{(dni1ltpe2dLbPfDE##GD*2#C zW8 a>4=G9Y5uL@X6oX$=GU1HwS O`vx<<5ox=}s>!AvP32WppBD$x##h8UZP|AJ`zSjWO) z2#8P=l7}}H|J`=r%0S O;^LrN)2*klJg zn2dpsP57A2!78!-PxgF)a&*kRgQy~;iKv5x^#N!2dZxQIlcvuvV`%?FLPbMJh z(wyO-;8M`4V>tErSET{6S)&i>DJ%Vwxk{E$W+LlkgSp8sKb$|_IFRjEM@PG&^u`vV z*y^lqj;MHOjYKI%N}PD`?=}`%D CT3MrN!FOG{k(6WA4I%d++Blz znwhBRh-F!6TEHySE^q!_hPy%Ek23TQJ$+7lWzUIv_G75C(C@6Ri24{`xcrJQdZqO6 zs0fFMz6hIecXGV+o9_4Gqc`=o)>Oo@!?7t9JFUO8F+akPWD`Y6q3a2$`ZZ1L2p-?} zk$}=8&Iu?%tQJatftV$YCwAkAEM*Vi})bEQjqyO;e*2tpBGZhBREF1%2)5Yp&Eb zkq{~BGY-g4b7%f`&J3NmQifQ~te9<=pO2u_n|>w$e~^ XP5WggD_Apsj85%N)7AY7L#RGlHaI%DQ7(e@JIcd{_dA3VQ>imJ zc8J!Ak%AUVdw8iPhJyU`P;3)F;@ tbfTHuVaoEy~QA!bW&hZ@y~y^5}!HhL@i%`c*69K8Z%;ksyXQf z7nRQ+h4o~+8hq1pG#d$dvenaLCMu^ll2lh@2@6xS{)7aJG+#&(Xdm;~P&7*&J~ Rr^ugCZpN|AmyeGz8DRm}Z69%u4FY zbLl7K(>wkN^iUTO5c_@>FJqcstKWBBrAvDwJ7dTcdmuypeQ67M+SZ*ityAV7b{@Hl zuRg{*qQ^1Dn7eM*@$T-@Uv krWcYE?dbGEp~Eo$#elA} zjuAwHc|6T{ i`OI`D>Va1IfsjL=c ?zo}a83`PU-v{S$$WnR3I~S#;7<7mY zdoV(D8`;35Z$AI`?&!L$!9%a|C`swt$Nfp9)Nv{^isd=1DGTl1N>$D=BoK-inS3Ig z{9s`d*(pe!tPaJXa+*nYWD<|Fv%iUI)`VTEu$?CR%Dpt6Yo=jP!H)-PI~%hNilSLj zSseO_svi3ANt}DEFEJKLPS3IaL?$k8L_4;4%CR(Dq$G_$_G7RmS@g!oC}#Oev~hb% zcJjutd%IDN_D%a%A#>T&eVLPPho~Ta8steZ&A|AuYX1Ll2hO`o&8?@Q7F0Z)by1WZ zONV)T17G%Sy#r#4V&-!&8}0(cf}~eP-Wk6z45I=ioWEvsy%|?TDLj_=0oA6tHEXWc zFixmNfyRy*N>beWUac`pnD&$eI8v)Ote=3-VZ%1> Pb>X_Sa@LY2CSWs5G$b5E*r{W&ofgitH2rqiqn(#|aVN}(1fG&^OKbSRUXb*$y zsKv{1;R_@tnC4NF(}4~k&Pf|l>=TEi=;FL3tsFn!-$_<+P^mWm4kSf9HY@fG_Mea@ z9$d*88b>P(z1K6Q4!mK-#6Z{T5$uFA(e#~D4l%GsB^&3e)nG8Hv0+qTL-Rt2IK4QC z`*WsalODL#fkorSg`Fgy;jyg`F}(}@gb^A%ue0@E_}l4Zvn-{*&08J%!+^($MakyW z&@qI6CD)M6YpXEoi*)^_K!=wQl#Cjr-PB$0Q!v|6feJSURF-56P{xLTf|g2XhXvf@ zwubMajP!TxB5=kFl^#AgXv>gs` zj>eAsje_s(f3{cu@cijtoUjt392=EfMm?26*Jq^aC}X1}78R8^X7;s@R(i>^jHHe6 zh}B(7OB8GBp(y6J_2eFwmbOx&^i_2=yiDzJF%mQ{Q&Qb*A|Yj@$DW$zy1wLH>#1-B zwj37z_-OeH=;&8oPFACc=oP%QkC;oDqD*x}NHUB576aO$)3lPKTwL;qS$AQ0a3xdW zky45`DyQ5UJcFE|OI_fyHhm>u3Kbn`f+OpqZvkkGA3~48=9Nr-@%v0BYD|a8b&xza zVmOy#bIyDSqY*;aI|ncDEa*!@!4sK|Hhc|>VWCQ8`6xe4pfNOK=^(v5EsqTsGqqBK z!Q_DFG+Ywr225mEDK?uSc8ym NHa0(xyh_pix^u@@RGhWMZ_Q}c%x$T*?78BHDD#(8$;0|P5(aWtP*t_W zY$Y2vTew-it4E!lk@7~#tII_x0ehKy = j$VTA@?1coS0N@ 2Q>O1FzyNDZrJ V*xo_o zB%9#Q43;;z!&cUkI)Q}OurolS@8K-tuIEx7csZ=s|3KM>A FZ{d7{K_?ZjSG;Ugq z+p#ziN}_gA)Ip@`64-dGoKidKI<-?@aMTwK{P_b}-K2h-3O|I@M}I_lkogUFMI#|A z5vgtEPTNw1@F8DWL8E}5jfb2(CH*5sVWdn+=?UuA0osEMHU}9CsJF_b3&SPqK_(2& zELkW(BS;Dnm`Scj<8TNln# k&oSzW zAUJK~%H?OGpnPTHBX#H{KkgtywQIka^hv|FVvn`AM}`C2NUdT&UXmlANciUm1YqP* z s;^8G6e#U2$J#$tM-!|Z` 5a3NiMFG8Lrs?D*MJDfS&sA@$U^? z+P(8q2nH8-ga#AY%J|u##F;^=oN%}BFsiaTtz -u-lzeb!M{Ix^M6VD|39Ahzo$?j*u7 2dz 25_x_3!bwR9Xe1V03%K13ATjdHrQYYI^+dkVNnF?qKo3!f$59lC zU)ebLrT0gWu$TZU?$9;_uG&t$Tn}>3oL5WKa%C&x){qu(r2=ckpi|Fpc^WA|I6hw9 zD)nVUU_-!Uq~MQYcTkMS0}Ib%eK;OVojLBOgzslbXY5Z=75r^&vkB(|i`UN1tke7) zugN5*OMiFweIx6hyj#dY6`g_pkVC33VFb%X1}jSEiH6^9#ynKUo`ys&4tz{vt0gMm zsLu_4- GG95O5jhB#L z_wAbwf*hUd*9ys^3&*CbA}1u 0EKeD?fMG9SB_2s-SsruFhHt%Z2PWcZgpmWI z!_`hPc51yy1Sl=!#A| d5G;m1!e&Z*{U z=gNkSA*W!`)-)k`GXjK3PimceL&7aBWvu!5c+~)@Z<+2W{7ojQxSpH4Sg@KjZpd62 zAX!@B7;gV_dpN9g0)&HoTwlB%W8S9#)ZKD*vJ;qALxCsHavpeT6L?Ule)c5x{gV?d zolc@x{f#FD#io RQhnxt*s!j{tkCFvWBH%^t@-rjjfIdeTIQaf*nvoX>LXt<4R zHYp!aL2_^NeKUq9N3L2)vnV_+%j}}j>Um>W$eDYhF%vpJ!fosWhfNQJc}Z#_EKJ&M z>-ye4o2ojVFmQf!SZD-3^-ST^^os&kEH*8E*~F+c6S+x2e(l?UMph1Q-Q=U3hz7So z|0faH=xIrNC@WVxCm%bx`VPY+)vQ+jMuCMuX63h}=tADY$thUJOCZV#i;RBtJNGLM z|6CuFPP_6LansN6OUWUx DEJx rY1;G#iU zo~(Eg=DB8j=oUjVzi7}ssee-3fm}=O3QTF2z|qNta|bdyQT4p`&Kc!A^IqI^ kBEpPu#n1+ud)azNd4-|-t zd{8y>P_ymCNxLSS)JEa#D{p4WuNs!G(!*R)EgqW2fqvN9LgQsxn2*y25yVk|Fv}E3 zlqD=GK&{kvRF&R`b|<5<#oU@XbnFg%7@65*?^CL-LTkB02h5!<;P^KCey+z;She_@ zdek=c7))sYT6;^pjh;qR_Ukg0nvaa +5nuUe+A}J)a@XSYroRQ4m-cj)@HCO}Y3nMe7=3wHnLxtm_A4?Jh6y|z5v~~A zPx)I)H-`gTMo03S!~tVrM^pHwjhfaG(Gdw+P@4)md h_o+es;>MFg)M9!=OT7aT^+4 SlXKH8O%+w)(UFwz}roC#f1O4nuSfsexjrA@a;rqQp3XxA%7KD>C6J?xQk(R*JNy6%Fu0AM zj=vKXCwF7Y6X)R_C|LiXgt796#d5(Gasj-U+qHAfvPO+n?VKR)5#7!nN+`bo55pH) zkG$CI;ZX@$-2__4G;VthlUOQtIkNCXjHNX3u*SmRkJMRk!C?>-TsAJM!9$0^6&w_p zw3?w`Iry#e2T%zj3gyoD87SI^Elo|1JxAIlomxt_A?GB71Zn3ZaP-tQzv1{VN%z2a zTHq(DNs@}W&BLfA{txQMnaS|8Qu#mr;20V?37QExLb#(6&B!>w?T7z|uD1-U>ieQb z2@ymoDQN)#=~Nn&l$Mh2?(R4sB`w`0-O}CN-QC@NfOGB^e*gQvAMRbx! &1UjOSPx5 zKfb2ZfZHmWdYuF~Uq-3uh%&*kb+&K(>Jkp*q5_#rLzI(Z;w!s0SsBQRYDR5EQW7E) zqFV!l{!D2fE!WmgvY33^v?uYFPKiux6c^12xc{pzh06RtP}7g6`RqkgB29_bw@o(2 z=H@ST6!aESEKaVqC&dmXwgXk$k(hgd2b1m0YqAqUS>IFYNO>cOWh%A0I4E%@#A4>T zb@%CBjr`lDCaK!+X?%-dA>|Z3F=z^d6FiRHtYoDOt8rNAUSwN{TfPD>pKr;NlVGSx z=l1mI_mrL^yBO}jKHhZyp{p*Qm~}Ae4R>HiBUg|mPxi ~uKOVxk*^Kjuh=T5s&58s+4Cphz^?CC|tWX?{PYBCI1D zv5~?FUYwl$)VF6j9U_^Qlo}m5f)*4{{GQavR*qeN!pnb)X76HLp0!dFGuPkcHK%JR zmtQko-Jg%bp=F%$#9?RABEm_!x)lf+V-YN{u-aY#6=4k#XTx#|f0{{gX6xAkwib|k zR#2u6=oz>jtINeX9ytSSOARj0e{nM%wCmY5?kJMXS{}9u+{RG?lkS1d2_b?*BNe2~ zf 8`xzKcfc~a0;k+wMUh#b8#RU$p6XV z$2>e>z~Yc__knAC@p4FPDYPYIu;=~nm(qF8ILCa*e!rqkDyN`{_`$|MI?hnv5Pr0= z#knEG{8vjjHy_}4wPv~XKJrei_m!e$S(RW|9i5g#BDw7CBG>%Su5@-4q=1u7K<|wq zHAu{=>8|} 7D80@xnnJe9*JH zDX67#$#bTjO-8)tB;Q+Pp;`NfK^Lg1%ql%x?ObyO-`y#&RiS^&VjvU@oEFlmcM%7V zqrAhNjnX7nGHJ0PMOG3lk;|-!ue29Ltyx!i%?%*T%1lf1^IgVFqX$&z$V7EK2UTH- z+@&J*Ivz#Rg5-aUgkOMvA%wLLL%cmx377DOLgl+L?h$Vl8V?aHHQ%O+sePMy$JX!e z6Gg|-+vC~|V8^h!(}ntFyC~CfKfO*mH;~nv9x@F_Jih9fZOSg7DfLhzXb0dBeh+wv zqS8uWUC=FC>WE$*gn} N~NaSJ-%2(3dDg0r7rN# _VB zEkFa(I1B1ukT9yOZ#ZDIR{jqQSn@GZyFPpgWU+h>&iHP$7T760!-|sHAj5w!IvvXb zMpOFOY*V<>rkHa&C^pbH)&D5uXX-$`VwPN0<(^P=-G|G$^syVmmWXa%&c{!Ipk=~* zJSKrd`t4dMDlsY?M)8no5DF!Ginn!>x|Ka9`mgMg#h*!Pw!)U|@^BLWr#@0fL*U}- z zezJBZgM|K6+?mj=zv4RgeM@D@r_*qWtrT!9<*a8#7(~0e{1AA2-Ti6@`F2Jt9rg0- zo+Z6~Oump2i^&8I$XNo-CTzG>_BJ#Ew^$}jC3<5@ZF`G8!al;@c5`&b`mdJfes{cq zI3tM_NvWl7U~bkmQmtX;XD5jqmXY~Sd*D9|u>~^;qk(Q7!TmeZBfsbLN7Xo_*9)lH zov>{<={DN!l3fvBZc-R^7xkWOZ&6&F?UTjYW6$kAcAi=f=3@D5|0Mcu1oN3q-r2L; zzG>O9#~TopXMEhm6ox{olq?pLW2^M2CM=hhxIF52Hvo!^Dctd*f0=dtTeJX4DwoqT zPZ9wo1(bzSe-hpkGKI_VutMcKw-H6v0+bERBcfvv6LZ+_CS7bZhyJ>2Ye#Dd*APCm z12Q8DPJopCI6C!PFDN}`=IAZuUCrbTP{q@nc7o~oD=0)ijU!h0VA|ZG+*3koXtB9z zzvpWZEX3yl+;@MycLXGDNMZ)Hpc4PmXiEJ1M|PNGp*oDvv4S>q&RnyKGR%V(-`k^l zcLS(eQ Bq-c z;GR+;V~nf1RiwD)WZW8HggTIzg!sKcS~E&@bsZO _$I z$jnAQnGIG!%<@+}Tu^ORe}IOQ8A!*jha_A#6q1H5#UuyIZ$n<89noWO+S#kvFoS-( zn$DW+Oj^|?P{L?tRODRSl~jongNt~CKqc?fQum_=6`DBSyYBxgX+I7Z8phZA$SME3 zRL+Pp%M>9fe=K9EP>Z_aN5b#;A7rmm(Wx)6xX<1M=;}otEO^!q-=Pp?3z8dw@f?Jy z&Zi2JH?dIm2#7zaI3f MG~zp9}vgw}o{CqJ3B$!YKK`DvO AAGpIfACyLIhH>l+gF89Tc zF=dR2=`JP$B>efmtc dzhLUD!v{&K=huf^@GZU;b-ELWOS zfV{YosbnQX2F=>P!;kv<5S7QCVh}_{wcD{&czwIsaI0o&B9tZ!u5BkcE`;cUDPQ8? z{&zPV%$G--TT6j3S&5S=C5So0@KTkOL-nGFtaol&coYM>X#ODUFD#a`(EfK#Zl%=C zWp$dltai7<4{8t^PGu`0wSG25BA!9l;^|(D`m;K9(zsEARrVYYCeu#_)wy0wvDjF6 ze&rF~%^JdRh+w^D5l{ua$Wl+MZx1f=uM%aa4a1nV!{tK_)8f>tHS@I~Y~(V)iOp1q zIcvg-oM+b?+^T0GU*nXhzefyD!ysBt%9PzU;}md(@sA{vSNyH>IXXry?X~Fpb ZrY=15|%!-WN%CLzp#?g_&DAt)a z^U=*IUQE;g+N^+ri52I!mHV15QVEP6nfx^hfX13b%iYhicM=Y+2N=qi*<6_k ~xobDj3K>M`wRZq)lyxU+I$H=4U43qWPj8TT0V-^*OsNFMX5@73n%kEZLb*PBU6d zc_#S-s(Q1R-k6ycn^W0mdgi}rEaXj{IEbl#D Bm8#T&DngmzWJ>HJ$`#f_kwyAxzWtpVx}ZPm>WkWz)Re|UzeL!!kZ_W-E (5w2;#7`G#vs? ;T6QBdj7mk?0Zxt*e)s=UU?^07kEwd_w#o+^gM zan9glt^;@+ZmW9`jx1Kq&B&TV9kqBD9|(U$m=XQ{Bbiby=1@JE&L5YQ5czM_(&bTN zOemy=hF>=2q8J_=V$UJC`onM8nqUbWELW-;Jq2L?+}G?{DbQGu_z*ekCP?b{Nyw}y ze*d9rZ?9%L{xZ9}J^x_M+}ip|*1l@f@MD!UOPyMA*|#B8MFDe3_3QleAR8|6PnFw) zHgC^~x@`SsBjXYhW7Kpj<3kgh%yjiI6?TTEiTWGRrTnY(zN^?kO0LB6@en8x!+gHb zt*h7}>UCL8;q{X(cx2zb1tok-ONx!OE11;(OdxF`84@a{7+3D8pFZV4+@l{VOox3j zkX0CZnV=M+*>=6y {GCOE_v%tJeERT zj%ut!H{T+bpUL PT8#!}5(3@Gjq5ApE!?^ms`7MlW` zlY?=ZWDX_^ITnC8rIx3j8^>U15_`+(VZ|i@!0LO%Z|!A56)u(78Tm;8587Lc2EFM6 z2zfQ!rnZasE|y&j3p$V @(bn=-<=m|+8 zgUrV>=@0-FC1)2&$t!90Pn*O8tVu&LnVzw+v4-Z*C<7}r0DbxK=0lM)&vGUvl_&Ua z=iic+&p9BFn=t-4i;7_&hrNrU37(v0d$n@v`ZxJu@$ZKW>Oa^6rW4lIwUxF8{b4Gx z=A`OW`74`Db%hSay=tTYxS-i6Nr;8VNvXe&6 x>4!-%_^hE KGZorFIvpDm+0YyNk9S$Qi6ONQluhI&VPm4ZV1a9;R(9^g>K( 0*7u~uq~9F+XI!XH_fC4ZA-tQAhb99*2g@| 9GuyQ9>9Std`hj0-o zmwJC?gpV>aLzc0I>OQhVK^3z^dRh%b(T=B=>j*k4#RmFCS*NRG*|q8C^nZ+JD7> z?gB-Od(YK$4%2VEn@a=)u?46CR!;*H5>(Cx-qPR(8*H>=9oG=QlELSp=qxAo=u+#u zoK7C`{l(PsbJF*+HaoVb9gj)`!x=H) aJ|y7C*J$K>bFXN} z#fzkPIi&f#<>7b_kG+Q6#qZ=mjGh9nhj7{J33+9F?;_#NO&r9OBv(^OZ!Yu-{yfL$ zu84mHit+y=CzRyI10)K|yCjYqMjS8FY@0k+M`3a-Of+upXO(pWo=UrzQ*@|;`p1|7 z#sk7Q^pVPdsTFrt{l6q-f}NFA2|puGbae~-A5LR$3|2-?2t3dBr$Z;VcC mbb=o$#uXg|Jc&fcM8y9%YB6_;Z2{PACuW( zIp65AO;B199rCz;kRj;*yB^RYu<1S3p+k59*UVyu2%u`lA^^Hk`yy0Hf75uR|9<%? zGmwCj^mETwW0(rVfgtB9HRnrx#)d*SDUUZOMqCZde3}% XZe ^35*+h zL``!u{vL-iz=ruci(vA!_5F48hup*Xh%BA%5afK;rF2R^DQ!@>lBHyq?a!<43pG}v z6CZVfNE;UqAxk0 %{mn=FQ*oAcj6@Cs!S&Q4bTF@ z2@O;Z_Q}YuGn@_^++2wMg~Ix^Ym-6iz5pRU_@i3 6&)PKe$z%WexLhWY$m$<&$m-MmGZo7N!*5 2IaQy_UO4*# zkkjNJqRLZU2MU<(el$Gb%VdA|jn#OmzA8Y$)JP|hWKRB2&V_S8HM~Slm!18;Q12)b zpf*ZR2TvOv8&fuTq`KF1cah*)sz5!VK{j*}sae`UFNU1mpm4)#I#m#J3URGuchIFb zHwH@Dk^%xAi9}ww-@}CgVVi(&lissHj8+ Xso}HdPnI5$zUG)Ortsj(%SE|Os)lfN&5-?Oag&Ftvj2|4(Z5%4JB)V`jEZiQ} zZ<`=Y 6WA6x+vzB<&S-5H(^^Zs>! zWVug=1%9WR6S =NldVM?cN^>6U)O!L}*uWQ;tM*|EV z6@>yjETn!sRfdPuYHIVtSws?NFB8G`!z(2%kL^B_Eb6T6+=`;Di-nVcWwAu8@Buw8 z?>NQ e@O_0aSNK%+qtCm%VLXlwHN`xW*tWBjI8)Y zhRaTzRDLVaT}5IAof-GEopdY|{XQd=!zOZ;{^XYVIh|qj`_r)1PypPzFeH3UkHAKm zmB4Uc48s#f_3v&vCz`w}pZi8esH8e&-=AKdYExT3biT4Bz)t400IjhaeWEjKs&^o# z7rL=br87e# !_Jj}gNQU2=5 Ei ~_Kl6MEZ z^1rm#JB&yMZ=UVPHyibp8)T(wx_Auxy~d579`-cI`2zw09X)F99N9`8LFpZTWTjqb z2-S&FSlinC0?hMsz!bp6!NJjZv7IEt3+0jbPWxPxcG_DDtOx+&lEUFlu{zsuQpzj7 z_1^F2U)8AJe?O6TY||JS?eKd(O1)ooim>-I-W>&Y81as88w{mVU;}ba7i$WY0FmgG z&oje`eB@j-1?Tr%J3q4nB~xG#ht!Qx+vT(`^CF7XYAESNdw*f@KXksE8$Hxp4j=*0 zfZqmafX1)m_U3Qb{# fpaP9VJPwEzdqj~2b! z{HlRc3*~ h|jxfz-K7d^-p}(c&w8M9*P{p-e|7fueGNYeU#VEon zF%jB-LM0R53kXJ;vKG7XLv}MI5dh-zYk>WpHJhM>fdSC-5}FF 5l;7Cp5cUo=; z-e%OM`JO}TcJO%fs!+DAElU`Wm&KQ2_5JiPcfJL{ZJBaUSwmlQJ^xR!veBOU-{uAf zsFNsTHXTDs*z%%j8P#43YWykC;V(u@nN$;<|5V$tYx{pnI~bU89;(@7H;U0yWViRT zGbYI0LkcecRaXStQ inB0q*#Z=I7i%Bvsv?_A&m%X`^Z-=*mbyrYcM~P}1DUckn3| zPZ6%m zV_t9jt#wWXXjHKLRx&L0(NZD4Mmm2|72W3F$5VYOUFH%N7GVg#OU!SbDWeq>4L|;X zqXc C%8WZj5iEdr0uO9rK{*3@6}FkKnFyzPlNK`31v})o3uUO#e8U zlW{1qtGsXBK!UXz%4xXyk+C$1To)&qugP|bMoNct;zx6nTQ~`OHTZ4pHUV3F`qg#+ z325Q=K21fX1CHeKh~i*8TLKX3+PwgK$m2^SMbnJ%KH3lLr^%TN4<>{Qi WehpO>?}C8&6{Q0M@dXfRLiI($f(=SuG>^%V93DIFpW^Hz7wzYs zaN`&TShy*N&h3HtQh1Rr0lSNry6%yx?xg7z4%zB?$}JD#xC${?z@P+lq38V+>FQDS z>REH4p=?r|!>n;d(j8^uC6vh>p0IHXK hvynMbhO zKEP#eQPSjo*MCn!|F9jL^l3Ib&7H;5R;Vu32I&-VZ~$q&QAXVwZ+I}E%-7i6zM8Hx zkt3-Qg+5ZA0muj+rgc}1A5>^owOHR+E;WjTNq&