From 7d09422380e72c8f2796b056c0aaf2bda7a1aa49 Mon Sep 17 00:00:00 2001 From: <> Date: Fri, 15 Jul 2022 18:04:53 +0000 Subject: [PATCH] Deployed 9999b7e with MkDocs version: 1.3.0 --- 404.html | 2 +- examples/scibert/index.html | 2 +- examples/scibert/views/__init__/index.html | 2 +- .../views/evaluated_sentence/index.html | 2 +- examples/scibert/views/match/index.html | 2 +- examples/simple-mag/train/index.html | 2 +- examples/simple/data/index.html | 2 +- examples/simple/deploy/index.html | 2 +- examples/simple/train/index.html | 2 +- explanation/index.html | 2 +- how-to-guides/call-remote/call-remote.md | 4 +-- how-to-guides/call-remote/index.html | 12 ++++---- .../configure-service/configure-service.md | 8 +++--- how-to-guides/configure-service/index.html | 12 ++++---- .../create-service/create-service.md | 12 ++++---- how-to-guides/create-service/index.html | 16 +++++------ .../handle-training-data.md | 6 ++-- how-to-guides/handle-training-data/index.html | 14 +++++----- how-to-guides/install/index.html | 15 ++++++---- how-to-guides/install/install.md | 12 ++++++-- how-to-guides/large_file/index.html | 26 +++++++++--------- how-to-guides/large_file/large_file.md | 14 +++++----- how-to-guides/use-service/index.html | 16 +++++------ how-to-guides/use-service/use-service.md | 14 +++++----- index.html | 2 +- media/remote-async.png | Bin 139544 -> 163933 bytes media/remote-sync.png | Bin 134579 -> 157806 bytes reference/index.html | 2 +- reference/large-file/index.html | 2 +- reference/utilities/index.html | 5 ++-- reference/utilities/utilities.md | 2 -- reference/views/index.html | 2 +- search/search_index.json | 2 +- sitemap.xml.gz | Bin 214 -> 214 bytes tutorial/deploy/index.html | 2 +- tutorial/index.html | 2 +- tutorial/train/index.html | 2 +- 37 files changed, 116 insertions(+), 108 deletions(-) diff --git a/404.html b/404.html index 1802554..6f93d28 100644 --- a/404.html +++ b/404.html @@ -431,7 +431,7 @@
Let's send multiple requests at the same time to speed up the overall execution time. To do this, we will use the call_remote_great_ai_async function.
Note, that in server.py, the inference function is declared async. This means that multiple "copies" of it can run at the same time in the same thread. Since, there is no CPU-bottleneck, the server has a quite large throughpout (requests responded to per second), but its latency will stay around 2 seconds due to the async sleep command.
Note, that in server.py, the inference function is declared async. This means that multiple "copies" of it can run at the same time in the same thread. Since, there is no CPU bottleneck, the server has a quite large throughput (requests responded to per second), but its latency will stay around 2 seconds due to the async sleep command.
If your great-ai server is not async, higher throughput can be achieved by running multiple instances of it, either manually, or by running it with multiple uvicorn workers like this: ENVIRONMENT=production great-ai server.py --worker_count 4
Replace client.py with this async client. Note that even though async support is significantly more streamlined in recent Python versions, it still requires a bit more boilerplate than its synchronous counterpart.

