From c2838dec0b2d7b48f98a36b073083a67b3446096 Mon Sep 17 00:00:00 2001 From: hyugogirubato <65763543+hyugogirubato@users.noreply.github.com> Date: Sat, 30 Mar 2024 20:03:15 +0100 Subject: [PATCH] Release v1.0.0 --- .gitignore | 2 +- README.md | 71 + docs/README.md | 35 + docs/shell.sh | 17 + .../android.hardware.drm-service.widevine | Bin 0 -> 12176 bytes .../android.hardware.drm-service.widevine | Bin 0 -> 2660672 bytes docs/version/18.0.0/symboles.xml | 13867 ++++++++++++++++ extractor/__init__.py | 4 + extractor/cdm.py | 149 + extractor/license_protocol.proto | 752 + extractor/license_protocol_pb2.py | 143 + extractor/license_protocol_pb2.pyi | 607 + extractor/script.js | 206 + extractor/vendor.py | 60 + keydive.py | 45 + requirements.txt | 5 + 16 files changed, 15962 insertions(+), 1 deletion(-) create mode 100644 README.md create mode 100644 docs/README.md create mode 100644 docs/shell.sh create mode 100644 docs/version/17.0.0/android.hardware.drm-service.widevine create mode 100644 docs/version/18.0.0/android.hardware.drm-service.widevine create mode 100644 docs/version/18.0.0/symboles.xml create mode 100644 extractor/__init__.py create mode 100644 extractor/cdm.py create mode 100644 extractor/license_protocol.proto create mode 100644 extractor/license_protocol_pb2.py create mode 100644 extractor/license_protocol_pb2.pyi create mode 100644 extractor/script.js create mode 100644 extractor/vendor.py create mode 100644 keydive.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index 68bc17f..2dc53ca 100644 --- a/.gitignore +++ b/.gitignore @@ -157,4 +157,4 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..338f6ef --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# KeyDive: Widevine L3 Extractor for Android + +KeyDive is a sophisticated Python script designed for the precise extraction of Widevine L3 DRM (Digital Rights Management) keys from Android devices. This tool leverages the capabilities of the Widevine CDM (Content Decryption Module) to facilitate the recovery of DRM keys, enabling a deeper understanding and analysis of the Widevine L3 DRM implementation across various Android SDK versions. + +> **Warning** +> +> Support for Android 14+ (SDK > 33) is currently under development. Some features may not function as expected on these newer versions. + +## Features + +- Automated extraction of Widevine L3 DRM keys. +- Compatibility with a wide range of Android versions (SDK > 22), ensuring broad applicability. +- Seamless extraction process, yielding essential DRM components such as the `client_id.bin` for device identification and the `private_key.pem` for the RSA private key. + +## Prerequisites + +Before you begin, ensure you have the following prerequisites in place: + +1. **ADB (Android Debug Bridge):** Make sure to install [ADB](https://developer.android.com/studio/command-line/adb) and include it in your system's PATH environment variable for easy command-line access. +2. **Frida-Server:** Install `frida-server` on your target Android device. This requires root access on the device. For installation instructions and downloads, visit the [official Frida documentation](https://frida.re/docs/installation/). +3. **Python Requirements:** KeyDive requires specific Python libraries to function correctly. Install them using the provided `requirements.txt` file: + ```shell + pip install -r requirements.txt + ``` + +## Installation + +Follow these steps to set up KeyDive: + +1. Ensure all prerequisites are met (see above). +2. Clone this repository to your local machine. +3. Navigate to the cloned directory and install the required Python dependencies as mentioned. + +## Usage + +To use KeyDive, follow these steps: + +1. Launch the KeyDive script. +2. Play a DRM-protected video on the target device. +3. The script will automatically extract the Widevine L3 keys, saving them in the following format: + - `client_id.bin` - Contains device identification information. + - `private_key.pem` - Contains the RSA private key. + +### Command-Line Options + +```sh +usage: keydive.py [-h] [--device DEVICE] + +Extract Widevine L3 keys from an Android device. + +options: + -h, --help show this help message and exit + --device DEVICE Target Android device ID. + +``` + +## Temporary Disabling L1 for L3 Extraction + +Some manufacturers (e.g., Xiaomi) allow the use of L1 keyboxes even after unlocking the bootloader. In such cases, it's necessary to install a Magisk module called [liboemcrypto-disabler](https://github.com/Magisk-Modules-Repo/liboemcryptodisabler) to temporarily disable L1, thereby facilitating L3 key extraction. + +## Credits + +Special thanks to the original developers and contributors who have made KeyDive possible. This tool is the culmination of collaborative efforts, research, and a deep understanding of DRM technologies. + +## Disclaimer + +KeyDive is intended for educational and research purposes only. The use of this tool in unauthorized testing of protected content is strictly prohibited. Please ensure you have permission before proceeding with DRM key extraction. + +--- + +By using KeyDive, you acknowledge and agree to the terms of use and disclaimer stated above. \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..91ec619 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,35 @@ +# Packages + +This document provides an overview of the external libraries, tools, and applications utilized within the KeyDive project. Each package plays a crucial role in enabling the project to efficiently extract Widevine L3 keys from Android devices for educational and research purposes. + +## Tools and Libraries + +### [rootAVD](https://gitlab.com/newbit/rootAVD) +A tool designed to root Android Virtual Devices (AVDs). It enables users to gain superuser privileges on their AVDs, essential for accessing and modifying system-level files and settings that are otherwise restricted. + +### [DRM Info](https://apkcombo.com/drm-info/com.androidfung.drminfo/download/phone-1.1.9.220313-apk) +An Android application providing detailed information about the device's Digital Rights Management (DRM) modules, including Widevine. Useful for verifying the DRM support level (L1, L2, L3) on the target device. + +### [Root Explorer](https://apkcombo.com/root-explorer/com.speedsoftware.rootexplorer/) +A file manager for root users, offering access to the entire Android file system, including typically hidden or inaccessible data folders. + +### [Firefox](https://apkcombo.com/fr/firefox/org.mozilla.firefox/) +A free and open-source web browser for Android, used for downloading files, testing DRM content playback, and other web-related tasks during research. + +### [liboemcrypto Disabler](https://github.com/Magisk-Modules-Repo/liboemcryptodisabler) +A Magisk module that disables the OEMCrypto service, responsible for L1 DRM protection, forcing devices to fallback to L3 protection and enabling the extraction of L3 keys. + +### [MagiskFrida](https://github.com/ViRb3/magisk-frida) +Allows Frida, a dynamic instrumentation toolkit, to run as a Magisk module, ideal for environments where adb access is limited or not possible. + +### [Frida](https://github.com/frida/frida/releases) +A dynamic code instrumentation toolkit for injecting JavaScript or your own library into native apps on Android and other platforms. + +### [adb (Android Debug Bridge)](https://developer.android.com/tools/adb) +A command-line tool for communicating with a device, facilitating actions such as app installation and debugging, and providing access to a Unix shell for running various commands. + +### [Ghidra](https://github.com/NationalSecurityAgency/ghidra) +A software reverse engineering (SRE) framework developed by the National Security Agency (NSA) that helps analyze malicious code and malware, and understand their functionality. Ghidra is essential for decompiling and analyzing the binaries and libraries involved in the DRM mechanisms, offering insights into how they operate and can be interacted with. + +## Usage +The combination of these tools provides a comprehensive toolkit for DRM research, allowing for the exploration of digital content protection mechanisms on Android devices. Each tool has been selected for its ability to contribute to the setup, execution, or support of the KeyDive project, enabling detailed analysis and extraction of digital rights management keys. \ No newline at end of file diff --git a/docs/shell.sh b/docs/shell.sh new file mode 100644 index 0000000..18d9e01 --- /dev/null +++ b/docs/shell.sh @@ -0,0 +1,17 @@ + +alias ls='ls --color=auto' +alias grep='grep --color=auto' +alias fgrep='fgrep --color=auto' +alias egrep='egrep --color=auto' +alias logcat='logcat -v color' + +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' +alias ipa='ip -c a' +alias rm='rm -rf' + +tree() { + path=${1:-.} + find ${path} -print | sort | sed 's;[^/]*/;|---;g;s;---|; |;g' +} diff --git a/docs/version/17.0.0/android.hardware.drm-service.widevine b/docs/version/17.0.0/android.hardware.drm-service.widevine new file mode 100644 index 0000000000000000000000000000000000000000..bd2949a3d4c03fa7e7cfc6ea50cb76f94382d1de GIT binary patch literal 12176 zcmbta3wTpiwmyAfRcHc;Afg5cFU2
&yAX$9v+H8kR|`XbGrN#nj7;~k6K##a+7L5D`p}GHHW#K6#zTA=VU=t~>0wSe&Pzu5 z$gub@LU4z?I`dsHOOg>Dza7to%s;^^Nh%J`-f_zqBgom6tBXO@k6W$#j_B_b3;G*z z%;``?VELG#kzp6(shbWlOjP$pq+f8d1X+7`5sw&-IlV&}WT6f+&hLbSp&jVhW7wPy zj=P~}_O}^s*vHz(^dic~=9&nP$E?~9SL<8hc(6OfsFi7k2gBsUFd1GcrAz9;5024r z9N&CXM24XOF})LA?a>(L+(I61G#aNvCb@*8y;$@}C=s<=J E|f@T$j{hIdzd8JpQ2m)y~EV6!8X!9!b=yS&`YJ0 +-$;cty16CSTP77pH?beh?$rA0zdsE^EMM z2jhVc2pv&7vmpZxEz%zhF}UuYH9i`;m}s+TJaE>@*;oyEwU*3Pw!~ToOAtnAZBqvJ zcK>oVv7~KZ)3OFIW!E&*tIdlsMgp#g9@4?q>FxB<@22Ox7ENc%dS50RCN3W}yIM{~ z__Mq|fJ#lE |yI7&Bbaaj$In`RSwc zN)$&u-Z_ax4#v2RN1bjmr)g|SP@xJ61xd11mzLMuGASdG3oT&jXpgBgdMGjlxzh4r zHaAzt1Y@exqB8YB0Iw!PBXQu>%rv=Gh`7ei{&+v!Yqtjam~(- x^m}uc~V-nt$$GyuFY9skVcOv)2T|FEdy*|4pRBc`iX9V{O#L z$r#31y)Jf~{;hJTtuBThmBe$wfxEG$jk|4`SXkGga;aB{DZ+U??);b`!TtR?E+@VI z19;VgiJOpAQ_a=~#y}IHD)Mu2yB8-+%vnSB;GTpN_xGV31&QqvuJq7~>EfW%^I&%z z4EuB2V}Or2r?KX^97z6@6GXs3{UMaUH#?ex4*HfCj*#Q>re;YZi9;+H7&|-t@M^eU zf^NcUjoxY{_&ku$uGczoay!+{X8%ImTfsZm;{7Ft@ULPWK -eMbfg{a^d}Bgbm@i((y*8?l_4$WcwB_45M%5HRu~=yEuqVhyPsQM zW?OA?FFgAVEj3MhaF?|3EB`8P+MsC!snBGTmFIRCHDWSE8|8X=t+H9EH)wJovCMz* zo~;UO8CX@$D)B~<8Xmy(>#51+%(TT|sa~PArDoD*`Q)lM(sEy@m9({fX1#W9-I+66 z8?;_>X4J$1VxQ3t)YI#g&3d&0%gaBPGuG-AvB%1*tL|de^_7}?z *7rIeFl*LNZSl)H=1URh0sGxq#n{TBX zT%GeSgvBKo7kYxwQAR)4KCB0V$j1TJLJ%RP5aw003ri*$bephadR>@nlgQ<&%mB>0 zc6@o_8P}SF)VjkGIPQ*sr$@{2P7{Bg1lsKH>?}j~aV4yeyD^ruHCo1ENx|+~VarC9 z)qa04 wcTJWGm7OQEDN((p>; zBrNxPePC+?sB_0`)vF iw8$$`3lfAq2n5fHPZ$GpGh1@h?}y#y5F7_Ec)y1W1hCFi zhC%bp M zAlThEu0B>NbV6aBkzy~S!y#NZWb@$Gjhq|%4**PW Fa?y48W#mtIUrgAp6(9Wg8+iVQ_-l@#Rb53 zsIF9(h?A!ttFpGS`ACX|Q~$}aAO-34s~n3IB}W9g;_ATq9hnO|1nY6_QVmJq=Qo|y z+_Z6~a&F>SS_;D7qn3>;9WV|3BoUX1` 1!jm1Jt(H*U>dIDyd_OK2Vg$y{2sFooNhc40pN_1WJ1-Y;4*5c&Pa?8GPmY( z^#PKm{%wQbRS!l?jJ*OyIul@nhnAuOK-bmGH4+%bp|k|nMXWkd%6(+igCgZp= &3Pn`QX|)vE0wjtekRT`-73U}%MzOgy6#RqK$OnrIU-8%RT#2PK_>(LuKX zpz?SQUB+$%D&;Om(9FUc8FcQMB#f-gS7O%pT|hPhEE;hvB_u{tAZtaq5S}D+0@DDj z$DxY{+jj{!cmDkO@LYLw>2$bUI~9sb2_aMDc;9gcEghu1_k`#FxTN65q$AOk!bZz7 z6!u%vdhPJi9vd7*hK9{uIE=yS^Qb)b@eUzrHHCM;6MdWka@#op?pC>)XY8->jAnOu zC!561ed4+BjU?F 0#KL){^73Ty-{jLssHS`+!8T~;2d(g8xvPRf?I4b5oGa^#-KGIRAb`X2oIBT zWLSttXk8tDZmAYnb2ljdO`IDiSjL^i;HjbWsD(6~ti@Dq)DB|-T0$#$z{Dxiya<+^ zJsB*_EzTXETbMhB|1T^o9KBEfGS`mPhZSnYACS_D`c*HgFJkF*W$BDFeoEmXuy>Jo z*zOANe;_=B4Ea(CO$hI63zg~iJEP=&qW@_0V5tNa_t0HXvoP7 IR}@!mu4V-ZyZ=8b%`c80aNECf 82L_Ig&-#MTbx#JL!38TMCP3e;ovApOjz^LxAAM=1WhwFy ze+E!L7OVpl0}h`B7mmvnBWDxHl#9+e>Jaf}tro47*I^$hkKDjiyAU^e%|Wu)M|Gwt zLKGT0nt@@a4@^BP6KLngVAKJLbaq}b(K+Sz#U_kt)UO$-$C#?&!g?IH6M&+0W(3 Z7{TMtVmMRppp*$a=GUII(gHF7`^t(EYArKx lZ (D3+60$P#I_l$Pdz9UE)ww4x`cu zhX-Yt;N2 cch`js#~JPK1@BHk7+} zyQ>Rl#GI-PxfGG#SN)qZYoaq5Bediplr#6S+&j4C5$FsnDC1p|J@8q09Kp2YWN1sZ z7$|~hpb=Iw_lW@u0!bKPkXQbKvJ4JlIF&_wCBZ?Cml3xE&j2ri2oWqWAZs$AAzq2@ z_8ie&Lj@*-?s_uk@smOB{~E6!ZThe)&tCp|bOWjt~eWP-9lslZQ# zj5|Z;IKDQfO-Bq*G@K&4scUj%k6px!n`>9aJ5QoTLJcy|oOO;mE?rx47WnCWb%r7D zFPq&vyCnQ6n}}@1jNl;T0Ho3B96PC3+<%vM@i6$q&K) Q7B(X(XaMBz 23{BPqyq%=ATh zMFszO6juqlu0#y3f@mYy5sZXJBVouM9ME=c?V(kAcf#OtCL&A5wS$vzxHdNHwe?en zT6YDkK*xv&Oz1Y&nQztT2l^Pm%*tb84n$Oqeo{3M(1s})s9jjwsll1j(D{ZCY`hli zis1zu;h<_DYR$QT#K9+FCT`^5fqk%vctKlNG;9SAz+jZ=qZm&o8iAxYj%vr- B(Rdka k^7~Qw!t~l;Md1>LlQKR?IK!*m7w{ z@m{m$Dx?KACj!g(Ur &RTqLviKoMtg>7Eg=>99S%rs1M$ zq@4slwp|39)VWkH2C8YC1HGrv`(iWzh1dWP6lEVYdsn!s8qzoo0m+s~;xqX5jV+a< z{xF=lJQD6o0Krj511}uK9Mw3{3IQl00N@$SE{ma|$W&Z|DN-hGHm#4V%h^GdF2nFD z6le=E-WH|70`URH@UMC_dX>aWxZQ^rSt5&Zp^T#Q)KK;`o_##Iw3KI^JuV~!lYy1N zLR>N*2-_g7N^1joD0nxSF$hi}k%->YGzPAE=n=rAc86bJnEJ_D68F8q&ZaxH6C9N0 zEu=rd&-s(F4uTGp7$;6I7=Db<4S);jUm{e`Y+XP%M)hY@tKOLhiMx}-5rN|e0Iyn2 z)DsQC=|Yis7c`NA#M!7X8af^!<#?V^zlG>+eP4;Xmr(LMg`&MvS?SJBc%?ta+ap?B zKqh$Rb~tQa(o~7LFwh-5!b79IPV&IP0l-?jPh>^N6|$1=N`F|vCL=&$E?ON==1x*5 zcxQt9a)qA@t0R19hNKspxFy=X4LN81Hx 2L`x{h-01B!|(;=+d${6X9BjgPt5LOstD^sGL88ioFIzIh! zf*ekZop1J)qP=n*TGtKO-~e`-5Dd}<3=5LI&dw-&5NSZc&i<%WVrl12w^Z6@;vYVL zSpR^R)4(asf&$xuipg5HSmIqAthDT^w^+(pG5WhY_m+%%l2ADix6Gmm+fCnG0h4O* z+cRV$w5P!>h*ys403L4nP7%yBJ$elEsF(y8 Xd*&SB;M`1oL+{DJfK;aPS^8j;D)fpd&P-5m@LTrKZhtP=RsyRDof1j+gL3> za V)4X&2!2n?k<#l{}$`_$<1#B+p*_Tok#pvHsE;g!wQQJYi2pvr+; z(paYyPXs<|;?fX(jRUT_KWyOg)u17KMYj5>6DOqw!AU~{h>Kh1m##F~O~7AqRYPzn zh%(MSRr)Tr=i4gvT2QIhlvoNj{Gv!R89Ld`PkDHFAJViSvWG@xi_5Q-g{Z(UJW5(( zbBQw*5lGfiGJzb_qv<&lutq6nNM&3GsIIVLz+IO3B_T_Eljc!eAYpTSQFU$SY0p5z zM)P@cMX`O;cngs`xd`*lWHggP(?%{SZD}uVU4SkJH*vAkA17RjK|?xM^1ZOYE^1Ds zfead=lqbgo=2;31jUqA-6wE;YLx2?w5D4VlkhzM@F8Z1@pDuFQYo_ED$~+?r3fd{C zNcJ+ P8IK( z)NsU-uK2PKgW^Y>U)Dk8agM#JBTUlOobV}+?QI69YyDD)$(T`kGhW?vlR{7JZhL2+ zkEmHewi{=*hO$!#KM%FczDpxHD7fJuR(DA~71Jb}WLWMAC}J$(8TEe?;mK%IW^~Mh z^68G-@jN2tdPsQ{>D*obcqm&e%;UNeVkb&{x8L9G#+l6JHNyEkisxFb01qkugDYqS z3Pl}DxDTu;flfsjB%@+Dy~%YD(rqI~F;w^nDn_~tDkM$QcW;0(D_@aMO&!*9KGcM_ z6+JlRK|7duOgY9_oj@ku7fs78g%lZWAfX#*B#F% K(G4!c6*2Gk;|ZFbHjo#_I|G2GZd*;S{2;O>30l%A5B`zrkjcyhq|h6)R1`UG ztnoJL+a@igm=wM1$!R}I^3+j|jS^xm0+@HPk-GTWd?Gt6G+)-IAc c;Hdu;t=DUSm^>2wz0K>XhkW-;PPrf*wnV_OO?h9f42u$ z1euDg LuQT-LL82fwf2Wz37RpS#$LcD^XT)Dl)UQ|u;pQ({ zaKK{bqvn1`mOM-EpJiT=!&^A+YEaDho(^_XX2Lk}GatQwAgM}`y*fSGbcF{V0cX4& z=mmND2oP?f cgvx9Cfr{X5oM}e-+3qW0- zF<8X3j-Uq+)Wl9*tqBcRC3_@Wmke6P6h!n1^GrqC387N~Yl1M888ny}IF6B?V7PJ| zlA|DUOM!sY?1`&sRAjmkSZ7=1 ) FP-qI)h5uP2kImi z=6G^J5T6j$dH+&G>W*tY^ywUS4FgDlzbL{xFjiURT5LqV73x$5Iu>03ZUya^0CpIJ zJ02juvcUCiC}YQcM+BSc2(<&a>atAO1)SW70df;mUQCi1(cvj=n1Xf*?Q(R4yYl29 zb3@Ee(5tuySRH!45#x;UE4-r%Fi0s1M!8DnGC5gHg;`LVV?C+%yhE9uJPAPMH5n9< z=2mQ9$&^n(PqQ1sp C+8#Z_>&e`Y1b z@@Ilpq~;v-!BuJu2d|?Rpkqr##ZkK D;G+4obBAE-pfgM_|2THI#Q4ax1 zH&xq+FbBdV@xYZT=_8tkkAc59jo=8v8v-1 0j$_b6A56d#f{ix~$N0j%4 zq+f8#aSj435w=~7Jz(KYGS`a>Gc=X8Waee~NfI7;d1MH*kZheEiRYAc!x%PvEQCL7 zW5c)JF1#KH7L1`-;vw(@aw+(-#2sB2#L&e&agLX_WF2SM-6Diqm8pgpK;=v3V7JZb zV#TH|-!RccV`l)9;8KJV!Y~>&2Fy)KB^j97MZ3C%a4Z$qure0`uNe-=V^bLjfKDml zlj1R~VX_@Lhp?m*;}KzAzq?UepJ%r6@nf*7sV(Kr-6- w7T`Z#oI;Aph z6kj ^B|sHvGi$H65Z`NvrU GT;o{yV!gb&jF+ZyAk$0lwRD%h;4yz8jAmW4jNP#P6azW%;A1a zjIa$y4pca5qe-qLMQB%dd3wg7BHCuWD?;%X@cC=dCjBeCj!=C{>_M%$SlD1pH;jh3 z;Gl-$_`ol2by?e3oovF#?8EjP8;IwUIBL%4Qa*ROq~)mm#E?AeZ1Dl7NQ+TJ=2%Nl z2-9RP#6S}3D0K_%v8Gs)&5uVfv%-}>M7x={=BP(_^98(;MlBkikG`+e!;O2={IldC zIRVOKrnp8lU|5xj1H(cPPdKXQ)`Xd-p*^<=PmK)B$zyzqPnyqn0C+mV7W5Y!roJ0P zRbMfi*=;zoM@TUm2P{H4S@#yNjinG&jVDYSYB_>CZ|_%RqiFXwY2LYcEs(`mB9y1F zC_hh5o~!{C8c%h!bh=z!4;T~*Lxc_NFYmfIWnR0OHNDoAXdf1fWm5~0vrk#NUdf@1 zqy*JgHiee%Wx9#vSEE!dp*AWiNr@wkm0RChI|<%#t=d>)wkR@qTqRrkYCLVDT&??z zo2?~qtBv4Xxh_?75nG5*Lg#n}+qsDnwoGivlm*9fa|D+NVnf9I!8%vQP!$;F=K5I> zlj4mo!&}`(=H9gXlB6-Q(F8(8KVJtVALTgk zEy }dN{-#?Fx;i;0@TR0>fyzTBn~qwN}+SC6dkx&N86_ zsTck}j#9L%w&L&{4?q}%P%@qLlWE#q*gb4EC>tFGO@QXaazh7HzNANXL-F@dB*tQq z(NQX%Hqu<$4K3`4&RQ!b;Ey>$z|HXZ%1V=6H-$U42jxZZKsKVUJdw^bE3A)91lLPn z$0e`v2|+!Yni>ZvcZd8{WY4B~%Fr#4NfH6@&%~f8vwV*>w2!sOlQLMSi7U02?9$o= zV$$+JrWeA&cpEy8$jiGp>q)cLj0b2y@gZ+l5uZa}X>6ZAfkx`T6*q#Rs$lTY>O3 zh42h7p_pFlLLP+UaR|ZOC M>nruzCy$52W`f-r>JLDQgq7#JY7ffP@n!+}XT z<`{`mU?5(aq~u1l9%P4>@JSg=uu1W3d@j*h*hr>9ee3%YK-L076pyb#BV}m!IX0Z) z&}SvjCyTQHW@;Z4Cm{GiPk7Hs_C4Yi*i9zDu&CB;)}MmBr^+@Fga(vW&yuuoWtY?d zlf-pS*2&y!&*5e-ul`rO5-Ze8AP_nLq}gz030Mu0kuIz#b(vX*ob(t7X%zx9BGqZ& z@t8y`k`lobbf&3U&+^AAFW@ICE~)M$6|*y8?htU8YRnVmg)k^t(RN~9zIPlf+ 4g$3Y>gRg;S@Nb-oYQ^$`5cGm^Z z%qnf{zwx}SGOVCPO;Jrv8wZo(`P OV44xC#12m5$JJ^3) UsKb7hJb$LaYP-|q5Rt` zDzYAuIG~pHxZrR^+cTmEE7io|(^i4P4GzNz{pks6(Hm;Zr;dEF3JMA9nV_9(m7L*} zu=2m6+4)srAoTh?N)I@ErL#C?GbBrfH`81Q`RI0cNZS}pF%smtYE3donbG2}Knn|n ztf0s$Jw~u&DRo(}6>J_-Us 3$)R7PZmRI zh6&v5Ea@}SmW)Q23A~GHg^mEuz!)>5Ba42Z8+_M!LeeC4E+beXnK6-|rWaN`^o3N# zd@YosUq=nLR(g@WRrh)Q8BCgiO2ivWUJV;97}k5KGeGZ&3 +2eG=M$3R;7h?>vgl; _p{j~Kk2|t`> z`eL{{>l{8E1+VFWY$xMn(Y;G_HY)Vj2tI(kW?Bo%*%e|Hx_5VW1TlPukW}UKl{HMj z)843JzlOO!yU>)!$$n)}qzuChcXi8;ixo&yve |-~PeI{r@ z6Lfbl(V7>a0I~Yg-W$mmZU+ ATG&c?~0HZN8^?o7 Y `GlXXB%y^5TfYj0H)SdB`;Z}Z?K)*gq4*tW;vrN z7XT!klec>^V+re=x0Dd~on!m6gFyQ_o{qe&!-CwSPYT(hJZvR5Kt!e4j?Q0KxhpY{ zN!uGs0d=XSOq@wO#+w-oc~RpD(TFocV75;BD41M)^RX O)O$Q|u5?%74t59zk{u9g8z{u(Lu{6-4cQ4|v$|HPo0XGbBPF>Q_u+Oe+Qi@3 zuBZxkHuSdR5~yVIAl;yB3`a7R;UP>P&&Oj9p=2{0tp}4iOl24XGkg&wPn1Z;_daF^ z__MVqk)YnfN~wx$uea>(kvK;jnwSYC3{1P=IIeUK>I&d3q9x95-OmjQX`|Uesgr|Q zy#bj>g3*1@DjwS{$u^NCgFLD0T-X|y;)l!%ntmmZkJ)s|h4_+731m|% u^YkFG64`JTzY4 zX(ArK1zJ&pSX?-^m;yjI4ZT^OLBaP5%e#1+iO$F9H8m7io>%dp#7!YIbi9KoO@JrV zsm%Ln)LmFqcwy$j@`OIveU^EdSwXsv2%^JG%6Y$xab+}_Tl<+3sZXZO0le&%P =evs$MD7ih!vRv00jvD) zI+6%;luB5EkuNPV;V)rd-Apu-)Npf)PmT<6{jD&C5%aIb&dKO!Q8H+_e7z1eYw;3N zGZLQ;!KS~9J)~0}jln-9O-$NTK!;PvSN-N!&g8UV_Au7b)3jn!^t>J8_UhWfS~-4g z`^ffD3 h_v$%4wR$gLX z&clf%jy^FtFuwdImoh@ qNs1ac%G*5_owQi&l)+j8Xzyj z2M r%|0X^YaK zZfR@@O}iTphYK;o2cG|K6IfBQ^>4<91~f4abbCSB4nr{>V19~Qay5%-7CKnB+D}GY z>~qFpewVn}R*bO(scL7tbS5oAWr$?lx#TM0TbK`Y`TZa4v_5bNi4BO{fr4j37>bIl zE~2s H}7Z`Wek%a zPViC I?7FpMCgPSU_1bd;vY* z?4%iOR99x_<;+G|dWw$JfLa?==k8K;f{PrQafa{&uq9`^;g)1 9DsE2dXLW(BICY%=9SeO)f^*WQ_? zp*);e(M#ox^2zFI73Hg4l7>B2EnTsNQ4iV$TC0W0;5okoiT9+rE9e0PN|o~))jF!# zspK5XNHUDfeMW4Z6y94aV-IykOOXKKLLgyCONd64xP}>^TQPLDbVA*W1Il9|wLOC~ z>KYObT~{cwZGiG!6wtr~p;0<(6CUFXn>M3n)pE%Lb8k#4-7U;k>WFvxl*_WQU_GlV z+YcZKU+qKEko%p>SQ<3f%{e4Aq!%_LR)ZK-9i5LXbsN$N;x}qg*QCBO))R@(@yoN{ zJRvj2=$X(nOo)qlOcMc!mgee; _J{+ z02iL&jXW;3zKpJGwKe33bg-L6L!zEx1o`weybEw(=J{JMBmA>gTg51ZDJa_(K9tt# zF@{CXz@HeE_AnZwqT(fZJZ0GeFp3ZN;L%s5zG^VlE)rIVt?2Qgy5XA(zk2G0;Td zJa1}KY9?$goAWu#$nw4g^B7sok6rQ5cy6DxDc^`@lDHU9F?wL+pvw_%rB$+Z!lk&; zZfcHZAZ7s)QvieJ!GMvT0*8c>W=l&lnX&~=Y^I~mxpm_BYew>BNfP9{3O<#j1@w%% z IxgCL*7{z#LGap*;4=l zWe!GmxQ}-A3y%pxX1$Y4SG{)_NT0iO6Zp4~o)>bUxf+5aAt;cL09~s75-4=d$#8A0 z4l5=1QIv1i>By==B;busb3`B)2^W!9PB#F@Bz9x>|6Ljem@+N3+DAg48p@a%Hlk}N zK^6u{8i<}lf-=j@m$Tggxga`BS=voA T$I@^Ea z9_$Qtrsq-jgo}s+_2!L);TS$1srQ+J3DM3#=thC3HU$o6Dk(xkC7vI~3!_Qx9yHz@ zY-?Z5ev-@v@rQHD-{@El#EFVgn9l;IvAg1;L^&dt#MP9Rii`lm*li}jnK%;AS<(4= zMJr9usK!&U`JqSJbVFgQ?`0HJ7UP3pdl_4~Ac-YSR6(R(^{n2&ZwZrb`H~fn#x5%r zxS=XY*;xm~uVKGI FK-~$Pqt}fwI4A)q*xix%N|a`0L!bV zYISTQwB{lOeWB`e5LVokor!|3(yM|(R3k>S*S(RHvv~X)OW(P}y#)v-EqshO171*g zcmC2vmf2*f2zW_lUIFg2f+@D#77)YGvtdUf+0xmVtw#otU=;-YR}f2>JJqcUS%JwE zN4tvFx^ho1v>4PAE37xivY05#L?am1*($TiYkxKhCxxEdoxZD|*YMV3b6rhCoOle> zUu2u)FoU;};0nTc18ixMy@Hw0SL+HKdygS%fH>YxQqmG_no*dxMrKMFqNxFkkj&-K zgd%ld3b)~7qET83hq4E$pgy67$0#NKIjk3DHL{<1v`4A{hU=AkziLh=Gv7|wH zw@C*Mimr5LSkDJtZ5O$Kb0)doH&{p6*oh(H0MlfOP@00H`A#VQ<7*g*abd 3P%So z2}9p?ze0945)8zACbbJeMW ?m-XTj~vmDPW&Rv1szOEOE4k72ctIzm>%VD8~Wlmj=mr3FMs#^6Og2HvJCs$N_i3 zkNGFau(+rcc+M1dc!Pv5pp`!|C{9 &5b^$8J=~pVB0Bprg6bMa5fVlG-xjX29 z?_rftCIp _3z$BYEcGAI;#%yW56PVUFJi)~;&nEr_bVKig z{&2;me9z>sn|0H4G++Km55f`BwTNm&XDc2Q0uVMlq-ATlNuM@?H$I#^e^o{;96tuD z4-0C#Jb1L1Aw1pFP{DBqKs{8 nIU>)Uj&|oOgreFsRA|4ntpSU9wnUNfuj!eN0fuv4TdX$O8Y3NMG z%IfxIZmA`)t4fe>#^qZJ%j>#+6H9Jd#7MgkDgp$kMoqvc)ljrhDwW&x?4(`l6^a@d zC|zXPKU4*iA(wUxCI> ;znZ z3`EX%S{)iF&bq?0Fz^5ag;dD8D=P1r6y;cow#>kJ+%z8N(N@cqVF4d)S1_|^OQ{mq zhi-i{-y&!m`>AxIA;1*F5~ICKz#ndqV2bxs54;Z$pF`g;4xov}b9lYgUw2SWg86yw zEFX#{M*a_X3xJ bPEr}hxHJSE&=&?!zQu_B5nPtYBwd>z4Z0~uPw>Jn7R9krV%jcVnT(A z_JM35*rt&N0E!`V^9!fqGo8aOOkat7&)Us`9obXN!fg2)WXDRFf%@1Y=2c_j-v~^A zm`3iofs1%Q1rSHU;_(8`Dpqz8+ow1;XVSjlbGUJePhr$bMZ)sKw=CVPFqtc^pE5J3 zzFhWh v+;gMi*T)d9Al`aMkmYKDPuHUX%au`ZRn%`3B++;TZuvD* zfsU=LVMFa{V$L77ezv??1qVr1PnfrfaCX!l->9u4+#MVo=to;3$Z=(OWp2ssfRz*C zNXW@;IsqxldTn*$uyo63wp*@Tj?>Uw77~_(a#j?9$&8qR8%0@X_9q5s$o=O$MMW1k zp_X5Uoc=Yy1P5#wBf&%&;8{5E$QigD2t2mI)v+aBc9AVso8@h0vRd-3Zqz7TMtTe2 zVSz Zd^pjt;H@pjPBS#;m@E8 zL#5f4#lf#h>n?RRoidj$GP1i=BIIgF5teWl?%*CyRoqg`Rcpm{l97Wlz^sgu> Jre)wpMDJD1L$s zf81ASwoCBmv9sh*SXcCb3To_j5o&=YHT`7Jb;gaAdu_>f#KJ=oSCG}h;v(5xt>)mE zG}md4KD*DeW *rr^SB=Q0BKFXb&q2b Y7uwnrHnLwH zCc8d7W9lXRLOycCnHl%s0aIeMi4b?SE<+Y7M6eDIi^o Bxx@hZwOo)|?|C3-TBmzMnxx$LNiA>GTm&H0Le zkAaW77T3c<{I2`(lfhJcUA&D@6RTg7%%DR+F2;=RY}RZ5_?LJ*qe1YhFcCe`rjO)} zs0Uyy<>DQ5HzhId{0`3rp%QZe<_`Q#=m#~~C4~!W7fqR =Cq0LJ{32exCfG9x3U#rAn=ETiD7sQa^VhyQFjPc=}SFp5N9;IH-qHq&^ z4hsS|$|;YyPk})5G{fB;a{a65;JE%}+yKh&Q)G(|$wGSc#PNlDFc`2PqG^4~x8{0l z?keN%{2UdcuhR;+oC~QqS=tKD6L@lF#bOE~KP-{rZtx 0Tij>>|hgZtrS_bw1P)ceCj7>Lpt={o2XsM}@ZAYkWIT@Wlx9p|vWJegsaqHAv_ zgoiw9m)CV^qO4@I1`5&vSNd984}Ps|!#@WBh%7DjN7OKolvVHLHU|pM#gd|XQ~Lv^ zUxv<<2_&4pgL)W|DelUQXCT2WvEB~S8_N2ZnJ?#{G`Z$?S}UEn+m=c@49E;_f|qmi zJtaocx_Lgy9t=rkqlzs-sT 7F9ejQdlZ3-!W*K zs+?LU*(j~7xPZ@zMx(%7@$d`eR=9%2Q0yQkH=!w37qKp #>h#4f#)OFZ4_i4Hz^YNS|_K91g#1IRaeHc2@FF}kI4 z9r;SU8+yc}^1O#WwKWAyEW F8;J(LTafc_;fKHR6Ogl*i~~pvOi$H=MfNK&E*+v@=?~Fp zfuL ;f z?o3@`O8KM@h-;H{_2^P)CChFaoa0*xE;tri%GWK-1 fybshxe}@9-y#`r=pQJ ziV1~q-vV7wv`wnFOKv6{KopTw7H}%aN8tgG>vy80ibHlW^I#TYYDKK+f)&M~U^H?Y z%scW4P^Wq3lcXp+^}#O)U9WT5v-R7giZE9Nn?zU&uDjPLhMUd+ak-%k4~qb9V#j+V ze|Ha+^*44QMbZeOX95QBFE5)o(^;EkI>KAgu+I}DK`q2SPzW}ibOF2`oPzK70R;l3 z>o)&yYdwX(ikRUoP{55XG9~ua7N=KC4InQC>=}&=G|!!s)*Px&YkvAWdUWq>0Ii=X z*G-)OzC@>x{j6V8b|v)@m2kRVT|eW@iA||E X{yJub^CFSmH!bbseS-Ey#3pBGOik;Xc3?4O8JN zWxiu&29cNxQZRuR89yIXR?1teo55wX5~^F 5nFj z1jM)PHh4 +oHA7vb87EPUG?2sjnWCdc7I<`6ao`- m5ARTu{Z^`i+s$mOupR3OM2dWsf*!|JZTnJneP^nIa z#+Jeixb4D$MQ<`}M(jSC!BXXep?)3oRjjG*Tfd-S2ydnoyW0T)MuWt(&Y;+Vj!>6R z++zUb?z$YN=p4-hT&-_mjm_Y!U&*p91@M@5S1u*nT*8`JT9sZ-5to~`u+U&TP13e0 z#>#=fv>t`yqGd7DNtK745@xJCaFqeN?q1TJvv%dYU(h7z2nm=_!V)vp8JkK)Fj *^LR6K{aV+0^d^(e3&d<~#r zM89vpA7DwZ2_?X&Dftj^AK9jC5C*WssX*(zxod{3lE<#fRLI;Moyc=V$Dn!zlmq9R z!_}B&Af<`QwI~ImC{U4|>e7}k4zfV0G);*CrOL}?5JrGFcoG-g=26Tf#H|Ar)^;|B z lUx0LhM_5asHztm?X!vwD0X?i63UGs?`0|`+;JGsXTx<4F?K~OHu`orj zL6?Hx4SolC4^r3=JJEm@|0Wizz;gwoJ=$oc()&@8#Opb6N={9l2SQdJ*lJ)m>ntD) zgPVJbc5g)RFzdzcEiYLv>_`o^ja=UbhYgo6Z0w`-L~2}$BZvSd9q$zzy?|C@Ik)sH zS&ZvKhhgFtWfIsf9YvtGq2Kc)aCQXz0zUQ;j8uXW$~Nj%Ed$hf#Lf=@kKrMnh&k+B zf5GK@pv66&HMk161t4+87lIy-1s*tN;ibrxR(R7mUBg!HC$S4Wsw=37M^(8;Cov%K zjY@OjA=w`BejB67T8Q+hxM@Q#rTUj#9tqa9C2kDUR(C#z^|YedZnY*<3_SGGADf(T z4Y#LQ#%L_Zk|qugAcIg-!;cYl)uap~v+hE=PG168lR`xZl|wdBDFgu+cDPF)tKh`4 z#!q@8(vS%$gbqe2Eh2Oh 13_@8C;q~ArC7E1i$O`=73YW|TBDTT< z(AhhOOf*bs^mW>Lxf!3anV1I{9~Q$IjSRm!*0m;TA+bie(xA|Y1xI7~2UhXN`A`fc zGm&gSG_HJRMl8~j4ATiZi&=Cb6G!05==U#-2NJcF4ZM^dLu(OPXWt<5$3gqaZ&LC> z7HSu>p}6e66Z-oeADQ9to0BgroJcw8JR;@bCd+w=U_l3t;wG|$#K|OF)3gq56DT;G z&0lbYf)IBKuPW btcU49tdLGXNckEk7sWPxc2HDI^A1dZn6m3=zvkiHe#Tz zxgt~YfE9;4cLeI0M{tNwrlc9DlQA5A0^!YVrjj{>E=5?0*t$`|U#rWg6b34`(;Krv zSh}k}29itFKf2e )s36CqI{L}2Y*IzJ0JvGa#Tu9jQ}g)E9wV!km +&F83y%<=DmyAR@$AibOA; zt)rH8{bUuf1SpOxGE@UNU8|i*Ye!S(V!#2>c_xdLvRQ@P#$lO@H&f^s5{&ebjV`#` zhwe%{gz?9E$5{1IrZDGkC4(~y3c{9@%)}X3(%A(QdQQE28KiV|ml-#MoQn{F5g74E zs)28~v9T1O#0x-}09np3TV6?AS>aSR&rP_i^EHe4Nl~8OdKo4!Jp)&eq#{ePSv-V# z=5*&eWFJPJQgbCUHYB`ia8z4r%}%riqh@)k *xcnxXH_g(~B^G`|K>EzT)EW#F zYhgDO!C*%`H-_~{K^fwg96Cdw3brXCyxIhug5m(0Vmq;z(PmjcJF5f_H@)VP$wIb4 zA9|EJDr+|9Jj)uw)Y9TR>tZb_Qf}EnJGwA3?+8`z99b5Y3ggUUx{7+y1+EJD!N^wZ z6r-%KXEiTjjDs>7O1rBLTYKXC8?;;lifUM+6Q@<*BjkLSa4FLWl~BlzKicZvi@j z9IdA0D9(k(m<$G`iJ=WEN;(@~*)Z@pcZWll?P8ZOebG{IaPFPE$XY_{;HhQr4<_uV zn}RfV;b;Rwb{GnARN?&(gh#@w$i)sHcp!AH1Jq2E+Jx|GY$1FEyN4i6*Ez$Sqfe<) z>9ly{55aAf`x%Uept@k(qu1Q&>K_z67o6(%cQKqW+~=20F3qpQt< j!YY2rb5EVQa0hh9Nr?FQKg>s=ysP~lz7i8&-OW%D~}Qe~@BhAwmt2x3xQoCJKY zxiE;Vv)$@DqZ(4`qD3I2WD_}jlggKBTdT`yz#j0%(q;`#Lf{n^O3IXANd~k3oNm_0 zO~T p7SLN`?zmfO!-3mHeh8*|w4Tl*&xv zhP7z5Tt5ZZu&>;SKtqlBcdOHyY$}~ney~um$8?beOw~#zo6!SY6DQFSRwLZV)Iy$K z(4h-m#SSWbSr3^Gojo5@Psk!<`M=9R4zimnu&w5(cz>9Ff;(2~&B9})lozA8Jx%YZ zMZZTaX&cnO#vO-(OiLv~ILv&mgjkodJLMj4Jxi|wIwHO#i1E1HM=!cWFcUFjm y6Fm6qH 5J7d~Gt*o?N)36?l+szbxJn!W zYytqsfkgBpc`}BsOG6JiY?0+JWh~Cvf I;Ij )s2da09nc zOU fRjHZrBe)k2-^_^`{Uj|f{lSIxN8uI z{ey#V $(^;sz#4%*L@&Tr6r;#s^9Wh)9G! zrwcq6mYJcwe5U*iBnLm@W_fkhgSa$6pHNN08ZPyR7m|74Ohl*7qsT!ruR(hAfL@+T zj$pc{*vrN6r6?{^9%U~$%)(OC32re3V~4W)Sv($*lZ*KBQEde!H4VV3u7e m^7G*)c1)!zOM7;FQ(V1huG)U3PmH2DlhVM$kk_{tQK}Z>^og=GwIt%^Y%$ zU0=FWAyXYud_;~eTPOA4g5%rT@U)(m!Q^4YZZ^hFFQRBtBlNb`kpsjnkR>VTeho3v zL3>EegHFp?0|x#$i3BKdo#f&=qZa+lAZ$ONb=8IIU2uY%<+63OvU61Wc3so}q#Nbu zH>l5rY6rKsR#^)!$)ceA0)~ua1sN}s;E9P$axBOa=mxFks<2zKEVnI|@rf!~Z)P;& z0X%dZVs%2D;2G7mq0Q+N-~n7WHM=uoL&VsIMMIi_wZrl>8? a{bI-vuObt!JZad3T4E2>)eq&n_VJgJ5wfLj!dUyH!YDbz5jQYcAuH ~$iYOgp2Yb!{rkq?o;pB{~5%-L0V!10=qkgd73+J%v3ARrr! z;Z>5KaJ5NR!c`ztq*7sQBTy5I5k{}liaz69;3A-c1NP}r=m|7zR@D^Ci7nsHr{UvY z+5@eq{!EUJ)T0TezSr*33Sy>-0~3A_x-XGm UgrU5c2kv(VkgleIH8QiGt z{W)g<5dVw+*A@N}&LXu8(V^TmsFH@P<^nVcEz&`j_g1M%X}*O67x_a 1h z?*SiG)vXV2NI;}W3Iq_55e!8nnVy*-B_shNC6Oe60*+HjOdv6pDhP-L6%_>q6ciB= zP!v=whz%4GL{TiDC@OYQQBW!Kf7UK%&P*nNukU^Dz2A2yzbB{dv(G;J?6TTkOXyU> zszwM;U?xRFIw}QGM0pU9FkdhEkj?mgGV&EgN)SqZG+Q!#74A`$NdT8K*CH0L3j)>@ zLk>DEiF$>lpj>Rx6U#g)#uZ{cE3rVxDYnki-l~((2;Vq5D=RXl3MJ5{Ofs6+rQ%b4 z9d(*TqcmV8PqQwMnj^~)mX+Q*A3CVqyvtp=5Q2&MIGQR^Tp $6 zOPI2 )${5C}i)`)fSQP!F zpgiD(oVySrH|6kr9%g 572ZV!tj1UGxVnp;Wr$%&seWEKKkWdqt5@(`0 zHsuD=O6?<60GdPsd4(47YE)I7^~8LpkC0lak_nGq%AXps|J-2^8M!O3+VmE=CFKJo zZz=deI;pD#^v_U{|Bkk;tfU;?z@*DG!L@QBXm(aMX#cD%EGfTC%B;kIp(#2ceklRF z6dI~A`H&ex&IFyXssQXKzkQgLWx295NI0YnnuG)lLjcWAdh%a-Jd38ClhO-rCmm6% zAzd|J5FyA-n)~Z`X$cjR3xpJHlCE|HHCtDbSc*sm)gn|Ix(Bh2I1k_|)X0qtGI5 z?Wdz!l%)|TBtyzPE~^Nq7DJRysNxL5?JV^0WNAWtE4(-fOJly)AuQY}krjNpb&ZEp z9ZvQ$`1bS`WtCyMS*R|@VVVjpEGVd$R8S^O#y}F0Bcu8a$b^q#Nn+9BechYNvqTN+ z9bkvQq~?TM_Q8TOVWki9NKGo5)ClqwZs|s13KB&{A Nc=Rbf37*dh zZ(WHsyRlHiBA=8r<>4RK&q(beDxG}t64i@|o%16~G{p6MO5&-!^vE{NX(GuKDEFkQ zxvO>S&`b!$BvqU!2$8cP$+h4YL<5$C5*cWS4@^TAm$XNCw46{zj#XqO*XfP0P@)b> z4Z*EsU0`rX+K3Yo-s8zT4pEjQkqafpgQF;XLv2_{CdH>ya&+|o;dG|%;sc0)__Ec} zW4mQkRJh^l9p0(B!!VD8>r$vnQFd@im~@RbFpW?FO^K={A*7^OP)S&Z1mXm8FL>JK z6=>*&&zD@@J;hK+#;O!{6M{{!jP7v|c86$}6!^O2YdpmuiI}Se+|E9`3d=lr&oXr5 zU#WL;Ir+e fO(l&ya5 zlq^hK#tH9e@-oGea@#p66x9e|om!cjCGbR|foW+lVx5`0$vWETum%ySPS*Ft;X+oc z7EQn!T}WlQxRZQxVy?;@Y~W;uVZe}#f%)|HjE;#)`X~DV2{ %k-JD4 zRge-AjgX0+SS(jbpN)qF)44hzA*7f hQ6OygS@8je`6 zQSJ#jUW(!$RETYQ7EdUJ Py7?Ufp#?^(BXoTSy}?8l>Exnz+*?*9bF&o5CTg$z^2Y{cf1Xfxp(<;oyW+uwgiK={*(|K$cZj zLGtdpHjNSLY6meS8GIqJYgi$O_d2pu!LW$VXAx|KPIu1Fvys{T;jI*>MI vm-sn z5K1AeWx={23@LmNX{?*eWQ&mL+LZ-oVP0M?*3=M31|C5 d%knEKhNxa{n zT+KOZ6n9D{eoyWI$d!kM3_~$gsc^3N97_2wW5gElh)A6K6P3dQAxR?&aVF$?iI}Ux z;n^@L0Egtt%E`|gk^v5M*pSP?+{0Nq`2iPUIwXNjqg525D4JG1G%?fM!c%a0Q)pzQ zz^^irPzoA5JT6DJq+|*iT8A5wjWdD-uA7d;4H1bzpJ@wJl%EvxK$PqE$_at{9?Blj zKW8AzqxB`k%L!MZT=Robiv)i)`h{ddx9wL^M+?ceiUiIfXFx=8NuEZG^$}iqbhIdE zJKPf{g(=3la+U}NFWKF4y^uFq`Ym#RKu?SdI?k&(NWc1rS1INt5eYl}gdz_ #bNYC@E*Sl5Pi+$6E*P~nhV_;eHkD8 vC&tV3F+iKz*yB9Kd+*Z??}9>O>qU~pGs80 h`*glfqPtfI)p!bT=WlxEpf%9 zvAT-p6gAf`;6VtYOJSq}WhqQ&M4CY^EM;xtYB?mTn#Tp)M06t2NTQo^MGgWM4UxV= zeYBD}L?2Qm`7rzt)7Bp !J zDl|)z3|Nz9Ho|)5G~ZpUAL1)3H5P@2O?bQ}=Z@T=4q1hRH|+|=9A8bCk(WJ+xHC>< zgOm~T5 @xG$~H*B;HRin*$fdh= P^myE!I}*}u5PvS} zEi8 (MZI_RdT%HtP#y8{259Vsgq)cB-Bcrg$YL3+6$Et z`Vmw{WGGpeywme5!W1Ba*yBbww6G;RBQp~*41^3yC@G`lrz=-PM)f_LcRw-9N8Ax2 zeore#Ho84dquJ;%T1;k>(Ppw*tO38-ZMAyS>=rDHH+vmsyW8xu`vXpQn#mDJ^QAd0 zKBLiQHaq+n28|B0(PVTR&3tPz8l8S~n$h8~+nhd+&uKE-Jzl%tXLDM;?ttB9_89$c zx5r_2dpu5u-R$ #OY<2$Mn{_2>$DgH z78}mkomPv@>UMb3()>OvZg)B?R-f5!F ~1IW_S#H#i$4&s zd3_#KNx++CGkOD7x7h@j!w#pz>bE* ~L6|4zI P7u~tyY`G=ntS`tQKFu z>Ni^P5U YfTF{JZT=c!{Ihr@ab(ftKIHL;m~&MZhOFM zc6$9N1>OLkAmB0EEFNPTUdrb2`*7exi^H+aYD#mveMYl8;PwYReh2P$q@jtU)woS| ztJP`rIV@<7MyEB+X2L~>-RMs w>bQ$2)ExtJ;`pf zp|e^L{=w)@v!Va`(XVY*3?%qyCac+IGNFB=-#I*J`fiIGy$1KY?G6i?r^ADOXf@(p z(I^7=XU50C=L&exP69?-n$hC*dmUc1=Rlg |H^l+QsWAx&C;7uHUw0$EA zh`t{1S^OTq-QmTDbD|UhyVYnzGeOb)7E{297Uc|h1IV1WMl<@D&Ej_0oYcbbbaW+j z7puu>wqlgPD>>1+eKxnvVKF=LmT37-)P@bs+~Gl=bo;zsKDeZr%xP})_JAKx#z^8b z`%N|vK0A63N`o(oLDPXj!REBNjTSThaO8Bj%?=%7CI~ 1N;=2Y*`SX2~ Ec(_|u)g(01SrdH!u1Ep>l%?h@GbX~+rz^TO5@C7C8!vvq9bW@zG5jL@8E6Y%N z@V$^ViWr2N3W_s`SYf6XM_xuz1Ek&!(jG`dG=sPtrK1dgF@6W~&Y zk_?ziA3S9A&Fu>_sw%ybY0@jExk6gf`yrA*#~u$!MgU>Crk|@?x$sDnxeC7{ zI~cF%x!Q=Es<~@rU0YBNXXTd+zd6Jbhuz2Ds=ky^N$Mg%z@(o0o{dm$hTkmoBIMeE zSVXYUw7N~LUPRTw08X;cOfKJmd;yj-m3{_!@&pJ@VCsTXq2lu8ncSf+)f<;mK*Q@T zG8FkM{MtZS c>s_fPz>m26OjH2kmtRG7Z zrS%uqr@1lz7KGb=<&Z=a>js524AvJw;+ErsU=IpI7fC^sX%5UGHE}i8$ml)7%FZf# zHi=MWY$rq^m!309g}g1q4s*jS%&eKAMR^!_^5Cvc=Z&mBwp8?>2#!?c$h+upZpx}< z1vOJ$y@)mi>I+O0EBT!y`(i A)$t61vR7G@{?ikFBA3l$q<7b5Oq zLgd=(FvSc}i(-v5#&}IKE^PMu=j6IDY{1HPJVln$)u+^5@C9e5kzr!&Ox65`&_F8f z14wR3G$FLOlWDFe+YM=KFCB$SktbY@4>3y}iF7Jvk;f*Jik)D#>nsv9GLQ>c#2Q2? zJK^+ Ee$3n9s&V9DPO8J z#XK2SJ|!8NDt!(U%@CsY^fRBbI#x?ULM`TWb)ciWbi|;(PmselniyqwMa%YauY$1e z;u@MFEC`n7Z=??7USM_h{<00AS8&BEEs{k5(r&n`2 z~ zdGSyRK|4bF2 Nyeg}S+Fit@I= I5&VqfQkO8L1z#L=c&@8dT7jM6iZ3;EErv zQOPN|+%*I)*oH)34uNGIhykD?3J~S2QNApDRKakNpDq>q80w_qxkFtTe)v)sNn5L; z=8WJ$%ua6y<&^Kh%dG`Tpkko@1kFtgK&5t0oFKM?v`5rt 1Hx$S1}Mz@Jb> $ZU0M`GhQ<;{5TY=b$9zZ9 z4Yj&kTZ{_hd|ChnSqk0_v8^!QldcXn;c~@=AbeoTJihKi3z+HAps1JZ6~oeiLS*Tu zOpqCPgfbK-*_ZICCXJEwQ~)1eL-Ie3ki^S@6s$6kE7#Bxa89P{W^i6b+_r#>Mk2l3 zanVO5re31th%2C$G;&0yPYbA_7%Yt@*H{YOLj-jZg_J*?F#!?cpu+szoB$T3HE!=D z6{XR`194SWmhuUL*2jh{Ao Jo+*(iF;&ODlruT*z(+PSOx@EvtAO zzCR{Aa3MtVOJac4Lbg kwh$YjZ31Zo} 0Ec;gWe@|2CM_|fYN#y25)w|Uf?Uz_8Dabip01@u5x~IU^?2JRDz_f* z9-(nK +pMs+T^@YGP3Ng;&yJ5+RW{U(4##_W9&CICaFxHk0gY$PNp60@xzA#b8Xd|R} z&} 71IYVy?hip_tXKHnH zJ!Az-y%~c}n2JF*2DEO@lDbMs`-Mqhd>xuw%CyHr&R2}k0(IroIu43lVG6ZGJz5B* z>_I!%K2i!<_l_W2tW)qkS$yo!5lsw!$jHfo^oGThLqak|D=vjlx|}a?S9W|PEYMD3 z X_!I=^f$;Iyq!Tr3~DoSfWXqnV63ZIBM1fLX&(+ zH2%a1?q?WWqrmM`kPaXtc-un9!59zIWp1Fzr`RY%JU(7og(5d1 zM)-UwR-=g>otNZ+AQnJR>N$YA#4lQ!@ {Efw3a3fxhK}SyjV|?e7AciK)KvH5S zXSpaf7oub$19ZrHB#j%Q5;Y1s#F_}Ixo#cu6kJ!t9X|7*ypfO5i4;TfkkHe_)JNT3 zJcPI?OemWEJZg1G4`O1l;S2!2nf@-$?GcX@QjoZaij`ty<)%fd#6YT|*+4H01&fH- zWH6;*O>uG600bB1%V{$v_%cBNO(>N9oQ+b7ZI#rhL%DMXc^dli11kJ}VG1d@Hr?DN z-FHD&uWzSv!WA(&&ul@#87(6~UjvC0S{eXZH(DDSxE90#^GRL0RtwJJ`~WuOx2S>%X}ht}f+pp+St(Z(4G*&|yAH|5}F;gEw-C^Af= zTzE=m1*CNpRB`Aw&eajA61tN}NS0qxT;88nH-M#c`>YU6lsU)=S*fA627^+1y7)|V z5f-57wCz?v(Kbg@R8_c$6cidtF;+5#cws(J@J1+ml%ga;tl$~wTS9Cecbq5V8F1e2 zU$~p5^@>VYjmg1tP(vhFf?xoac0Rn?h}EE2L}XFJPo$iokh-!8&h){aj)##s38;kz ztv9#RCP&l-sDDYeAZs0SN=wN#YDvuhNZ^?iay$pcQVKJ{tP$pSb|d3*hzy;zi;n6R zN@!xw^tKzAZo(bwDEdj!JDPYEx>PBRQ6v-ZD>`CH2{RRmQa1~gf|IoMT6T~Wp~??; ztKh3SXB$CArO4(JZu%hxU5styotb#;2z!yJl$tn+McsUog| lftWfh{g zA%q@CIA~UqQ;b6bBybjzXT8U2RheYxrE^%V0>oiyimxO+Js$x({Jsn^IHUJMmR@Ip zj1pC(r|UzyrKgLbS8%I&+*@@wE{rf>t<5P{+!R(rRM~~c(1F5*zmW*6d xEE8bKZ+Myp@a@uTj^hN1|;f5&_8bg-ywjH9R 1eb;M(>gzS;b%Tn~7;{wGMl~p|E4Ocs8)V7$+#W+rF9IbSGxgxJmWnB=d>^Utb z5-#J{Jy##4Sw~y&widQ*_;f0u@F#>iJ7;`E&b*tSGF_=KkWgx+@U(@>;ASLu*$@BX zGTsfXW5I6DfXkK89s>J(B`rscz+njV8@41@aU#RBM_?T-sVMkD3+b1d{6^*skFL2u zXyJOJ9T$d0gCWzCjLgeju!oUuC9%kbYZk)Rm~cMe^cn)FOu}x{FHI4;6wp9n?zRMj zA?k|iLoy9R5nDJ1aR8OKD46c#V9|s~4K6G%dw4$L*nm;utEuIMyxe@OVb+C*(e)1Q z8vsH9@S9jTS<0n{SdLPaCzq7KU8y!HLDmGK2W~4wbjSLb4^SH#ISRfdf?MDQt;EP< ziNBm8Nc2@iGo0jZF(49IONn^f3o~FiohwPnW90L&H5eKAy5W&zp&Mc70{OBeZ#8kZ zAe2&+AqA*65A*~Egfru2w9pGfXM(dtFZCqxrEu=eD+0mh!&o$U B=I9v zDN-~KHXEYqh;xJ7l@VtIKLEN(PIn|jBjFkx5Xv+7L_>?=a~iTa5O4)`ogfVW)t6fV z-3lZ!g~X=m z{v)x0`2P=tOhhpJv*hUh8hbvDvWs$k5iN&VXx3Nxw0$wJt?Mk z&Wu1prn5K3Cns_yBYzlZQOsB*2%=yNQozpbWxz$`R=FXxg-jYVxmFy#^pFhsNYn)b zRVm__q-1PxSp};|lz^mG^lixXI7-T6-{}SJmF^l4R(h$s;5BiF6e#zG{9Q0V76V_C zZXm+d(5(i3Tev+H)gE4ubR9&`=`3{QyhCad5`u}GrAQv)5EEWo7}aPYTp^wzOExU+ zq@`Qb`uUnJbj=}9lZFJR^a`AQfDh*C01Oy(qIJGpS~Fc6E>u#SkJRTN>2m3cQWsws zVg>1qQe$-fURWQ@63VY63Cxsqnp4%+W`{1~<4PhsG 2xuoshuGQv;|Gv zAg5bsC#pRn%$|#PEi`zjOhR%DF-#8&Uwj~)$Lb4!u?;m^4B|)DmK=Qf#2?ZD_{qFE z8WSB-I?((yroz?2RU@ z; @A~zW>)q9aJl7%K8V6ZM$Yv5ll>J4Z74N!P@D_S60aE5!>P+9^q4Lc>W6%T zQs>6Z0i`C5)N+Unxjv=lj8PW;MIybPjvh;v=j4YFf-JO$DE7a)I>k6ZruXO)mG!PG z2&Yy<6tL_ee(p4u#!cZ$PcpUj-4!ykh)xZM@)y&D3wlkdf#BafJm2VRL>O3_Fq$!x zDFzzM0pI|HPjj+>$%3~8Nb2ixa!x{VDKZyUJ;SrP#~eZ5DvOvf8dmvd=N3IKioGb- zkt-u0L6e4z&2^SPNCLO5S%rDnAt}9*g2U83KQB8I2IwH)X-$mKI8gCVVb4x3 P# z!Ejghs65W6$Z-#XT@VmlL8}`9siVocOc2FtCJPBobq;zE&O*B97TqRlA`DLy92-Of z>>eS9Chk@e;<&36y-f&*Wt348>OmV{i7*}dI6oj%MUbgXBIndhsh=DN(s&6wbS-aT zw}g-{n0JY~(ek5-k=m<)YX?HhPEZ{(U=SuWkw(nBGHWT7!PwCs^k_*wi7azqK&7T( zig<%yk)v{Q1+A^>4))9#3ncLXdJgWiD}~QD13n?WK4vcRJON^XYcZqf3FLfT*Vzuy z)**T}M9YAs8P}hyIP>#|@Yx5%3YVD6Vhxv8v>*+^50OS4h2(}Ib;&^)x5h4`)L0yf z@WG^zO|ok|&C4ybK{0S~fSk;WIr)k)S19 XUxGJYt|Y2M`?mpJ`IG_tB|{;BF3fD6N4l_6fV9y2boM(T>om{!2xbQO~f zr@ZsHD-ddU+;E4_)tHUQcS@)$aWCkCq@@-IFD*TZpfGeJvud?4PjR(El|em+sZ$|F z*T*EatRuG3l1r&zAk2t^<;BX7p?Y|yB?bgUMImA(akVWH(##;1Qj!do-y+0WTJ7q) zya6>$$Mgx14e1Ps2E+@JpGqNJm*t8=- wB7*mC*)Q zM)QzHp!$@rdMOHrD7YFz1Ab)a#vLK)eZNAi9LYd}T&*ia2&byYOwdC8;iJLhA1{rY zjD!@=R9G;er$baD|HKSm{=Y7yoN`G-(oQYLiSjPQ1Ju>=Ed&AztybAYaUxc+CY*ES zqD1l>NxEIx4ag*iL;~;z!wsO+c^xIg<#ED5!$nrx^bARg)I%nQOUDOeVWggJ9ObYx zI0zD?8&TW-ap t=JgZK! +Ql}kD{qQ2DO>m=o TrPr* zSly`e`L8@s!n^}E)+SpW3iq-?xHyOKmZ-i{Icbyu!o$c&%`#rUQc{Hz3ZsU}m!m63 zEZ^*(3v(5H(16TA897>*ak5Sa 2KAf;%7hcE1pz)?D(UnYf(3R_tyj23lC&@IANGV <7Q>a4$wf$nhY1>2(wiXk5Y@h(X+lo~UR+OX3*CE(NP3(m z;S`MsexW6R_d*`8jhl*zRcjaniLb?EiY41+Xw#E1XUoPNGCkuof<`_-AjH{J*r4QR z 0Y8Huzz=H0NqhVNtfO zB@2>