From 14090f5965041ce764f78a9b649796a69651c1f8 Mon Sep 17 00:00:00 2001 From: clay <20932067@zju.edu.cn> Date: Tue, 8 Nov 2022 15:24:02 +0800 Subject: [PATCH] =?UTF-8?q?clay=20commit=20:=20ci/cd=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E8=BD=AF=E4=BB=B6=E5=AE=89=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.js | 5 +- docs/ci-cd/README.md | 2 +- docs/ci-cd/harbor/README.md | 2 +- docs/ci-cd/integration/README.md | 137 +++++++++++++++++++++++++++++ docs/ci-cd/integration/webhook.png | Bin 0 -> 38439 bytes 5 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 docs/ci-cd/integration/README.md create mode 100644 docs/ci-cd/integration/webhook.png diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 59c28b3..1d7c1f6 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -1,6 +1,6 @@ module.exports = { - title: "Cloud Security",// 文档标题,左上角显示 - description: "Cloud Security", + title: "Security Cloud",// 文档标题,左上角显示 + description: "Security Cloud", markdown: { lineNumbers: true // 代码块显示行号 }, @@ -61,6 +61,7 @@ module.exports = { '/ci-cd/drone/', '/ci-cd/harbor/', '/ci-cd/rancher/', + '/ci-cd/integration/', ] // 根据自己的需求来订,对应自己在docs下的文件夹名,默认首页是README.md }, ] diff --git a/docs/ci-cd/README.md b/docs/ci-cd/README.md index cf86fcb..5820e16 100644 --- a/docs/ci-cd/README.md +++ b/docs/ci-cd/README.md @@ -1,4 +1,4 @@ -# CI/CD +# 关于CI/CD CI/CD 具有不同的含义, "CI"始终指持续集成,它属于开发人员的自动化流程。"CD"指的是持续交付和/或持续部署,这些相关概念有时会交叉使用。在现在的devops模式下,可以使用ci/cd持续集成对项目进行部署,通过,ci/cd中的一些环境变量则可以区分出对应的环境,以便于软件开发流程的控制。 ## CI 持续集成(Continuous Integration) diff --git a/docs/ci-cd/harbor/README.md b/docs/ci-cd/harbor/README.md index 1f1e011..7ef2027 100644 --- a/docs/ci-cd/harbor/README.md +++ b/docs/ci-cd/harbor/README.md @@ -1,4 +1,4 @@ -# Harbor介绍 +# Harbor Harbor 是由 VMware 开源的一款云原生制品仓库,Harbor 的核心功能是存储和管理 Artifact。Harbor 允许用户用命令行工具对容器镜像及其他 Artifact 进行推送和拉取,并提供了图形管理界面帮助用户查看和管理这些 Artifact。在 Harbor 2.0 版本中,除容器镜像外,Harbor 对符合 OCI 规范的 Helm Chart、CNAB、OPA Bundle 等都提供了更多的支持。 ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3b77b4831446430f8545af9961979903~tplv-k3u1fbpfcp-zoom-1.image) diff --git a/docs/ci-cd/integration/README.md b/docs/ci-cd/integration/README.md new file mode 100644 index 0000000..3eac3b7 --- /dev/null +++ b/docs/ci-cd/integration/README.md @@ -0,0 +1,137 @@ +# 集成 +Security Cloud 采用前后端分离试开发,后端为Spring Cloud 体系架构,前端现有React,后期会继续更新Vue3.0版本前端页面 + +## gitea + drone 集成 +在安装drone的时候可知,drone需要获取到gitea的oauth2的授权,这样drone就可以通过携带秘钥信息去请求到gitea当前用户下的所有仓库了 + +当gitea中的仓库有request的时候,gitea会发送一个Web沟子请求到drone +![webhook.png](./webhook.png) + +请求内容中就会包括到当前提交的相关信息,drone就可以拿到这些信息获取到gitea仓库中的最新代码 + +## drone + k8s(rancher) +drone触发k8s是非常简单的,需要准备一个带有kubectl命令行工具的docker镜像,当drone的steps运行到了这一步了之后,只需要使用命令行工具运行: +```shell + kubectl apply -f deployment.yml -n dev --kubeconfig=/app/config/kubectl_conf.yml +``` +其中 kubectl_conf.yml 则是k8s的连接配置文件,deployment.yml文件则是需要构建内容的配置文件 + +当命令成功运行后,即可在k8s中看到新构建的内容,但是现在看来drone只是触发了k8s的构建,但是k8s构建所需要的docker镜像现在还未知,在docker中有一种叫做docker镜像仓库的存在,我们制作好的docker镜像就可以推送到镜像仓库中,并将仓库中对应的docker pull路径放到deployment.yml文件中,可以由k8s pull下来。 + +## Harbor +Harbor是一个docker的镜像仓库,他可以独立部署,在drone和k8s中当做粘合剂,当drone中构建好了对应docker镜像后,将docker镜像推送到harbor,然后将pull 的路径又放到k8s的deployment.yml文件中,这样全链路就打通了。 + +## 前端 +在前端项目中,有这 +``` + .drone.yml -- drone ci/cd管道配置命令 + deployment.yml -- k8s部署文件 + default.conf -- Nginx的映射配置文件 + Dockerfile -- 将前端的打包内容构建docker镜像的文件 + docker.sh -- 进行docker打包,并且按照约定格式推送到Harbor仓库 + .dockerignore -- docker的ignore文件 +``` + +## .drone.yml文件内容详情 + +```yaml +kind: pipeline # drone配置文件类型 pipeline管道 +type: docker # 使用对应steps对应的类型,drone是基于docker容器进行每一个步骤的 +name: security-react # 本次构建任务的名称 + +steps: + - name: build-package-react # 当前steps的名称 + image: node:16.18.0 # 需要使用到的镜像,与react项目中packjson中配置的node版本一致 + volumes: # 将容器内容部的地址映射到宿主机上 + - name: cache # node构建是的缓存,防止多次下载,提高build速度 + path: /drone/src/node_modules + - name: build # 内容挂在,将打包的好产物放到当前目录下,方便后续steps的时候 + path: /app/build + commands: # 容器中需要执行的命令 + - export CI=false + - rm -rf /app/build/react/* # 初始化需要使用的目录 + - cp deployment.yml /app/build/react/ # 将k8s构建文件cp到产物挂在目录 + - cp Dockerfile /app/build/react/ # + - cp .dockerignore /app/build/react/ + - cp default.conf /app/build/react/ + - cp docker.sh /app/build/react/ + - cp nginx.conf /app/build/react/ + - mkdir -p ./node_modules # 创建node依赖目录 + - export NODE_MODULES_PATH=`pwd`/node_modules # 构建与缓存目录之间的关联 +# - npm config set registry https://registry.npm.taobao.org # 可以开启淘宝npm的镜像加速 +# - set NODE_OPTIONS=--openssl-legacy-provider + - npm install # 下载依赖,虽然已经进行了依赖的缓存,但是一旦有新的依赖加入,缓存中没有则无法构建,所以还需要install一下 + - npm run build # 开始构建产物 + - mkdir -p /app/build/react # 创建存放产物的映射目录 + - cp -r build /app/build/react # 将打包好之后的内容放入的对应的目录中 + + + - name: build-docker # 制作docker镜像 + image: docker # 使用官方docker镜像 + volumes: # 将容器内目录挂载到宿主机 + - name: build + path: /app/build + - name: docker # 挂载宿主机的docker + path: /var/run/docker.sock + - name: config + path: /config + environment: # 获取到密文的docker用户名和密码 + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password + REGISTRY: + from_secret: registry + REGISTRY_NAMESPACE: + from_secret: registry_namespace + commands: # 定义在Docker容器中执行的shell命令 + - cd /app/build/react/ + - cat Dockerfile + # 将一下文件中的密文信息替换成对应的内容 + - sed -i 's/$REGISTRY/'"$REGISTRY"'/' deployment.yml + - sed -i 's/$REGISTRY_NAMESPACE/'"$REGISTRY_NAMESPACE"'/' deployment.yml + - sed -i 's/$DRONE_REPO_NAME/'"$DRONE_REPO_NAME"'/' deployment.yml + - sed -i 's/$DRONE_COMMIT/'"$DRONE_COMMIT"'/' deployment.yml + # docker登录,不能在脚本中登录,并且不能使用docker login -u -p + - echo $DOCKER_PASSWORD | docker login $REGISTRY --username $DOCKER_USERNAME --password-stdin + - chmod +x docker.sh + - sh docker.sh # 运行docker打包脚本 + # 执行完脚本删除本次制作的docker镜像,避免多次后当前runner空间不足 + - docker rmi -f $(docker images | grep $DRONE_REPO_NAME | awk '{print $3}') + + - name: drone-rancher # rancher运行 + image: registry.cn-hangzhou.aliyuncs.com/claywang/kubectl #阿里云的kubectl镜像,里面包含kubectl命令行工具 + volumes: # 将容器内目录挂载到宿主机 + - name: build + path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 + - name: config + path: /app/config # 将kubectl 配置文件挂载出来 + commands: # 定义在Docker容器中执行的shell命令 + - cd /app/build/react/ + # 将deployment中定义的变量替换为drone中的内置变量 + - cat deployment.yml + # 通过kubectl指令运行deployment.yml,并指定授权文件kubectl_conf.yml + - kubectl apply -f deployment.yml -n dev --kubeconfig=/app/config/kubectl_conf.yml + + +volumes: + - name: build + host: + path: /home/build + - name: cache + host: + path: /var/lib/npm/cache + - name: config # k8s对接的配置文件 + host: + path: /.kube/config + - name: maven-cache # maven的缓存文件 + host: + path: /home/data/maven/cache + - name: docker # 宿主机中的docker + host: + path: /var/run/docker.sock +``` + + + + diff --git a/docs/ci-cd/integration/webhook.png b/docs/ci-cd/integration/webhook.png new file mode 100644 index 0000000000000000000000000000000000000000..880396d456f43d1b9d776e8021e26a8a149b1420 GIT binary patch literal 38439 zcmdqJRa9JS*EL8IB3N(_9^Bm_feJ3c9fB6_t_ki0cL+}5?ga_%?i$?PrJy(GeNT_? zsxNx{eev}kBe1jek+s*FYp(ea@>Nb81(5&|4h{}QQUat12lv_+4(_G(yO+QbU*=UF z;1`0egoXng91i94zZa5RjM_rK%8op*Pa`w7;s{@ZK; z>^FtVbkg(!FYe#{|J{8yu-bj|PbcwCcE)nwyT{XnDeQz)bcop0YXATd3kv%Dk`{4+TRkMPC8J5BfzP;uk0^mrh?ww z>wh4EgS%)5LM0IrbldVu1bVz2g7`lln)#tYR#sNe`qTV#~Tx@?f@iQ z=Y!d?#YGtqa566{3Uv?k$tIuZplAEs;|W#9!lGCzuc)-t$-zPNC3dY58_EMM&H&csPw$By039Uu$ct!`7hwV|iKGR-rLmR37vD ztLoa?E*`#r?%2`xK@xS;z4+{5qoNW&w*Y?vf4BBcI6UW{59vG8We^KUQZnSq$HnDZ zZrW&Nz#HqI`!3$>?(S-6Xe3y_hD%Z)Xy6xBh;v?xqPj`FO}?w6 zr=*YKTC#JTC*IvOX;j7Xb`i=Szk_jSYW=pO2o2rNFug)|^W>UHUZ8%q>zyeq#IDtj zpb&|V7`*)JGLWFWf&#rp`+#6wADGkCYfXsq-4OQ*+E|0#x~|(Mc33TH1_6wWa1G+j zc?soSdDtG2lCFPl{cnSqn3%J(vsr22htSi*d8tjT3R(aCWo1IZxX070B`|84fWhLRX6M84 z<`O=IJ2yqc~?gRQ=ik&&*h?$@tB^9Ye(AF9ai*fx`6-55o|!|x9a+3E09 zeUwxR-HmotF9az)D4w@#bMthp0+4loG@-6qMl~&4-fYbwP60?P|JQdQJYFE|&y=IS zd)GTKu+Zd0uhjUE6D4#v)Akr27k5$a1GAVaQmLz}%k+8V<>%7>WG7|x_H-`LM|pGZ zbgvnU_jF!Q_p031E_B#%t{7iWy{f*0xt5&z5pw&*gpCx3>G=Z`argBPj)97;@Q}L= z=f`2hY+HtoD45PfjVL&7b3kke1l>8%59e!(fBpI%9EeIX%m99*rJ?yIL^^05=;X|i zU@9amrn+d({KAx2U45{&zAo$ODkT+~o=%iG5)~ZG;xqKFx* zp4sVGs_D6&$h?maHt%VsD#FvCdy+#hxxSI3(NK^idh6bovovN!|1kBowT~oBp@nxG zY~Ht9DD1cMZ_9LvNuadi;CqwHipIU3rG?gYC@i23vZbi0>Au+??{R&kqNcXe>ZO(S zHJn5^qY)$w*cerZ@y*FyPNoE;muw3e>}7-) z;MwrSc1PLm7Gg@CEl=SPY}y?pX_IuGx6*iX7)iuyJj5spuawww-z}4sj-OewL|@*b zsG~FFi3r$x{t$!jG`~JjLCc({=u0l+_PareYh^(HHuP@P`o(8(8jya5DNGKt+~sJ1k=FG!fmNrqnvn0C(#H+t=H)hkZ}k zJ=ZhcK474wz3mZx97~q~?d$AD)F`0{_iF7g1P7;O;Ge0^=JIxL?G!fKZBT!ik4TtT zB_}V?=dyuru=ZHcppT`WCFS0UEP(6EiOR1{ckTL8q-%^?SNL1SmUDt;y!qV2s9G^O z+W#&w*2Y*YcsHuuXf3?T{^M5)qi%R~s{2-P^;ox3wyAO$SBOZ0rV-8Wv%~Mu^QH-T ze5E(9AGYm1U}4(4AZGN%I#N_veQ$q+UDHURZO71RF0)lNA<~Y&)yVYmTIGqx#_R7! z%`p)(_2Jn{)VP2Y)TZ9c%bO5AI-SQ}V$bmSL*3iZ_6bf%R}lubASr>R)#m={*^HX_ z9HCa*A@?pbxASAsoYS;wYmV!&KVr|>d}cA%{Y-q!^lOLwmg64p+&?e#N?ituoF7Y! zuCidGWJvi@nq!!f5)a9QF(zza3CpwW>P@mRb>Xzow3|!X%@R&W3Z!tfOWJ6#{}z@w z;47L;qPx7=0l(HnFDM9YYT_d${Z&)rI8&xGH8nMmz&Noy&`Fzwf#E5X**I&BxYCHO ztFrgo|L!_EIQV9m3|;bNs6ZV147br%AgTqqi_yIm8VhR7wx^x5X3#A3m@t*1C>zyy z*#HM`+z`3Soihe4wLfb-GyK{_Izt4?}{ashe zJqXJnqrkLBnPznPgP?m&b93`msYacphP!){HWM@B^G2C{ad81SvtR^8$G$M4elzM3 zUS;e`O4?41jB2yD(E1;@;Q54Hlws}khec+|+wG?e;*)lZCqcK-O;OtW$2rUTTfY^% zF~Pd(YOOYJFC(K3z@Wh+8AGiWR|j*~M@!G)13;hrE5XNvk|c^7SqHpfd7-kiijpkhXiaaujp=^it*2zB7rmS21hEO1^FlDgVio?~k;?&w%`m^fv5)i}W zxG(aily8>elltrahz1Rw5bz|;=S~$p?7JMJL5i6;rtsyPtHe#nQ3T}guI$g@jyMfa_N@urp;vB`rU^JTZGsGT0~5~MmmSwZBTD? zl*uI%r?Ne%4-@^dcyi?jecBkYVS??~?-p2ibL)M}C}7`NhI$|d_`=4%(qIirL=49t zM8pNhkS|M|QPRx~2*fyb4X_(H#K_5wMtW`Xp>rG-hz^C{CkOXezmK1oyq;l75%BNr zX)<4`!_>gVDNTOZpk6!Kc(!5S!Gpq{LQh?|dY&y24-e-fG7O^4wMG$^!5s zwvcy;gk1FPFhPwz0;!Q6{LA@Om-1-gYdNH?@L;bV?XqGoJiN`V5%4erZxtd{-?PX|V8zLgN^_>nS6-tedn;~p2%*jl$$4yRv`$%?a=)G_ zF0M|gC!#rj^edOIcm87RcEHStYIz`}%gXdMR_0XhHond4Nz0|q08My<8L&tIl%XQ1 zkG;@9VaycupjdzHPWH-e7?*Z4P?7Ay7pVhmEs+9&3Y~Ng0V(<4&c0Y`D=Vv~n;zkq ztr+GByCuLHNghw$IUlr(BFX~_Pu94El9o6hrj<6ca0oRH7u@YhtJ@BK?MuWWu>Kf{Ngs9Znmg3P?5 zqoYBNTZ73u&Cd9Q46$)>ot>oQmw`Py?0oJuMm8H{mu(L}+dc*Wm{JNP>0q(eR*0_n zJ|re)i|qyJpAcD2he7_Eyv7Spgt-y?;z+)C-EvhqBxRDvF~3dotx=KQy`!O_VM)3i zRY6e`^$QHX?Y+Ua3N6#Kf;utzT9^>KC=N`}&HdabEk~V08UwP2h z{hq_orbCoAI<*>Qf5Gx+YJEPno))yZ%Bte~lTb65=|p{9<)WY}|3Oppub5+j`E@)O z!Cm-GpCKB^aeH<4c4Tb6c{_ z=Mz5uIqmJGqqb6p_dS4R+5{SmQmQ}G*b=*fPOquEP5ExVJ~E5={7> zyGDN-tEtZH1lugLoY&==&wl`upQVcNhhmWpzWxC~iXeD&vN(f6I(P@)E-Gd|EjjFz z4+_~IhH_YFfRN^1s!?r%jfLg;c)JadBJ-5V$;mQ$0BnN+6ot=C2g$*~K?<;?rhNfJuIEc>|n7dVk=E#U(WgLSC=)3_;(+(7wF_a1EJT%r<-XXykh-WCcuA80&$)Z?i+e6-86I&-C zvoltOJexniod+h@D_uFoqhvi+siIz!k{gKv%#Gga`ucf4efb9=PxaIV8-OG*9>4)o z|Dz*-16T#fDKT+zpNlc^qoX6qr9%?gBuqP+yUyj54=Htx(5I0y)7iOS$oWMa(vnge z)Vw8Z-tJKoma0liArtdx37t$TzjbH7T!p5Xp~E{3F}$kwGfQSf^ZXvZ*eEZVck{-fnT+X@dHaD7|zL)j3G$1kMNOKPU79YjgQ8P_(XxT>OjK^(N zzIGv0h5BPHwRe0_kX!i)kre1!Ya!V5K!RUSbmZ@zr7Y+YcumP0!VjmXc!BDuNA8pq zP4m1RRLD=WlH3BnA~R~HSE#FqSvofgnpWn;CMkAFK%mJ{MNtsft04}2%MgDd&yK_@ zRCILSAj=!1_ybuDzyN!`KP_??bQ{YA&$9dowkB-;I+1}wR!qyyH9`H%o7LN{wlCD% zY;SIIa&tc?^TW?uBrO~|G4b&B`StM%2`(-!G4Zkn9efV-9*d}vd7~pY_~$kG+DvA| zEXJR^tjUDp+~I1ni?{<=uKDfO$3G!AmW@9+I+#pmj_Qkwiv%1Fr}O35Vh2 z^mO(7R;^5X_wF=hFC+KxW4#(Vi~5BWA@6u&y^&3B?zY~C)O4aKiMhq>#-;I+k7sLk zoaBCtoSgA<_4n7uV0rop+QVE+fXHC}qYb!c?+F1V$8JpC`k?V(o^lk{PU{`g?EEd9 z?9U(&gQ&?D_?&onQOM09)|TXKjIy6pQe9$$k1zfV4u=glz`HNaYfQ$e zNgi3(%SrSt5773SVu`p>-OGe|C9ST-S#o(k@je_nXqu1c-ewA@n0GrdM}>Um+UT#Q zGQUh=If8A6x84u(xx~?BALV-g+_Ua6W64m)P9T9}wt#^CHBZAjy z>FGKS4(H`4bB3C?#*k{6;X7l(Ko^re&xcx_1&stUOj_6P1wt1P4?%`C+DdlO5;sye8;|3M2KqEQ9>tA`K0Vg9w7N%vGAB?uGud?V8b(I+ycX_=S~Jc&f!sH z4AvJLgto-o^!1Z7^Q}EE1%l&C{oo@!F!ws>9Aa^qXJt(_l=NF0wVosw(~su%P&o*D z=~d<_bI}L`M2FmF(4tzCW!aVdsk9|r+Ng#n?}guD{w-(*2L_Q*QUClIv)5`8%|p^c zH}Al2Ta3UXJTpGE;s`#!|caC^u0ibUs2 z|2;Jmji0X!LDK4m{`#YISeDun9b==Kw5oJV5PSWh)fNwbjQV-uyvsf?)UpC$Qe7gXkvYEc6$l6@gw99CgAy)w>|1b%GKv}{OtI93Qi zXiK_NFk4z#0SpGe_ruNPlJGEo4v4?Ip&>WaJ^yNCUhk^@<{M6sSJop)px-aADn53ZswZ{Q>edw#!0ri8v|+dG;w2 zz3WVUd|w@G@8r>;q$ZMYw@#$^8XQGVPOx6*`?P@52ynM`B@lY8+=B9WkNaU;3XJzC zHRgOyIgb)U!LRpdSyB*D``-&mp3XfJ48=B-+)IfzXTxLbLQ}LA>d`)RY*SX24T&a} zoqkQ2$+C~l6OF%!HZGS9anpBtWlvg9^Ahq&zl6!FytKu7;ujob zq2zTZA;ExGU{9K31xT^Gy6@k=GiudgVPVB3B+y|Y0t`P1NhUz>Q^CmC*v5N$#69|; z4x9JcIkZ5`K#}?O`#K_b$oFQaHx4xx6r%(HF45DMvQn?3-2<-RKs~&i0FO-hrMG&W zf?~i7;9VUoCMnpEk&A4~iI<+vFq0ws-BBcM0Hb~gDgx*Mfa8*tmv6J*M6C8@rR-7i z_mLZK!EepRcPtc>!@TKut-HxtA94eF`1z&%MsJgh{dRESv&@b@@MK9o8-u>(UU{L2 z5;hAB>*dKQR#^`h@8B~{1&T<%U`6cr1wFn zNO{*j4)v*D=hDRIohFGN>`&t}k5KE#>qCwfw(%f3=O>zb^9>A7Ps@+G-@tlmU%DLR zIrvek5uB^Y73*zx@al=$W(Fe_l!&X#TPq?Cg5D$86Y{86zjtdS(k)4TSK&1AuND9y zd$+r8W1iw#V#(FKxKw46Tcho1%K>RIxUiP%{)|9!;1zxGKOC7=ZEaEepBC&98W*YB zeYB|r*sg^!q{-xCSk@-$u-+YvcIp-VK0dMETl%-d>b$zmJ~H#Xfs2fEkA|uaR)ll> zbAxy$UriOCS1HS{oGIuYjyz>3i)#tV;8iR%_}bCJJis;g|2hkE|k-eME8K%BfN2S z0itt5B4?KlIz5!iEhr$sumn_zc2Mtjo$@80eFxU%#0gURp|a0(lVI>uuA{OKoqY+IbAHKQxB9HOqO z$LBCi83+w|GgEi!Go_WL(pY-)2summGd=xzB*N3DyF)OOAgRQzg2bkKw@Jy$59ckx zp-DZKk?|4{AAjxy9z1%4^E($e+r7xWULt_w2M01F^BTPN7)|{x{UA3KGS~#;KFXv~ zE3f`W;M1o(Z3@ZCS=O^6bZnx!jM-CmL#md$8AMMZZmwMztjv7h+NzY@Uv5c7Pw(SW zAm7oF!Zz%(TqB2^v33eMyPMWiDd^XFi|S<}bkBt89Qpam8#89f`opbcG@S|&gu1GV zV1VTAbdgmIe1ylh2fGe>lirl9S<+8$e`~4LJM9|-&IaznA|0OK4uqV| zj0lXb=-AsG@K2PnAuGbmLXFS~8Wefxsj z>jDFfyaylyl>V8>sex*;yB|V{C}ZMegxNkjjk^e|eG(3Yar-$Ip!xuHD9 zPh*$E|4~nTZ-vtjUe3xtsFp6}xJWi8&vB5}<&XCcqw;ssO{>yl)8D=j24o08aIJNu zZz`y*b^80efLY={l7*$QZ41%fO?wl^?sdV0TX4I7WVN>KdiQWT3aV=qV%~M05!9e8 zvH7%NbT*i|HIl{M#%D4jed1|$VS$^Qo1ceAy@_mTbaK+jCdwcCc{t#9Wb{x(O}EdY z2Q~o#gL`}F-2A+dT^R8QoMKVrWGpmx=qfrI%{(?dUGe<}O6-M5|f2#aYO`x4< zV=0^#`7+7RC?P*Tzh}7@KyrGns{zE8*q`L_S-$*);jiSC z#)O~G?ogzqr4b9b{!*s9Uz}8s51F1;%~PBkA79(p=+uqmF6+@(bLgHe3nc!pKYqRm z?(SIvqNnErlsA_3sCH>Pl>_bV?f2C25pA?b+5v3^bu)oG&i~K`A@~1tAMoRUp}a_4 ztLeY$pwVZI)lU72Hz2E7?g&CNE60UR)a;d zOf4)NY;7w5EezS@^Rxroccw+)^^m<-z~X_uk@3=<%zx!u-Ry(t2 z{q@_o@+lmBC8hru{C97_QFu$_DHL_5S^PXD27)mH5VNcqvYs6^(%44l=)+8g>!uPIA89&+=l5d zaZ+A6aKxR@`&;<2<0)*mR>> zh404Qa*UHhc&!zPmfeR|Cyi4%JYv`|V+VTdE2V3zs;i+;XmXUif&zMFJ6dC7;}U|X z<4w3}?Xl7NJ`26v)wH=uJ=dMpsd zkR$YLp|p$lgvpQf^>eJJ{DAm0w$GgkW$1U}AZ7{R@4j(aOqZBhT0X3WF~`Klj->M! z=m?ol7E($ll<2iRLa&$k-7gAHQ6$y`eOwz2{0d=PN#Da;pF5r2+>!Iey6d@nP=-B6bY1`#;)<# zIyGfUI+z8-%GExBva$|>CV?4}-`W=el#EqXY&JH>Ow0|kDIB{1(~Zllo5o=l^CL9g zceD^MJrMU07yMOy8+=$+jq5>46;@vBGM_A7nl=kl8}}+JEBo{3j|`pxkX8(aX|{Uu zvMW;X@XU5~Q39EjO}KkOsA5~ps8RHZ??=Xg71J3tG=fW2lQlJiQ@o)^S{ZB-8#E|( zUVZgLk75;1yn%>0W~`H;fJ&c1$W@@OZ2`rTn%ekvpTQSg8}SiEh;r0)O!j|u|IzD__&sS z^<>eeQ~UYpMGB4I$K~_$O0Y9@OUzMd*RyE2^-$opm6D2wtsGb31DoLJfLckxfML z2E-sTIC`TGD}OB*nzZ{cp;I1&WljJR14hM6T0}tdqi;7}{52J9_~xOSGy0?GWZXDw9bDP->=LhYonw~eQ7SS#O%5{~RttPZElSoAT) z)AzvRTUYY^q#KZtQAIF{@~Z0PZ_4vVbIQdl)&D`R&6rWKQshL6;h<~_PS>j zf_~XjhkuY(XCL##+cGzA@4rhr(m@lq zB+eMn#ogG)2JfP6_o0a04A%MW@rV0yoLD`$B-u6;QAZ5FZ%KF|G<1-)2oy76D<`|H zXc31FP7XRT@L@{3eI85j(u#>r2pw<%Z;-&&KI@AKgqeMUzRk0zhizfdMe_yJjVC8&iXPKn3<{XsGiNrONtdX>7)HiuXMOpt>pSBW~wV}-Efb~t&< z`VaJ)l4|JqaUphnJCwY_$k-_@{5st&+h?{XYP19$WVXG;1l=~~hF;^AI&x`MBh%8+ z+1uLUaa%9K?ysYW_*GR^uRxn$)b&V9IzHjyU>+6tFkt6}o|_^^+r%~I{088|8*E%$ zOms|xZ(Cgw5)!1@4%@>+8G>3KxYe4}AXe<=;KHi~mGVPRvjJX(0t?lOdvJ-syB(D~ zFdjJoTh8&|{fI*Tp1Qu_+X#T*$9GN$gROd{vA`AVC7c>nUxX!1&-$+>Jku}UYFG)5 z?6(chMi@!$?=n7&_&hq?o*8dFy+*>RI0nex3qYvqvDFywE{S$GV;>-R&S8?z+cq<@ z^i`akt#d8BM{0jGU+x`XG_a%(FAmuWASenodY*G?+l_I!_Ms*gzWh|U@jDs<#O3_2 zw2-Yn3+J`asQBatD2`|8Ej`*=^Z#7$j$l{cb6Re31F!=?lpjN{Goo$q4vPz=aOgp? zm*>X8$ZrWkuc#BFuo0MP(s~jKjQjZBWN4GnR{`O7aMa|N`p#cB1ERgaigUl<`B=Z% z=+15xl2BZ3|jTx+OX%b!LbO8JSM%y-fXf_meTat6PcR4 zho4iwk#0lJby3f@?nw(?jw{)%uLYsLnw)-xPbsi&#;9M!088uvYzG_yfw+WSlfOIY(gI_CMuG~{R7 zYsp%m(B=>28~{#oJKrMWcRm2}Ke4Nj;o_ghlv3Tnpv%n*bLD$mgn-oLfkb0UldtN7 zmQv7PwyDr0j0rYs=W!3fWl6R-Qhf;JOg6)fYw4rE_ZF{-Rgm}sF>q>$pHfKVVYBOK z&z9M4LAEnsRCD77yp1B=g7A(Er5b=ffhhvq9BTmG`T2PWXSf`{1+8?@A3acKr=*S} z?k+g6P?SpqSB)GoLNhIyMsB07h7tH`&}CD(4i_68fGTuWR#uK!gp{nTpzU8cbVi+~ zILSyJk1Gar{Pb#v{=m>slzP;X6!(Z=5Fs5MUkTa#SA{WMB7@zs(7dK=3c~FAy-fXJ zAioL>418`#$V4{=xiX!Kxp|QcRVskCdX(R3sHSw%G7QpEMD^Negv%Ao*RLm6Fr0gY zD0-2lJN;0*#xRXnPaC@(M3VpA)s@%Oq-nEy?0wA-^{D~sbNnXq0=4QkcGMyZZw+?B z{~Xz7H4FaCT7cmAi*?-)64Z{_(FEz;Xw`=3)q+2rP=$S9X8FvNmBo^TkH1HHsRdvN zMFPYWC=k|y$GmO&JxsKtt3TN);SAB1%oSk5A;Aso@(+s9E0iv}xtDpOQIcj9 zKrrlJdim-VGcb&qnNRIV%q-Xe{6shf#1F>b%%emM{S=en`~hrB)k4L7N^eKk<$vD{ z7+-G{Mwfwcn`ik8xL-3Vf*#I5BtKee78Ml@>HYIZ9}s!ZKW8C8>MIKZG6Gg(i+WT% zIp<$fZ|Mx?-iL z=#ezE?*iKQ_ROIOt2dsl%j(EZ(nf4sWP<05 zFvG86iRUlP6|pZc)}4yEl2~lWqyP9L!Jr?3KABPxIbNaqgkiMNUAu=(RK+PMD2N6k zubv<<3ea@K?V++IGjMWV0*ONR{m&G&KbWPH7alOr0DLf_akZ$91=~4Yz~_Pa8K!yW z;XSoO;xmtuOjnL;jV{Sm zFwXr=C3<6d|MZ1-=0ku0rEC-eL|SH9Z=-%Nieo*?$i${V0RWP~!~;boL+=VI$B^?r$0N=WKN%A*h2@5V?`54Cf3$r>?c4P1ReE9z)S$r zvy;DnF860_=CYOWt12t)ZqGKmy1Ibrz~?lNqt#NHDf%!#oJbaOtu0l3(Sg|At!;`y z|NHFD3eT4>0_2GAM@rsiyqep{1gTzBOR~#X74zmR_znPJ8l=oocHRv)H@7fc<|BJ! z6YBxuBr3l#q&LQC0&X#qZ~BIZGk6`S?wRrw-4141$@ze_EI_`?&rEM>DI}ng@F$V1 zxRhFa#Ts1ixbp^YQTh-T3Qj(K2RyqGvR2-S_}&A3OCo?}GQ`|RBusvG&h4YfKMX*j zauMLS@P!jxv!AmR#V)Y=z(XcB@d$kh8FxB4+q}!%S4YXE*h#_+QRO5Gg)>ljV9<0P z5U|b4Vh7kT*^9dU&BCIv4o3>tLR7_Waj){!MX6;7<34{J=(oTl+;A$D`s3JE>r#^# z@$Dr64owsR9-iyLY$bqg*`4T{y+6t7H!6LN``!x-$b&ul?d`72WWO?_lgZ4G74;}{ zj-}>2E}#R5(w7qX0I)p`4L3lFIlsBOx=Kk&2_P!tP*9S@MO{+9xDR2=J|{PM6YQ`k zZ>BD7VTx?6;+%6Ny_>7j-RfEwE=e2!w`lYjS=|2jfRj$|A>~_tDmif#lhZHEk`7}? zRP55*{V0wmkHwYHE9vveRUSwnudl9J-7ojL!f^T9dJ}*QT2+xk0ORIpt#`28^tTZ|2}rj$io+ zySV0N`A)Vd$!UoX@ky@P@dJ~D4D*=`WMlnFU;Cx7s@d#nZb3l!$T3({>^f-F3{{L$ zgIEZ@Yge15482wwWSap}O@t8Dsz^lH%n9Gbr;uQK2Z!Va>W=R2z}qcepGQxCcL4zG z>UMFTO!HqntaZ)e*2O;zuR^_Jc<#Ejt6q_+T166@zDYHq#<@T*l-Rl^yA12PeIfI1tHrvaIY z%}VRiBuaYJwZN_YmqCl>R_GS*()oP-+nw4xel?Opb@N{bud2x0+q{VbNwa~3h@X#d z?=sO}Br7LpeSKJE7nhBf`Bo->PaQ>FLk0wt0u+BgAbpBD;5 z4$V9EdF}}x)NsYg(-njd)e08G?{+pZ(WB`-m>~`yIJ~51<`h^1AV5~6A#4!E$itJA zEUhjLQPu@WykLO0*#r9K*)TjOiW-hpti&^na!sL8dRM1c&exr!;oppmQw#v4sW6=T z>h7?3EbMrRIKy^iN;|Ag?XQU2flcOHV_y^fXGuCikp7-BG zCTqbX;8Ayt=#(b#rA`lLL)iGYi~&ZBm0L&KajzFCpdH|g}m5Y*gLx&&ZjbO#-j`?qUFI@3-oh_t4L@lq<%?zHUunh zU%Yu{xq-8u5`3U6B)-_{9ItDzwOaynjt37${eztYB*?EWE(HqcF{@fIk7MlS#^UXu>|J0d+Ra$uu^IIODbe-e0(k8XU~5fGblA$E z--Y*+PLZNcV*zH1+NA0#chf?&!i)kvBqRic_2I*!3YwCt)(9rF$SXc{U`FDCE-y5e zkg7af|9vT7{+R42%APxlvL^Gddn%G_=b3TTFwl#M$)fd?WoRH4XnRLuuU_Tw;f!vM zKir} zl20<4Ox0;|tt>2jCf)%;H^CYSc>j0f#U`hLj*fL!;-sI?+wDd4M{ljb`Kbc3R;58Yt zKGna=&OhN2^COSBJRed`um;}y&nCe5|5?T2e>_-SO;r_87yRdyqs1u10=?t16>t}c zL;AmgC2;?D`3BCF?%UV@mU8}Iu6)Nzfo=S&1^7Q+g!vy``v2j&{r`u*G|)sohk5Pv zBaiT((%dKsGEf_e&RYOh_Eye^`ybw-5F;6?!6&soRs>Yqq|`MvPMUnQOl(7I7Rl97 zte`#uKQ`~Ti{ZI-mWKN?Z!&k6y(29W%&34BU8gwdTk8lbsHN8W&#xma0OwlqKg9^z ziTCDSM_!&WM$}4EdaOliA2$T9pIb~1skHG1E|)yN)OdY_@v6JAW)B6A$x1D*aWsqs%;Qk(w9-9za08~3dO zYNL0^Y0m7QL*JuXNJNE6gO{9<4~&T}Bh8Tp2n6(yNy&@iwXIHES1a%Fh$u)Go8nK0 zn6YlG;n1T^yV?ircJ*-K)p_VH8bI_0{3{XlY^}F>KWKbBv|CN0#s8jP-lBloETitf zRF_N$fl&?bZhiQ4NuFX*szJ9MnTt4Ht4*ht#x=s#pi9H>iADG;KBC@M9j-0L`5{Cm zJc|3P>Ik2w3Bf~i?zY>5^$4FPFwL9KAPT(|pJS&E7g*KYRU6m%iqD478wC#m{d?y5 zj#?2r#IG7qr3hmGEo$-06DK8P*wuOsq7ea+n5gKOxga2 z3z)rsUw_)V%e^A=I;Z2nbbm)m9%Hn{jYbp_#-H65vlYLmmj!*y%f~#}T~)AyHEp+Z zTGxVb<`7EoRW4b4tqcs{YMrEHIIiKpdc&my|OE*0(6u)Zgj(C zIS=FOS`QsD!NEUPM@^ia-fcjCTeDWmkq8wk#Lrn7dWUUJvbQSUtgym4;_#K47O{?h~q)Ub(hk>80UxcfTpLIf`D) z{=Q7~4)BkLfFt@|5D1KV^nT<>d5B78b8|px7`7)-y`bFkoJy@$Ow}84o2O-Lzi)a- z#$8B`9y2k64{xFZWP(?FouXb>(l7Gi=b}}Rt2Q@y!GHcUW4DWa`QT!xrheeq_Dx>f z9R_@ByBCr#RXfKs8V(V14?`M(7obddnA+gQv65TrSmHU1EiCw7B>R?6>`yHXaB?De zAcE*$a`afip%3X?-<|pk#yF)FzW*Ks>`N|#-EFqxYb732PsYx4l>@t{@8 zY!QqavN{Trvs*E`VfV9RI}d{54G6(m8$W2T77m}1A-Yz>FlRTj2v1BbzZ=PGe_+)9 zv|Dg%;mwTb#l_B)Wir&n!c8}enJ9;3pk{h*{n2Aw@)~lVq1iX}re|Ak<_N96k^VyX z7(ihz&wgJ1)s|vg(3Mn5!j`2Flg<-jqnz`n$Hc?i)9^^#{lOx^Klc*ai<<$Jd&JUz zG8)2S`94~*NA>b}rT6*;Beu%59W}D3f*gyBBdTk}xeLiw)N?x)KR$c4Yjw2d;ooKN z)zRsDC1#1QrAc~+$`~0Y4)kCpm^eMZU1kDmufHs{PnXgF&a155P~VcliwO7nvVE5O z)#6r})}Jr2m$$-g;WVoUl$-k^#0tiLLPVZ8LsmU<49*ZAd5U+teT3w0vKFVn%T-CTgnA?+QZWr$H(gpbVQq|gV7;e_C(4r4;R&xI2Vq_JyuXH8 zT3gdA+|~~~e|tR2n_~`AgIR-gSrv&zf(}wIZQedO+O!3Pey)HoQMYAfY9>99op7kx?d7-NTNmlI4(oVdG@O5vl^NO$$yni_|PM49SAGQRh0pUe8k85 zrj?MsXepLV1D%SToUTFp__MGDJKcv&z3So2*>%w5hg-qNJCDfJZ+M#n77TGefkZ_R z8TjisJIBvsIr+Agke`-+_>;E~I`5mZ5FLecCvEM;FRDRY-@aIW-^HyQ0*t0l?L92hE!er;I2HSzz3c|>8n$#UY^D<(TGo6e@t&uZQo z?yGa+Ijc9zVUYJ<^^H?boeQE6&sz7@ zC~lz}_3PKTd+pX7B0T!Plnl;B8uxS=Ck#?wlz*p4JJY zvKsd&8S+|^f^w1QXCBRTMb;dES48->RN8G*~jDJEPFBw|TuNv#2MNyd@G&%LRB3q%3&RK%Z2dh3x zFsYrIn83(PTPZL{R36KV+}4YtL&tJ1L$Q|av@f6M^^Im7n=kVG#RjrW95 z#O52zeszu17aGSZ^6XkuCovD z^&@;k)#PgK7N@Dn_z7Ayo$qoL4AHOFHZ;oWDKAoU1HjWwI%+cQr#mhe1_hS)Fy5$2 z0okSgJjpM~jm>c(Y${U$D>XiiAzE*W1urc2-Ue;Y2YJ6g$+$%ekVf&Ve-?}*p5(-2 z9@C;15L}R{evkt`x2vYhH>_aC!LLkvwi{?_PP#l>W=pEm(6lnld`NScC%MDxpz-_j z4_=GhCC@KIVC}~^E|4Vm&mA#TGT3H~w}RGI!zn`XO83*h?fV;CzXi@J9tlC$Qb$n! zfi`+zT5BbxImGOoPiSw3M0(=nZ{fO~M>45$N=gX_GHMZ5_0ZQf_jW!r#d$Wp#jibe z+7J1u8>3{{;uJ3;rGMq>{PcOb3IAEXc8sd`b+hb(5T2b`ZZ!X2ji)7-Wt(JObc!@H*RSm&MZ$5ds)3n^|!Q0 zq@Yg%q_>CC>18Y>z2oHXi>rC#Fh;IU!#e#31n}%^T^ypL z9Loh$lLnz^>jL%dLt`B6+gXpT^=zv4nm)CJr`lO;E`Mxwyf|5yo zWN4?2AUr}YfkTIG&c*q1l|Nva591G>6!yKvIGE3QgTa*{8aDtLTh@t+13QhXlz8LU zhP;!3*M~Jo2okgY-jmb*>(M9gr6lLS{-&DMXS=PC<}LVX&BM*P*2}K_p1pg)^NznK zyp&{+g!*ogWLD_?;VF&~t7CVdvASSbXcl=wqsk2s92X>r!bIl(xo=6R>8Ky_^Dz+a zQoVDsrW<2fxZaLNObwkqniVM||1h~#I9nq=S=}L86i;rxN_307Ql*E7En{8js9BGC zA42CPn*PSPB008G*$GsqJa4wyhtig1zdEac!79@1>ek3f_x_D@bj-~d>_b00$aVcX zsyO+&bvcpJv*uQQ#d_W4j2+w2L)Z+12tRfOMZg!d86UyE^RqNHR`;f9-V0IPCP4S%bAa{c~j*<)wiE+i{PdQzlpB6B41P@qFd`;NfcK zj2M4L-vHdD{_^JfT^NNE9+qfHo#nJclfs_#B&p=m%}!l#m`2uymk*}jV&A6^&U*FQ zmos^iwr2Z(g~PbVx)(S6OUL$0W_HtN8+L={%rwrpmOm9a-vnM6J61d4Im%@#tqa){ z>@laAXO|dVF~riTD!)&jKM1l^96OW)-2|oAZCt0ukE;S-4<;4kD9P2C{LI3v!f*58pO)uqM~&_B4xLg zk>a4u9Rhs$^vli|XGP!rI$e;$Kt`{R&wH2~dbG^T$e+t)>jiF;@vWuy-wYC|U(|2c zPp8TmII#S^&>nud0xsCJg!0+*W6-pj_fw9_|vJ`;838d>KDR9Y=EGu%)P`&-&) zliNV4tD(+?nQug^l$C-gQg(SGrpZ5+e-w z0S>Z*zpm-F!T5OenfU&nJkVxa$$?t__Df*;&r4|WFYJ%*rCfGItSvQGLY;2WBHSk~ zmS)4sQ2&!3klr_XGQIcBw2yD(_js>Cu4WNlNyca|=#%RMK&D@6*P83!n3!L6aV1-4nM;8; z!Ylc}ds33_fMh;vdbCwrKwpacD1RR(@Dqe~;o{>=Unfq;L>MiJCmT=d;1dka_ffzm z`?g8)f5Mv$2-wNC{}Yh@QSlKMu;~aqoLK+Q7v$$mfc-U$@9SH|Y_0;84AN~7 z(0Iux>3=%(-Qo)zMZOK3(*vH5itUiQ6C|F1R~mT!(0x+*uM#c5^#5M{zgqZ`4s4!R zL~y2e;dtJ=TtbyY#er>t&4~i(p9KZh6%ls{=rD+#fWvLFk;E=tue2jc`L@DY%80lB zVoTA4C=4E*z>O(|Tvw_F*cIjEAQ5B=n^<@MWAfzU5~%I^Z~zL#wZIL%$mKhI1T2It z(*<4r0w0s{*}WwBN4LdxwNyz1&lyV~DcglfvL!JoH`iScUJwvqHvh}g_fb(2cvMwK z-fh0&{DPfAED5%G{ErbhWdSP%f)Dt0iMgg9kvN4YVYhuxxN9GSC*WjCJJ|4xsZH;H z&9q5jZrZ=`7;Lv*UZ!mc=#ed)k&DTT90Zc_a4)#{x!#~(lsEl7Y-4{0p}wnQ@$cyr z9C1TnOjRJ8C1mr>>gUG*qw>tG;`x`>lF^kx~0ntp$mTkGqIlI`B^}{}@yGFo?r|O&2 zTsu3s&^c;c%Soh*#|mlIZ^UuDwlsJpJMz*cOEoBaXaz*7cWSZb7<&IvHL`Wb$j4{( zY8WzgNKwn75T*ACXNQ#Cw}U_AyZidlT$Ml&$q*h-HocmrJn9QTVa!)!ZyhdLq;IC;1(Rer&Bp z|15EwiBCCEH4;OAUE3s*p8E#$`MbGuLsC;txfxW9WvO%E(?e=!$rc9ol>5_mzSIBv0?%hvJ^$>`^ zTjxnoQn`^ae4LJ^lxOYQy)RC;zB9D$dm|K6A8+8*a2 zMD&+i3(pIi7 z1_BqE^5YFiAm^O{N-ma$&3Pxer19dG#ZmjjE_vO&uR(gnT-7|r-##SZbFV;X9edyg zNwUYO>aAm6Y1M5aA4}4z@5pcb*Lv;H;%zLX+!gMcs_;V9Y9ianbw_sb7Hp8B7~Rw_x`3N7nbsgY3p zU3q)<7$nhTKfdbf3XiaCW;-%oP*1?;0C_goGWZQ|-Fl&JLbEC$klq_DlwuHbRgfas zV)&;tt|+3x7jZKaqZ*z~#WtlXFdXDFl%2RaHNlrFYBA4U<|BQX3t%l&O3AS`h|o%` z-ft+q64U-p;x|k-E(8gV@>1=Mxzz1;Oc=k4UE5K$YCV33XpCGu-|XY5?#>IV3Hv$E zzc%^UGD~r@J~^x;;iaGY90O%-m>e)@T~}{ks(U`0+0j|QnL#dfd%dYu^aZ_D3_L_) zDQlCSXWl31P~$0FH6~k*yug+g))Jbq)&SW*LwPCHH9?^#bZuRBf<1WLZQ{T@91Nk2 z`l_0cW$`YG`E#J;v$>NB2mjTbqOShs_=6N@^R5Ji5j!%m~EZ)5{&lwe4X!jOUxky4DQR3dmg!X&e%-Nx1tQ22 z7g98uneu<5zJQ?PWSIPPBf0+G5&Yvbs-3)XXG(i$JAG(DxxBJMW=FOJ!iZKQ|Rcu&aq?gn< zjz;6Sti(jD^}9vc$ws1XoUC9xs@nC}0cz9VIqsY z()EYmnPe;8hSDA9yC)&=ak@LUwss=wVb>YYKGwqF)fqxp! zH@KZSKM?2#w&sSTuB5G$D!(cx;xF|E?KmWKTUU*1>Z%HaI~W}G(1eORiDq5hfyc$T zWPz=4)#tTg5K&$jJ%f>kFkiZ0;2VOU7yDzAF2&m*kQt@e+a38a+~F6-#__^1`gwNC zb1eA518zI5U#|s!fXN&wU$^+e;%)KwBC0JJpJ`~#izo=kkg2vXfyOJ{EhmnvMxi_0 zYk4kQ`Lx6eAzt=RVk_gTo#JJZ2k7Dz_MUit{ce#(!ZF3h26Eeb-}C*q6D)^;pSShA zKc_@>o&Dmi)^$(0(}je`X)T4{qS&&^jngj8uFynxA43!r5hz!px`GtoK74RemR8-( z!{DF`;EGGBh~bHwJK*{e0{J-|zcPIfUtaelqgdjiaHhz!|88mNCs0oy(M>lCh$DlZ zowMk;Q_sAac4eC7Xo@X7`S@a99d* zs>8OPyMra*mB_1=dXyrMG&q_flfvUec!K6Y_odbrsYZ!^TkUq=AQyT|^mDdJLl2&7 z#Lg#|!!~MppFdVOY#IL$6bYu_|DG2B#C=s}5*%{grx;l8G3T7A-{Pn^lgV~q&MpFe@`*`7V%;P>b)`$8&Ap3=Igt=vVf4}EtfO)i)iDFCy~y?w$%k(kctV^ zplJWW{jxiLzU&hB{p=3ijvJN3%LBP~&$A9|8!C8mqBUbfxe5Ei_&5fBS*Fw#gI6X` ziNIi?{IpuGFNX@ zj_pWqIjM)aCdERN%`DHSGE$|%JI;LLf#fOgifIb0P~>`joPNGNG9pHNbt#_Ze0_dE zR3@67Z;B*s_Xk)x;ex|2oclP!gDF@Jz`oP|B<486AMQqs!I_Q+!1MSBQHtQMpV)VA zJ}NG7W-;9fE({C<(f^nL7$4>TFNMV%ek+UX8E62{bRO~H@Xbyd7tQkH=9mA&ph#Oj zU2#^)BE2&xkm=&94PwCP?wS3&0imH`6)7<$Ousv*Z9GbEW-=TIWa-v6*6Ha4-n&!` z+^66E2X!M5n%V|8dyl*{p<}cAt$Q0`nQiRDqdZm?ziDWMZg0Z04P5{u?Gg9?X&O^b z@3QJ*V8jEF&5dH zz?PDt582q@5r>$^W_o;=fa2ZOeU4|0p9P*zk_LCY%Q9 zTwu40u8RriM2a(;^KL*!z$(nYz_^~Vf7hly{{jl7N9v9BghI|UE@0QBLB_=-O***c z5b$nbdC%|0_Sw*Vx9s`tkIz51T|_aie;l^DXuTn_5}eU?au@6IxA@%SZ`@crlE!Ow zQ}4+uSXDrGvdp&2ru(#{wRS*_IrN zASe&Ce2--)B-e>Oa>=lwTy#sZJ9WTZqOm{o)O;Bj!V@Ba=|>IUgflL@>RBkt{;j?JJ*GY1<(t>av0^`c>JM zLBwU5A&R`(fKbiTPS(@Al22qG79H~S>r~sVNL6wK1VZQKBi%Z0$5t37NHz2dX0Yi8 zZ&#oY?;i)_T4Dz#*BHGZ%+1t2t9q zEUemXX)WPALZt1n)wJ(XQ=gvOuIcEnG9?+~H-|E?u3ZaF=GR&>W(DDR79U8%kRk*1 z6MW8lB(V)$&$fm79xx(=8mt=?Gpp7kiiOK((}*sbp!By)C(xwdS^2tq!^vV(KB4U+ z$!qT!lWXW)-ELB^3oLvR$V6+jHU!IuYPVW#Y07G*iG$2To#z%MfoU zu|};C>57wmC4{x)V0b#VSqr=k1EGCedXy9ly-cI(^`I)=Q7vtxMz&*#xk_8N=7jrK@UoliB*N#*KP>$^>e=C3jt}*9*{g zYn*a&e3nTB+~SB2@4dDxSP zy*fhNpTk8(+GqHMT{(WXx*8khonvW=6I0i1>r8VW=FIn#qBkwcFX^y~6&MhhMj?xE zlUf1z-rz{`;U8%VAHtU!3crV4?Ze#kYS#?Fx2HV9Rx$3Li3K_XIlJZeloF9LGT%iRGzcl>L7pY5TM!cMb;jIyD-@pH3j*UmWY z%nVAqO)9u)qCufejR0bC!R4Yx?+CV|x=#&8Ib2dnd%xWVrnSd__N) z#D!Bha`2`GS&47m*x0_GKPAw(RcuNM&?tvwm+Om7CJIxT>A<%Geh7bG>h-=MM=LW} z;tk!tVoO_-mPQJ$Si{7mT#_&d;|#PAust6B0x8JabImNb4zKA8dsTi*`P`-dx&CK0JY{P?i97{ zQbImqrVqZw1$RpHZy4Xg#YB?d1WdP7i>dHHOZyCcm*ngn&N6ZPd0*xiv6*MrTCjTW zy{~{I6H!JoNs;TfrBU~D9QqgNW%(Dg`Nh-=%O`|-Y`ri%5IJ&#%O-#&_`!NVE=%1R z-<^o(y#2mrh_W5TSCqKB0E$#7cZ2mNq7Ad!1J+go>;g7k|8t>z0$ zoOMVh4ai7h%0EmWmEcdo838VDq3e$aQcm48(Y$~>ia$&m>95yE)P$)@jWw;!#bK`= z3o+YuUp$C%zZ}?O-Rxm=U=<4ZRBO8#lHb2iL;w)<%Z;({4E@b4bNL_^Hu2KYODDmW zH--zBn~e$7k~)6r5Y{OI2*qbMVs3@sMnTH0Q>j|j45iEo9m3>;DVjrP(% zlS33SuXh~Bse-~h)u+VCjht(_#VvsYo8jRw15`Juvx`g^Tz`CXuzqcV6+nVio*jZA zoWv`vk!$r;&{EBDtA{~f?Ld*@p?UB184FQ5uFsx@|MK)&Tcr!5tEYYUF>?E>dY-2+ zgi%K)eo@8xX5O(aIg>dq{MDl_M53f{)q0Q4Euh@A!0kP1FR*HhPT}v1cJ7Dk-+S;Nbu6%zU+vd6a1X!-{)92W;0A8iu>C@ie^daOPYY>dzO z@*x$@h6kOb+J1q+Wh@o3+>s$xFUL;5KN+2jHQP?ej^-qod5*l*N>dt)4z#-xPn+F& zTu*wsA)ZszsOFnf(=6l#tao!_w@%}u_byUzm22t#Qt(>!m7Xpv4?+=6Y+J_2tVpwR zuaL3tkMJLm=(rZ!&(;Jxy?kF{Gf=B1-C5bb3a}l=73`IOAag$(zWIwUPQ^x7aCf+t z$DDznt}P}01I6LjK}#V?X^IR8|IBtA25Z)etN|0eb=3+cFdz_qPLSw0^^v_R{=9g= z`oXSgs_@K}<1AnAyN5K+^UxI;vLIg0Lr9#6|CIU?EIPph0EV})&>=T9JR5k%9n{zXF4f=8PfZk4nwg% zsO;-CVr*}|Pcw@_L4W0VCD{S~*0H6a+`I>Y&T!$u-b7K4m7-r}Q2 z(zM)SSSOE37?s~?;&FYqmMiQFk%A+n-Ed_J(sKdyE@}^DD7R(g|DFY!)}y1!oz^G+ zHAnbzO$)#gZh32Sn2R>-Bl;YFznQ4MwzM@imx4f?3+#)uJN>-7?>8&YvJ42@(P%5Y zZfWE+oKT~w(fc5(I1-YtAg`mDIzC`6eH_e5Oa?kMoc*X?Tfuo5`Y=^;#k%>|5$o6$ zxO19G%1>0fy&dcbBP5XrNX(7v_I$;;S)RGg5OGpC`#kZj7) zAyhc&YnG(sm7Bady@e7I50Lgm!W%GlR#uNN{};3VBC}V8WY!A5$``kf`s#$R89rdI}fou^3F*qF|@|j^WgR?q>#czt&I{PhzaO6s=Ja8Wo>WmghHO zL--}6P$?^wTMAqE@D~l{9u7}lCz%WL{heR0XZ%4!*fc+q;Qyk~cUmD_pJ;u?0{n<+&VYdB&BK8YD0T$3(<=bx`Fw4&BrV%X z`-o5Dotltzj>|9Z)gP)d6bLrgnPJbV_Q@_f`%!1=zvxrzs^}?vB#^K9I7e&;To-T% zPuNQm*OPiEBN3&SJIHwIyDoCHSGW5vbGmq^)J%{FU_tn64c#l4mpvrSdKP8<>o&## zN6l|h^c6TS`s7_4ZCon7^cEF8V0)8wnY`{hysqn+s{Rpqx%pv5w-oc}qk>GOfZ&ew zq#qdEer0Kqu-!MTtsgGLeCpj2OC(>jD+-t}Q{x7vlUvj>mBx383X_@5Am9FMcxl<& zq`2gIDLR?HRV$mB6WD2RYfS+;zQ8S7cOmKsyx(wqDC1^F<#%Ux^)$6@g6{q zzfT^icqE*g7}o#U^r&4&l)_qN=e9Mc@e%_>CSi-cMii)A^MM-O=eFOr{Uj4(BS{`r zdA9IVaf;7^K!0`A80og&2SoRd3BcE8$zPTA9y|rWO^?vgUQ!LC--`2Iz_nahqejS` zfncjsE*_%U6#jCRzc7k?(nE4y3e%OJMuC9;TZmfEO@!<|1vc!y$4GJf_&Ch2dz1H9 z1F0Qjl|*g3W@&UKfu@Yhic%}SWNs*L@_Mc2_JN8Y3({!J-)Jo&Ocz;7eM#Uo;j<+^ z3Yb2IsKV)GHZ}f2=U|w@7~U3Yat20^aw~Ow<@by2lZXwZu{d%Z!lRl5+pnHZd0a>xU(35J0`uvtz6(^CS3RSZnX&EH6NW9Ar&|H-PNue zl%vvhmd~S3Mz4Zfzh7j~b=j&ohb8EjqUapv&Y7kb3}ORTwd~6d!vztEaPV`7 zgqRJce9Sn(c{hS0%NP4;F(616dz&GYV{Bb53?H}Vpf&6X%&i$%JeS4k z!Y18kp%FRFD^I!wLbbk)^-z$ylK^6zf7CW8%c^p%38%Jp>^I6EnMUfIs2|b3Rec#t zbVBqCP>Bl*JRp~df=3Y~1Jii1HRk&CB?`M9^WT}w%QtNISY^91-&Eq(@&Qf)LgdC^ zyqQA0=-frzc?vx=68I0lX5<74o6?F2kTG(-f=fD;N$)C z^#mp>tNnYH9wgBc#R*1#*n!YW`% z8JOIK{}{XxSwK5<6+d<&NuvU>7>Rut(o9AkWpJTqCI6bo7zV6ofLymSyqbXAPnqbe zFd+QrgjW(fwV0*{sv(ks@$-A5M!&reCD+#P2p(d!Zsy-4v}190^9B|JIc3ehH^ z3WH_NHfw_kcAGg4Dtp+E*@01|8+YOz&dG8pk@_g^;@}=vMc;A#r`WV-6Y(4$O#MX+ zkD{YXv(iX`1nibGOKF7DZgD4jvwkvQFo9O0O5LNR=6YVX6Xx3}{gR-FOlaM&lZnB> zE`GF`*T8X;(<)S`I=KAO9?;0mU~p$@4x3%p)i~TQ_a#kg|Fi%wHk}D#YEmokWYN@`_%vgBFk!8}> zuIkiD1UZ%ByUO8i;CD}sUjv64(|+p6>oa*~E zJ_s>BElq^yPZH%bPsO!oU|~wk1lKaz*PPwWeeGV99`;anAuFozRct3ql+g*C--C>e z2szwQ3#&Zo`|HQCl|Mp*^s9O!X0wxMNuIbnxuBl-ObsI#NFg2wzbCIMT8$D5QmMLe zppT}I`>?$GOF2^U%(GECXQ#!vfQ2;}GHRp?Q%e){bt}@txFZ#Ja-B-C0l!c+Pq9N= zeT|C5Ecx>8chVgA7QlH`mS~kaCDBoXR>Sk0Zjs~oy*^9_4!Ph zCzi;wbHd}nF(e|)U&qn0o2Nf}BH`s`58T!W+&WLx%thM~|hvp7psA4_UM- zwt?g>x-uvb`FV$`YOmo&!bsvA8gvy1kg={~{`RuBG@w-gSTZ(i00l#e6}{SrO)$CE zL#~qNT%U7w`m6xc@!D3E-{>!5Q_t7ocy0V;fb_gEVlsnAzqFoqq=sE(J8*&x1gh)H z-U?@{BTpMIxmi!>OPHrdtnP?yT2>#^_ces`lRY{Y#M;glpa#cJ+9l> zxOkCIc2q7W6G)cI>!6#;4PIq*n>@~z@$2~dVDqP01r=r12lxHTvnFox1yqpSa^Rwr zJzMsfMKMZZqN-Po*|2l0Vyl7iHwe13o89B07aarN(p&$`*0_854bQzt z{CrsSjDN!>Xo5_@{8X+;Wb;s7r3!K`Aw(~fQiM70mO!ZPwxXS?^7`^hY_vv}NweHV z3E53MEC{PKEiiU#y5j)C5sJp*-I}H!$;}+&l^g+oy}lYNnvFgyf@_dCKz_a~sw$B> z4rq1{@F`Ob^8ICRge;pe$G~_MDGz@8-f*C$?h^%$e*fQmn83VQ#1eYboM7^hML=zl z4DrFTR>Np*(?`abJfw!ClTW)V;9x2xV=s^%B#o;K2}s4J3z75Rt{jkw#`fEEW>BR7 zG=4d{AV|Ht6xe?z)(i2me=^b+V|?oXq>D4bto&PNiSDIpiXK5^=@_T#8mGohcwB1( z+nQ!+X}S_3ZwX|b*@sH9(wOV|PV$(928e9xx0LAfk z|ETi>q(XeYUEsH`Y$*x+L~GR}NL4gCj& z&o%oQ*ogz;^Y_U*^^8+VdZ|=~b?}%q^Yp<0Pp706bcgXt8?w>gsWF~bYc5{}hhAg- zSF;%fs}-#gt?Cy_HDR#W!DVQ{k7Ab`ti`-0iHCW+rN#SC%NcsGCDWr_%p zOs}I3^9%C2e5hD8UiG7IIsT3L!@S+CqnAk@z1xGMMI1bVA$tqsYW7iivQm;NI*NpO zuM*b+W6--OQD2!dw3e$9Tz#*g3W*b&&}~2l+AaUC>(t60aw@a=H@0ZLU?QJVUNER0eZsr7aOzVc; zqjFMZ4&y}K9HRBiwPhY)O+w-(+$5U``+v>>VUN5gu^Tv>0V0NWNk1@UkU&&|^k zs7!~hnxjWpCJNMcqx;!`$kEF(-qe2UDodF~JKSHTs6yq}Xt}Ip<>?8(2WoB)cZ6$| z=QmRy)Cx`(F_e(RW`9Y$zlu8-NqF_;Pxh|p4%TadfJK6)tvG8vqJaa61`n6-erGN* zeC}Oa!s=lVcMhD_`vMG>-NIU**`zOiEE@HE!zG;$*iFjIHqs8*SbpCm!b}(PqSU-E z<;C_(o;R4(CBItKg(~z{H$U-8j0Jgs(FsQ>Z#(mTrZ3;c<`NZ{E-)>p?1^p)T^wx1 z1R-3u_QMfLJ}QBtUPy@`0HNJjlU>Ea!FXw=mw;}H$ZC=ernzG>DQPwZblUNJIKzY$%`fWI2! zGV+-d7I6RL7*8PTQ95zv`31Hux)bYkQu1iUJ>1=MO5vKhgVdsM|3)=BtOp?+P`;+8 za6L}MnkZ8h*!xGWsq9T%XL{3f!|GGW>3ZvkFRhEk$#(}C1WbRzNTl*{0`rynXecfFFl z^A!^i9e1=88Y{*DxJ=9b1r|w7086fw+-qnrzr;Uhm547W0DZ(`{5xQ~rP|e#ilp=F z+RH>iPSjoU(>XKz1g4-gWDWug%;=B-G z0P6m|f!-zCsGS@r!p_LQsTxx5V?vz=>r-r=>DT5~f|JvYYX4|7yzSE*sa{14>to^{ z*N;d@#Lxk{uYnl*NQHzz4zxD+;TDy(BgA4IBw)Gv!wRpPt#7_LX5gWsYq_G?-y?^8 z`nh72vvsDD7xQ2Yu4?6RFR>>z-_8PH6MK%29?jwxf(jmO3Mi^%&$b!uRI|nLh>S)X z`Y~Rze-C^TY!dU)$cO+x_81HHYX+;C)&nYZp`%tj&(n?U=5>J#&IAecI zc0H4c5YGIX1n_CL$1b0D?ztyL*_7v3PDZ;c%2Uix+9xN!-XY5xKRU)oT1D*p@Y{$S z(gxY*xI-JI{YvTQ61;(n2BQrPFN+6~zAx{%UR__V_Wz-K!6!x!pkOk74B46my0P_Y z&LrRR6F{_!;*-aMS0v{Gwn9m>6oPjc=6<4n=e9V2>V!nH>&m)bwf;`7hZMp?>c}9c zuG~_HrQO|3=Q|_B-x5!O22w79-My+w$SqC>0Fa!JAnfe(dc;lRu}DOqfTiVSum12Y ztQNW_4H7o=;=sW^*g$OJoF<>{xGQVR(nY>*r*f5NP2i%EG#vHF<-xoV{c2ez?rV%7 z;OnUP8j_=Qv(S57X7W{GPG9(bV$^AW1^#0YoxT+VM;%~vZHn=KVw#pXy%_t79vv*<6~`0mbF!{C5ZNslcaDft1)IX?mE!`OXn)z#e2LgQ6-mE$bj{3p3xPl! z51H-joxJ60AIE#XOq}#9RYy&!4BA$zLXNzfY0AogH}hn5TV+ju&`y1Q*h6$Ap1UFz`}BOuHNbGu7+(How-cGxDB($zz{rK*u;9;(!7F!DdI&lOD%)q zWH0Ni$%{Kgb=r*zu^BT|*-6aq*eIVTU2Q&?;|*|s5AKc*M_vva6O}m&oq6Jg^T=?0 zS&{^tMcHQGz4}M{p_`A1ESl>Qx|B;5rJ{B;C{ujBjSMv$4J-Nr+JDI#PE1*C0g*d2 zfoR#`=$Y~hZmA=Dh2iZ%=AjsS=tekRG_z1N61%%*j@r zo!CR*q+az<$q#)d`W3Lc9w@q6S;G+SEDnV5-+y|U(ySQQP2yz4Haoq@3~svBdtt=B@Ynm$hs8D+wNq>ymym#L1q~LE0wb zvwyB@my9!O+fc@|0b8Ayi#Dvgy#q{3`R1i<&x+3UrOs+o02jw#?)%>-V_f(^_6dJR z5Y|EREsCao0r1yxwF;yb7pUx9>~};5UH4S1ictm<2cb&W8(aY5xBVaEQa=DOxxt3v zH*UZjzX+zrki4$dEX}gAD=v>!997*-+Ems)WdOC&wE+=%dmGbk#P4ghJFb5%`xW8F zl-uLS`n9?_u6cF;i~@2xSlt4?#U*QrTc43o$`G~~=m`uJgtm_Z9K=eT?@`%A^@@dj zoze;d)o&8$HVW=VkH;(x0oMHjARIL~24M&mRMSMkb7ZkfN@3z&-Udue{NlGW&kao9 z`FfdhNHVQDQDiX$GYs}7pS(Y82A|R_J{l`ex#bSA>UFo*4v0Ji% z`~4oyl7YL}QqDK-|GBT|55~#pvnBPE|B52U7XI(yn*P6YM0Wz&_8vF?3w#Db{ofS) zr}W>~nf~9_%m2SR2JD#quSxj-YL+dCK-!PlkMmBpN?Hg}tKCOLNpw?Bsc tJ7Z1%??nFh|MkQFni33*|Bo@l!<`0%*_89m8-TVL^3p2cGD(xq{~OxyjOG9U literal 0 HcmV?d00001