This also works, and in some use cases might be considerably quicker.
+This also works, and in some use-cases might be considerably quicker.
GreatAI aims to provide reasonable defaults wherever possible. The current configuration is always prominently displayed (and updated) on the dashboard and in the command-line startup banner.
+GreatAI aims to provide reasonable defaults wherever possible. The current configuration is always prominently displayed (and updated) on the dashboard and in the command-line start-up banner.
You can override any of the default settings by calling great_ai.configure. If you don't call configure, the default settings are applied on the first call to most great-ai functions.
The only aspect that cannot be automated is choosing the backing storage for the database and file storage.
Right now, you have 3 options for storing the models and large datasets: LargeFileLocal, LargeFileMongo, and LargeFileS3.
-Without explicit configuration, LargeFileLocal is selected by default. This one still version-controls your files but it only stores them in a local path.
+Without explicit configuration, LargeFileLocal is selected by default. This one still version-controls your files but it only stores them in a local path (which of course can be a remote volume attached by NFS, HDFS, etc.).
Important
If your working directory contains a mongo.ini or s3.ini file, an attempt is made to auto-configure LargeFileMongo or LargeFileS3 respectively.
s3.ini (or mongo.ini) is available in the current working directory, they are automatically used to configure their respective LargeFile implementations/databases.s3.ini (or mongo.ini) is available in the current working directory, they are automatically used to configure their respective LargeFile implementations/databases.By default, a thread-safe version of TinyDB is utilised for saving the prediction traces into a local file. Unfortunately, for most production needs, this method is not suitable.
At the moment, only MongoDB is supported as a production-ready TracingDatabase. In order to use it, you have to either place a file named mongo.ini in your working directory, or explicitly call MongoDbDriver.configure_credentials_from_file or MongoDbDriver.configure_credentials.
At the moment, only MongoDB is supported as a production-ready TracingDatabase. In order to use it, you have to either place a file named mongo.ini in your working directory, or explicitly call either MongoDbDriver.configure_credentials_from_file or MongoDbDriver.configure_credentials.
@GreatAI?The purpose of the @GreatAI.create is simply to provide you with type-checking through MyPy, Pylance, and similar libraries. However, the overloading support for __new__ is lacking in MyPy, thus, a static factory method is used instead.
The purpose of @GreatAI.create is simply to provide you with type-checking through MyPy, Pylance, and similar libraries. However, the overloading support for __new__ is lacking in MyPy, thus, a static factory method is used instead.
Even though it's not required by GreatAI, type annotating your codebase can save you from lots of trivial mistakes, that's why it's highly advised. Simply add the expected types to your function's signature.
@@ -904,11 +904,11 @@ @GreatAI.create async def async_greeter(your_name: str) -> str: - await sleep(2) # simulate IO-heavy operation + await sleep(2) # simulate IO-bound operation return f'Hi {your_name}!'GreatAI can decorate already decorated functions. The only restriction is that @GreatAI.create always has to come last. There are two built-in decorators that you can use to customise your function but you can you use any third-party decorator as well.
+GreatAI can decorate already decorated functions. The only restriction is that @GreatAI.create must come last. There are two built-in decorators that you can use to customise your function but you can you use any third-party decorator as well.
@use_model#If you have previously saved a model with save_model, you can inject it into your function by calling @use_model.
from great_ai import GreatAI, use_model
@@ -925,7 +925,7 @@
Important
-You must call @use_model before @GreatAI.create. Feel free to use @use_model in other places of the codebase, it works equally well outside of GreatAI services.
+You must call @use_model before @GreatAI.create. Note, that decorators are applied starting from the bottom-most one. Feel free to use @use_model in other places of the codebase, it works equally well outside of GreatAI services.
Using @parameter#
If you wish to turn off logging or specify custom validation for your parameters, you can use the @parameter decorator.
@@ -944,7 +944,7 @@
Important
-You must call @parameter before @GreatAI.create. Feel free to use @parameter in other places of the codebase, it works equally well outside of GreatAI services.
+You must call @parameter before @GreatAI.create. Note, that decorators are applied starting from the bottom-most one. Feel free to use @parameter in other places of the codebase, it works equally well outside of GreatAI services.
Refer to the following example summarising the options you have when instantiating a GreatAI service.
@@ -965,7 +965,7 @@ assert add_number(1).output == 5At the start of your experiments' first iteration, after you've gathered suitable samples for training, you can call great_ai.add_ground_truth. This automatically stores a timestamp and also allows you to assign tags to the data. Using these attributes, great_ai.query_ground_truth can be called to get a filtered view of the training data.
Train-test-validation splits
-It is a best-practice to lock-away a test split of your data that is only used for the final quality assessment. This prevents you from accidentally training on it, or inadvertently tuning the model to have the highest accuracy metrics on the test split. This, of course, may lead to dubious results, hence, care must be taken to avoid it.
-With great_ai.add_ground_truth, there is an option to tag the samples with train, test, and validation randomly, following a predefined distribution. This happens as soon as they're written in the database. Later on, these can be queried by providing the name of the appropriate tags.
It is a best-practice to lock-away the test split of your data that is only used for the final quality assessment. This prevents you from accidentally training on it, or inadvertently tuning the model to have the highest accuracy metrics on the test split. This, of course, may lead to dubious results, hence, care must be taken to avoid it.
+With great_ai.add_ground_truth, there is an option to tag the samples with train, test, and validation randomly, following a predefined distribution. This happens as soon as they're written in the database. Later, these can be queried by providing the name of the appropriate tags.
The nice thing about this is that the 'input-expected output' pairs are stored as traces. Thus, they behave exactly like regular prediction traces.
from great_ai import add_ground_truth
@@ -864,7 +864,7 @@
- Expected output. This can be also accessed through the
.output property.
- The input value is stored here.
-- Notice how
ground_truth always included as a tag when using great_ai.add_ground_truth.
+- Notice how
ground_truth is always included as a tag when using great_ai.add_ground_truth.
Get feedback#
After the initial data gathering, end-to-end feedback can be also integrated into the dataset.
@@ -879,7 +879,7 @@
Last update:
- July 12, 2022
+ July 15, 2022
@@ -916,13 +916,13 @@
-
+
As you can see, the original return value is wrapped in a Trace object (which is also persisted in your database of choice). You can access the original value under the output property.
Online prediction#
Likely, the main way you would like to expose your model is through an HTTP API. @GreatAI.create scaffolds many REST API endpoints for your model and creates a FastAPI app available under GreatAI.app. This can be served using uvicorn or any other ASGI server.
-Since most ML code lives in Jupyter notebooks, therefore, deploying a notebook containing the inference function is supported. To achieve this, uvicorn is wrapped by the great-ai command-line utility which, among others, takes care of feeding a notebook into uvicorn. It also supports auto-reloading.
+Since most ML code lives in Jupyter notebooks, therefore, deploying a notebook containing the inference function is supported. To achieve this, uvicorn is wrapped by the great-ai command-line utility which — among others — takes care of feeding a notebook into uvicorn. It also supports auto-reloading.
In development#
@@ -959,7 +959,7 @@
Simply run ENVIRONMENT=production great-ai deploy.ipynb in the command-line of a production machine.
-This is the crudest approach, however, it might be fitting for some contexts.
+This is the crudest approach; however, it might be fitting for some contexts.
Run the notebook directly in a container or create a service for it using your favourite container orchestrator.
@@ -970,7 +970,7 @@You can replace pwd with the path to your code's folder.
Similarly to the previous approach, your code will run in a container. However, instead of manually managing it, you can just choose from a plethora of PaaS providers (such as AWS ECS, DO App platform, MLEM, Streamlit) that take a Docker image as a source and handle the rest of the deployment.
+Similar to the previous approach, your code will run in a container. However, instead of manually managing it, you can just choose from a plethora of PaaS providers (such as AWS ECS, DO App platform, MLEM, Streamlit) that take a Docker image as a source and handle the rest of the deployment.
To this end, you can also create a custom Docker image. It is especially useful if you have third-party dependencies, such as PyTorch or TensorFlow.
FROM schmelczera/great-ai:latest
@@ -998,7 +998,7 @@
'logged_values': {'arg:your_name:length': 5, 'arg:your_name:value': 'Alice'},
'models': [],
'original_execution_time_ms': 0.1251,
- 'output': 'Hi Alice',
+ 'output': 'Hi Alice!',
'tags': ['greeter', 'online', 'development'],
'trace_id': '90ffa15f-e839-41c4-8e7a-3211168bc138'}),
Trace[str]({'created': '2022-07-11T14:36:37.166659',
@@ -1007,7 +1007,7 @@
'logged_values': {'arg:your_name:length': 3, 'arg:your_name:value': 'Bob'},
'models': [],
'original_execution_time_ms': 0.0571,
- 'output': 'Hi Bob',
+ 'output': 'Hi Bob!',
'tags': ['greeter', 'online', 'development'],
'trace_id': 'f48e94c7-0815-48b3-a864-41349d3dae84'})]
hSceiU0j+ZZZL!f)))E3q)+-h@49;A)c`vl25-wiVi;oog zDPw=UM8S%1v+YMVX*$Wc&m%AFtf13g>)8%-CBA|BxlM^g-r>#vq3bP!;tJbt%>cn6 zxH|-g;O_2Da3=%^9^Bn6xYKBGcXxLP65QPyhi;l7?|0rgGc{*wSM8r&yZVuRKWnY~ z+ET))UB37v0-JqlMGe;uRsHikIrdWfrxOS9JSP|O?Y?zdba1;#tcqd^Lc`y#rB|N8 z)jYEge;$BILjrGD{+n{21Q?plp6M|+!8DoB9;Cy@Zeiw)R|+2uJV-REBljNVgk0N(EW;!as5{=gv|Ly1}TfjUsSmL zF)5LnM1phL&p4^}=wf3Q-{9PSY`&kvw+&e0gOpuf I zes-4VH;2MZ1z132if68GVnmcTkDuCQ1Gl$~kYgvFqS;7rw|w!3gFe=8=ReEa5B(8} zr~hVn?vI-qLOPt%sj|H`2Zuwy81%A>vy{fT1oI|h)IZvC TU&+V{D4eU$)X6PBEPZ3t#hd>Q8FTB>PAP;xU{SH4J)YI z?W>>1(Lx%yC(QnR^i nLN?L#jgoFRYTUhxKCxJQddKfKVn6is87=N zuD$Z{b2XqLLW)LYbQ>UeGYiCgam}NuPX=7%`)PYu0E0K2rtK8}=hb(~;qVC5QRfqJ z2v1Mft=En(d`D8!F1rQ1`ug`UV*N?3#UC!e2STd@;Eib>fV$g|aQ^*+j1%oD+*5)M z8a3{U9qo0w%L5Mg=LzTh3lcPODvmNI_)Bi!uSC%u!je`9KVppUIPl0rhW`3qR&eK5 zNbjh|FG|(xaeWEC4P5u|6!hPQZk==l1fmADM7(fn<%b((^0+uC&QuG^8n2*_E4ts$ z7orYtg6S~X6H=YgJA%ftuyi#viJ7EaK{^!e$Kr;%d<6|0Y6djDwzi@KLtN-WPjo-F zRwbczOwP18%A-amX>3t-X6CJ5c3r*|y=NQ01~gTWOp$5#p5)4 f4M?kwb;T#?1RkH6K&lvi?3zJ5miaLd(Q0r0 zSY}pYX3-4h>tICMC`R;zl;Fg@JSQ7TS6vJS^@ZA$WL8TR0nmw^PnN}5%_eF1BKDb? zt1>-zJn)%sd>$a?s!g^^6pOH#5*d85LmvL^*p`;m%CBvhzeT&_eptoj1bf{lxiW1y zpuy0EfN(aq8MZFLA-_+^ra$Kif}77INc6YZVg8A5PM$?CiSK)5_8o{yq v`a%`;b=yrsvWfEb%5 EZ8fNn0Po(Z$ud)`+ujdi)>3&Qo2Azu1XbHb>QM-w^m!AbZmtC%TA3o3`J^!Adt z=wH(_ePk?shavL1-RF 2b(~g_aqK;y9QMQb0SjtH4u6){;%mrd*SyelGAN0{o`n4?~rfntJD#y|1|&m zzgH>2Zyw~1Q~2tQNE*Bjy2~CM2m3Jj36PTPtC#v7nf=`06t&M-9d%t}oYh*YUmT2q z4?tvv{)uqcTVpJbL6^oN1GxRa$u1TMcZ+xwg-+{ZJ-X9tiR|?TKbq0=dV9~bvw%*f z1FkN|ocfa-B-c+Hy-B@D61rdN A_hq)n93Op{b!?#yPnwlgeLH{nriuk4zCrgdTX(>e>#~F~;=2Q5U^R5dpLqOG+zB zmze*lky}1MOW0i-lLt;YKsB~S#{{52>**{>i?&*sRD32V;sx k-NSyrm2u=sE0u+$Z1I`|H*9q&4tGzN9nzgl%)UG4RJ`XBR`f6bAx^Uq> zx98WvjYD4bCVM4ZZ{i(XwPbEzeWC< 2}FZ}({U!wU7?g&)jvzXOxh zrE5@Hmg&Ez5+(m}mBpJ$1f!)g37xJ%ov$EaDh10x?Ej2NScC2IKV+8AQ65zj1W4$r zXL-wIIN1A?3*rI599-L5b-4)1^HjQZRR;-CgrzSzBMx=X_Wt}>7AIbv9@}i-Rp4XK zrAGI1deW^ARYk72_PFxhiI&;m3pMmiR~)qine*Q~_+CP1d=i%eN7jh-!WL~Y=Y76X z0XVyjv {^?~?rNU`~qI^ARj zAg_WJx!rh~!TwLno*;BLeuxM%1l#;j?>cpu#g?}E8x47>2Tzc =B_@XXL)HyFC1ZJBT@y5K$|M_J?m@)a*sa3oxx;d|?rCw^RJ{ih zse-6ckKOA-y>;U~yz6II+h;i^2tLoQ@upF~Cy18K->0KK0+b!}16f2E#TELG8fR8J zS4~Rx1x$=Ce&V1etc%!1I>su=1=mA!u{gJX5S#JHCfTAcFLW oZX%}#qxO}xakAFd$ z>AdHwZnYfSdM _*3owGp3(mm z?~Eq;^}Z;S*B88%KHk~0bclrA(*_a{&kfoM55&icgs-2|SGurpS6x6#iRejar`}6_ zj{{8WU+j}5_U0Nutco3ofJAd6jMb7xs%?st|_oYnDsV!Dn$f$SXuu8<9bWT(>4eY#Oey5XK z#ZgPx6oFO*z1}uI7|~e3#~#Hd`mhMXUxX5cu7!>qRqo*ZKQmwBA^x|h;rP6QOxT5+ zProJ}wH(H0mbX_2(0boA*`bFw9keNvZY|rpw~p^AZePjQdNP*WNl4?D^N;=a*-#c< zuy-$bBxd}{!JcY=$)a{-)dxk?B5EYyoz@Z eEiPL!Wy2{X}8>eMm9xyhp;hg_k;VrAMZD z99@sqm~5^q^ROxyl`+Aw3}2NES{{v^YG`nh4SH~ZDm`3&8ew^zC3D_*u?H)rfpSVf znE$+OJE`*iv5w#vuBZ>`WMF(7NpqUu6TWVJQt-f5e?0tOxFVC+ke@4{>F&^=w#23B zHL&WYe>^p8rpgH-`e{^x;ViVx)AypI@8moi5tZ{atx@YaptBNV1GMCAw)L1PM#t=5HjT z(|%a=f6Gl1Jw(_QvM`dGkrTq8i+UC#FIaHQXCC 6$UKD0B0)5i$AEX-07j>y{7IFZO)fWUXG5V2&7awIivt#?JEEP8R12*c- za1gud7i_PPXO(c3vS@TUV^7@*Y~Xb_S1MaZ`A>G`m}t(5MArlqk@`L6%IQgi6-ZL4 z9IhlH_DKHMF%;G(6=tJD4>Mcnzv;BHSB>VR9ui0m)yKx~Qa{*;F+c1S`s!%8$|snp zA^Mt+QdIif7Lh!Y*N4!1AeE=Jm^ul3TW#s!O59h$6oI`DChct^@jTWg3QWiw!pCT* zXv__t^_%~0NBvez8QK%{kTNNQ>GeRJq;ik{;)mgd?lI0MjFt!bOLhFI5GS39Q^4 gLjz26Q|7j{czd7tC`)eR1myxU|Xy{oprM zNhJ`2t5v=dEb@@^B77yO*>2_;QCS0V;Sc*QJh`s)XiLBQF1e)jF|FU; zNLv!>){N#Eq_> 8G!u76&3payraE*eMY zvE0l`t+2E?j#CG-ydNjFwcaaC2SoPD|1T-(ZjB!9Jzt0LWlXfsx`a+Hb_J$b_DV2< z*0{lJrs8>pv^pq?6RScYjw)7^g9n?Up|nrRgD5Ut=s9ko T5>B zo>-W#PuaU}CTd~LR-Scn@%KsMzj?RPn7U!z9^`lY)3AzY3t%X671vfJR+1N(FUd!7 zoRpANmt$}lLWTd%QB3L^dOzxVb{fu7a0|hdIl27gO@H}rD`WnOn4H4%%TbvSFu9zW zhX=eL@9_;oOh6nRmF@dp4?& 36q!H{6AzlDrZM0jT+7Zw?Mf8@h%0EgG;_C` zB>h%w7b+|s&{T!UWidqOPMniUO4il?ywerVkpZBDTnYg<<3@;Wur|k^cRaLgNR iD|?PXO?kxx^`imm%pj=qNFZ+=BcX;_nxa-4WzbM z`RceD7wUz4Gm$u#2$JYrl*hrIO(XRGPe3ukMuLL E!B$c6bBN!OOBjr`vv)i2J!l8`bM!Ap@=Kh71Ev^kB=}`&9Pnb zQbcxQQg6{zB$0nAdGW2g0l8oX#UGo`qCb3-49Fq^&cW{7l=o#IxbCu(-X0#MUnO#j z?+u@C{tuh5f>C?pcyA|cghKEX_(qs;Of|KzE4hQi^>cVb!;F|;#^DOM))B;+96a_5 zLIQaD4+}omuKfC7T4?*hu9B&5Ts&3kQ4iuci>K)F)}Pu}XDb>-F)E60I(t0}BP3lo z@}@0>HWl-|-J270rur)BcSptPpE6_ZukHYiBVu`}FT}z@c1`?DqZ7R! Xw^4$*cu4iTM=xO2B{h)D~XL=`}SS3|iIe^~Ibpch4Igk%qB93Eh zJgy#AFL=KM%sGdL!tyU}EIM7UCBXScmD%I>u8~P~KOTbjdBSF9lyxTYuGd C( zb?Hy&UIj^}N{v@8cUGa$qeO2$#D~l!YAU8i6CW)J7_SUTyhx`Hm90DS@{e{DU7EEi z#?8}8MPB5=1am-HhW;7-S;&;SPxlV*msgI^NHh>35h?MO3~eW#rNVIy3l ew8|?eI(GQ0tXS zFU;24C$oz!mR!XVi# BL>KQt=wP{Yt&Yqk*x|7i=}f=IcZ_ z$KyJY+$nV|e`eG06P`={blY}g`q?h~`%)cQU=Z$&n}Ej(WxYHJhrwgwkG=;kN-`~+ z?1BOf$=7%X;FhZ*%C|KT`UVpBEu_XfSw8$n3rHi>v_@$dM&uQT(w2;3hgQ(fvtELY z!iwQwZLLXZ=D^v8dAQmW+8ol`^kWmZF`~v)`=$lbhICDiXg6a?dAIUO^1h)K>%ixL zu?lc`=S#B1eE+&ra_6IZYFvBoYkKO+Opzi^!r`L*vV>fN`Km&KT%%K%yaaDbFfTfx zQ3ploG^H5xQi#K2?d!?Wr`!z6U~c8EA_xO4K)c*0C1O$(OhGDfsgrLmG{LVb5}*M% z$s1p(DT7CuAyB&q9&t7{lmGaw@ze|TGG5@@;>q@J^i9BWDml%1$R}W2CHGkM);QRk zdtuV)huGt>rd-{5MoEq}f)&C#2;rFZ^lw|b*AF}`7QKidnAr481s>AK^R_C&6wYa7 zIlyX*n4+b)mprZE&ur5`j;E L(A!l4O|P7^4j8&yTeg^grgk80otZYIN! z^?t&b%m(xsf{W2%kq*MMLn5^ ;(rf@iC4@DB{FT{$1S`mv|`e7DX zai*>MzLxaDd>A=TyoVMv>Im*3*<}jNVLy^_97K&SeV8WKLgWR*J1sa2AhUb#ORn>z ziq0@8`uWzm?#CKb_Rc5wlZ2{(_}9AXUVku3rCwSz_5_se_{7k>YbdWIvfH8-UEh*O z1M s6834&fXd+G{fdt*oJ_+b0g|*vEtWBt3R~++oR0J)2|*47&1WI zGK1$0)ZuW%_GMLUIkvIeJilOWMqIi^_%&3IHdcw{t`nXcu?!dX4QbUQ=z>`Q0=>VX z?L_?||JVbWTGVO0hjFw0bd#n$l3`d;8wv9?9LwF~`}0Vm?CsLRmuzB>aWOJOo|FLe z{mSV4SxWfucPlO)-Tjt(man$OS%nVSxA&WI%B9L+5w?A CXnl8kXPQUmL@*7=CPi06DD;YkX- z5o{P}MT5P}lX2e%?;mK4G*oCz9DjTZ*pWD;8CLc~kN5I^O{4hH;fU*PqYs`8B{e8_ z5W5ROeA;F0;1%}T F6e9YC-HVm-d&TTb?QDN^aCN2_83K7wPRzswBFG% zbFmjV?e>xZHvpvl)5r-=!^kSz)+b4lZQWHs_D%Yl!3m!)kcFDf5s+pNQ&!Htmmj}3 z#_`oGBkgfmnH{0XcM-?)prh&rdn71{vdRF*InIHo6%j4j%lLMzbuC* Rv{w~CTw*Vl9 z5$kNr!$ia#dhK&z%^<+B1v9dmMfFL$2ZjncjeIAal;^E%RN<+F@RxVJ2}@`xTO*Sd zAVJEoB7QJj9(j*9-B@JjX)QWS+{2z6vR*}SNX>)XG5m~Adt>ju`{fbs*c-gVq(ib- z^@wqaZeKFLTghMLiU&Jl*UbL;{7V?5oxl|JAcA=#hHmT!Wn_A>8hIxH9K$#9)v{7g zO98xjl=bYxCP<8|6oUIYQE3b^k2Y1*K@NRLM^5NLnk>bAfBnd)6H!2boMv)9OZ`Ej zI!ONcXQNc^+lzQcnarRJh=eU9(^FB3!`(0PNo-t>1Oi#pwiioAzn3BYQiA5s*bkv( zdVq8E|CWh)7g{W7g;%xD;70yC=hf@;->R^l` |B^LWM#N^u`O!RL4#Qh!s|$T5fKJqv>I>4Sn7W zw=2b6jVwE1<@=__zn~#|QaOw o~9%vr11BbutUtj{HBzCtzC0IXYAtQ5#oMp*QZe+fY*{# zv6*V+t4 &Ky+{w3z{nD?-}1urR$+v#8~)TyNaG{o7^Sj8`z_- z2@X 4bvekn#(>k|DEw&()*SJK%3STXDi?F;u4!gRM8}FRvRlqn>)Uv| z$YUamKx#?NB}9Qae)l_ro@B~TQvK;1@hO5IEA~?A{Vm ^L7=v9nmM6+#=wkTWZDb4LCX2Kh?c`Y~zh zY-Tth+v`Y$vW}z&?bWj>UzBloJqk-#BTB{N$uIhKz6<_xzsq0U<@ZxpFWXbwAExik zufgB8lj6TPLr#G!92!8M-R;O}5&tV8Y$I9G&BsHNiRc;giF4V``!zJDe)>zo`G-Q_ z9o~sW!6DXp*K8QK4UsZ&^-wr|aE6BFc!OS+ 16Jww zE*HtokE1cBA}v`{Ycq?DDv#70iRf}YoxY; eONM0{MC16217qcILM zPG1gC`Xxke^pNh6CFD!-VBC#gS*RBJ7f*uF77Oaxg++Ccq>%f%zBN}JrV wG7T+>4J_tX$pDnXAFE)2OT)S_&kvz3FdnnW9UMbn*<5Xxw z6#KE!l(bC{T7FyvUtQK^`zeXz?3R1!=WOk^?R9BviQ^#pavLhcLdVXzsQwpNEOFtf zTkQ4cgLtSRS{e;g)pN@uwfcQ&W%oaJ#IB2CBc8JfbRiR(^Sl~F!JYg;*x@~CBg^s$ z#81GE$tI(+H)&_}=C|>=N2b4Tie A9*Sy=oV64X9jlvmi@ASzHuQZvZ z#jpHiGsk#K#P8<}yye!x3!bg7B@x8$YbOjo1Ov6k^5+5t4x)>1kw_a!p_S)8aQw{K zH?M-GJ-tDwp6JkWef20h_{%uCA%cJWm8O4-+NvPBUpLYmSqgcomZhoT!;Sp2y=M63 z^%aui$-R&F+nNmq2s9K? ^~A9}c!)PV~E~*)=iL z*6T@r*)D{b)Nz~e`}{_|_u@0zY>Xm=CWMxV7qv9T0=x05wC( AK3ovrm!?HTHuBo>&bI*Jo4ve2E>8OkY)MM3@IYnD zTAROu*drQNxgAJEOG758FlYiI{+$Zm*)k<2pQ>nbmE
>{wUw$ z^ucC4CHL0%t^kl3T2?huTPD4}jlZ))lUKwEfu=kxtQCCyaOr =lzFe$w1RAho%)$x1e8e{gP%VcaSUUJfqAKA`80HF5>mpZhN zLa^6r`?KxAnfv&)!p+zDEMxh0BFilAXs$8Yqo|N{Z93Yn*F|NK7UffN^32TuP021% zq!#$`N_g;Zy3^CC2AbI%G7TrBSx;RR#SY|@-fOXb6Zx6A@pgG52$`6t%-ka>^t~IV zNTpZ%d-1M9q*Eib<<6+Aq|3)1PrF~HZdb6upTDz??npGDWGhmnGDdea(+}3i{uU?< z&$M3s5~9XQkGF*V$$03Y0CFmT_&j0xtEYYlA4JPS!Q?(0CNKPJv6%&$|FGbzb|3~> zn@B|RvB0y&Bayh2sG=@`eRpPLvsxA#la)oo3#4rCSFvr;m=1-InWc*d4WV;A`gA%h z9Q}7OoVz=$4e(5HD 6SNs|^Yb6tCA1*tX)jdt~G-ZQ#1*hk2H61lj}JBG34r|>d7 z&}aebRlu2T6;P0?^&L)6XqdVv-<)u7SI{^_fg_6T&@zs%Jo#!^yk`LSVe0#@pt0yW z&h5M93;c!-Boe+3`c1mvKsH8$aU;G0W(#~^14BpCwghY|IOTh_&>A&kHF|eRUTEI| ze6R=~Dfj@k(a%#T?RAd$=1g-pmU}ixq7%
P3bc `V)9LSA3Kl<2xc$z27OOY?YA0rGvVZ1kv zq LB*Va0-?nMLXVM2M~-WW9|1N!DBs@!um!`%ioGJ!PrT?az=iBpQjB2 zb?qGX(Dw`ly??-@rV=K!q&WF7kT|JifAe|$bpLW#p|sp&<#WPDm8lFEG;SXnQXLFO z+s*p9V#Sm$grO9^C9Rv2F1QR#%S6`s1rjvM^n}_HSz&9u=y*Bt%<~J48rJU42y}4C z89dyTM>wLHi~qi@O^|yB_w%q$&4K)*&vG5(Cnk jI z*omh7)YNhBx}pDdN|lyEut+rIOVNuu=8UJm{<}_&^7M+4V&HQ0&6jTBa$c@UpKDms znzfK8K_CW1=qOOHFSqiU5pm?eam0S<*0*DGgJHc{!ZIdiZ8!iB=1n#xX5)=0&9OPG z1Bw0HhC8<@&nn^?`cthEr-j6S#0Nv5#+Rnp=TUwd=saWtelmEIl+xQ00t8p9L}Q%& zCO@a5PpfJ4<1cfJQ<@k-g$r%*8WeBSKW!ir25NW-)7`%>U}YZ*KmBryImHU)>M}?Y z0=80Mt;kTwRuqch4BNu9J55KxrUPHMia`nNw;?_JEjlp|b==kCxG5p}gO0Qd0h%e5 zs^j#8Dfb|gMAdOks^)J(lvvukdeY_cW|brEZH~Yrl-3Os5j>r!bhhArz}7R_`ODA| z+23<{m#doE+!KJ0;hFLH3{DT&JFR7ec;WSH@z2qYcDHJZJPJn#irx=ZiChDGC3pI* zG<=~5?QZh vW0ZBTw!b4thq+_%&V z4u!r1?bzuwP$i#860xy-30~tvCQ1q&uKL52-Xl=f{3&G9>`>c#mAfxZ`MJC@v$5EJ zuQP08asMnY%yf*98JftwYP_qYrKi!~vuiA$y2>u_z^hBW4gog7}7&INhuT+cJob@$z8$eVb1I)4s*?$i0q_`S)L3}+RH4a% 8v!^yC z-lO@9;H;xz;MVZlQT@7_EHz+c_=ErRt!1KFzpgE-U$`h=U+)r!d!eZ`$FBcWPT<8| z4-@z=zrm+~FDR66nqiJP=#+YM??5qbBvt-u*6Lu@4prd$@rK?Q5x4k( 7_N*BB2t8&(Wtbgko!q=z%u3ay{8aNTeYN2 z5LDL=iop*C(FLkI0_Kn7)%)??m=J8m1z4%kfeC_-0vUHnvl(^j^(K)Oq}vna(Ip)R zy-p6ru36@?Pv}QFH!0#O?5xdk^1mgG+k~rKQ>fzDr1|TS+ML%ULlY4%boFOB%W>g` z{Rmz(WAQg-&a`<7LNDCqE^c}AaoNcJv}dC6>4(v=eo@eZ6NjiDjz}d{w2lN`S|Jt` z;A4BU?WM*Pm@y_)j~wFW8S42@Meysz=AJw^uFD^`Co3}HPZHup2%TugdHm`aqK!%D zeIn~ZQDqoQqkFQS8Fy`EYa6P3vaU`$6L-+W+%W&U{9tqip9=7Lm~cmcOkv-wMqF?* zSpH3`Ml^`u0OkK;fwt#S+5<;6!~>Qb+h>6IB9JAKg5H3ODH;r$vh@~mJ#J&`SC=3_ z;BN;%JZ6ri?U!5Y>1c45{wZic<>Wc P;JFAn5CnN=D`3CDxhd*89_tNZ_>Z2U@2oh)y>2c;37G^C9hk`#(YL7quEnSmp zHXeQwLS!`cq$j(;YE^bZZBb_F{hGVx>Bv~^veN&g)l(CsBp581OuJr70UaHG3c`8? zDryb?x$dMKe$2Z*a)-co_{}LD>bA@0D=efU$~`<*4Eemd`WB+jzg(sHvvks^&IxAP zH DN9{L%P2+`Wb5=*skKS=l zDV5QtM%Ff!I^4tbHFTl;Eh2zZ$WNrU1&?NEOutPv(ElvqfVHNpQ^$a%ff*~C{jLjl zwxV;aKRUn~8h>mmetRf$%Z|aqBC-ErfuNvkSISf&d6pci!=Y`0j<)wcj|{o+phA@L ze#@Eq9FvX|bb5N&FHtgOWzENz<&9X1MEziqq_X&egXK&JJUq-PwU0f-$MNS!>-!7_ zItYYKMdRBVd?ZeTEU~V5(h9G%Be1;Qn9n>)90>&6YMZHTJSCke72=l;V}pG559d$X zoPX`E##T%E|GMlU4xSdY?8)hwKHGKgePX8>h^o?g+eJ~_e?eC|D``_WA_p4qjn5$W z%fI4T>?gLrK$hWM?_XyC`X2rW!EyD;i)|WCaZZuvGarhd6C(H+5A*DdDdKcWW%DDb z6E1IE=8}G~mqUFoaS$YkSgefyc@_+QO0(Aa=4#yE47eEK;o*JT93ms?0Pgs|8T&j| zG5X$W>xlYXn11tdA~eeE%lXrtxUk)CIBn7ugEnPC9IXlW_b?Ol_ejW}kzeJq4)UDAm&y`znH=P WBQ&NIe(d(i)cMKmv7(lLFaB;Yy@BoHzWU6gu{b|7dP%hpNO6V$DZ@RBi8l; z;xLg}z>0SB_HDM>v0VqkYl* +p z?2E{}@muGC)zh4o-d9f1x3pLMue `5x7zL7eG&4vEyV@}r;GWJntdJLCXZU9HERvjfx}bjTj-EvcS(fN2+v zdW~TFpkuW0?Y)D6!wlJ;X){{d>230Bg!i6>NJneeD)LLR{1`i&Cfb(lqlvdu@U6(C zLEpnN<#d
JkU_-Df$>?xldfMFn+-pDn*)t>jFhj(IQ+&Pzp&P72Z7i_)Uy+{;Mu8%=e*=SeCWP;8t)G{k;7WqkcWUvjw;G z*FS$5(fa+VU;1gmwKC0lrV=!Ub56qZc6u%i8#OQFoM@xFC6#%IRbRq(%9v}x#}e=Y zBnW$i!agnh$Vk*+_~LkZ$@X#dw+>E&tPZ04+jE=r{E*vT>-;^QEwS_^J|Tk8);pE# zl4aqbK;L-aiq*Em>mJxISH1z6xKRA>8VmgaV-3J9F$VSKM5 nn$FbZIgOQ9 HVb|^GOCq*GmHacJ_jDxq<4o3bJR^4%F&tWg2 zY6Tl06X;HHIJ9ELrWPwigyf_cY9BP$ROhgTy+3UnTICs&Ft-}uya=kbK3Y57Rho@{ z>F$S-9oLV|@s_&R@aRbISU+MJbY3U~0_V8@0Dg#07Fet#3q(zu=s6YUT5w;8dy+r3 z-nVS!7ZYc3OPc(RzODUk^Tn`)b9X&MV&$l ;9`= zgHroQ`-rxwr5L|NjDUKda8V&vNmN??_J#C{@b4yB(=Vyh#<5km)=Bd^@f>8t eI$!l0iJf{`mLblqiVB+|%5}@Cv ze{}n~E@%Udikxlv=IeQ!Ob8t9XVk}1Qp *J z;2B++V0X%;|89TP3co{QW1!>Irc1Ur2U<;M6`17Y+t;!;^){%zwXoB97*^(-8A#1< z@e{byiml-=!|8jmwl`&A-?#G0EB9AT{jIl`au ~|k)EHo=2(yECp; z9+YiFfIprH(0N&4Y`^>dr|#!h5eQTdh^+T{03LYiZTB<~_?Vx?g~P)9ETE@$P2h6R zFD$4TDAd%w4^!THVjLl#y4CH9;h90O!j@#mX*8k_4-rXTyhR2M!mr?hJ{o26AR8Cr zguf#Q&tEs3z<;|ud+uxYdbVD$_qrdjA@?|5vV|#I0taN JY)}UKlam_zt=abNH@C{MtDw(U2eR)Q|Wd9>v{B zSA!H-bl7g1nxHN^d+^%*6khUnycJBk8wm5cz7oS0Fyk&)ziqa1u20ezTs_^(uC{Ht zzE1CY*S6+Q6yq_>p|=q1ZLN^;s_9J|dUKKGcUYRWexpB@5~ts)Xm#^CqMXf2j}NoR zh@jIA*irZSEs&-i+prcPiXH6Zpc5AXm>FaRAWh_NGb3KCXFCd&;}^Q)R;;hEV*6Ne za((3d2!|E8zyIyeqNly=uR;-vAtD`~PW)(Y;)@y=#|nHUo4x*ZY1@gl#jT(HRqL-_ zr8^v)?nXoaiQo$9`z1=pdUgASchBUE=DT%57>>+qoFKnJ~L_V`D)h6oWxXl^q=o6!%%C z;3iV-qpFaUrB5$VIymba2v+M`We9h|iY;Mk)Wm>Hvt8vb8A9XtEeHvE4ht|;zmENf zOs9~Z#%CQHm5eNJy VVRrcO!R54;{&d1&Pxn;!gQ(XR6#nGn9gN^r}9FOb( zL9Ev&C>$RwVr~x}#H!;`OGu$mjqi0f7^w*wzO7twIKEbRs{uG-s%!X VIJ!tg_h;M}V5DT0n=YNLWOl{r|b}e|&^?Ju4cG zj|*g<3*&x!L6*XNbb&$zta*ELfgM;NdS^EXR(l$x00CZY=QGYm9+`jlryqa*O{f3! zbt(R_Ac5Tidy?y@EY9&W5f0Y$-r7A;P7r xP#8DAFm#^f=zg5FO6A`tz8!>(c@1Txheef5er>@oULd6Y?oU|=&*+|%Et7y zA^f9v5-vJg#D@TQwg_SGURN!eWxGYU$%M)Aqbp7NEer#^^$%3Lb*HeO+?K&6!4o28 zl=(DJ2&J%SmhW$mCq1 0p$H$AW z7JEYl2F3xr^RL`B$x!U*$~$AAH3AF>sz$eb322p_yK}ks9Mu>TVLs2*Jdsbofxi2o z-a+nRjE6$SIz<@tIz*z@$3gD? BzMDQ}0Ub8F8*& z6Pz<9h^@x(eZKVf#6+a|e|QDE&dzw-Uh5-g1@HW=G4mLXXZtDp@s2)X?1gO?^X|9~ zj7X9?-FG1o0d+=79G^C<)Y}smD{WF9pH;imji#SQ`a)|w5b*~QW}g`wZ6>Bqo6I@t zUYyN&O6Po2h;WNANS|Ajrs>DOB7zV)3V~OfZ73)ZoAq~7-tji|N#WgHqypW>e3WLe zK&VmCp}{-u0?+B?PD(R%Q?z+ayF%UfU9n5`A)9Cc=vuiU_GF9KBIBK^rJrPF&Q!d7 z`G%w8m`!%*?JVd{LbzaGQ2Qrv=0t&4=T8typ$Y?pWqcMM73SdjUgb}2;Y@4bo;|cE zV(=c%ubo6(H!6-d!YhDoyZ;E9k(A$ea&d8LNKkRjp8=@DGl9A~^>r0v-wUbf&1l~2 ztpoDS=<^LT;z*}G&$rO)MXqXINIaQ+Z|b`8N{KAq4H~lPG!B#dR3zzss*&W$jeVrs z>hKKcwBvHYV!tHH_TZ&JQ(bzCxXZDf6yBYO>J}FfcyAqB>H^%LwR*^<4SEmNH0Z{! z{verb;a;+0WvZyjT94XDdB;Ip$X?fQnH+||vzqqnbUJZM3K>BqCzAngZW)`l*_E}q z`}Xx1Nl>#g9aq>&4vtvJdxR0Zgbe&^c3A-cye|>=dxSR}**1xS{;Z8=HR;|dv9iwB zr8Avhsvb++TjY@PO uUw+Pwp&b33CfT}Ff`(s{UESLD1gT(?#2DZu)leo!-Js0EeeR?EmW zJ&qL4lX(0jx{Sv}3U+;qS#NaO34-O@4P5{V(oHq>=raKG4z>yr6tm-T8UiHN-0}~b zL5?@EPJ4BRD_R8c&y0uS3o0IF*zC8o5nwsQf>e0QqU$0G? tCSl
!}}85P^F%=mX&pU^{}FlDoYJT zKB)-veOhC_Skc)>Kc-vM9@h?RwgpuhLw-{JR@#Ga+PjK$AaJashyL2c5YZ5k5VW-s zKBPQ=o<4NDM0MYr{5SFtlj^$&KdH*Jl4wdDVrXbp`3Bn9LdksraW`q_Xg25Ijy}CO z!ts;$PhJLM-*>M9HB?s=xGSlcn;kL)3Ow(x82w7WuC>de^TOVR^ksrDjvx8Tq5gGh zIN3pr8g{TP5i=ioOp`U^tpD5&pZ}LN(g^4Z##-0cd}~Z}1caELz)ng}{HEY`Y%=a3 zny+zUiYk@Vg!PxNyM^Uz6 {t|9iT(pB+V9_ vBY3)LW32>zvcYzZ z^o{77CiClcXY3a(7pjtDhE#=dIjz(kv@p`+tk!Nv?T)cJBibx}&sb*_l}CzcD2`sp zGO&$%uTAo1$kjrls8P7eEqf-NkNDs -AVHF4t)3+!dWC%aGqWV- z<}jkZ*Wupk&aL;6L4KV0Ns$wB9M1G#zki&18=Mmph-&$eva2{xJn1Va+oQoYfN>L= zkN!82MS@+trxEjoixGp+&*mD101#DMXO50ZvXbk2zrL7nGq61Svf&?a|H^n;anDE~ zMp_~+a)A?*{zi3dSo5*Ov0-1=fGIoFrU~!m|Dx+HgX;L6ci)8I65K7gI|OG3cXxLS z?(Xhx!Gc3@cQ)=$aCdjNy$|1?+ 3MkkObDM|uHX=) z-+qSjeOLYLl4Ua<`6xERH~dQh=Pn%X2YdSQUVW{CwfdYUjL!MxFKI0_?#4RNhVs6O z#TAzolk&V*Wg2tD(L;YKjcZ*#Gq9A>b3ct9E s5%I(aLF9iWhosYUnL^Aa1S1R3TY8EJ-FJb)RyBsi t+>9KW`%Hq)I>fQ*?7_F;PQB+Xln7 zJ?&mxKLg-$x4zn@I+Vwp*=HbgvLg({9w~FiH9h L(v?#85;dPeSBs~ zXPg1W^4wO9N={GsNpKi=z^rl^C+^^aJWJi(P=cb8Cf<|oF(=NSx`hy~qK @(zDHl`E~LyKd6#cFP$?C z`TUf{i@t_WJI`?9KDBK8G4Na?b<$@t0C%LZxtEosUHM!WBq|FywVKRS#XT=OU%J%W zC-zF^2gc@BjD``-m?dqRmCkVVu I2SfX+JHd(!5p_0y ux~kb5t<8L*Zmr(#DO zFtN{5#mOV^AtV>C#B9ZgT}eXpi{3ZfVryuc3}sKknNvy4Y*W-8ixZ$_)ER|4Kr97k z%?Sx=4*}Q?n^1f;Tg;>m4-{&hX()@X$re`5VpI@wQBujWnp4zUmh--h(B|gW-AeDs znSo$a#{K?7oxT@@_4k{@{Pk0 #3Ay*PNxWc1GTU~n1GxpW)lqVeS3fiO-( z=emPU$I4NmTi#guPae^H+S%aP$Fgv6_oo1z$&;`~Y9Qjjy=zIbVihQPY{W!xGpy^910 z^uWF51o_Q0>l2FIJ+iLDQ4`~{vd~)r1{nd7*L0i0vx(sD(u~a?g@&XR>$Tx8FJT>w zppCvKz5_oWIbzveI-I`K0;TiF!uW`4Qc2oZ{C
tMqMB*v^1b-vxJ_p@fm^0 zK)7Rx!|fi8In?nZ9kNW%h`91mq$LE1*_1X`AU)hga)gW3g*H|OEj`p|aF`qeyxzyf zbFY|cnvo1sYnZ;V-9`fm=CY)%j_MG<-e3pG;T#++jQA5Ob;4Zt8H$}rct8>-4kql? zx-YyswZHnT@%iZONT+4tKGk%rga!@u502Q&_zC>Fyy1U(+C04;<$ah)Ml(Fm4fX$6 z-Maq%k2hT8^rxcs%J7D*$5|s?!mBz(VG3werks5$`~ #_97&;DNd3Ym8aHDhT ztAL9K=|;n)8o5p0gXe@_OmHaYy~=Le*19f`h?bRA>pg?fu7%&l^D0(4n?Xl(w >r{|~)$^puI@|Jz6mx;X{In(aGtXT) z^RB_5G*+~=3yE8gF;68SzO0(FaVA6qa#WgB1rA=dk@G0TlSSZ^GI31Y;9 @MBN`0tpeveI3)_Y6a|&Dxa1d;%1H6HnkUH*PVv_Zn|iwkJCW`L=c-AY z`s$J(LRIbXYqk9`nQpRN{#Yw%+w>pzj8xsZK|>o=Y)p#9g!4qckt-@#1 **6%0KmjV)LR*1Jkn4S*9L Tk7Jb^JZGEGdJfE%VNpLc1F8{-_y2a;Q$nGmGE~^5DCR< zh1adjuOsC2OGIDi;*NOa_6d{*)f-Sm5;OF7q?;>9Ax2aN+wZueeUdWp0wQm=nrDt> z37v68wNx+SE|^uOeKG<(loGe)ndqs0giyQHQYjnem(;K`& 5M-zP{O^^nCdAL*oTUxEXH&c%9MAZ)-pO%q*F`0?CODl$M zGR!CH7^dgz8R3B#s4=7&jYK)`mWN3{wk&ucb%j2@jk>^SZABnp`I<_6H39qY`v) Mq3~KfzM~bpJsAkGx{CvlV&_i?J`XSv#T26O&cTgu&0YGI^YGHWL02eCF7{S0lUGD++eDA~HMVcV&Q%G3so$g2y?0 zZ-gzZcqR~k?;>>GZ&*J>)bd3#qZ47+R#(KP$Jo3unMXZ7$kWhy>uuIHI@%cq9<+BH z=S_X&&IqipLL{@!Q0uxZuwK_`;oiPHLaPF)Cyyse9~L)A3Eop-_9*N-sKKHxv)Qvl zN1zV$Jmazk4+nndr1W(VT-ye3AfsNIk}`w!P+Yf~1MK=wNEE3%$%e;W;k_su9i$~q z)F0&`PiKo3GOVb16PE@1{kgc>0Vi(KxK$|~5+@BfrF4B0E5a6OGOcIp_V0G@Y+9ll zE< ;yvOa??e2T2W`bnZAaQ zxI*gTU j;A&5$(wG$G|slO!k?FqZoinnB$Ca#yuwpT3EoPP>6 z_S&HCX!B&hky<0(Upv#n4w|q+ukpRs;CngZ>d;vaNeSVMKaSU#zrcw|E3a6(VGPnC z>WB`4T3@Q=`n*qs> gQDdOKu>}`&@DNC<+`#S!&-7-G?+`{B zv(AYG7~+N`tQF~~&7aOSCMES1Mw{)`c&lpWLQ3G6q$Y=vGL* 3oz zx1)uK5#A;E1@c}FT)d)tY3o8*aM(bqhPH!l>CVrkY%U+H+Y2I{0#j8X #D3XceO6wbB! YUC z2!|a9kbY|u1K*M1UDVV9h=&|RL$(+oQ+fC!Lrm2j&B58nAKX+=F8m8&Lxoo>7X+37 z)gNg@YT$4-DB~TV`r2IlbrW>oQAHgs54?>s`7=<@*f@dNCrWLXbUbSbENr>^DLzm( z^zv;&KbGp)a7A5HgUa7yaxV>#m-XA=%lccNjMmB{yB)PZj0Lp|=+#FTFp(%=l3u z3*VP>N*O^N6AEd>XOtJzWT+YF#SeeK^z$vt1lRRrvhF_<7hacl2W?t+##}&FG9y?C z&~{f$Y*Vkwj7gLz=0@I^TaUQYh7N5_M3K0IRf&`p`8*DouTpw)RL1>)Z|nJpz}=v! z_lCc=Bf6@UcU^t0{fABSe`DEIfAJT6h2#bWcKJz7g&7Q$jDlLL!2>$r%rcREx8UT9 zqeD9G Nd3RkmBUEjNNa&kDXz!95d&Ad4`I&Tq zNABN_*uG8`L@_ooT*`XU%@Z^docCqO|0q8eSzaGRR$HAcy6thoq8_YEi(T{QlD{VP z1qzyb!YgaXZ4cvaUV2r=n6Ojo6*-dPk!(J(_JTZ84>yCnajrRZ$kPIQeessS*K8=1 zHYb3nNk1?u54hk{b_owEt1lL57ik4CPI=y)jiljc@^9ATvP&QrOdf!-+U;hk`*7gJ z2xLz93n1jY+f@U6#qwb%0{c2k-&MIft(+Ltq^>VAw7_w+r1EL?FmQkc7GM5THDSm( z00h xuHe!pdpTk?x zyJQgHdWJmM3B7S+E)VjqAqH*->HDRtqIe8>pV8N-!Em-bnDqHAY>g=eAs!5A+J$tT zDnHk#^`lNNK~&AHZAGV;6-=W#qP&>cK6btRGt9kuHTQ|DF3oLxZ+o-)*YBaOL@oyM z>-x3AO5VXFvDE|O06-A##{_ur(=zv74u9CD^rcWjI>E%HS21$+;%?Zz*_mZM8Kdsm zV>L`}U5ut5f7CgHE5%^AeRgI@NP*BP2TYs;Y*GdP3+jy@2`PaSkb<7_OfnZIAb~x6 zA@Sd(+ f{ut_%F;@$0(uCq~y23MWoyS~u?M5)}F&DrCodQK-%5UiyyV zzRFN){D4F# @h&uBUlBr!`_x=`(@;hJK8jq0;oRp}(nCtgl zbarYm^G+5J0ytFl)CSeh4Ct>ZnAyY)0J{=PNhp&_TnY0c0ld2(78>R>ZjB7`2;$dn zV$6DCypE3A@%n#Z#{%7xS3lzQkMFT`E9hBSdb4M%@;wh9Gb(|xMM*e8ghaa0-X=v% z6e mD@IX`X7khdFox)G |1I!kL;50RHsx zRyN#tCF9RA `$-^ZQD$|G}O59A3_(9rN4O z0qwPv&EXJ(INCS&EEtdcaN_mUy@NR=iivHhk?ELWGvcPpt}ErfOsN++O-e{mGM_md z0>wqOlkVgE!jG$aQSpJNJ8mFk< 02EMsbiTKzx?(n4tr(HNCL(I(rwFWM) z9$B#Lk6KcEBF?`g86K0B5c=5oKZ70fXU_9?r_Bn6+nJXC&?(NfVjL?wb3L%EQ hFJZLr^ygEtRKXzL$TDWwc oYz_weG{41NMhh(bR1@EMBJa5+aJ_fRNa z3Y+Y;AVL3y8(vLGp+T)jHy+KeXZCXFZA-6awlXQBolZ&iyOxv!ZVwAZGA1sD4yUpM zN!K-N-3rS|p6$zstMBzaDQhAG(ww~t_lF$T8zT fEKB{w) zQk5W3_@E2>gn7>&5?CG3DX~Ib32D(9>HSTR?PGZ49)FggKV3`K{KHGBS?~#8^tS`; zSlw*tr_s6gN cnX(Xe#;@#qNmf0!Z68bVHH!zPiIjfcumMclrz~5zNat zlA*xeF&~t>pxn4b+cb#Zmuhs=eOuS6ECN0gOc9FPD>PZD-<|o@#L{%v&@^fVYP` {vd 7wW3psu7`lJ~}=T8|#Cv)>%@(3m~ktw>zy6G$jdNPl$6Mz1;dZuMjRV2pd>^jnEW z_aw8iNl}nlB!KW=4lftR!M=#dD n*djcd=rI_DF(1?O%mO;pa@5(y~3%_>o$3Z6)M!q4}@A74dseV(W z(*`|Ad{Dd857S|cg0-8d*<8(bm}+TX_e^vC9 3vOp5VJm+Sx6; zv#6k&qMdD3J^}%ugC7u%hFj2+l2FjBKHQ~lrjEEP19RLG%(Q4bp2>yuWyF^{WFNTj z=;v;i{qpN~^4% Rn{m?rZfc6r)1 z^6q g`|MkxWk^sB`E=3DapjplAGD-al1|6;-Wt6yi8ey$h%6MOk1Wo z8xZmu*T^KI$4Q|VT^Jg<8L1DnL~NZ(Gaf42S1^wuq}Wa7^V6Z(Th62TU<=%nXW>t@ z0L;RautL3~w$Q5Y_o}VL~TIJmOvyO3T8VE69~B zs8@Au$qQ_brk!hDyxqPz!IRE6Fs&SkxiYS|ClBTKo(|~dbd};8B)<9I7RWx7i!#VI zz8B<>EJvQ5$?gAGBh}y}K24-Uy~zKLX93L^n9YOk)-?YM*Q;luGJN<(RzCpv>4-NI zSOj!-GPE`8h(OFNjIL24G5oH;-D8k`z;p2(lQEl`-p^`)YdnX4;lBCU2YO&4KhBM+ zUg@_6VdUahahDq;=)V~4H=W8jqes2N!@9rZ+{QL2_NHDJn^`}3HKs74vC@opSS79F ziNdqXrEyy>SX8@H2|CN1&9cw&NYo|TPjB0ft9;DYd|H(ykZ@Y_(4P2x+?yTC67MN6 zc5_<{{(Y@Edz+8w+kiE;Wl&BVk%WPsa}T|3{p}74gfS?6D;*IcIG|ou3%VWCENG&~ z!)o&!8MiLc{?SHIK+61k&)lbGfi<1u&`#{v>qEIMbn}6y%K7`i-&_D$E(fWE3mc}i zYGWP_AO{$oNtTR0;a%0X##3h01n^Ovhb~ia(uEv#?KfsImeVM1Ahj}xDx~84JOK`v z1b8J0JR@7Y(Kc?5nKzO{T%Q%3;pW;kps~%m ziI~-YMwrD#j_|9uWNF)6Z&+v#+;k#-gJK7HqY_2GQr&vPK7f!5{U#5YHmfm|Yu-HA zw{}79d&pZNd0^7? HHk0aY|5q*R!O~mMp*l!bm$NkUWeyg_5p;+(*vBg|RZ<2$> zer9!{(4|g>XjfQ0^he*`cT+>7#1h#9txHi?;I>yRrFe>!G#&b@*LYBiC0R-VE@Gxv z7g%?oU)R{aZy(jZxXD6U`qLf1^ZOBcN-@qxcHuiT1A!2A$AxFfCqkfB&_keggWU^< z=Ncx`#(dTxHh8Bd1>1poGQa(R8jRDNA5lv?`Ip3Gl+1N3vUs;9WmXq;{qn^-UwVOQ zO$p_^q3X);_{@6lT%E(GnJ0j7b|A%&9_m7^LA?uJ`uL~LGCxAv0~js)^DwU`VKo_v z3f2+@vL3!eZ&&!z85z6C^A|BW>1%@zS6^jUI{ZF%5m 2f=a5&V>3omSv*sOdmY?|HFQ zXy4x*w{;ds32%S&D^JQ<Fog|Gaz60N6+Zo+U;3mkSYiiRP zs07{3L7^xi2sL;U!yrNFM`2|3n*wdWk$+f2u9>122_;0g_)MK~6A_4UHV?+)`x zS$1I6NYMu0ob4ALkQi8VW^9DnT(>U9xj0upxQEw6^C`Y2KUc+qfo{y&(WXE*S z$z^R7Fuj_S?*9b$-PC?P>A-vi3FBZ6BFyTCqZnNiM$`1U`lr7WDv_FH7-NNw38z*+ z@h(j_o7_Z&K-cvM;!12se}YvI%g(8X&wp=fr1T_WYO9F@5>M@XDRqk!H8X1KP&Ef7 z+I~5G@I^aeOq-I3eA%NQDkp&zKqU;E{tPnaZvEz) cgi4 zrjA7z7QaWf>6cNf{xC-OM4LqI?vxSdB(*iaPad~a1H8ZYgQuGj(rj;m0<#w@@)~lm zr(AB&A}H@}-OP{x?}urm9jw?96@lFTS7Ed7LqCT;Ro1*XlsbZt-9a?h)sAnpO;g ezA=J)rWY4&d*gl(2&al6d*+r(exp7NdNkC_ts@9Q~;okC!kW6-mez78kz zpr)c?6u%gJO2}B$(?teqHy(+&&R9DFDp%0WsHe WsyHt)Z_MQtwL1e`=ajC zYUpU4RD+ymIENFlIB6wbv@&b0^Sn-BX;Pdt!^+Q%qWuiGTkMSK=N{CjIoTtngKzxT z1hMg(0VS}(-h$K^Po|6*=+z((|46u=fUkKp$njXh)biOuS5(hw_k>4gzPKcaG2%ek z2IurJ1sJS6T)^+BVqB$FQtU+>>z5}NqJGl10aB65< jWSB1+_Qo? #NViKXjA5|6y7{jvZfnc0Q+*3-G_1uvYAF))(MHDUax8OsO z;?Rm%31Jj_!8JFx^TVaBpRizdL**w2h~ioBZLtq|8)~S1ntUWhgxV}xre7XCsfJoB zn!30Y^(n1iqyisnD=Gjq7A}n|4iO!qp?$EqBKouNQon!PeLR&NJ)7DmJD@crrGNf= zN8J+yR<%WciH~R_*?-V9h=8pkn~n8C?VPo&uhDp$k(HO}*V|#Sz}?08eUuzc+>ZeW zFB0U~I=v&v0C8WmiJi1*dOeHJ$tQICUbnluI!!)h-b}1Gu&Ww`yuZH{zf@RpIc(c; zIUTTK-MnudFOKtp@V`2`b-<=J`-Blma;qzP{*4~(Tuc~DCx}Yx_k^$UzB=z9m(C4I zex;&jL9wg+N+^q3T0|kO4=*apvTjeoY52GuRm$g%sX5`WX1O07h8ns (f7Hlav9Z zY;$Iv=IO!J?j6Z)rA2cY{GQwH#X!pC=z;9m#LgY{_^ySE9ZbAmAa?J=SB&XBdF_l! zrEev?SEKfJLw@;XNUN(lyHDUm-R`>)%a@uG#^&F5>(WcwOR&mL^b2;eYR<=NLmKho zh%K)L1%Y;lo0|%)3AVrfCYl0AY5l{B?b8l@<)QKgZrj+wj9Hf5i=p>hR$vgP&Xza* zM2enW!mlZJWbKIcQY?(@mhjpAhttX82?{bCa)D$i9{5LEz>rwm{&H6^mO)TMdrihQ zOln2UXV&VxJ9~c2039ppcmxSJDU$n_#@Y{m+@2Za(^@y_`l;IeGi9K@-;*L&osSLQ zxTU({h^|%`g0|td`!goti#hKOA@w#@6cGNUw`hFeCqH6zkYm=Vw4oYo|Hb4E&!b*2 ztHPyymGa{C*W8bp*DBv;+Jp)Pdlsjj8k)BrHizC49b1Fk0AJwah>0iD*)F6oQG*5i zpQVj1PJ>WzqMlzJal@ukr>-yB(-eOU*h_9moLx=(bGhH`Om(NDCn8WKOt7dAe7l+* zO6zm%-Ts=6@ayvV`1i`=t|*YncuTx)H|+IbJUY#AxGT2PTOhl_1S}ivmz?I0Rs{@7 zP?-RKo&uPHRAW922SV j>`i2AS7a(l(1H(SqJM z3XDKe=>!xLl}i(ik5__&Sbw4fMT0m6!MFOfG(mB1PdBzD;MSt?ZVgGBrJJhv^#}6J z^H}1Jo+X9%v6oKLzT6KEKaII^19}(ap!e$4^`{*Sx{Uh;a#8RoIOM(QDNw004K@Ie zog6mvfJ{DNXtF+v=M@_@DS=`3K_m8t23hUwNve)T2(-&Gd{~*}4bEUv1wR91S~4@k zV*<(1Wn$P>4{wEa|H+Tp5as;D4NY-whQiw{Tg&rHZBA58`xCvT_(+Jggg@%${T*sq zES2c~yl2QBQ5u0}ot=qZkiJ6QGj2p|oP$HEa*1G-SV&&Xh255Ioqc?h1Zzr^xf3Qo zEn;j;>5Gf@Ngc4+-?Po39;nF4 ?V00;_)v@eWN-*j-P<5Q`txWFB$L zZQtQa{RNo$p8 t`R4dfk8{JWKJ?#wqFt=j5uXX8GT-${m4_L+BI}NWU#_QhVqj??&6|FfB=`e zeg94M&Q(`PyV2{1wcrkhEzx^Y;To*GuB ` zY116gcd5 }nnr&OMR!GmU8fjW=W$+F{GFZ&|zfmA365eE(H_`~}an z^G={w@tcDW)yaqyzbr+Q>ca>e4{rBclJt#gqt5@sG{wUZx&OA~Xh-MnkmbX*V2K}H zM^R1u^zxl0j{_eA;w2itlpb~ CGC(0*=I*eWm6MngZbY^Tp8 2joNb;T@)%3=M@IKu zQ`chb5HtK^qgN{ajhj0IzXU@6%7q4@R=|&E61%FWDsJ^Jr@OS&pz+HeSq(hDPf+-y zit=_+ZX&<#OoQX%L@&+7r)^wIjVXPw6RN#~R>6z~xAz1~lk2Ei8(5S=gX4n9EMGg* z#%63=%?=I6>2Nx?@RO@_gq$S5|Drc42P>4IhL67?i515ROWfw#yIhW00F6W4A$ygY z4V(|yU{87C4#2lI>=~~x%4x#Xw&V=C)vPtmIwZs%FkcC-92zfYJ3MY* N3%E4b;(z`dx_vX?y`}ta{bgaFu{ZgbZfUDB#;0KU z$0wojI6&}(TcS~*cS!V MT2gF7e__Z@?l^)^<3$pt^M0WvmxKMJE*JIN$Ps zJ-A^~P
5@p4uj>nXp{ z8guL<;zq9+xb^*=^Mq>}yDTVjq+79D`w8_~SLnDp?=W^%^aqqEJA=#$!2(6|k)CBL zdNZs=CGI}}yg$lxGWzG9BFu&VA6>#UN{iD!&$vx?PIJwme2}vL+}y0sxX+=q_@Pd( z@vH+M^-f#=^&jLPtmS`R-9G;QSjsyBEhAdk9FQNv1fffz9F9~D$iF1 UBU0h1^XY~lXkG-T!d~nw ?3NAGv>H*R0DiDjdUqwN#J%e4<_REx>$kXWH#Q25$FS zvVFyFBwenQa!PWzc9I`W-`6Pb^?0<|*6RJ@W}4rK@a$%RAt4>{|U7Z*af? zG^>Cug a^QHL|WMbVKJlgBZ z40#k^ygCmgIZqbT`9GrOACHzTB2fd0Wc0y?k3+!@a=3lD+?L>3hDr&J7P6(NzgeeT z?r)@Wxn1F-v-rcVNh>rT=&_sK$YZVdYetA!n*AtEVViv(QAkEt*>lIAOChxYs3Ds4 zwandC>G5<|^pK*j-g5fAJ^5HBI6g|(eu|+2-!=hYk#p{kJjZoG`8$c3%l8XzRrQFi z$$|dvJDc?5 c)&f#S*)Uexjf_|@rPVHzi z7F)hc;1icy3|%aEHw?dqq8a^xW;W!lPbl37YE0KDAEvbkTd}P}J3o8SKcVWS>eU(d zxr|i1wTn6>d4^M*DXVIzXMJKAQB8sowp`|A&lLkhS8zWf>MW{zix$4FEmX%KFOmOS zD`q=gkRrj|w|{Z${~Nn5l8ygm!i@iCxeGIAyDs9+GzWjsZ CTa=o4bNaN`rw{1YC^oB(av)|7aqwx{KfTRRjk zb`$-3cYz!(U#NCYR(}_RFZKpm|Ngpam?u cX zl%0uTr#<9USF9|kXW_B{!2W((P)+zx!vDV)A`wJTb=I_YZQXCoB>;pIO>$ 6)+Vdw?>A}aEH-#hk+DFk zF4OLTVpx^=Ki?)v#o&G2h_QGxgbkWJ7movI>d_}C#KwJ{`Es%{{b`NS;Ssb|+ldoP z N4&DWt*9AFl~3=$%R1+h0^jhr(cz>)#uZ)aW1{X6%U6N$IuuM_+MS zEiI_u99l5h` I~jLEr(YwU#P+HUjDca6fDiw5 `8snN} zZUM{_{Q4?mCQPHy$ZZW)UQ~TuK8RNaU1o|`r8akVel9AE3e5A)NEsiD?@YK+hdBjX zU0eiWADfmS8`lJ+sOTnAL9O}LTaE8eN2ZfeV+9*H!Fp~2)%n=kZG&+o0Yror0X4)# zN77QzhE0m A92e%(Fgh&jBUUU^XKm&sWaaQw;~#xHl`Cv=2tjq?if2v~ zZyr3OYr<=ttkhsACh;#B>b05e_g~h(ps~X?r~e?_q%-GB8#brSJ