From c54025a86b04886c6907628c6fa47320a2260878 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Mon, 27 Nov 2023 14:25:08 -0300 Subject: [PATCH 1/7] basic cv2 piece --- dependencies/Dockerfile_opencv | 15 +++++++++ pieces/OpenCVSegmentationPiece/metadata.json | 19 +++++++++++ pieces/OpenCVSegmentationPiece/models.py | 25 +++++++++++++++ pieces/OpenCVSegmentationPiece/piece.py | 33 ++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 dependencies/Dockerfile_opencv create mode 100644 pieces/OpenCVSegmentationPiece/metadata.json create mode 100644 pieces/OpenCVSegmentationPiece/models.py create mode 100644 pieces/OpenCVSegmentationPiece/piece.py diff --git a/dependencies/Dockerfile_opencv b/dependencies/Dockerfile_opencv new file mode 100644 index 0000000..a9fa384 --- /dev/null +++ b/dependencies/Dockerfile_opencv @@ -0,0 +1,15 @@ +# Use the base image +FROM ghcr.io/tauffer-consulting/domino-base-piece:latest + +# Update package lists and install necessary dependencies +RUN apt-get update && \ + apt-get install -y \ + python3-dev \ + python3-pip \ + libopencv-dev + +# Install OpenCV using pip (Python package manager) +RUN pip3 install opencv-python-headless + +# Set working directory (optional) +WORKDIR /app diff --git a/pieces/OpenCVSegmentationPiece/metadata.json b/pieces/OpenCVSegmentationPiece/metadata.json new file mode 100644 index 0000000..4fb6cef --- /dev/null +++ b/pieces/OpenCVSegmentationPiece/metadata.json @@ -0,0 +1,19 @@ +{ + "name": "OpenCVFilterPiece", + "description": "Piece that uses OpenCV filter on an Image", + "dependency": { + "dockerfile": "Dockerfile_opencv" + }, + "tags": [ + "image", + "processing", + "filter" + ], + "style": { + "node_label": "OpenCV Filter Piece", + "node_style": { + "backgroundColor": "#38b2be" + }, + "icon_class_name": "material-symbols:image-outline" + } +} \ No newline at end of file diff --git a/pieces/OpenCVSegmentationPiece/models.py b/pieces/OpenCVSegmentationPiece/models.py new file mode 100644 index 0000000..ff3b3b5 --- /dev/null +++ b/pieces/OpenCVSegmentationPiece/models.py @@ -0,0 +1,25 @@ +from pydantic import BaseModel, Field +from enum import Enum + +class FilterNaem(str, Enum): + canny = "canny" + binary = "binary" + +class InputModel(BaseModel): + image_path: str = Field( + title="Image Path", + description="The path to the image to apply filter.", + json_schema_extra={"from_upstream": "always"} + ) + filter_name: FilterNaem = Field( + title="Filter Name", + description="The name of the filter to apply.", + default="canny", + ) + + +class OutputModel(BaseModel): + image_path: str = Field( + title="Output image Path", + description="The path to the image with the filter applied.", + ) diff --git a/pieces/OpenCVSegmentationPiece/piece.py b/pieces/OpenCVSegmentationPiece/piece.py new file mode 100644 index 0000000..49aa25a --- /dev/null +++ b/pieces/OpenCVSegmentationPiece/piece.py @@ -0,0 +1,33 @@ +from domino.base_piece import BasePiece +from .models import InputModel, OutputModel +import pandas as pd +from pathlib import Path +from plotly.subplots import make_subplots +import cv2 +from pathlib import Path + + +class OpenCVFilterPiece(BasePiece): + + def piece_function(self, input_data: InputModel): + image = cv2.imread(input_data.image_path) + gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + if input_data.filter_name == "canny": + edged = cv2.Canny(gray, 50, 100) + elif input_data.filter_name == "binary": + _, edged = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY) + else: + raise ValueError(f"Unknown filter name: {input_data.filter_name}") + + output_image_path = Path(self.results_path) / "opencv_image.png" + cv2.imwrite(str(output_image_path), edged) + self.display_result = { + "file_type": "png", + "file_path": str(output_image_path) + } + + return OutputModel( + image_path=str(output_image_path) + ) + + From 9961800047781049ea0aed55373ee387c06d7b12 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Mon, 27 Nov 2023 14:34:35 -0300 Subject: [PATCH 2/7] fix --- .../metadata.json | 0 .../models.py | 0 .../piece.py | 0 pieces/OpenCVFilterPiece/test_opencv_piece.py | 11 +++++++++++ 4 files changed, 11 insertions(+) rename pieces/{OpenCVSegmentationPiece => OpenCVFilterPiece}/metadata.json (100%) rename pieces/{OpenCVSegmentationPiece => OpenCVFilterPiece}/models.py (100%) rename pieces/{OpenCVSegmentationPiece => OpenCVFilterPiece}/piece.py (100%) create mode 100644 pieces/OpenCVFilterPiece/test_opencv_piece.py diff --git a/pieces/OpenCVSegmentationPiece/metadata.json b/pieces/OpenCVFilterPiece/metadata.json similarity index 100% rename from pieces/OpenCVSegmentationPiece/metadata.json rename to pieces/OpenCVFilterPiece/metadata.json diff --git a/pieces/OpenCVSegmentationPiece/models.py b/pieces/OpenCVFilterPiece/models.py similarity index 100% rename from pieces/OpenCVSegmentationPiece/models.py rename to pieces/OpenCVFilterPiece/models.py diff --git a/pieces/OpenCVSegmentationPiece/piece.py b/pieces/OpenCVFilterPiece/piece.py similarity index 100% rename from pieces/OpenCVSegmentationPiece/piece.py rename to pieces/OpenCVFilterPiece/piece.py diff --git a/pieces/OpenCVFilterPiece/test_opencv_piece.py b/pieces/OpenCVFilterPiece/test_opencv_piece.py new file mode 100644 index 0000000..79b2409 --- /dev/null +++ b/pieces/OpenCVFilterPiece/test_opencv_piece.py @@ -0,0 +1,11 @@ +from domino.testing import piece_dry_run, skip_envs +import pandas as pd + + +@skip_envs("github") +def test_pca_inference_piece(): + input_data = dict( + image_path="/home/vinicius/Documents/work/tauffer/ml_domino_pieces/pieces/OpenCVSegmentationPiece/earth.jpg", + filter_name="canny", + ) + output_data = piece_dry_run("OpenCVFilterPiece", input_data) \ No newline at end of file From d0dc30fe775113a5497227dc241a51414465f40f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 27 Nov 2023 17:38:58 +0000 Subject: [PATCH 3/7] auto-organize --- .domino/compiled_metadata.json | 76 ++++++++++++++++++++++++++++++++++ .domino/dependencies_map.json | 11 +++++ 2 files changed, 87 insertions(+) diff --git a/.domino/compiled_metadata.json b/.domino/compiled_metadata.json index 8547450..5528966 100644 --- a/.domino/compiled_metadata.json +++ b/.domino/compiled_metadata.json @@ -498,6 +498,82 @@ "secrets_schema": null, "source_url": "https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/UMAPPiece" }, + "OpenCVFilterPiece": { + "name": "OpenCVFilterPiece", + "dependency": { + "dockerfile": "Dockerfile_opencv", + "requirements_file": null + }, + "tags": [ + "image", + "processing", + "filter" + ], + "style": { + "node_label": "OpenCV Filter Piece", + "node_type": "default", + "node_style": { + "backgroundColor": "#38b2be" + }, + "useIcon": true, + "icon_class_name": "material-symbols:image-outline", + "iconStyle": { + "cursor": "pointer" + } + }, + "description": "Piece that uses OpenCV filter on an Image", + "input_schema": { + "$defs": { + "FilterNaem": { + "enum": [ + "canny", + "binary" + ], + "title": "FilterNaem", + "type": "string" + } + }, + "properties": { + "image_path": { + "description": "The path to the image to apply filter.", + "from_upstream": "always", + "title": "Image Path", + "type": "string" + }, + "filter_name": { + "allOf": [ + { + "$ref": "#/$defs/FilterNaem" + } + ], + "default": "canny", + "description": "The name of the filter to apply.", + "title": "Filter Name" + } + }, + "required": [ + "image_path" + ], + "title": "InputModel", + "type": "object" + }, + "output_schema": { + "properties": { + "image_path": { + "description": "The path to the image with the filter applied.", + "title": "Output image Path", + "type": "string" + } + }, + "required": [ + "image_path" + ], + "title": "OutputModel", + "type": "object" + }, + "secrets_schema": null, + "source_url": "https://github.com/Tauffer-Consulting/ml_domino_pieces/tree/main/pieces/OpenCVFilterPiece" + }, "InferenceModelPiece": { "name": "InferenceModelPiece", "dependency": { diff --git a/.domino/dependencies_map.json b/.domino/dependencies_map.json index 8283953..8835c33 100644 --- a/.domino/dependencies_map.json +++ b/.domino/dependencies_map.json @@ -16,5 +16,16 @@ ], "secrets": [], "source_image": "ghcr.io/tauffer-consulting/ml-domino-pieces:development-group0" + }, + "group1": { + "dependency": { + "dockerfile": "Dockerfile_opencv", + "requirements_file": null + }, + "pieces": [ + "OpenCVFilterPiece" + ], + "secrets": [], + "source_image": "ghcr.io/tauffer-consulting/ml-domino-pieces:development-group1" } } \ No newline at end of file From 4986def92930e0eeb2179accf6ca899d4b5d3756 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Mon, 27 Nov 2023 14:41:07 -0300 Subject: [PATCH 4/7] earth image --- pieces/OpenCVFilterPiece/earth.jpg | Bin 0 -> 41716 bytes pieces/OpenCVFilterPiece/test_opencv_piece.py | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 pieces/OpenCVFilterPiece/earth.jpg diff --git a/pieces/OpenCVFilterPiece/earth.jpg b/pieces/OpenCVFilterPiece/earth.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cac3e9dd42189ca251840c22da5ab746a7873437 GIT binary patch literal 41716 zcmbTdQadFQdOyyN`6nG zEF~^}RRjd2AttP-uE_#SUz^ZL0POt9P^>_59=VJo26H~B&`D)62A4W#gT zOJVTvRQ)>pwaxlY=x?%MFu(e1uoG`e;N%UTL8F|ReDa*nGwO2k|JS5V&@3$37SGsf zeAZo0oQ^`;odUd}y2?5@J9y3J9&$UQSIYi-{68jSW5%xs|0jSv;^*n~-zBKsudj4;3#`ae;XIBG%gn&=mzTo9@ONKCY`&(jR^`CC zvTM2%1OHov?WFH_8+l+qb{ZHW_lOLOA~q)2jE|wSaQUQGb^p46p%u)^3Rdnc-G9PV z>vB>g;P}00v40PKOt#-Mbbld=uUgE z?1d87Z^3sj=fU&rtNT3E7jPc_Zr%=iLtdM?osMYwf;gP&7|<=)%D9UCaiIGQ=rDAe zMqVsu(oUJm=csw#VJ1}@#c$N4G`>#Sgl#(cie69o#_m6`CH0#rE(23QxJ=!JW`sNR zU7hOU_#Nu)(XTwS)KY|BcR1TIJ#~`u@P!zF^^A)Ls#3a13b_oX$nm{SH$LlytqK-$X zt~nKdA+bwC*?uYt(b#`)0>M#p?|J1XC zwDfy7o}|6=zc2C*@^{eFEhyEsH$KU}1LyHb{T7D}_7!T;Th+zipX6NJ=D80&NWY2K zcicv>d%uZxmg=>Xdey71EM)(L#vzCb3-i9{lmo6}o-;p_ZtdvM!R8EE=ea3JFyoLz7H6Z%|cmD>L!!~Y>MBQ=Y*8Pue!}2Sxv^;9KJ6dex=rF_+ z=rn&r&;weGy9TZn!$JZU)$yesFjs%Pfm!y_VYQXu6GKCV&Un?5Sv}x?lM?E_uGq1r79uija#WQ`5j1%zC7_iN%Pgz z75lHVSGXBklRNT({yDIPH*UT5|K5l(F?bLN6v+(=r9#(-rS8M05R>$)8GJy>rFDbs zLzKzZ8^rKKjki7v3>g5Apq2;XGnbV+@?9rwNfYG`C=G9nHVk)~>$MKh>Y(!n@w!ox zx^8bV&lESZvTV3Q7pF%z1aWnJqDuwYdOR*eaquzQx%g?8oWDwmhJ5# zN95y1;oK1KZl~9N@!?2!AXk4S{kFIdI#C>K*iQz5_|&Ad{|Ae#T0O?AXn+zimA*VH z!h8$y$;E`H@g@9E-Cxy}373_+iW^*z^*r2DSoCo8iHrEaYjt+LLAiH8G^j5D(~1h6 z2TBL}&9(`t2bAg>=q4DwL1yF}VW<~HgrjsjdyMqk_7cua3$nYY%Xxn7iq$4>11uDA zhMb|_>+0Lyduh(Gomx^y;PfFvx}vJ_C(lP?YZQBy+~gzcBq|cf8y{2pI9L1O%tEf0 zbGr-Y)-sQtJ^Thjx84jDkp#;_mqr=k6v}Ur3~;|b#&3O(9UaXUp#WIvx|cu3mfWip zT*2>tNkcXKgOjx71@;% zc7$9zIhX;|K!f0}o6jxQVn)KfwABuUMwN*wq2zFNo+KZo+a5o?T>%d8>vXrE7{IeP z9IgdfI_(@|2BpIBAnCMilejq>m!RBacX7j^DjC~-n#20~7-0iNxka7IE-KBy)_mdt z|0Hp^eaH)KH}o+? z+i629$87o~XHt$9f5rlBH|Wp;CEywelU*NCjS~?v89tdzcgn8N8kzP#-G@Y8tva_` zEnCLEf+)Izn0mS#)f5g-Ek&&g$$1KPm15|%;HyDEOyfob$B@PByR#xBDbyF;GB4~B z^qi|7+3^jX+9xlf{HH1aEXb!Uw^?~~^G-nZAW3|kbVxrhvNJM-a_s}wqhutCtiLHl zR_%9LD}<)|$dq$)^Qi0U2g~EQK-AqG=XAWz!Fv_b_uYhBUs={kyuS{Yk3`iqHG*L> zHeSEoXp6GDx)#4(+kl_3;Tmtv@49qdOxl#sF&%0tgA-);;cGJDe0@t>S;}Mf={t3feRsw_U^#rhWjoZUPZ`(!Kqzf?7^RM@>s3me;Gp8G~SP6Dhi0NF*WL+B! z?SP-KEjLP7ZWE?Pz@u>W6XkB_)bGb}jLAfiyJ6BoM~z|snu~ih<|_*L90g&1SR@Nt zX?3|Q1X1@{ih!^N4=z|o&aG*-Qh5@kufan5%ta3#-_XUF-BE{qf0Vp*%`@#3@9h0` zxnS*5L{z`x`=*JP8^!b`pZbm(rk9+o%e}{fv8pIDgv69Ydxj8qZ2ha_q|3O5{dOBQ zl8kWqTFU6p<}`Mtn5#LTzg7AR7CyWsQqr?WF&3**t8PJjY>;j~#pupPBH>@e&nN0- zbN45~=qPavbN^WT8ZTx|-6@BNJgj%d?@`Yaa-ZM{9% zlHi9gl4`no8$nSB*8DPK9Y{)7nYj5|QkN`9StEKOvoZ(w2kV@i_sG6~6mjEP5`VgS z>?_F=X*Ny1Q9QY6cMaFuvHb$N=DmP3r~uf+h~;MZRn} zAuA+xC!kaB-H>Qnl&2V;&09z5LPTA>KmRiKB!A*BI-ute_@h4lao28e(0XiR$Pi7z zcP8PJ5%t4fvlxVq$@X>z;FgHQ*LipRrSjurNZ)L5!|qGPGGf<*Hgu`1n=Pb z(tHh!|41$=j1yqc-G=hw!^{j^zv6*VUonACzA?E=Tn}r&*I|jQ#f83xI`=PYEo0w^ z%%a;7R)~4E2W`05_N_);;f4I{wsw*!M)gm!~2cY7B}%9}?4*n%E6 zH6!SX(kdGBu zPBR4B`xj1Xrq>pDh&f@CfH9YYl=nUM$4tl8Q0$Yy`Teg}H+9eMlp;Zdz%IXLHZ2)2 z2kln$p}%^?XCkN|8oupTZLT$=34Vjzxp{>a30KRTrdvM6iz8)ualyC&RenSrLiKay z=L(sQ2i6g+xx}JV<+1Js>?R>LdBCV4n#y#-G&K~c-{pD$_h{AJkMPei3~*HOw>|P? zo5nSfq!+}%a3-X)P5jGpUlZOijJp{**SuXb9$D~JR#fxaaC{^a(v`^=BK6EvGF;3A z_PGtx^6Fqo*%?=6g(nb(Log>ylt+7pxEFYgeVPyJO`-D3-8`gZ1dOVl6X`tk4+y}9 zs?t!6XhCE4?GTBz7|F$77fL6GIFDy-)Y*s0;v7m*bjtvgV^a{;8PjAdF4s3GVF^6_ zVfjI?suAJvZ#iiVk~rk60?r>P9deekf~i?RBle%X8=~Y06%#Ea2G% z>7vJDuqgNE{(Z0$PA*s#kD1@w((umWJzQh>H%G-=hA>#29jWml-LK(5}OF0U_u zENAjRSz8q~n^5+YOd#pSzq&BJXhBw?j?2G8w?{=vB0`l^Nmz!vc>Wvsu#1m4_@PtC z1H`UMAO!dGeVVyzPF=?WC`)6GfF5VxXnJRtCLFtOa^VzRy1W|d2#4G%O~j^fe?R?a z;ESeK6#Wbv932Z`j??Ic?Z(m0l@y{fMu7z%Y5m&?aZ-7d$tFfLObcQp%&`$_VK>(3 z-L$}d?iQ~2t|tDFkEFQ1EP6?!^*3c@ZQ->mIMX+$Wt|2lr6$7h)zb}V)h!4WNwNn7 z1Wu#PSQmrKliA=>JIq|7Bhn)WK*Pt1HVahuRdbpf1>&JWpgz5+i& z$guJoI(UP}@}pLh&FC12_TL9-#gtB=LjyaVm!YHp0&8hBLOt_&2?<{o<|xCCpI&Uw zU`@d)5{g*xWU*6tliHpX+-iVR9s!xm?y10lQ*X5I%t%ON}jr9C-eF%l%3}l)2E@S@Fg1kz76{6#2VLzmO19HY)nH-VH zMIwff7v7y)OFN|;D+m=#f-+e-KTn2TMyv>}D@2;)jf@oqWET=6@Ye0Ig<4r&SoUvVn&k9IEd=C%AJ#AhA6)V56mmF&_|7;L!sYUthh{YW#!po}P;R*R7 zqcv$K?({WcTGkpVph1`83B+yv^`{iYc~)Hcm51#tQ+z3#i>_p&VKiggV!}kzR(=_ z{l^`K?AV5Z`&s;@B~{?#zfBI;p7ixH%|>$Kn@m)GeR=bQbWNob9YBSbnTEC9uG9Lu z>o~%&4(dbJm2$Zvu1L{C!gz5#np0m9jw4U}kKwaB%vftF18C9?XW=Eo5L8lYuw(A} z_LIUpG=F}Fb>zcx^LH9{g!Ezo!EQdD715tsv?^nDpSmQxv^l`DTTEJquP-To;xJH6 zSA0WV+`a_Vm(g#s)&2&3!>_3(LH+6Ok(^CY(cjnXgOq8_Q%NnfWa z^zf)JF zFQu=Xh8>zd?j@qgX)V3>1k z=8h+*H;f`jYzY&mCIE?Yd#min+~kw6hEvRYv6JoBzU-q{XFJEgJA*m1!Rn?y?(JOG z?=Of`3=N=o2RvbggJ*}LU;i;FqEG7bKZd%zeUJzw8uOFSe(;?CcfBq&#$ejpf} z4M7p7Q`P519xtH%|=~^>|me0Jvx4o|> zW-@2(^>ozuA}~2;LXbHZ-_m{OfVs&$jIcD9rc#5eUB2LI>^|jKYBG!K z3m_CepbTw#1GydM=-)BbR385TD)f~4B~!5xB$lgDUBlXfi1Dch-(8)wnu@cv z-kodd!+tNR7(WoV8O?E2x6j2d3DoWuNSu_d-6*M}+4_9FP|yMGcJy z@kw9lO4pXeyltf9fOCDI3<^`ky}9fNyJG)vB0@6>6yQS2Wkie>yhC=4`Q_4Rdt5-+ z={uYUPmP3Js;Rr0cayyxO0-2-KOousFYHAF$AP!;!;Gj9#$AwC@P?*P*}B`EU(hW^ zh%i;}Chzo%+YiOlJduRE%<&4}i{nwr5W(CfA2dPQklYGu{|SYHFL^XwO?Xn~GU`sh zrtgEzaLj(K0?Ek&$=`RKA+ItH%P~k(H!x6F3SlRei`ED$vwkRyimRQ|hx^Sj3!-@c71P2s4@|HZt~E8|UD zTH{>0ZC2TNVLct~z{}hi5fF3#IlC}2o2H%v;(Wsmcv+5&z!JHXtP=`-dyX*zx-x$R z6y%w$jxYCnFv~(swhAMX@3MC64P&QQO#CcRQR(w%cLSyV3$I}sHkZkunKy^*pI-nU zL>x~duy%$4^OxQcEaGJX6J&XTQ2)mXfF7fhmLz-J1>y5-RdMg){@=*_(Pmy`@1@|> zlk6en)kU}U<4%%KMQ)Wq)Z)I9p3<}8uTE)uRFo3bKf6psgP4!Gg;28BCK)%{QY%Ls zd+yR30@OXV+)&6KYc1puivhWWBv#DlB>4guX-uV|76a(}Hh&3r`o*&|rZrAJY z;{EVrctPK0=IJ^-KPO%*RU=kwW#Hl8f9Bnu013}}V|eQ#S)YE}eGNU$vJL??b;&7< zazkB3`p8n*mTnGs@f34@qE_XWx%0=3eAe9K%SbdE?2vTznDxW9`OiysqC znrwaW2gX|+hU`0@#)_kmxFVMe1zYRTJd@*!zbolfynH zp)SdV3lGbHf#=2lBl>95WF_6>t;~$-BfZ3Bi=}MrM?&>WlO`pEW#=<>q5HEkczTvr zd%|AB(<@^@ordbQZUiof;A9UW6-kM3epgJp8g{WoBEWS2bgeL-5klG$f}wCsfzH_q zTuPN0h7kNhys6_rO3QdN$4YRGj2^E(;k5s6_O12UVdbVij)iv6E)kLy63gOzQ>Ob zW7wwXlpV30+Q&hcKA0oUM9dupjm;waJWl-ngkcB?!m2yi?#ei>FnkaC8=AnK|JTR= zSG~B$oKK1E$YE*>YJU8rPthg>7aWz@iB4U?rqScW9mQ@`ytGl0^@$C3KLYd|Jije* zZI~<%*<(Sr-+u;YPFj}MUYPj(>wm5|0_!4B*k74{LEL{A^34sNBgnD-?@9P-Ti==g zSFEj6A<)4s#G|TstJc!Zh^}#y7RhROY!wgLMg(Wm;JLRlAuxY>LNNcxF{VsP7-loe z^cM`1QpQ;xnbF;TthF{F=>Lz$|Kt2HpTRW=pq+U-2e z>}AVptlF)?qc-)x*Tc+WJQrMDS%@kwSvxRDgO9cu2-y65d=3Q?3ed1qpe~?iG11sG zR$v>Gab5n^PTlddpV=b5(ydzj7+tql2;b~I9dKGCk2#%o_l(Fz;4*S5prRF?pie7S zEw|GYK|14UY5g8l;KJ)e?Ag5UAi};l#Yuth#5aOeHPo81298$2uGq4SKEu)%@?UV( z@IO!&1SkB@d*EY-g2w!Nh**nsYZgylUDDsLFd^wi*M#m>wJ(ufxq&`wO$K*4(v*56 zCYokUL8sdl9B&P*tYu9vMCWBnuZNoQf>V zToX~_&^|}`vL|U!G&R%hV=vogV*EuZItXBT>1CyV+6lK{H!KH__TJi6s<%%x; zd%ZVFruEw?kEK-~aeNtq_Tjq2wo=6FMM2axX*!HDW|O-yWU^JDth94_e1yQ29LQO- z=CH_E&to6s2 zsp6V9sli(=hu429zE;M@Pbm9bpumR64at+IL5O4HynjZ!Ta{O4O(q$3s^Z0jV`kYnLU zZS6k^dqy+)3*T02Jer`Ru#Lt2B{DkgJq#2;B##5k#yW8vAK*KMwo%$9lHm4UGBP<1 zc3cE~j|%hlBm{O;ktIR#Zu`?U00uW05m1#ln?HlvMl~wn6Gx|-J&sS2#~7{&g#B)I z|6fI$l7YJvCk!2jt`N~3B}eq>B6myAPxaV#H5(PyTvY}+i-|$X4vU)XjK0TUJMJcR z)WAc{qX%kMUxZ26sQ^^x^oRiY?Jh-^>C}12ppfm#34ySPZ~KN@KFZIsvnwV-Hvp2= zXK)$S2>ozt4U)-EPwSvO_gDz;ceG^I(=p-RqGM!1ZbVc)3~9Tw9(1_n*6jnj+d<5C}*}&h)sm`SZce3m$vwj_oDfFvw)i z8`%CtCZC?}@Q5?}HCz+|&9qQs7esYpatX5yUo_IdqvSSqA$mSGE1=x{J=4cQM$LT8>=k8dPxAUhL`Nrx8-(R4Rt>; zrsU)eMIcLUP@cUpA?hXVPeK;zf%c=4xB-oGEZItIm1<7|-Yz6GLv(C59+k=Zw&riy zzB{Hoa(VV%fRma4hkdENdd3_%eY)79=$`FOBwq`+{9kkMb@J%2mTpNM? zJethw`uSpfTIyh#3S4Gtb56^ml!k)YKizXFcvf&IK83jW6)jDgOgKj9JW6Wm)#AX{ z3t5g3b3~uPX_2PO3x2wt@u;t4jfr4Z2+HzC#&<})_)ywgmQ2agpnT5F{K}fbdEQw} zr2gq?*I*&rLv_sFn5VIPBtNzuZ_nr{(3D}lfJ5GSrkEZag;fOcR`{VPtLP9Z0oJEY zsI%1Rc3-#(;y{@yd$6=_cr73x#B6UX)k@;X2jMN(ZmVtTg!h(Cr?0K%-x~kWt~!vl ziAKCSzNb?@>93)w@}3G28WY>Q1onx65Mt=_mLVS@otNqBQ@G(3{aVTskRx5XO$UJi z1UxA{jkQ;Qha8Zg_@Rg?qCcX_J~m`Q__cx&WegCJR- zLg*^u8{;ZwcNODR5 zY1=^!)~~wJtV>YwJMVNmuiHgfx`-3_o?_rOU#wkqqE5)|;G;!l_Aa(@n6mPvVj7Zl zhGLm3stTUs$crK@TPp*O#;5w9OTzn1J7e@ z)jh;A)7a>uEz7fKCGM526+bk=r-*%O#fL6_+U#sXscfT;8-Efd-4j41Rf zD5yKS4}8y41QZ?F>7ISyi7mrz$nI@X-byYMuzy(wuZ4kc$TWUa_xyHK{MN@2Vo?-F~~ z|164U=mNuJQ*7IE{6_*~JtVDF*h~p49UCp2Gk!E$d8BPhaDf3@CEQ!n?Q>$)o6zxh zfkW3T-xt0PNK&~)XrOd7TB(2eXQL!12*}6>Zzu5mvS9|{+P>{{8I-vYlfL4yxcPgP z3w%@aMeP)(h!ftv;9;ODzD)r_*T{fTi>1{nUf$B1hX&s_ln=7sjhXVffvp)i_F-`y zGrG5z{WB;N-8rNyLQPSLf&jAJM+Mg~Vq`h2Y7b+Hc>!>a%KHeaPU(OkU%j`q$b<(> zxg%WaC+(R8gY;OQEUDTM3K2Eo^gRDyEIn)Gp)RCTom`!-uF{V7T5Xqg7g9BJ<#g^F ztAsBW1S2Z5UiZ0~(RN=Q{x+28Ul$704*~q|ldtAAe5iX~zprxc+I zCiM1G6BMK2+a+#h>I}7atZv0(53fpeTD|qY{L1=YfEr`HQn#C~_wr$XApPnIHP?MXIP#q;l9oXA`Kog|N7hq0h^5 z3$$D+YAYf{!?M0A9xru|gXX^f85V(Q>D4hgi0OB z;CK(Gz{f3qSqfPYuFQihDNRv==skOGp35YYkdMkFKwLYmrCwIux-Xkk4v^I%TO6A8 zNvc`cLG8;#iSxklQfd%VLo_DQb2AM0!hv|WZPV6kPYwP#8zdw|;Ts0u9=PO`omhzb z#}6pk+fZOE6J&X zXAyPd{-BLvjPPXOQ%xS&L4J@?-N!!sT`+P8p{nd@hEPF7zU+y28?81Fp1GEcb^Y&D z?ZWy#SYyVom4R&EVI`;}H8ZvWrM=Nq`>zg2*!;(uRtj~(SB~rC5vm2CUB&~c`H9`i zJ~AtrOp0z_@9&F&l>H7QqPxaEU`k8`TM^P2C40jY2dO>zbB|5t zQ3W_6JV~gq^T^YuyS8yB9yNl8*72^7SNr-yWc-xXyF6kZz%e*9ix2Y;JB6$%@LW)+ zmV@d+1MHYKPxBFBdz{I_EQEtwj9zI98`d%els z;7Mi!8pYI54rZx381g&Y_Ge!MI=3bku#K}=thc{z%%R=GLMhPvBlsL=adH+DBlIm@ zE4O?;X)8gI^*P+teOson+giJcSPW4+L{&%kSjjBidRbdiDE@sVDtZ4AuW*YRu}_K~ zvxKO%BpxNC{UP-f6%MR>h4N|VOPN@|SgI&5^!aVDn~t2A>^q4%owloYBn%#%V8$2^ z;|}&}?vd8=$ige*j9V{v7?9LjYGhyE_S28y8@!zJC9(*2-+>%#JuQD>iS&pfjsluu zsycuwkx*N8f;Dk{(GwIjrlm{6A-J}y!SC#4KUQI!U$y>6ybl475Ez{SKgGXeYx$2E zpz7~R9#8gmv8M61rf(pO;XJKvifMW$vkFEtS+azAP;4N0Qma?DgUT)blu4Th^NVIi zaT0#N_g#dUKyQipF6;>c!6cF37eSnKBoTeLlmxTQ5i&Kw;)Q*PRQ&)elSok}G|~Z| zVsE5Vv|Q<(5$gZ}{}uuwhYjiAJsAaN*B?=gLGQ4${6uPpHI--sE5q|YkcfNM?e9}K zJK5^{e@-Lw8;)Z~l)Z*x%hlF2_xjS3dV$>f5YFNtPKcnC@-%Aqt;=m}i;12M1?dmv zo;gN?4pciHsZ>q_TUyDHaJGuJ+O}J_fb5$q&#A0PDe+lJ123*x8x~*JOg1xua#F!` z!9X-O+4{EZ!((#=yN$Fzsy_VurlaB~K95!|YE6#}AnoK`O@5u2ov_|L=p`48g1jl3 z-sGQeIED5@fUA?{?)>&R0{J#hGQ0KDuk@rcn~JPOo%v2S^U+!WD9J~9lqVinOBf9b zcwg^35)nb%(*kPYC{s!Gv1dimKM89%o~LGO?TN-OGSI?Ws~Bx%&V^d%WV?_W!-!Yw zx}vN!M=Df~xk^#L$w{1Pz@#rI zS%*%M?i}|X7QgpVei<2El;K6@O*2ABBNr%+nlIx%cuXFQd`GapGSY@x={DQT+nv)^ zZlbh)6L8&wHZQzC7csT1d)RDP0s(h%8<}iC&i!~3)2?sX$LZ`W5NnL@gyjvrOtv0R z8?k(Xw}JfKOHML8T_+J;Bdnz2ap}vc#Df#oUM@+JUj-iyG2W5F1prf+2wU7&B6pb= zgLYm_>q8t$ao}uQO2vH|xq#`sob^xVS3o@%t|$8EaLm6X0ieS9s^0Me@IUBipqQ*w zhD3yvTgJorqkiz&lYf);U{dc?u8xCzhsiwy^3M^1Hr?Jo+{Fbm z%CU}~mjqXgl7PEw+h{OLRn^jslw61|DIK?#`h3e-ig$Z@Vq$M}|8b!#&SbsL7kgVa z1Fvn1KpiK&Kk|EHm1krkrQ>A_9Eu{b0+2M{YTW7pA}Ph_DxTw=jvra=iLLDWk;+Jl z{y(?rPH1rGD+?$X^S)CPOT;p~n{S1x3=y2Zt@>xCp=fvHDdh53DB!@Uuv}YctXBQ349h z+}>0>T0^;H1{S`EDbm36jteXR*a};+Vq+JJ=Qy=%q)rHD2#66AB63O_EvOoGE`aLO z6m%@oBYDF@?`tx9i%h{XG7)ob0R2I*VxxA~ba18uFmU!JSMds6Eissc+E$C#W|HLbJg4-WAqb!X~HpM1Fz}Kk*FCE_?ISIEF>mviBC-+X1NX>ZVBZ&QaY7y zDwjI6I5l~-sf)3uOTTtbABU{$)`S+SMff=;X_K;k|)dA-K4;2XQ$*gcj%)@ zbBPVjPxx4#P}CfU9qX&N!3}Taw#<=vr@~J2Z-4ure6?c!v_i%4Jn_Xlqy+DZ=&-OF zngKnc`J6&5vMOZ?RMX|1(=8$!BuyW9d3Fw%Qxt8k&ZQewvKK`Le?MieTz85Vgw|(h z+`UwG-9jHDs$qKWyuzECGYkz;Da5D>P+H|~`~?H%x=l4h&&_@1NUZm6h5ThD;fPid zV?>1WS7W9D&j(65n7$w*Y&MvjUt!;MHaqIX2?@HGt6}~*@D2AZCahXx*h8TfSO5Xa z-{1Y{dU@M?a6>!{G7IiVAJ+P@T(*PgVNVu|d|v+VS#`>|72U&?B&Ope85`-DnC<8D~M z45=vPaq93T?o8A0Db`?TFSzge{|UK*>2T{$pN@+3g!qNf)_w3#%SF-WB+7Sukys^O z1glYa7;Nei;&3Z2Yuj1UZ(pxMSbI+yp2&YNQ3n)#pb6^RE;2$F&d&^^1dsVrc2aLP z?y0mxbChaOs8~jZA`b?zR8OG?6_j|jeU2{kejSkvm0~W<#-2C=n&Z~8Tn4pO%eXJt zHqi1mTEbwtcYQic8GRgUy82AIFrGT2zqIA&7@1<`GrHGo$9ybQx^OaZBYl(`mJj(~ z{O@AR&|P@Q^~6b)5dv`WSMjc!MGYWr!E~XmbYrwiF~Ydd(}U?!|b?ygQ2%{ zI^&n+3V`!Z!k(cHNTk&5`}omxHP_oTbxLf%_2=Y$4*FLZt+n3@pmMhOR(P;TnXZk`-5E5a6M%&vXOk`Ho)Ny)`%U6D|}n^hTMZm*@Rq05WWyW3GWyN2XNBj6~Hp; zijA;ixqgwJNe!uFjvVpZh9V9e?tr|nY)Z9u`({U%z$!kwvK7z$&m zr}&fW3jusOpm8v|<9Rm+a&L}HDseQl_}Gj}h3k))$BM5soyy~Z3zoCKI=0k&8%%$1 z%><*b#Y5mYE8H$~w$jRqdNn!ErLSoiW_#1|jbf9URX4&A;-*b6|$=`E0O zay50q#bPfHE0qno+EI^-7^O6Ub`{{^Lq;*3IkD-AqA6w#v;KOf9cZ6lEAXk^roB(_ z*KnYXDZHXb+fn(Ilin81M+Ggsgw1LY7mil0xIN=Z%DjN;(*_wVHz1C#iOdgB+sPT6 z&9&n%lhLu>-j+%p6;>o#@Tk2o`P;FU@QYk<#_;xF zOg3V@g>#bNK8ToR{<4j(*2g)SMxc}1SsTduc>XhYFVuj5*batWz*l8$Ax2Eep}Rf} zdY<}JO4*o`jL$7e=$0WCNPT00x^``8C_=2i{Ab7KJV zY4iLkL`h9ya_3GK)LG6U*iTyea<=~tEJtSZOa3S^t?Ynkys2RC)r1h^ zg9I&AbEaL?XpRHge!J>a4{LDQ(8kid4~9Lhz9xsQ(O#V{{?_>cRrC6xHWujBQuJ%z z_cb&~AcO9bN1Hh{MEU0eg!fN+SsCgL2Qt5#4&dM}BS&&q zok80xqj0Rx5eucyD9%gjVFz3@8t0hJR!U-OoQpH%I)dp_PIj98ZLm0wq;V{fay}68 zvqzQ3q62F}PHKJV9HNFB&sX3qJ#*NU0nyd46ISLin7OFtVB?rmDY zh%ObC9a)SzY=BfDJe?ULh*a6A)xu9&tT|cfq1(or@y3|RWFV%&%W{#kIkP1PWE3G{X- z2L%tMe$CSteN251*}Wt<%omOYsZ+%sg?7*9-SEOcxY%p|j}NiUA82Qb+_LP11h1&8 z@^~UL$>{z?TuSE)5~)1Gn%Q)hRSzHpaIq<`@iQ2SUTOJET&1?k?|SV$Mx^UCRBo?E z1uPt|=Yl36Y?}WWh5MTP*gVQ!6qn-BRY(v3e)% z-@LDpc=;lEreB@jJ7iBUod;CTa#Dd=SCUgl@kY`r-YXM^MnO%cjM1@LLzi!q|1RU>k zlZ3+<6$re<&VyaY_g5Ya8J-k9ZU&*hW@Pd&-&eztFYnYvg>gX*+Ga zTblMdj<@_|!{j`CD4CTwNNyqJ&ql`joUkQJYWY;uuR^#pqFx|Unolc&hw zjjU&KbSsjU&u_zs5vkO*I=qkG6Vys*9}QR@qJ~|t^gNE4-j6=g;`qw-=)6wjtg! zQn_no3ol|U0(M|0m45!H3*sTkeb#mO6j}Q7rtNpmNS9{<--arthJ0spt+-~+mkVBQ zRBMLxQTVh^<$NMm*avy6c2UD=7H8xhR=)17P zs22@*5?_+!F{>-IXEQ3(&@gK6K!GF3F@uAvqlonv1yN;tyJ;8)fzXOS{a{iz7NxN7 zf4eK*SVxzpXKF{9>*m6eI$T`yIKZkr zNXOO?!U}s>+YuNqZ?+&mUG2sZcpwp*pH@#*S7dHY8{JFVHRHj=&V_EIAC~2C2AOe-n1>NmA6T2 zvgm@R=|-^yH1L|Jb>?~I+EDhr*!5Cb(z4<@4|1AjZ^uP~=Fv}vfs6T~p#tFaZV-Wr zht_)>rzlR}gktrS$eM~06h`YqqcSsK-YB!s{chDM);_aYfS5e`R+?Se(6P9{QW&tm z&S| z;x27Cf&nQ6kX-4>I{{r~L#SYocNn`L)}U-11Z@G5AyyoIPn#qGV{WD!-s^R&Qc~?D zf*rb4DIeK?^w6i=6Gl{z!=D(oo2y;qJS(Rz(0jJ8jjnt#u|ElIMkK$fCql2rHC~eI z@$vdF1^FL$7?Eeb`hK-WEwM;rr@6T&kmM#T+Y?LMko7;D4Kiby>%fluoaXVpCiRy) z=(V6$=S~U57%UQIpzm|&)&Lr^I$*z2@NMgTd@?i1pFkyNzaANUP=Tb)7zp%P@zNL_|!mO5( zcWwNmw(rP8A_iNaw$qZo{N81poyFj@>T0Nn3?_k9O>QXGH>X5mD|tMkanKGd?qnc7 zE{-+PzmtiSj4|Ld(|v|~plY$D->zab9)nd-1p%A|R0zkEAc<@HpfRe zb^Dlac1UXYtX&nrr`=$V9;(2>ZAkiATjBBp%WqGmQ9pv4LB=kuW16eC6C#}u(oUN# zY}aGxW-J-yv)FVJR-9g}_HwLjDLwpy%g*Zm0xv+&zmVSF1uoHw54ux9z7|#I!V$mT z4zi_NlVTBHT()NORkZ^bZx{X_guQH5WVj} z&gV@a@Qw@z#uou&!2UsV#ksF45(HNY`r?6tjQ4ddil(zP$)&Fmbn;j7=sQzb5Nfl2 zHKX4WpU)JeOd@MM{51IVVexh3)8%wD-(T1 z%1l%3ceNLIvQHk8foy0=Milf#GH!oQaesotLDz+>dkZm5XKSZ<1#YCh1?@OFnG;`= zUXZM-KKZAuj^P%uTfH1=S>x$E=znZxK`uG^ur7%^lbrM8p-jeY_U=!xETmu^Dxcn0 z3CO4>7(WB2o)Ufzy|shd!h=bD+vPy!r#bGK-c-a4!biVeph7BN-2eOf|(@JDK=@9^IuvzEq$(NBr4E(RGh4iM*4`|OID zW#DpKc}E%b(RoC39>d1bdpiMya{)7aZx!p(h{jVeVt`bo$IXtZ@c| zK2ifCOU+ZnrTZ?4R|lLjN%_J>7ezAL(?#PA&7l07`)9G-DAltjt66rBZ`=3^<5gt0 zDee+*nNFi%cwxyZ{vad>bb;KAfPn9~bfcyntd?HEL~}$v##H0BrfEz)a8Fn&1SS${ z(tuD}rNv2Xo}Csf((^y)23$h~Z8=~yt1vv9>@uz;GBi7#TMf$s?ZYMU{zi{t{5{q# z>Ck6)=Ea-)c|TwmT{z_`i9?sPihcB;D-y2mj>l;+M1H6BfjK#Pi;3%;=Kgt`e|(c zd*bfz9f^WDYni~uTJy2-BM|XH#g1Q`sM>djn+ETOL?y)&Y-;dOF;j#H28#b`Vwitb z+wMobAKgo+^WM*kps#RbovR(Z#w5@M0RMtykcN~Z2MfK1Hxg_;g-VtaoD-4#;Fgn&=)v~RR;P%XXlz*3%VxYKI}R=XqQ?f zSiIz9MbXcozAr4OMaMox8PlMEvbT>DVdDw_xRn%^I#%|4`S^&~+Zubx(U*)XbL81p z&CbI|?@fLQULutHp`tnrmYX%ArHfu^;c+L8`DI;eb3(OxWdvSA`9AE+MZ4YU-6;-* zr)eCoCRf$}pW)`^#IWNO4h}FQ}gf?|FTf7Ry_3nmzRdWytGix~WiW;sSv(-iM}*;b<;%$}y1` z+8*HHORxJoiQ{Ls4g?e#`OAl`KmVp~exVEtL=4tvc>#n^;en`@Ukarp%>(A;y2u4$ zTSg~A&h0S5ro}wGU5(*5J}P(gI`~{}7YBIyU>Q;t+LTP)yd1j-@QIRHpeT>zBg&4m zX00!0KUDY)v9*bAT9bK#%vgFQ7@{u)(?vwL`beao;rG;b(t2)5`=2j{)@WwKWqBdo zpi(o)m5>hB+cN_Bd7hEm3#JHqe`*@50tnD`med=ChH+o^RKS2lAQG*Z)P~)C)ik!v z1WMhO*|TxaK51g&Iqan4iuR;0-AFN;W*#H{dk}h!u||elS~OYxLf@I>CNSwV@@L^c z89FP4T`vJSwg#iz0vrWx3$k(wv}U5%jg;ivb;4FzJii}27GE1abc)W;RulM!s_>(@ zW}VS~9ZTs2)F64JNIcYM5NH5=GkTG?Q}x(utvc2un{U4~<%lW2mG@f&U=jk21&r7& z0q-1r`9`wvM-1ltn1Ml_8()HTTr8fZa|#<2OW)fh;l#n*M1|FV^M4m!_Y1^8sDS~%5?Q1Rn zPqM^dJfm7lS=5`#J1dnXegeV4=b-{{ZCrp!%?)KcZZaw5Q+W9NLigJ-{wCT-T!A!? z(IJb?_W;t5#-AnQVK&ZO&WaD=y22EbDpNEze@E@Yr8kDOaG|D$@yF!%*N{|jgJKz! z4!_`1ZuP?m2>PHmJvmKz zKq{e;U$c7%3QoWAJ<5!H{|s59&fFESV2mZ+PYdGZxu%P2GIj_i-%x^4w2X$$dv5z* zT3|yW$+6^6HNaKWNj;hxzG0_qV$QfK@Opwks zyZ5NKR69cdi}W;3jK3lCf(D&JNuA=D+en#ZC=>%u5i*QT5@j%GVpreHk=F||dGZC$ z^xb4tL=hwuws~!B+2-x*eZwus7;8(mI5;Xc+#b^-LG z((v1U?hKMV+=1qX2qRL>Qjj_8co0DGK(n4zn_yBpQJsr8@0_ldgr9kK-d;3T0?t)a zU~nmSiQ^>U>ja9tl)OpnbL&_EEZ=3F@JO4l%_pfje3*fzqEPs3LGQkf#>}1j?w{dW zd##mZd8pX@8^$SCRdJ;{K!-q-uC-)lLxp7EG6W^&XXWn1tG`YFCL9DM9H-J*d*0ML z;RhGB>O9eLJInhqeCcU2Aw$rbk8ZIqV2*vad_kVTOV+wDleM!jadI(jT;eBKD02K( zl5*^@r3Y6jwG=>YLMhHw(81(F>5WE&Kii>Oc|ZfRsA1bXEoZ=DXapmn^nogg$%~wb z{$9)xHf-2|uCbFH7x*!{=&7%%3v>HjXQiYzM!M*SvY~-9JGUQ{iiY1>UNBj{E?XS3 zgbHhMYHjS>RB$na6*}e)WYnJ(tR&aM3fDUN9;#PJ8j}GSSeJs2UXAaO;q4Y(A3o0j z)_+h(mu3|pCz14Q1it4M`ymP`cxP&0dDF>=m}(fi0)@C2}Q<- zWeohqvz?_|eR`s#)Q{l3-*s`)6Z4)mpw+I|v7kIe>_x{_>e_mDqhGiNdZ3SZZm_@& z)Y_k-B>Lh0VM5)VzkKRX@}5TZ;J(uDeI6(1=1e-{gS^DcL$C`QO+d~Ku@I)SJXevt z=tg1Wyn@qZ*|zmHJ_a3AP{0MFc0JU8Fvu+#J2qImBOs6wm8*;X^*#wzu}Vnr3-Av3 zks3N;&Y}uh-N2cx&H~JMiTl4=%q_zgAD`Q2H3?c3>k!K?e9l4!aPPL17E>NdLsPDm z`RXL`B7#IVrio(}2$<1UFD>qSHb^9+LfFJm7l`0X6}`ro8r1Kh#Mcajje~QQ)0j}}VOvJ1==(;Jh z9o04ztPrBjy^M`pnNF}Q9#>upHe2Z(G>(MWZx9icDpu<8m>UeC9;FZbk|W&k+xgb3 zynydr5rKteja*2apItMWtIkrY7n`FY#8A>}rHNo_s!T9naxYv}Zd5D6;mG5Q$-$zX8#I zns@~DAD1SWdxtUN>uUNe68^Dyb(lLiAA1y5%HM#F!1d8tS2Fbrq&elbhqm^r!M_{h zJYC!hLln`CiQ_a^FET$b78?&;C19x8us_RZykI~Bfc15{oas8WpE(jr8v;5%^zk1dd2>l4Reoh#ZvRyB69JDV9N+!Br zDr&gCR^Ubrez9p6l&~A?{a^CAH<9MF1vAkPd?6z6k`ee$5n|#q&|~?H&-Aej_LlbG zG7wBd@)w98(RaEwZ(SgwiV%1N>>NuIA|K4AUSm_%X1cpj;y5X)FHdR5i`x96Ozvxd zcaCy>uHZpo2n7J`{J zWOinfCuq2c5x>0ojt*87C!h+Ib5eQy^PG`+J#phU{-r_KG|70W#%m2*$q5H%V37Wt zBAG&A)pFeM$$3rHhc@bNuNGA?`nwIG%(L@$AW12cdwePMzekxR)Q&zo+xYsX2YoCw zIT5N;YxK8p^qeeY=CEAn)b=cWcp{aX`cHZcUx;D%E_?v81FNn1IEnAUd`k3@ zjXURSk`*J|DJOs@^UKb}HO%`P6RtUSClXADWn~yjJt!KE>7$Ke0wcq1G`i!)jb{*1FeALsqe?KZ_WdN1f3cDI3!?2medudzmdxs zGDNR2UKNLP)3sY(;l-+ef@63R;+&JQa0s2W@tVf+3H$QEof%*%TgN`S7}?h-ROj}f zyPYb6pL8@c9WgxSEw_*QgO+l^JtgKYOa=$2Ed$-O| zb26OT110g&vTKr$EZP}9JdO*V1613xNloOEdV~ehoj&}9R6mSL7^#KynxN1!EeU#y zK4yJ>>dZ{24hWju_tarFp!)<9C1{@vJ@mdXbx4p%{p(2Z^?~8Cs51u&YrN82cyn+t zL2bY?YIYInDF`$sM|A}3;b+)qV&~u{$kC7rUE6bp+{G%aTIg!Rcnh&J-LBF2_5^1w zrF4eIwNs0kk>e8QTj<_sEEu93g18!b(45hRk~MT>l@|ZDw!ti<0I-_WhpSBG`H~K5 z=utwl-z4Eaz);tY&{OE6W|l>Y&CHAmj!eC!jkhKMlT&bp9S^c~NB}D!?D=8f#R-?T zaS}$51JBVTpsH>e$Y0X5v((tR81sg~`5WnY%zR@p8l#mIzu6c|(&4dedYS&HzpMS^ z_*upcdn>@cGHWvbnY2Pb-BP((FSurb5c7DAhyk)q2PRWmXz_3n9wE?*~(gY0HG%lr$xtRdHHf2h4t%=D5_*7@oDv6P&J>##w44z_sk)b-?88 zWOkD6++}|T%fLR7Y=uq)Z*FMac3ng|@I&3Pnwvl>ZxdT8sO|!honx?AVYBlfCyQT6 z%tz_;S={F9yjr4&5$>83bwXvH&X`A=pSL1>so*8#!kxA#HcR+{#Y`co(9;djK$0e; zcoKmz;@1Dx+NF3m3vn!L3El~X7@x&My-$j{A@?F;BtHxe=Ika zjC58Por|TkV1BNAS`rfk^I3DH-SUi-D)IbcqQ!b(a%Iq2TBN*_FRxB_@XD7}TA;Ub zVF^SIoOZo5acwjiQLFBlD_sA46Z;;0`TnCF`AudLm#c>QU!AICy#~cs8SzTcdnvEp zeyuiP_=~DEIWnFd;QBQRDDsqL)f%9&;cV1{pp>ZR-u}EJxv2vH#gas;E6yDi``*UW{=HMdm3gi{R+nXk z-RqZz;EGCE*<|#6T|(PoaWI7t8mJXSJ~qcFRM4#{=r?Sl!l69{zAe?>SohkOMoLVL zt*JOX1njdne#jHxu9&{+1%Ysw53D^2DWZEQRtbL``qRS)Y zX?HF5k~>}toD8)&Zg6lV&_)3$5XDV3j^H?tcbg#GU<4~*@doF-gy?k!A9TRKJ-RT% zmb?G3GfPl;B9v!^n!6)9!J0d%e~6tV&_ovvOb(B&OJQ}vgm&ZugbC^8)99;s)|7o` zpeJ2neyt+!TO#C+RiZ3f^!ZnRApGm88QmK;vtIf_I1_0#WU2>PC?*>@#l<=C6#djvW-Wlg^yt+EuvR9;mSE`x6s#9W5{ zy9A#)nB0^u+zwWzxI_Fohc`h7HdK6#2v^Tr&5tV^A=#pitV~=zgq+oO>|!UrF;h2m7r%X$-4NiT8f} z?~BP|Ol~1+!i6@?;!Afj_H{=hJ&o;r@Q+o~Nfg9pMKnO_uN!f5HzZFWaDzke`6-gL zw2qL~QS~1)w_wT5FgV1Mn>kA<;}5Z@_q4ZDAEd-sD!TM%!Q3?Ba@5?StXji@&Ve{$ z=AWDhvPV3YJ)cili!gqey!zaKHiJxePi+?l-ppikg&PTXL=TK1z#15@JA_!;brI0p zAm}CO#4#g3a(uc&Gw+t^O{A`t~zpNoAvho?8;FCu$k>$ zJ##nje@ZRBX%?imDmTl*HFP*6%^{fNkdLoqAGdqz7ZPSIYW9xyvnAaHya=hmUsZhK z9E5wcOhKskRzWPJPKb)ElR-Sv{qPO5Q2Q6p&UI`o{3P0*{G? zm)H^V8EPrr3l%mbO5DGu;lOIm@@b(U8YZrk&QY=i^SjzHE`FM*JFgg(?Yp%Ug$1f= z&?Sge?AgF0Hc}hhZRX3J#~TYwz47P_Pd9eayCciXl1~ifFtObp8J*ait?{2oDlSLC z@b%m>u$OoXWTIuu0PNd<7y$cyS4P~egZVx~qfq|Zo!EwyWaRemane}fHERmoW_YJk zdVW?5?7OhQEHxqCBc;S8CtcDve2Ecoog82<9x*;aLHJ60i0bwH=$1-qlFVRSv>e!% zo|g*3=42_Bn@FhJr?$EUBYP1UcBuW2(f5IaF&ok)PULhK2BU{m-D zc-?>My@GyQ>095;MZ1kwyt!1%ahb&?-9VdVy)UT!*&UKy{RSjlRM^BGdio_ImHr6n zya-rMl4!vjRC_WGHTqgs&XbfBXKUQ5oMOdfVa4%Z_P6wO)@Y?(y72zBzx~o65{E&q zrnj!iArG8Uiux# zReq_Twg)2GqezGN2j!Q(LB^x=Em{j!`t{}O4@R4I!_gO%>|dy+O4ls-f5exjd?)-N zHBP3WtITUiaw+{sSaV)}Y&}er!O$AOmK2$?lt|%g^^Mow}kTLbM-kT zst%+z7Lo}PnQRJRH1{hAKCprrTQyWxV2U8kW#x0RZUFMmN9uuHuXnv4zh5L&O*yLp{TnmgZFvCeyD_29%*}4{ z@=O|;#~DwljjLuPM+W;k5q&}c$@40z_DBB;+!yU9W}cEmy{2VAig0jdm$Lw@nbN~I9jB7j)gXVUPrC>;kGcp7z)AXE!R#e2F+qBZX{cD27gAn8j28;^>>WGzexq5B zcrAZwqcU05aw96Vh{`b1y{?vEoy9)}`_HALl6NTyWmj(dp<-uDG+Z9FB;A&Q-l3nw zhKO1WwXRg8pb^1~lSPT**mLV$*X1HoNmqNA;Kr3rGC_|Vv7*CqVnXCj2`m*0`scA_ zSDXo}OGyf`%YhPIBX>Sf4MBH{Efwoqs6a3pAl2CYRfRxPJnRaA^`MtCvp7~nw+RY<(9CU& ze=k3uUkPkXb#*OH(s@O)hypx>)^*9N!RDnA2+z28b&ep-f0gCpNNsp$3~(JG&RJ-D z%JM*rKPOD_Ahgr9)2<}mjpdSq#c>{`&W;tzTUXbFWh*UUr>CBVrWm^~cLcF~ao|0N z*#B|vh`)!E8F#uHSEK*oPMNtQ1m}e!W*d!$1)7GpQsv#c9im#S+s92MmdrcI`z`Xo zF(u?=O;;<+aAFChptK}gKUr9ww!RuX3WSVI*k_r_9p?qjB1Mh#Vps1p#b%m=;aD0K zfp*vNt1Y>(;5urV%ua|miRTmO`m*L^E#ed7cqqviFtv&^d-)%;)ecjnG(nVAZ4;M# zKkUY8n*GJF$)YQU2>loc%jhpyxX64ljujyL68KJs!#&iEou~fVz&Miq9V~O}*X89l zQdAXRthmmVq8>8l86OeXtbWrqRLC9fTW>l2E^35=)_LLOz19)zi9pLA$^C1;-NAXs z3PZ_!9&WcV7AYfO^@KTzJLLs?1f$#x*1;xxI_SmRXnVtr+0g~>H_WTn<1gtOMXF6_ z6$MbBBU)haT|{bIg0%M9lQErwi@ttFkJyZfIpnMg9fHj5;B zPJ6KuOzdaTreLOM7t37+eoV^c)4Z~H59^hX2PN9z-?m4~ApB9uPLTe`ydEr=mme)< znR%uN4)tMbbk`)dr*asRw$H*!7LaRoGrQZf|&OD$C4XoO{45Z@Ez>G+W<{wTwkO0P`1a~18jQJ5n1c#lO0 zosj5)Ov2;0vc3TRkxTPL(iJ{C%%#@rIaQDZhnpuJCyQQ}(!^AM@9KCzm*#Bv?G~(LV-L;^Xfa(=| z!Coo?ui-Ydzq19RzakE9YjYT2N{6X{47JYKoqSC}Y-!%gq#rBO z=^?)m5p?o7^n(Ja8VSo|dR#doNQxzWw?ZQ-~m>;i8WtiK80AaLW0udx@W z=}pfv%ad-sa&DEJy)1UqQZ;icB@{XeyYEptPI2#7&CfF)z{;)7`St#GBpcjA2i24B zeCNmg#&>HSXr&iu{KsD8m8HAhLG$d9P#q~-p7UV(%Ic>JRP&bdHk;zI+hTrvCT!NK zoVi|DIvGMe3Cc4@91@<@>@4sh))Km2@*H!3EONjg1s;noMVzdp)a$<)YoWg6LSEN0 z2zwb=31NPA_8TjGR~5~a&#i$J2#%n;23dc zf}2w>eA34J?Bw=-Bevcp+xx6I9INi8c&z>Bh_O4fL#B1=QemHW?1S|Gw_t1lw8Qh@ zJ^xq&A?#!euJORoH~yb$EsUwyICp6l@)Ug!rYo$xc3m|GWBYm)HRnvp~*Ek5nxh(O7DU-0HpxSnA=95i0sQVR`@mc&G;my}>3 zZWt;_=aGiDmwzDG5t5jO%8WdC@+KFWYQ5_4+ci{iPRy``m)p%Isv>PUA?~M*CTHbu z&A(>wgjh_9jnNM#l7@IFnN!OA4sEFnNiJWmq;Iid_1A2G6=Xr^;Nw86;TUwb%bXF? zD6Bx}qT8wL6Brkjh!-PVhA$w<)q7PCyhyn?zMfa)r?THM{0G({2(#v0uJRntYjtn~ zGuoZv$@Oq_dayLxwK2%|-g+}s9|fO)TcAp?MvMO}>52tyn)_uP>ve3}+csOD<1 zN!>=J02OFkaon2F)9q{kk^}T36F1Zm=(}0QqB=>dtA^4&kOLGFY3K^m1TABqBRFy- zB3Rrx8bql*fMd|@Ye8|69_0ij4U^UO7riF02mqL;l#5$`n<4PUPxj;c1#d-FO^p1T z#VDc(za}nx?2bfvvFNsYiM~Vs6ov;(bxwgnDZ49Y=WWLgW;{-9A3GP?mT+qucHEGI%nLW%r~Jr-YL#EYNd^ck2b31)q*7fA}vNU zK_JqZ=4Ob`;faM>6>Z3m#W;&{akTDs_v2}B+98S?2|H+UiL|=+`j4P!i~PG*;xv#G z8~%&SUxhaL(~X)NewaVo+q`@>g5aomtp`*O%g8`s=T?$n=fTTuFuYPaK9)OJkO-<| z)W^frGSzN2kuM(@!^Mk?syOUL9SRsKpvp(?DZlYMDvstjII#37hZxff>ADgE&tNpu z;IDyQr1V?9C1UFSB0bNUBF;U-u>sB4pdAsk|8zAESj5WYuuY+0&Q^vD507<$As^3; zGvZG0^Dc0ANez8x2#cpe5r0h6$U~h0aFu00IfAC8VFw4UWL2Hg(1HH?j^wae@IZj7 zgLv`&Li=fNPK$ZsWdZY5$n&(BNfB4*%$IPHl=s9lA-1*_k+2?3rXa$Ai zzihb?^a-LRMaT7DybwX1>f?DOsXNiAd5Sxs5qm$`bi3au(XXbM+s=Mctk%RdpkC30 z=vmDTDTN~fH&M*$Me`!-)$iwz+&YBN_|;xa0~Sx1?MouVKtY=@RiB_+Z)163F_cHO zZo9m8^dwFPva9>2l!nLsq zOh=U2^A4XiHQ5Y71F{=^GcG$qbr2|kt_0z781Gm9b6r6xf|K09$hJw!l$TTLgqTMb zjvhH^`+S==KOWPi>ROM3-VtcPFXw&Nk?~b`f||%L>zJEfuJK2@DgF9B?939gN88-5 zJP!4y`~IJs*&k@NZJ4*`2GWI-JYkwqud<*;isCHuo{%N88}YUlQdK59=b`ZOnviip}t@y$ra={t`(b zCP5nMxOH73yfbhbh#|Mm@sd}eiN67PY@?pEcft=#*d2^)bmyQl9yVI_x|HQ7T6uMf zjrgp#uR$nnr<-+&b63-TL_K@+><_`~oUQcjSDjRc8uRW@GQtulDJc}s%i0BbwMsj& zZhU0FlSHzVQF5HTks8JX{!bc*P(c(UAeH7@)b$)am+Yo0cRkB!-s(aDVb__< z$z^>PDSy|>muGTT*_j3NTDJfrxFZix{~V=8QVyYclo}(HdVC&Pz%sMWC_;`Ax2}{U z4Y_1>Ob*i{6`q>TRf(fmIP^I!gZga$=$qpg(S0>oKilz`o*^XML?%wsZhHZ6t7xvM_c~)h zEKe%2fC~OEo!tSeyWAY5RAa2*$uOU`DOFY*b7D&*srO5bdXRNosr=}Cw(#a@OUbHF<{kT_QN+?N(L%D?SnYN@M7?#$$6jSe zN$KYTQB+0d@iG$ioM$HGA)TwX=cktHC@f_;&SLPdsYr;NyU7Tea<|}GXuZmVV zg&5CLG#WoP%w}NM|TN8B7Xsj`L9Qw`QV?=-HF>@B*_Q?tr8013;LFNJ)?#qmHeVQY@^>Y zM2}uVl2nBeyo_}pLXON-(A>+aD%U@W7p%(Y_v}MY31Gj8J#=#FVP3m+yGXHxJ0iu- zjRveGWk24MBddI^kE9f+|18RDOu)tmi-O21sb{i|N_Fh&#fAj@E1#w2A~~LcVpAH+ zrgKPPOWQ)X4UKAO>;kg#`_RqN#DB;vshQj7kO(9#7sLbaRgG#^u4@XcC?1>0!XHR|<=CMnR1atX5^^!`!|DHC-%Ps|6s8oxa2=vlslvRY zq!KdG9PSH;FgCY$M+puLN-1YvML@s4h-Wz1DkWPaFbgp~LDNzh*|X{RUT}ZAm=gMb z9oW!{Gv|EQlUzdLiMDIpuBcC;Wz%HkV}@++l+blXW8!hFYDs$!hA_6+FeTluqsk=? z=x4tx_58wkd}=f*RYImIXWYz*0eJih#gs*N-a?#+6Rl7+4}=)B_Vm6>a#b)F3PVqP zXg6dfH;|f$g*~&-t^@r4nQ?;C9F3X_^yQ&8Hdf*(De)bZID2A!07b~RaNzZg+^3TW z+UeYc;EUuISlRg+Jt$~6L#<43wExr+l{+~-G3U~QZS9{R+hWjqLm?%^va}Q{`r6Az zdAL20e;U0Y@x&g^vI55QS`3R@f9n~lS3Pp9bPlkBT*$68z0@w)BL3KOCckvjj$I1? zV!_H-veKHA?hl13m80{8Mq^R0Dt*PAzT7aA;Xp8uDkRLjm?@`gl_Ce{JYo9%dXFzUR*hf?@8}zj8fPqhF%>Y1%dZ zDW%R7w5ZQIqs;pwwT4}mSfd&uS(U4Kc8s%SIU$HK?`jPNq z&3yC9tTR1f2t7@fwFKFNTEpwUW@0KG&gLH?7&@o1LY{+%CFs zHh20ypwqW=H;U%_6=yu5p5?%dsi6cB2(+70@4_xlDr4Hd2K=F$3&+bVXW53FEy zqr9maGs{QOE&q49LH}>-bDwnEcXC2c0X%qwMxdWVjkii;QaU-&JPvV;uW9q!|ISx$ zIgUNS*et0L)^^}EW2(MoX4yjKJnt4&vkhY10rn>^Ej+!XWy8iqj_IyC z{J6ZTCfTzQ9z<)z_^5bCFOx9sTR(PQtHA4|fC~i4LQj%7TvSCwsAS(Mg|!2%D`Q#V z14K_jOi_BUGL!x`xcGb+sU!M7=m(lmje*+vcK^v(7FphMRwk{y9*v6s|J85(4kZ2B zl9N*{(-|SCtKO_RLHXLNBsg&Xpqzmx#7VI4Y z-%qgxeSV~@eutPym+GyRsta~M3RPiiD{R84*oPuf^g#1Y=BrjWcu(*f8t!wUF~-Pu z)a>HUxEy{Lym!=(QG36;Bts7TJW|*OBtBYp(huyIE6fxniS!Hv7f&tl61%{ffcQ5K z@huFJ=ry7hKUqr(a!k{}pjpTB!%-M4aHjCoOjb+gsZ?y-UM&Y*7lvz(ts536PsFLN zo>)WZSEg#^n8z_%FUH0;;ad|sH~MkU@Ql~mq5Itb3hcJ8!cRidR=#px>eVpxeJ|?9(l7BJ%sY=nVyBsz6niHE3|3-VmmLBr22;PUI%kVGFK{rll>d7&(U?Wi$i~ z(0Y(cLYmg!T3yHJp=s(YoQx636~hhMt?qDZgzHyWsU^RC)>sg0CMj2M^UAN^nx){~ zwfbPfIIjb=D2P|=xc@)WL!b7~2cyHoe~^_uXbtw)KgoWQlZAQqm;)$^I*9x{BJ+S{ z>6T1T_so%Df-5zuKVW;dE zoz<+IrNN~bgtZ4`SZ-J7)3A?O3Y+K0-Nz5Zi2v&+2?AlXc)c!NhAC(zCv#Jqu{KZW zmD**bKk>admo>f#B@>2T(glyRlqEZ>SN~_&=`4dzSW|Kl@S}xik|eo=gi2t9ky(wL zDH7?Ihrp9$!?p(-rJ)6Tmiot1ARU09W6cckE&a#7mi<(gzM|GK*CENdoHqn7iJS%d)Vi& zqPYemAe2<9R`x4^PGq?q+UckD!Rk4-jje)6ANHzOiY_@d%qb3~H}%>UU!-m(DyKND zh12(_4-4=pmZXE=J+hBi%`amoLcJ68T}ZE{Er>p6OPimdqgu8kY21kxC|^au$6|o) zbuU#;U~MK3E$mvLwCZiss?aN>mIi=WPC6Qj76xL{wvX=-ip)b>wty(71-_%e$FsJf z9msgSX5qG)F_6XZWaAshEIuw7@k34%Z{o@HDqf&VY6w|BnxPj*I|LrkVH%JqO`H*{ zH@TjY;{GHRp-TiUk@Rrn1k!|iz!awN9a9tPys@Tft85k~rYxe>AdOkxx;XthFk~IR z19NKN6+d=fUL>~$AtgH?$_^-JD8$~Xp1e}J{S^G556@*&Cmd6+N1HTe4wfKAFUB^- zo5A;kFo&0cM)Pscpi-7c?D;1nfa`bzyLXmJGJYTm$}wW3fGJx1i2I|f3Y24Tr+ZuHneu-ZR3 z1ZZI+X!_)cTo()xhiO8}97I%t_2I}SYHVLk!7P&p4JXIbAxJq}m$X2?#|O$xL_0q+xlSGOVdzC^@$Vyn!S-r4Y2 zr)OGxFloVrzm;vG1^|WZaO(Md+Uks;4)%?;u-6k~RX`c1offN3OcXZ@OBE-%^zTX# zF4KM4a2lFQdqV|`(o)!D*kn*UfDR6O%-c*j5)oiG*c0-4u{51qDD~vx@Iil01j%|) z_f==W)P2knTFQFIkCI$FMcDlbMPfbeEZWh6+`@ipq~~`8m4UJ=BzI*`nhDvvumw_+ zFaa;P=}h;=NeXw<2*e3vHpn(})(hXzHaZc91cNO(eJ42H$Dmc%i6c&qW=6l){D*8d z@BAJ+>KOiD6!D!ww%QwSQJT$4Yz0*3d>0v)w4jQ8Xh1@0ZWC`v#80Su++F%{cP;QsQUN5q%-NXas4ND{!;+nGwwH!KTCtQJi&oUu^sjRy^S~et z0W_XcXJWh}VFP*hFjA*{ z&@PfJCY-eRtW#m$S?*W2g){T?gI3*cx|En$m=5oW*t?Mv#WFca6kJ|S&)YyFC&N!A zIqbBS*tkDM$0oS$h*r_&uqENc+lH!DWTRc8nR&wf?WPs9=`#{N#E6|H=R(w>j3VLb zL`q673d$2*Z%+f4d<;xvR>sV~U!(P~T(D2=qDivMP6ZlKZ%d?J=(m&zO8RYu z((b^)u9$SSI19x0+Smcymo)8dU}|Kwd_F7a>(ytT^40KaSD24aOKtv1f<_|Ia=W(I z|9V7Z>Sw3&E2!qZ8B|f3QcU8Yh>a0GpdZwBhn4(I{XoIGkluJzjNqyGiVCK&l`_wT zWwh-*#CxyFfawC3XMV(HQ>d_$h^) z7x=V4b34MLfv#U!64-kg-kqO~nS5`372s3$YVsZFR24qM060w(f*YvhIEj=6dY!=1 zhwjZZd%m&J9ZWH@G-63;ZjCAQ4r)3sof=OjB^@+A7w82DKDteg5Gd1Zha}IZ0$9dh zsL_3!As;ne>t9crJ{G{vl9w_3_@CBLrQ8dx(4OX2RCwZIu_>7zzmO5jX5^oo_$mHE zNPD3}HWy-b1;6di25Gumrt>0Bdc)~Iqr!}1I*lPb+;vRfSY`ouQV-aDUlkX=Z`yh0 z`D(obkAaFLr4XO-NZtUb{o<2Y9G{}>pF273Yz~_ z+1siD@%cMYqYv9lm5!OAqo3-U;qxnmAsv6V)y0r)6Y{Swg_V-ZB@=ruV|)_xf1zfY z=J)&*1AP09=45o~cw>*M*EL5zsDK*nDipi+hoxO+>%$8h^m>8A)TJH{QY2C$Z7h0U zw0p?jkMa1E-PC9~A$RLXvGtJodh>Y6Y22zqdi}GKVn&>C;Hy66Ix$W> z)?toJbz7xsLtaqBcE9@Xl+a=Q3Ba2~%cd0m)Arx=h#osfZtxEzEluM7JFr=gbQqtd(DEP{wu9kM^bBRt0H_-{mVhgn= zwhD9|VFCu<-GV*zHqJ$GQ%G2+GF6vUhU}@De-`aAc;8k{*!%G}GZF(O7Jb533ky@~ zdyfuugCGyB_$46p0Q@l~beb}m1r>W^>aMa`7NYYG*)1Jxk&<<)qUM~X!=E6%5K(!2 z+0xbWTKfG@pe&}3R5UGO#i9h_^YaPm6h;`H_IeggaIpDnf9_gl;(4u#sNj&;=oo1v zBd+0GRsgS6e!>K~JFGX=DO)KQIS58JJ7h|aTM?KBrJMFe05&Ovlc>woh}6qOn~BD* zAA%L75(T3oI%#?7qb4O^h7*#%qYH}27oLR~S4F8*ql6n=k{h6lqfs3!9z1Zh<~&mF z*N)IqKLet%jXUI$C2x;J;MWNB3=JI87e9UiaI!Er!e0U6b)?BJuGR8-QXYzi@A|xC zAfA$?)UMXnwtXd&5c!snxPRRxEX11a?}1!9R3K_aICqB>q6|fTG|IRjA01+2d6EmU zZbsVH;qKK&nvI{ZNfK_O)1({zP6pwY>10Gb%elZ?+UE9VmV~GY@o$nNCR<~ZmS}|U zId(6zq;Ndzr`Lgq2GH5Y#eyvU5hw}FR!|()u~UR6w@lyKuEoRBi)QZc8mf1BdL~+w(ZfpN8VsulDCJB#2WB0O zQ{Rg~b1VjC@Z%*q!#w^+0I>y#{r>@%T*C61l3+P91=Q} zP4bTxCnD%dk5{d28W~pm5%)P=E%gmOwmZF%o5O2sa*1qgDhL^BeN|!4!S}H!PK87w z3v<iV33p9(!3tKINf(yzCe9uLnUF9vfb8Uev`Z#Epsoe{OGV`I;B z2C>WIYXLRyO;?ih=^U*F0mSQ0QX~l_=W;5T%XqU^;fN|VK=9JL{FCVY;G8J!$A}l( zyp3aP-f4{)#n9KsQTN;*&g7679{Y752gn0>nWk9s z0NFwC8Q{&{EuDHgm7&Apso0gVqL7NHYoAi5x8~0}xmgfpB8!29?`i5!d)&|g$5D{d z%h>TDg0Y=l8w#^(Z!(kJJsv1?BVTQ1XtL==4~5Jx3DY{y<%4Xwz`dizdXwMoHdR;;`>H8?=PdpP4zJ$tbzww$wm!`UxYXvQ0}xt{7f$!7*M8z|btqAM`+ zGAX{rNU351kb_FV=YPm4l=i5&Zv_$9*I84|w%#k!tGGVZ#(gTH9BG*r)|fN@nHH*1 z5uMV^%o=d)ad}W9(99j3OF}@y51*q#G>@3!YII1bEYHEJ>D{vYx$tYpXr62g#FY4i zL`haH@*eQ2^!11P15dw8;6i8()ky4WMy}lfp4-9HU>I1Oocq zvrljJ;Ek>e>{xe9Rk>nFY`-Z9fEz@i^aNa2$(33^KQ#OuQw&KUSr7QAWJcU38zvP{BS0D->l9dSjK zh*Tds{|n4`5EH!hV2>88c1H^)toGeL3N}8aZ!7{1oUU@qxIhUk+|2|l7lk^-s~DGZ%lMWi&&DbU#)cxMiel~f%I`R;h*sWpz&6GT19An{?g{!?db zf;g3WM?wOPJTn-+&uKn!Q+S*4z+XOW|{}lqc6KaKTAi@0M9-T9IJU z6>zXXTXi_C)C(6+2>-^VaRjqmbti1Lrd$T#lGmvU;Avp2uzmlwS0?RT)bH6FCTo)U zGFgaU=NX8)WGG2z8|HLIAf*FLk75qZ>&M@0W%&S`oz|Kdxa$>;fRs~BqLc)Z-Jf~w z=j$_0QD2#Vy) zp^i_0PU=)Hy^hD4iirs*=w8C8ASqNXM5_X)dGA%CJL7^T*C#D1((l`cNlvRfqnsW| zug1~K;JbH)0}p>L&ZZ!mH~6epy$spCCfgeuaiF)ekl$#X#r`wvWqRnb<3Un1vo)zPXm+_Ym?gWp%EzzBxe zZ{APVF9z2m1WmMyTZ*mtcn(MIlxPGr$h?6$=XB5)vBe+(FD|iV=Kd?4Cx4TUk~tcRI<2#o>`}=lp6wq%b~v3rqi!{!l>Orh=w9RZ`_CbB)$Dgc!A_rf?4~sJPRwgA0I7`%?Wt8UayR=h0?2_2} ze8aGbSj^?^1q7-VP#PMFa>+u0|25_<)r=PccGD74!lNuEzxdqDAjPcR_QI)2R5Bbt zUK8$z>A08%C|BF=A_&99di~eC`U(fHkFJJ%-SJgea?)S)n>f0G(CBK!&LW}k+S?YG?3eTZ4gT9&zam6lwY0=x3N$) zd_$MZ3@NsJLLO=fIWiJlO#Suvu3{3|;#jcx!n2FL(K|906@#Aj6BIF^MVh3#^!v=K z_L6E5$$~1$$zJdoh9s9+QoDIj{)6jCbE3=MnUW8{91l_U7tXXM@`%-MHH&vv-Bw)K zd3ui3JBy_YJT}2teI0SVL?Tq4Z>o=(qI(^iAb*Ldo^KRJ7nt6M5zvbxu9L@R{*5BA zupY(;GqcpBR)G!h0J$-8_(?6sC8V6KYA75l@Wim1)XoJAaY*Jcy`)AZLspGL)5YQ0 z#9IRsC6Gc?(Iy}7)_)avLc=}Y0)+90rUlHX?nnD2_LUz%E~`TYQ$hBcVyvusR_6i{ z6?e__Kc2$!2`5sBK0WcYMxAn^n?6hTL0Yp-R5eD31h>MUpI7UpJw;s`Y@dd(X;G~g z_Wr8k?a`eksJ9H29dD(yR6*vNhE|^6?15#|ZLkIllpX#{DJ);%+_I#aY_B>fYnjH| z#0t_dKnay_n^KhJ#xF*A+Dla+FvDz~Q0IIP17|PuQn~IUh9GzB7T5@ENay87*BDv{ z<3n7|Uy@1@+u*(7_=NW&r{BXcAzUdF&j({}!4_P*GCCZ1PozPuY&tVf?FXVHQ(oG% zT!lR+IEYC3oNhZcleH>?0gr*T0V5~7cfHW-C@a?XV>Yrn61Wb~1popAV>;VD-Rt0m zY_7h+O`sXmrbK3#ep)ov($FO-r}H|AG9YN039*+=3pxCJnhj%WNb1b;z3vzT-@HKa zL(I!#n-XFgRLp0TDK;|(hm=`cxC{BaPeKapwa#jhC97g%N14bPYWgMxet-HLs6~U* z_6IaG8*&@Q-y9W-R?qK}#=Dlh6!($=TPI7N6@v!5BawA9nUK}aU0zQbg4O9A<>gNu z%W)0mv`+K)*t7c# zN%k9+oF-u8qsTMJ#|8yemsY%&dSbeVHf{f&Qq&tdpiv3I<3`=WyvDh$TzUmXAyU5R z>ciy)tlXvak7Bg1L$J9P{_j+IzQ~QW9ds_qYZNeB&M$F;3jx;f@9Y}%S2@vg;Axd$ zDDN3amW-7lG?&bq+!i#>%KN|cs@9bQ=^|7lyhbqwd2{UY_S<(U$@dN4=Oi1sSGp)rrz0E7L;X}HbAS0*5_QU=7Cs$t!Nm_)B-jyReMGE?FfvucgLiMmN+*rc zbxzw~FZaU`NpD10JoT(=V|1DQ1PdAUqsC0j$QV1wI+y!Xbk~eW7*ZYmXTbebun{s_ zP?;C9r|YezU>uVPt1Dw0a%%I}JuGnZTm|Ih&XcPJHBeMYDgh=Pky>@NMZ5VkBRDE& zJ;x9vyTZa|H!IEwT-t5FgA)apC4h(>AN}IsR&^bl6oBw+^P*z?x#gR$D_%3bnUu2} zs-kk+pzK0991z_TD_+dYtbaHy7&a0qK+(r3OhI#^L__1+E0=T0W(PUOv1b4MDWAyT zN!`3$;q3w4JJ#?7Rd(_`-Uj|Cj@vQ;yY_b3p_3!$E1fdUS0*9s>AO^-sGlJTcZ|&J zmvB@7gyWe-a0IQ*!l`={EY{(37!I~+#9oNjyE@KFP!CbSUPGsRIkP(mLtr8s%-TK= z9wQH=&HO}Ck2&G+&-QpbgaDo6ZWc#hG}t1Yyq|hM?rDd}j00h!Twy(14-aquBJCbG zpd=C)lhk0vpyIFpKhP{Eo)auz>&|J^Bj#`O!+_B!So8SR84(D3;WtZ&7cS(1A|%F} z3&X>hLoq^-B6wBx6cn)_;qR%l*PijD>!1g&>KXka)_S@d5^mI-)~cU;4<-a{_N zSlS(-`m+1R3Z0P1;u&~cY9}*PpjgCIcNzAv98+>vgoP)6+N)U=HvM}4`%VJ};_UyJ z{z+cgyTSpkB_^TGHfa2O&CT@>UMe!Q}hwYXY} z^b-vo8%_#|LA%>=C=xauw(U8=j6v2|Ab8y7TK$0?&7VI>Dp9o1$^03t?N9Vez|Lp!X_fzZ zA20-4E>OCKbJo3l3N*LZ|Iv(?QNc}3I^?&qnWtmTiL^TyL#M_iDz~oSkapf_p@9!= zYC$~D#O_XX&D3OPUTPJ)QY|Y(JkqID@rqmsqgWhufn=^8qGrd*9SFLB+KmlY4VaFe zlHDO^FnaIu{33x#Zv<%r^F#gmW0A>K3PjsC=j)&}V5n^(^~v%!n1BYD z_eSUlQtn}fy+=mC*4FC+Ryvf!?l0JvnE^XC3nyj%_I8POpHEuVxok9@MeCeeq9!YM zKt=duf>XvtJYT%)4KgM;#9b$F0S|AP=B}qCJd$$9Z!>K$OT2*Fo1nhsDF~3jx!?y` zOD&^z81S`CuKAaak*m1brjyB>CyNqP;^4 zw25%b`?Pd!57}=Gg{@ULwMasRmPmyit;M(NM;W%H^&?P)0Oh2v+5q9)Ki0+n#d0o8 z%I~9~%J@hj{kZCZs~`g_lu!&wiZ^JA{-elKUUd=jstt!3?=fku=cY@STW(WfyF**y z+>`0(dxn2p4WRVri$$`V#1N#DfbmW8Mt0|avS-$9y&ry^HN*053kzn~+J@0IJa9o+ zi{`VblIf-2VI2iqNSz&Dj|;yq4dLWw3&J9x4UH8a=n0H78#%Ac!9+X3(Uuf`ID^MAWSL`FwwBdGv919Ld@XE44Q|etB9w^`*9s?7kJ)nRdLokaN8=bRSx(a1+(?3b6Z5Y<)tqy(!bj} zP0pN~>_=E2ZG|}H-n0i9$rXbivFNRmZ1V7qAu}5~RU*Osyq%cO#ji0)TPEDg+RB7) zLc{H9FP*3K71j-TjsaAT^cJMTRqSi5=%Kbz7A6nxw#rs|?`^gaC-^APU52W>T^8_nk`u#xRUE!(7No+s@);4WtOO>JN2{F+q$YB&LSjdP@8^J&Ru)zFEj_*Q(8X6;2{@yhAT zaTXsuF$O{8)#qEM=}O^UH+Gjv*^Ry1Ef1p>-F1(}n8+%`#W>*bzns~l9cAzU7bngK z`Zc>lAA`j}1h5EsC_kd(X6(B)rNKii*3GdQK%{Yqbw51hapHz#VjB&`7Zj5V_^_A_ zAjZJapgIs)QtM#dZCL;1aP)-AvIb3D#j2KQ3{%6#I=-i<_U8yj=J&(Yd8mH;ebO-+ ziHy-JxN@%>2=U)eq^u4^=vV5fkEsV90*|)Y^a6J#S=qFbeguzJ{R;itfmoAPX8^9? zI+hC|3!5_7%;%A$Bp-^8p?(y+_vghi5@_*a-d<9gbW|Nndzofb9z~1PU()DwonWrD z^gRbfh-V_?Md{wg0lPr^sY&xy)V?W!h|*beo+*MF=GXMqx0>I>uETn0a4Z>Sw;t8y zQWQ;cmBD`Hk2ukgu>X%y3)zXI@Ft@CJQ9K4Wbx>8=kRpumXIr)^d<@>z8g3HmD#%x78?XPo%P)0;xN@=)=u>p764M={^qj$A zup>Sr5>B-EA-%AF5_%1`4s!oK_E{wx(v zG(DPtzXt6mdHbU-2RnxMm?ce(DfM$+9t9!#O>dDVDrhZmVo2xK^}fAYQlQ1loF6km z!<*8q`;KZkCX&fz&lV+}p1n7)Q^}dhEnkqWVs7GYtI4gz-5#m~Zj zUzvrJ0okCBfE`09$D9DwEBCF*PJ%S^r)wf^t$Wcou|s ztG&Xy(W89wowEk$a&=VUM$}3_RYd$m+-hegff8zjJ@%Zix{=o0n1>5+7Opn|NwdtK zr3eH|v+hb9JRmm&`ad>sW~SpCUmcb6Q?grlUq6IH|WdNxD4I^xfHf|8uc zuOIPsHZg7;5@{H+)%zJGB!0eNc6X}Xw@mmW>XEpiz zsDRaYBH#cKa>+bZ-F136eV?sR5{Jqtc(P(eoj-(UJ?HjVv$LP}s69!X`uK;A8MlD$ zNtv^rKTe7E_A9paqg;Ep2jQ?&M9dRen9r@Y`)~Z5JO}2-Vm*pAmqXwzMJsON9ogzb z#m=WZQ-_8h8tbpL6;e?k;(A(oC6A63H68Pp@u^r@C~J&R@wHDJb$wzWkU#!F0)x}g zBi6gR-di@~$r}h9sH0-jS(gvmgh;bsv7JnAHrlo)H|<<35t|z4DzGP(g0NP z@u5~T>8#;ENzO#rc*`;nSw;mtzOhF*#Mnn@Pk`!*>)Nfq3$;42KD2k<@;@fUo=cwt zua<&N`j!3%wSa`29PF%jbA#kZ)%H4e`LAZSL&k?xYSLIv34?)Jr#^ixD@o1R8p`Gs z+T;f1qPxk{1Y+7@a}c{CmE4A2hoJY+p)z0u4F-@C%%pWMh>pyCE-nsjq5F!L86)KX zNMQ7f4XSn{QsR1Vn%QciFLW{h2P3Z1a!LJQ&YnPD=+A6<4zv9%$ze1g6Po^Z|Cd#_ zyGE}%5pvso$R<$i(S{v=vVl(;M{f&j0!HZP&wyU-&D0c`L9Ey2Z9ZDin{dnIDe967d64eXmn z{a5X^9pPSLBlNY5p>9moTehuKfYbT+>B~Eg;y1Wk_{1m&Eo^RGenlrT6P zQVae<#NNh8*JASERLT&t4v3_7t@LiTwj`%K#uCsSN_41j=f3cV<j$rE=E%a7 zawx3+thLmL{3Z&24;M+)u&R!-k*2BQyK%bm!a^{RJ3#~Y$=|CeB*=3yYViq9COhCHKobdS&)l&W3wFSW5qk>Az%jG+H+&sOD?H}zLhhK zB$(84j4gCWPDU!cq@80+(wEu^|8I2p9rxG61CKWHzZCDAs0Z_=KEm^u985sNyOgCh z{{D8Z_xe%bH@);9)p3picae93sj-U`F&!NA!0?MMA`CjNY?B2|T1*X6S&G<`&-{r5 zkzhM9a1xmFF2o>)=UnJ6z=h13>z>VK5J4iisKN_2*GdDGmj;Wh?OsKJs1m(WC9Y>` zap8s0KJ&f(xn8v!IqnAZNXwuFbLL9)s%{{w2V zubkILKc+kz)te}1zlgwX2KBjSRCGjm@f?;`O15&P;MN3$0GiAqIJ)_+(t@qiv;~5#v-SJiO#O79udK2dTQ$hS8 zWoFt4-Q`c#OpuP`q=pA{;yg?H(=6-uq1$oX&e_+8G+^$tpn`cFxudL!Dg8GE*_ozp z3~}CYD8GB2BAYKlaH+s6p}pM8hl|SN{-LwT4}{EqR}?ZM({+<9A zBs~i6XHEsA!r0}Kq*7)MSi_6*3!qG)n!L)|^mL<{&kHVtuVmjOCh90N;PYzK8eA)G zzkE2$c$SOrg*O|xz}P9Hpu=>~0}oujz#KNuH~Ko#QtL>9S3NB*w{)hIdhiNUvk=Fv zI=Jwm1#>wsS0!oW&1KqpWDdHmZ5emmiUdhO9R995GCIuJ?k*L~`h6!AQeOfu6Se*9 zxP2-sG92%ovY8V|X-g|F(Dv9qi7C${+@5cL?D~l zsD}@zQBY#c8!gilr7i0}@S~B{F9W_qmqZz*#E3t6W(e&w3IijF(i3!)R<%ckxAuBP z)GWD_5f_vnQgfBxmp^T=@0(+ggEc)?9&}SN#s~o_7ooX)v*8l8hSsy?$@%G70aSRk zK;B5;|JVU37v#X{+O#PQ5d~|(fI=i&lTN#Mm+4VkjDzHbP0R&x&W%mlXbEP~nG0Zh znOTV8Jag%3@nS_rBeHwD3;&}Is|1m-z}%F3UBJGi3x*Q(s@zcJVk@0=^gUMDku1Sl z=v`Z4Sj zpDu{bs->C5wb(c-_}ppJrm%|=&|G>>|4+_)-=$bP?}^lPN3k=a#&86=|}pE{y$-bCox@h`^j+$%d$eWUOO ze?h!@d56CSpLry*e`zho&=>bcotrb{PEsz>A^*eB_@7 zon3?KR-BQ(Z0eJeP5GiAv_sCXDA|suz&$61K{jE(cC1egnnmCiWu^cF-gLty-#M@w z{rM_$$l`P_?)jIhpZF(d+H)heJOpae<`b3wuZJ$wKTjpt7>r>47Z ziM*uW*gOH+FHQ4PV=rVe&tO|#es~B0)`CLKd&%gQhqYB&J-;HjQ$9Xfh!OtRE+$J+ z)-@~;2m{3*1sUb>>mRP;eIV&_UOL2;{=XchzJ1binzUkprl?y2;FVwivB$0s7}!PA zs^%g>8c`)-p&L>n(KyA29O~-5ivrC@6WKh_CkXRE#W-Htz`yEe-M1z-Ql0WQZQk=6 zRb#SM5)Py4jA7xbJGsl=8s7V!G04yaTvxgwfUstNvJl|L!f!g;H?amy18$?THyb6gu zPe4S7>q+mLur@uo`nB-8_F|2y43ZYe3hzPz)9cdnkH1MGA}Xpumf!B6Fsnad{h47(lkN_4!sZ=Nc8Jq9{^!^;41LJJoA^7a~ z$OHa|Gk;Lxecd1YamH`M?pGbzHGn)@PdFLjw@bd%zBjj~k|mlnKTlnaki_=?9ej$zf&M=i9z+eo zx+_1}X~0%$^^UxLTD`BUc{Yc&ABWr83*-HXnm!^o^G|V&2PF22uRcG5qK^?5AN>(W zVIlwecb%zv?SA5arpu>-`@u`pz3|w*eRwi}+`0D-I_?K+cB}i&Zs(M+NSI Date: Mon, 27 Nov 2023 14:54:02 -0300 Subject: [PATCH 5/7] update dockerfile --- dependencies/Dockerfile_opencv | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dependencies/Dockerfile_opencv b/dependencies/Dockerfile_opencv index a9fa384..cefe16d 100644 --- a/dependencies/Dockerfile_opencv +++ b/dependencies/Dockerfile_opencv @@ -1,15 +1,11 @@ # Use the base image FROM ghcr.io/tauffer-consulting/domino-base-piece:latest -# Update package lists and install necessary dependencies RUN apt-get update && \ apt-get install -y \ python3-dev \ python3-pip \ libopencv-dev -# Install OpenCV using pip (Python package manager) RUN pip3 install opencv-python-headless -# Set working directory (optional) -WORKDIR /app From e284b6cecd362558cbbb69c067756f1d11a9dcc9 Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Mon, 27 Nov 2023 15:03:32 -0300 Subject: [PATCH 6/7] fix imports --- pieces/OpenCVFilterPiece/piece.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/pieces/OpenCVFilterPiece/piece.py b/pieces/OpenCVFilterPiece/piece.py index 49aa25a..e1bdf43 100644 --- a/pieces/OpenCVFilterPiece/piece.py +++ b/pieces/OpenCVFilterPiece/piece.py @@ -1,10 +1,7 @@ from domino.base_piece import BasePiece from .models import InputModel, OutputModel -import pandas as pd from pathlib import Path -from plotly.subplots import make_subplots import cv2 -from pathlib import Path class OpenCVFilterPiece(BasePiece): From 8f23edd1d77e2dd9e98a9160cf28ec58ab7f76aa Mon Sep 17 00:00:00 2001 From: vinicvaz Date: Mon, 27 Nov 2023 15:06:24 -0300 Subject: [PATCH 7/7] version --- config.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/config.toml b/config.toml index a31fc9e..3f3b355 100644 --- a/config.toml +++ b/config.toml @@ -10,3 +10,4 @@ REPOSITORY_LABEL = "ML Pieces Repository" # The version of this Pieces release # Attention: changing this will create a new release VERSION = "0.2.0" +