From b95fd31fdc10c71fe8487b6ef34da6449b8891ac Mon Sep 17 00:00:00 2001 From: Seal Date: Mon, 18 Mar 2024 17:50:34 +0000 Subject: [PATCH] Seal CLI Action update --- LICENSE.txt | 21 +++++++++++++++++++++ README.md | 44 ++++++++++++++++++++++++++++++++++++++++++- Security.md | 8 ++++++++ VERSION | 2 +- docs/assets/logo.png | Bin 0 -> 15369 bytes 5 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 LICENSE.txt create mode 100644 Security.md create mode 100644 docs/assets/logo.png diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..aa07d87 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Seal Cybersecurity Solutions + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index 5fee05f..843fd58 100644 --- a/README.md +++ b/README.md @@ -1 +1,43 @@ -# Seal CLI Action +# Seal CLI Action + +The CLI action allows users to easily incorporate the [Seal CLI](https://github.com/seal-community/cli) into their GitHub Actions based CI pipeline. +The Seal CLI allows users to easily replace vulnerable packages in their projects with sealed, vulnerability-free versions, which are available for download from Seal's artifact server. To read more see the [documentation](https://docs.sealsecurity.io/fundamentals/cli). + +## Usage +Incorporating the CLI action is very simple. Just add the following code immediately after pulling the packages (for example `npm install`) and before any other step. +```yml + name: seal cli + uses: seal-community/cli-action@latest + with: + mode: fix + fix_mode: all + token: + project: +``` + +## Flags +`fix_mode`: If the `mode` is `fix`, then the `fix_mode` sets how the CLI decides what packages to fix. `local` only fixes packages according to the [local configuration file](https://docs.sealsecurity.io/fundamentals/cli/fixing-specific-packages), whereas `all` fixes everything that has an available sealed version. The default value is `local`. + +`mode`: The mode to run the CLI. `scan` to analyze the dependencies and identify vulnerable packages. `fix` to replace vulnerable packages with their sealed versions. The default value is `scan`. + +`project`: The project ID, which uniquely identifies the project on the Seal platform. **If the project was already defined in the Seal platform (for example if its source code was scanned by the Seal app), then use the same ID here. Otherwise, the Seal platform will think this is a different project.** If the project does not already have a project ID, then explicitiy set a new one here. The project ID must only include ASCII letters, digits, underscores, hyphens or periods, and mustn't be over 255 characters long. By default the empty string. + +`summary`: If the `mode` is `fix`, then the path to a summary file recording what packages were replaced. By default the file is not generated. + +`target`: The root directory of the project you wish to fix. By default the current working directory of the GitHub action. + +`token`: The authentication token to the Seal artifact server. + +`verbosity`: Sets the verbosity level of the CLI: `v`, `vv` or `vvv`. By default `v`. + +`version`: The CLI version to use, for example v0.1.0. By default the latest version will be used. + +## How to Contribute +We're always looking for feedback, discuss possible integrations and receive feature requests. +Please open issues, pull requests, or contact us at [contribute@seal.security](mailto:contribute@seal.security). + +## About Seal Security + +![Seal Security Logo](docs/assets/logo.png) + +Seal Security is an early-stage cybersecurity startup committed to simplifying vulnerability remediation for developers and application security practitioners. For more details, visit our [website](https://seal.security). diff --git a/Security.md b/Security.md new file mode 100644 index 0000000..570e1b3 --- /dev/null +++ b/Security.md @@ -0,0 +1,8 @@ +# Security Policy + +## Reporting a Vulnerability + +If you find a vulnerability in our code please send the details to [security@seal.security](mailto:security@seal.security). +Include as much information as possible to enable us to promptly reproduce the issue and release an appropriate fix. + +**Do not open a public issue, as it can affect the security of the existing userbase.** diff --git a/VERSION b/VERSION index 1180819..699c6c6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.7 +0.1.8 diff --git a/docs/assets/logo.png b/docs/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0e97b3252c52136690f9e6fd143fac13bb5939e6 GIT binary patch literal 15369 zcmch8byOTr*XA&|1a}=6+}+*XLI~~}+@0X=E_!QArb%pcqb<-sSW@@u|dk&2yl=yQfh?;W0^pG+F00s&U01YWY0f3Mb=D*8OkTUIm)rVUHVE&N-0E8h|00254>c1rO zf&bA8#g-5KA7w!Hn;`cXKPCVG+_l!wa@A5&UK(FfnKLv~zqD00?^WLyC6h zuErowJ6n4feorBaesobh{DR%)sdft#lypc*@J`G!P%09jgOCyg_WI!ot+6H!Q|p)?`rJHWbXq0 zmy!RlBWdnp>TK=kYVBYTdb4Y6;^5{gL_zTe^q;?f`RQtH@n1;xF8>Y-5+KW43kw@F zE6e{$&D_)a|DyKR@-MZ2;`$ey;F~di2?skzXLA=9h+D#Jg8u;gZ*~9W-oND4&0QR9 z-QJ@3U~laz%>Hkc|55!vwN#v~%^}_LruLsG|Gn;i%BxyAxH>={k+Zd_oV}~LGsMMz zYySt}|6St0*?NncU)9>v+*V7{+RohmpC~z4xdd7Mk1hXGQ^LX4!TG(Tv8nl+)BmXa zx2pds{SS`zf8nrk{ckw`t>xdEf-G-&@Za*{UrF~*EhOuNkpx-(GlPYZdS66W0RUcB zIY}`MPpC6L#0+z(REu48fz(V@9&g>9Nb@S&*9$w4VoMEy-^UJ(CI z!?)O8S7f2H2oQL#aKa+qKMxg&em!_c9X6CbN;Mk$yDIWe0}YF_53Lh_^LS|tI2~xeZiukn4EanjBIhbup^Lkq@zTBJ9d8pEBWj^KDpP4LXH3}P@vY6 zge3u(}kc^u^4{xeFFv7-ta(l z7!zzDC}X#K3b85>c!;?_a7hp?XFCW=YnN}?)f+rw|Lo?QqoP$z5R}Dq7B1m8c!<+P z|Bp^j=PD+kA-mr5HE-9rta|5|dZWelJq=7xavzjz9~>@?OitweT3eHwR8kUAd2FdE zOD${?Re16||7OQ)fwVy8d`<;eJocNsy?OqmgN{Qo-p{!!mxU~v9ThS_0^o+9e(!|q zBm?(Fz^mMa+eeqPASL}tA9gjF$-s{e1`2lnGxD}&z_K2LU4)h1QY8knL9$K-7h7bS!6Sd z2ip@cerQ0ElMH)p1L^g5UGD9*qJMMFChdgO0mUtHH%*M_4N(AwWF9qW9tKNu%0W6f z_GCGyI#C12P&?FZf!J?x+6B0%) zQ-Xaz&*5<=65!bffFG#HRy>Uf%mS(fMrhCx4)0gO3dts<6%*yv67xD4i-ej53cjUG zaMecVY82EsKqd=IwPczXnxr7Ub|lpqMhG)=5nKfJx~_TAq~r+KWl@LZZ!IL@xVC-? z)r_@HXhEAsT!?x{!4piy%#LbQ&;u!;S)=-25@-^xXus}Ao?s)(PqudF1M31_IGZ;AIA9&jYmxx40S8j<8Gk2{@!i$HRpXvpS{1Avcr&4k?}lfvd$Ks+b7+%V^PvjtP+n1pXqDT|Q9HfGHW zoU*xH5QAc+|Fk{%G39A)N1GkeL%xt6TH@6g@izW3ppjH#JdFVzd-`p$$qZ^N>+tIk zG`5>8Db2=+nLoh#t1ik)8ws>M4xj>$;fYDr*2a`Z(c@f*CSxC)26=Z8@|F!At@xo4 z>FgK*%p$10kkCWX#WyUY1sS2}rx^ym@C&znow6I~+rd06kqfZM-=I;Mw~d0ltM-tr z*>Qw2?5R)q-0zYo)x!$gPti>=7+|r1KgK#`Bo)+Apd}beX+5?9)$IHlu(~NgyOEw! zY=EGCag=k@t4P!e8JGU$!S+gJ_xdotl~ysMf?Poh6jZ(__a!Eq5vm*d2!crOd#Dkx zQh>LyjEG=OARt5?=0pso&dX=yH`pHE<>j3TP4qfsm0sW`^X>gjSE`5({M_;bj99FvN(~;e){XE0d zzGPZ>%^}5mBvcat*pkHGH2qYTXzyil(UE^nVClxg?lN~Mr3`t(1}(;Zhg*+g;?{OP zKR?K6-xGWyp1{!D!V!>y$~W=Aie)w`RI)Gwe5k_%!8ryob~Y+i-?eX6UP$RE6atSE zDzRm;5cvE$_unCQ8%1GLXTTlRP4CrS ze#7-R%T(l&+0wW+_Zx`ojpk&`rk>GZ+A5rAc13ZPEDiXOuvj;5UU}-|#vU3J_YmRPviD88b)T^!?T>lEvz5@&8&431tD6%N*BnT%%4EC@l|G#vbS^*N9K^zMpJ zu~7zU+!yM%TD34A6uwHSh6BFCTzbe;_EK0WpyH4B@%q}Ai=jQ)t z*wA{C&bQr4ynE?Y+`)oftG|j?WXsgms=B_*@+T z2z!0}W<34+ebFmRBSU!v2#KcaS4`O#uTMU571!Z(drQGHs`=R(J+@4>iE{ zAzkHp`bF+8?i8W6kkr#4?fZsCpqp9#z~zuY?dkWX;Ma)~Q=)_+y4~p2EhsSfy)+#q z!SoBZddcdiPL4LkLd_%yBq9Vga4Gi3+3zhXxE|Tw&p@?G&_b-3SKr0cTBXgC8vqNN zPufmO2A-P!kTO7jV+|nfA{hQ^9K}&R_K9vFa%2(pbKCQ6X;!UlF9>d)aoY=RdEed2kKf&Ik*n^9BmX{_Ku?@3q~;^F z%$Yr!b~0#CMly3iGX<{xKlv?}~C346YCAyCZRxaPVzciwL0 zQ{2tZqQyS6?mMxZ+F$dE(%AwK*B3(rJ|OyY-d$e&nCe71p5gpIt=`0{ASCbUTwo@3ftd^k5 z^q!OM&~iSZSG0UM$0H8@qE0cg6Np!+zk{RG{<7!aeB%SZZb>@GawaBtf_GHca6|)i zWZigdlCvKwn~4`UdvN z@E`R(3mQ3(N|rw5O|zNIm~JJd#(xhKh_PoJk*P%Ipm4YW4Z&PK@9E$4Y5{2eqzA*G z>8<6m_^Kq`kakQIWC8<=brb5R5iogh{P4jf^Eh zO@v$ZT||XaovhxD*PkS-y&drNXjg-R3zcqImHY%#?)H9D zx7wudLU%vhUoqyTGj6jYrPO@S6rtFUM#W)mMF-dVkokjT6QF4Z$LV9au_)}qgL(At z964;ULZwkCQMdAhzlg+t|7lJ%5#LP$_z}4u8;d}2{u$~ynOD}xnCLsPKpi0VVZ*KS zT)`oW(MGES;iT66ZYCVnxU)he#aP=yOIVp9Gx0JlXZpNKr22`An{H`q?l=52z;*Nq zCkDG&Ap?{F6`f3)LR;+{#nDQ1fmFCJ#vGCe5-oO%M2V=#7KAZKFEt=>v?LZP*kq_K znmqV~JJm`%HSowgKJ=u??I`M^di||Iv(GujF04k>K|H2`iRVKrs;0ciSwC6giLkdc zojbEN7+8ywefaM3;|4sD5iu)DJK8V%9S78QUFKY*>XV3e3~ObuQXG57#Ub7Jk>|~b zqX92gJZ7h#{O|$!74hJR{}zg!Y5ruRIEQ8mV;%f+$-b#N&@Dsh4AtBrFTLRGMfxKW z>}?V{nj(YAqY}{9z>?!j>#!cP#vXinX~8>gf3WRrb>DU;*Qp`Z4XD+zlY zDVz|gJd&Tr7d-JA*gX?5C89j-5+-SNj{M=z4<_`Y1aMcqqF9{<<3f$!Ut)0$%e^L3 z0aaO=n8Ph-HWYBHW13YCH@z)6A%SyJ-nM(Ea-{bzN-##%%M*wO`0xlasLDY3tmaDG zKXFu#p%S}Wbe^PR1l9S$dq;kLM@)~;oVWEE^5?sAq7ATZn#>{g-vf5N)Gs3+(@I#l z%5oz1ZizZ(N;dvPT2~4yC!dS6Hd>&YlR&?0lhIO@pRS6jqRNgqvGn&wmK(Dc ziO$?W6%4(w!ZcBqirF+IZ)0t=o1M#1`t{gdG`RQG&B+kk*qM4!+2{1$V91&Pa4_Mod!6kyJ> zmOn7A@-OItB;%8F*wPZ3!ZUzG5$c|abi6BzCVq}n-PIpO4MaJKb*fIbgwta~}%Fe4T z36tVf)ohjDD5nj6B%X!eR~`$}@|j;5x%jsSd_Q4KgnZ}Og&(Q1-yE={R-lOK zCkEG^jRun959rI{#->N5)|buE-*1aF*dV_%oo|2_(>?2kt4 z4eH8-EfH5oC0v{Rvc+a6cF3ze4l{=v5*Gut!5NT&CoQS{#go<4+QNJtGgXf8G5y}i ziOj&YKIFoGZ=&vF}ynem1_K1y?K<4+x}g%Ul6?+xct`L_Mm>@0q4VYQR?R^_u0c8&a#ydh%)NhF)pP-IQ zJ=c|sp>ir$7gFnPW_CB-)ZC(<8U`FsobsNBkK(G?37OG{dEFTCJfQ;?gI*_ezajQN z2)}9uX#Hq~-A_$DZj9w87{H!Z8={oK4QG@QE(p!BJ1-x2yy+!{3#jaKX_-|zNpqjE zlE=lGX5`GvnAH6WFc{{DII2K5g=wFYQ&9xWB^!UhneLDTy`%Sbnx(_p>2SBq6Zl%# zO1k|^UxM^D!vJ&G49hZ9DL18zYS^_xEdEf#<>So`&udrOc}i-r{`C{Dy3*VTsovkT zvTmWcf(P^fb;1eBTmXsbxOK)p6n}Wi)QKMa%?ZmLO9Pm}VLN1k5wuJYW6jgTfuBeu$jK4VEHGyBf38Mq>ol%+>A;YWmbuEx0b`S1EzvJ;FD;@s zNx?60d8B%+1Sh=3o1p`@wKKNLB=$s7q@wmMOgN@qk1cRRA1!|~QGgK{KAxq}y~>X2 z5ZEJ@?S)rRqnlFQpy-sUxI@Dum<(_IfFUqXBbS@DYerDoHML-4E|vPjXQ~d5wykPm0RYNu?|T)<`AE zk3PdbByC+UAJA}NXuXAQT$dP1bW?FVIE}wSaoQ<=_cH7ebP}JykK$m->~;2A-b82$ zY@;CYL7hvt@#Q^9iL1-S*BuHRH)ZTy2H&tAFQ>_`3YK5>wg?pyIel zoc~JuZX6h(;UY(svR~kL8twHgEvb(k8@d;47y6MP?O4AmD^?Y220fF+;6u2F zzNcUpV}tn`!+vhL1!=|xvhK$jW<8FIp`5jCd*ae49x z@vZd2_6C*3hE|hdgK2$emZ+_;ySQVA<8%WVGPS!a0(KS^K0QY7mA*f=m`CX%Wsq3WxTdf-pV!df2Cj7Pr_S;a*pF{epvGSLc z@5>IE!JS1D-Iv|zkD1CV4aybUd!8j9QmAT+oC>Uqh)ws!5S+8%6@W)+yaA6Dp2o0A zi&TpNZTYlq*f-tyvi7(tF=yML0v^$+pdU|ba#K=X0<`bXQK`M0B0Bkx_jv26r_7hM+6BA9yC~ z9uqXVU$xSxdB?p!{(hc(-BIwLzN%W=N)-0+JhR|g!iyz*KaluQz25TW4@b3&LR`G+ z%qW*}2g%&flt{P_K?H2~wDjO9B3dqGWo<$TRNIy8PjpvS!-ANk4=XYSsHJwg@hwB2 zH<@lDy*RkJr`buI-9B92DG02?Z)8-H#Z!Qb6zfD0k$>(+I`LZv?gSATuEw7^cCxta z6vR@a@)R-Iz*1798D8fuWHA8RQ328*EKu#A2q<5kqdolc;T-wVeok{DPuNw-l3BBF z5>YaeBRdU$MYo^f)Nmxu-ccLMS-YvtN0L0YV=2BbNnlhR0dfT{iR)t(iW9U%tRA?v z{5kVk?>6>VOefCubX;NuP0TR-rYgGnJksIoY1D!Bm_AhwzwbjKl#~pNk<8)-fkm1` z8C5d7O@jjW2olgJN6EpAm|UL&91J^O?AC?bfYoVQ;Ry2$FPC|x%5i5f4p_Bh!6C5;=UhCI0@zvR<<)07La`7Yes7MZC_JllTGAr`da#_Wmm zedY7uTw~xc~3Vd z#k}o)I6z>Siw#K?IzrKU_MotLLl=wPpl7aw+Y%45M1Wrg`{~bEmsJ%RHn*o%Eh-%k z?A+)ALGmjo8RHN>E7o>3qV*wU|E2t%-na6QWr04R_9*c~alE|g;;zvqm(nTvON1GP zAYEGgsF>dINLq89nNC|Nyo+8YJ+K2?=rv4}yZ}{mlCJ0)oLL`d*QFGd==Gjm+o&J+ zn>GK4&SV^^eKTDguLW_e7Fl-J4UETDq>{bSg|WzdWY!?tV0U}+1g^c|#hRZdX4sst z8>a-;vTY$-n!kyUEo+J@`r@$$BVc+Ic|P67ROOK^Oj#v}IvQG^ zH3r^lxGFiw(S64fj{{s zKav>lmOx9{%<d*HIag`3*JYfn`2)gSc8 znJodzcE7u-I*S)rCnv_fmOyMD%s#Y{-rPK0)A!8C_MkvC`pU7QCH;$IP|zK{2O#@o z?>p-RqmON->c5p(;>JpVGTbm5T(SS`4Zn7t)28|n-82&2H#-ct0*hSQeLivU8WvV6 zS=UX=sLByhTjfC(pYwdusENXUC7!^gBFiydcSxZ{Nv{B+pWxY0^; z=_lJ1`(R>_<{ALgAk>h3_C9MM=>y@j?Q1cuc?i|u<>MAxVj%jp;*RPEGr1Ma0$^#z zRM~D?>>szujqPh3SnbN-D4~hpWiG;9#*Pb4i2eOtN1WtLtQ6=wSxb3+MC~L~*wQ;P zC}zP^hm_8;Y@7UcNj}C;Z0BoveD}+9Uwn|cpYp7Ttmw3cE_nlN9#Iec>*ibiJbfc> zi7sn|u55}WpzTg=XhwqwR}r<3(noc4OmgwNiGT(vmaGIyxbx6q*xJBl*z z=fyWCb?oq>Sy{UGbNx))h@mRn{H1R=wHE1QHwr-d*@JFU z5{fw!qZ%YL6G3wG4Ji_shxoJgZsx4Y5)b#*bk}rpB^dv&l*8puS<#0+%XmD8@q?^` zj!!<-?UoZ_&AvOvi?NFq9y@(q>zUPTS3X68!p;k>9*<@36{<>wFW1QL%M7~*s>pqh zRV-R;rUsrb*|+@<+YZp+*UIfWsa8#Y=`HF9$+Rq0eRnkLd&>2{U${7T-8&u`)!lfy z{*E@8=1-J!Rr+~j=lnD2=iLu*4(;yu#mI3%RbRW1Zm$Syn2{Ik#}+XSosKy@#;E)O z)kD~4Di?i5{f4{M!o1&i-583W!%}_L*KN=u^nbWQK~_u&!tSa@gT`u(Qm53b_MX(S zUDrmw)dkvv8BsV#ZT8jHI$pR?N8OF_x-)YwC$|KrB?O>U;HUriW){6W{dj4>QexP1 zyIV`}XbGj~^RA)0kU6ng+-ac5S~yodNz#$aQd%+r&&dpb$lA=0)JY3jgO5%D3YnHR zpwKJXlDi~Z{F-2?OJeEkW_|MK4tYuXL(3qq=pHt|7?yq>6y6-$rW)TJ41!%aIJ~L6 zFcH_yAFwT3L@mmJ(|%Uy&}R|P!@=u-Sh@3&cvL^MMSB1UezO!HUt-$whdHduw&nK9 z@BF>UCK&oW>iyLjd_%CuZ2P4-OW1ke>%(pi59g}e-{0`X`W5Xz1Hd`XjW8z)W$Z9s z$1lz}!Kvd4AL1d@efD%^<#q-MPBN;vBG0@MJW6@`%ST%fN4^RTuP`y zUb_a`l6+71d^QAtR!&5jpT`t3)1aldYBN16GzE9kKuI)3+eojU)sdz+QEc)@`*)5sXaSGuPIDzFoD5`6$oFsy%6*Zl}^*KAM(=yO?;G`5a6BsY`EL}ba_*`+yt=Dd) z5+qbw`B9{$y@s-;{s}-E(hh*`=7WL+VNh7{yxjq z_#BxInS7G@J}*+Sxl>v_A5`9GM9?9wT#XRa7?77rcG5z?&Fhjib;MK}jpCuN>6w=v zuqxs<7QY<7;WHj#r}b*6P7wY1`qrOGAuJ=7XV^J`O@Oi_moc96T?*O;f^`axRML%g zQayj2m!Zb)>6r6Zlv|2#E97S}Curv1Hjj<8i=GpoBmwXAfr zo5EtR&sV48ai!0ZDOV4c>r17^g60Z&d`PoG=K)8P(SI#~CJ^L{5z57NZ)q~6N#-R}pOv{}) zkMuE=(doy>A5nzfN)D$2EG8I)@mE@x!BYpke^7o#b%)zxnGwT7Bf!FssH2%hb;p~V zEPt!YV4feAV=!I`O0^W0&u;0LN3$NK0O$8p&SD$a{COgtG)fp;5{>NuO`!yj5}yhK zSt@GiGIk3W>oknE2>1n1O#e@?ARtra|(s;bH%RH z#9n$$S4Z93hH+^bZbbttLe&;K3jMNB0`M1Y>_3-p`fYzn+-x-^Iw5(G8NW^X1YA^} zY;_4gWzcn&vqo9X5}{z3|D7U_CnxvfZE$y#7hw3$ex$+uL1{w^EC&bP zSJj@Dk{0f|-KArAJb3cITdkJ1jN*$w6RoLQoQe7%Awba{bEnXA?}IZmKVs1i9TAo~ zEanOnS}&fJAB{P(yS;w@bLXW6?rWq(aEck>oyA?s0P>;O&N6DPJfs~|$c}#E+qU^i zZjG+RvnRoaMBeYU9jsY|=Zu{Sme&=LKYGWna9B!u9jy3;+dz-(VQr}`c}~_EAK`(F z(Ci&KALm-My1yePO0|t~U3YvGlLh#X$>S0Lprhrob>@D)P)+3+#i!ZB-B7in`5Ft? zWG>1rPrWz~#1R9RBsDO-L8p0vJT%UEYx4KVr&Wdaz~*wC3+=XM`h z?bYcLZzOjxRGqJjZ|I*}sNc{rK&iVDFnS$RXk?~cJ&OY0tVpM(*}tbji(Ty#>OCB{ zD@k2aOETJgWI7yde@zjVtazZ>f1SdG6O)PICQlRTWkY0&?BmfbKyLMj`IV&iBj4R} zREQg^B6yvVdEaN6Js%79=MW1i)Y_lEDYUjB;eax!U?JG^s=u71SK6*a+^sIS)ytQt z#X?o4@l%(|L}Gz^qoKOBJ6%85C)BTfCBuk5>~veAESI>PuaNVQ{JPD0P@_$YT$K{C z)#dg@de5u8Cx4sxoEg-zrBk_Cl zSIcg{y;_O$AI#tF^{MP7gyyclfSWV~yE{!RoH5QfpaaeBNsF za2qhgK^cva@!b#Mv*E%C_D}D&T0VpreV|Wh2AmZL-^GjSjgDbezw_JWMo6ozM9|L3 zNvQR%?{N02SEBQ;e0m_ZuDnezPv<-?J0QxHdBKf#e#iOrNznZA&hXf#LX7g;u<;S? zKJ6YT&5{`G%{_IE5@X^g{+>j_OhePmQygDiGoqYFKD#0bUv635%Q%UQt+6#%lQQ2~ zdd{=YG`2TdRA|1kdBwa z#ZH@Cw)>(DG-?W9nH%2n@&fH}&VD@qt@z____`-*Vx=5pkL6!nd=B(N>ngq7HN4Gl zJ4vSKoJ6M*CXK~2e0M>DbK|U5E4v}egxaIYb<)43q8?J-JtgAi6g?IlBJyj*Uz)t8 zOzl?s5AKHY)5@$9c?7H^OByoV|VAp=X8G%9v5WtDS-hwhAv_T^D`{^PMklYKjWxT$`$@WCUv6N z5$*|o)0J*SBT95+Od7KFE}y%^#&_o3R6|M$oeCCuvR#U<>4bPM#i5&ocsIJqfZgZd z{s!$iz0+7Pkm)ndctes($F0@<^nAUZWjj2}MWA)DI>9LD4xZt9ZdA*DBF*4_Is7uG z4f~&slWg#8E8*>rk1M$V)O^Gmjfi>x^&4(ZqrO#jW5v8SHQuC$_);4$-b*3=11w`dWwW9clq8vO^_<^rr^}`IDDHjp zK~oeS^*fX~S^D4-TEo-g#0>t0jZ`#WAdeo(j6%CEyOwqygR}&b+SI}Cfwz$uaF)V-FT#B3(}&W4w1L}C z0W#I;R;3TOlk@mJV_C0b8QN)b!CjXBKzpHonqMs^QBNEeHvER!M z5?M96!&&G!d z>=usdg@#47nw&(>M|s@Z91Qu;R-*dC4LA4y_!Dpk);UAbqbUaksmj(|56FW*TPaN>iW9}YKx4)d2(}J)$#^S^!@i*k&!}v^f-hOk{947B-fy<+#w;Q zDL;Sz#K{yn+~HtY!aD84ClA-ws=PDjzgHfwRcE`ce~cYSenz|;riD=Rtz_~@s**~@ z5(9cXHN)6t$26ko6ZUy6YU+~I_@h&iD6$g?#OHboNNFsnVwYwy6~y+~D#d5HQ-$C* zmc~|jTB~dl_ zV9Lx17w3_u{REAXYNNDf7C5MzPoA6M=JPrUK2KUTaLQKxa4+){j1yF@P4=QAw-|s#?~D-aTnctXR6k_Q51E#L{Qf2`V>0L>4 zeIF)&U`IkWmdoPO8V8m@u{FgSEc# zB+Ir9Br((M3o1yX-yvI=%Q7mgj`g->ruqCd0b>(j_^J27v?>mr#SoZ|` zvHFD8(q0@N-o>f3xn^FZndx<7#xP;nz!ia~;RCsV|-8+pdM z<6n1=i^6pv`%TE&zZwTv z+|ynX;Uo7Shk0q$LN55H>|!K(na5=s5GzQ%ei@O%VpR|YMD&BHVixXpTj zBNCeSiB3CqbF(Y*VYA*adkPp6z3MbDtG`{O%Z11cQZcXgR-;|uTA-G1YZ~B%A=9dEScdt&4$f-IX#K;#(xCF}8*g?(njmF+72A7e}cc44c~ z6)*LM0{0qd$P`+9OjsxMvkrAJ907OGj5j}uuajjNQz1LlR%0M5;-g1bFT(k{n#_~kx8qz+YdQ!XY8r29 z-v{8Vc8bVU>2T_Lf3ENg;b(HY7m7GPux~ zW7_&SZdR|@7Ij!3HoW6pE{LC;qoY1ya%dY-Xd8(KX_X=W^aG%YKu>!H2b_Eo0yN&X zU#hyo*sC*(r-!=K{3d-2b-9E+)=t)=>9)CgvHk$1S;n0p4Qk& zV2r+j#^d++Lu>(A=<>9Cqeul;d!Px{D|y;2NfT#Z?qbf_u&q=2fv<1Y7!f?RrA-T8 z!Q8zDPi-h1=E<-I&=4}r!Yi9(F%y86BcdUzPF9CqYIM$kHAjgx2ysnjkspjrJw|=0qW5-mwy7VEYyg zq36sG#K_6LvAGH%T#X8~G?iOw2-ocA0L138$zTyBgxZy__T~reSgH3Lh3wb_LNIY- zGgW`HKTQj5qM-7KJVEs2>W(!66H>w$-ImCKwoo_kM8!$5jSQC$fn(EDZ>>E!_T3dKN`~Q1b b-GAYCxo(tz(VY`-j957-WyvaWqoDr