From 869ce36adff87c908cae5a28b2ac84f22fd2c149 Mon Sep 17 00:00:00 2001 From: Assaf Attias <49212512+attiasas@users.noreply.github.com> Date: Wed, 4 Oct 2023 12:30:37 +0300 Subject: [PATCH 1/9] Ignore usage error (#529) --- utils/utils.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/utils/utils.go b/utils/utils.go index a65f7560e..15013017d 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -160,9 +160,8 @@ func ReportUsageOnCommand(commandName string, serverDetails *config.ServerDetail } reporter.Report(reports...) return func() { - if err = reporter.WaitForResponses(); err != nil { - log.Debug(err.Error()) - } + // Ignoring errors on purpose, we don't want to confuse the user with errors on usage reporting. + _ = reporter.WaitForResponses() } } From 2504605fcf4f835078548edb64af89480b084f72 Mon Sep 17 00:00:00 2001 From: Eyal Ben Moshe Date: Thu, 5 Oct 2023 19:06:23 +0300 Subject: [PATCH 2/9] Add "Validate Dependency Licenses" to the documentation (#531) --- README.md | 6 ++++++ images/violated-licenses.png | Bin 0 -> 25877 bytes 2 files changed, 6 insertions(+) create mode 100644 images/violated-licenses.png diff --git a/README.md b/README.md index 595484a62..7cbeb7b38 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ JFrog Frogbot is a Git bot that scans your Git repositories for security vulnera ### Why use JFrog Frogbot? - **Software Composition Analysis (SCA)**: Scan your project dependencies for security issues. For selected security issues, get leverage-enhanced CVE data from our JFrog Security Research team. Frogbot uses JFrog's vast vulnerabilities database, to which we continuously add new component vulnerability data. Also included is VulnDB, the industry's most comprehensive security database, to further extend the range of vulnerabilities detected and fixed by Frogbot. +- **Validate Dependency Licenses**: Ensure that the licenses for the project's dependencies are in compliance with a predefined list of approved licenses. - **Static Application Security Testing (SAST)**: Provides fast and accurate security-focused engines that detect zero-day security vulnerabilities on your source code sensitive operations, while minimizing false positives. - **CVE Vulnerability Contextual Analysis**: This feature uses the code context to eliminate false positive reports on vulnerable dependencies that are not applicable to the code. For CVE vulnerabilities that are applicable to your code, Frogbot will create pull request comments on the relevant code lines with full descriptions regarding the security issues caused by the CVE. Vulnerability Contextual Analysis is currently supported for Python, JavaScript, and Java code. - **Secrets Detection**: Detect any secrets left exposed inside the code. to stop any accidental leak of internal tokens or credentials. @@ -235,6 +236,11 @@ When Frogbot detects secrets that have been inadvertently exposed within the cod ![](https://raw.githubusercontent.com/jfrog/frogbot/master/images/secrets-email.png) +##### Validate Dependency Licenses +When Frogbot scans newly opened pull requests, it checks the licenses of any new direct project dependencies introduced by the pull request. If Frogbot identifies licenses that are not listed in a predefined set of approved licenses, it appends a comment to the pull request providing this information. + +![](https://raw.githubusercontent.com/jfrog/frogbot/master/images/violated-licenses.png) +
diff --git a/images/violated-licenses.png b/images/violated-licenses.png new file mode 100644 index 0000000000000000000000000000000000000000..1aac702615af6f044c78ca9c3ca88abc012aaa6a GIT binary patch literal 25877 zcmdqJWmjCy7PcECK?A|v-9vD9cXxMpx8MW<1b26Lr_tcK!*PoTfl!ZNxaKJb5# z5Ef8&2RqGx@<#2$7|^4pBIPg637L!`2i)sImS^WeLsMoS>Qxh~$}6C9xmJGm64{mYj>A5ntmE)GWi`+AibQn;qYB2|%I_`j!t4(t;>|EGn2 z&e<#^A`BmsnTdBK`rGt(GhL+SmX?^%P$+}6VPL7ElG0$tz0$)61Bph ze3U;I{7+xL10YXTt+R_Co*!e9+=x^)!z7caWD=-VNcH&qTCs7&7;9=!m2*i&^nQ@q zMeQ8uC2v>tPYt0^9Niqvl&^jvqo7cr9gvccsA=*=miu3$pj&c9u^$=ZWEJQOIK1nR zq^cH2GF%HW+%cqLB+5ifG`_y35!@@CEp!^VQ!>;>Eod#M6&XnL_IV9+=VK*LbUj-Y zz!=XmJBgyrFmi*F5dJ$-UAEw^TGqdeb_>KgU9Q;^j7LT@dAts<_eMkoL^O^hq@@dO z(&iOr3nE0_W4icD7qaPfTAhQ(v$)KHMxy>R*8ki(t_-1C_-ELGuSzkwB2i$+<^AM-Zh~NIcdq=Z{9~K z7`o)0Jz&gscZl^4YpJv|rY^)^tD$e(cVu0j4r2m6hDplW@$hu>%^8oU+Omf42Dbw1 zEdXaHeP4)|;bVW>1Z{Pl8vjl%Dwb?Gt~c57e0mJUS`tZc`rlWi9mQXXieqPIcb9RM zr|d|fZn(XuCyGd8U_LxE6S2C=M6OBIncm||4IdtgNJF=nXzKipLMyxHRWR>3QzMT$_x@J3GfatRHca zi}W0saAkKbP;ie(T799(i$NHasr_e>gC^dlHn=MdD=#mvWXzASW^w#XeCM-NE-s`b zeKKOv&td{a{vuuFEAiVok?f7Lzb}7MmYXRx=Mx}`JsOuSo-Vegoa5X;KTkBrVLVR- z1*zujh%uG3cPU-mg?uWwwNfqfk!GmcsE%3Y!$TLvbY+aF%3_!+)rl@$DD9ISHS-9w zqR8O#TE-P1#rwq&tFDwoh~ZwC~Mq`Afq zCz3wABp0<9Ef(npisE)MpKa8o-JPw;z-YkFpc$IF;4mwjWN|sAvf5Oi$>ogzGHqti zE1G?HsOZTmo$(DKsg=W+jSMgr%kii_!+VSV8 zl%dcnw7FR`#T(#>*-6FIikJ^b5+%${LpI+d;4O+RJn*9bckf-G&`&bV^EPq+oaWwG zPfAXH{Y%jxyxl!!IEkSsB=74Qj-jgM>e^bdJ^zP{ofLW9bzangsIG-d9izQ4I%@0N zsSb|$u*)mHc0Yo-VxKh5xpEULxV}#a9o3ZPOU?8$HB@>z#A_ZGuhb7+>pVAeW(3ES z%+9;!r9%WpbvK7IS=%kVN*kUTRb)Nh)HA%iKZQi2awQYWj5#p|tZu!TO}=$I&KAA% zplUa!BMtQS&J@o?*`&>V#lQC4@B0zL_l3AO>tn6uqoU?lyQt-bcbB83wAQ=BJjA(1 zv(7g2qwQdHgDB4CgSSv+Red8>YfhIFku|Rk0|n_cgpAqC4Yn*FVW|5HmhmO8$Y!x~ z{D<$77$|r$6z+#tjjgwl-r2^thciiq?Hn;laA68t1takV0|Rez6><3_tk%=gXXk5x zI8$GiwH^V_hvFJZg((Ld78}{u3p{ayBH2l?iw+Y?ndX7#bsvHT%M}4Jm6b+3&N8pJ zvI zHTXcoV#{p>gP!pLzxH}N`lZ3@N;%$4*+89!OQX)S#i7*|@Ts5I6`Re@05>!=Lvc6& zN#E$8TMWNJ-g2}q0JaA0_~?NAOMJoU?v@xqoxJ7c)B-rvKE(ha8^K7!faxHbA9sg= zj6+2OyPx+tHfL79!IV-|^AgEsqoj;CKege+SkclRdA{71hb{r0M1l9T>)2S;Qr?cP zcqA_`(-=;y7&d@~jBTM9=#OlzYU$j}M>FMyh?|dibX7EfCHXl%!^v#?(kEG!fL-#w z1!zlh4iOltNy%b5zel62csn1H)@W`-$uf8$?VdcvT8)c9z>|pP%z&rU_@CW>GZ(UU z;p;Tb*-kGF3=rz&=7`BU@hU%v)LVSj9WPBPXo=&1LHJUdN|7()SLt0?zz8I;yu^Ht zB+85i5!Z`k@tb11utP(@RRX2%Z-$8Ar?1QqBVTwaDKUDvFnI$G*E#Ok%4O>2^*0ig zw{k+CKI7mN>G%1wKoN{ksAIvvQp?KQp11gY@p*k55ak9Ug!l`V6+XV`7n@JhFi@U= zUAtd3G%4fxc>6rIN>1NIuOAqoA$mRs%Bi4Zb|ioGEsxR3;=0H&6tI{lhYytTIr+>Y ztXAnQ;_3JTw4|)U&@xi3P%rGc@F5)Y41oWd@YZ&eRZ5hGpwm{Cq9@w_*bHHI_;wHf zRZ{)#Uax+)itnKnj>G`9^aF0%KnMaW0kaK=ic-ts0VUk?pYeigyD|He>7Uk0ZP zAy9ne9cVj}_|=wLH@EuZ09%A3en{N7!H8L*p>2wa)2L{?6GHI1+$=9W!S%sUv5T59 zqn#zcx;iLfxJgxV-5p3L6n{;;@wEK}%6PDY=9KNFLtwTVz~q&)A#2WW&eDXPph}}b zn~EhYBJ=HFW}PKgrC51sv1z?qlaqm$NAy+3{f^2=9Ma=-rEVq+K`%Q!U$OyPG=8EG zP!x{=*~Mo3>W3w%DZVG)CoiWr(BS*@hN|1}n0{@h(Z1=nr(|fH7|n%79a0?48UEd| z#eK_LRaHra$8_u^u}2nPZ7Z{UQozwElG^{M^Jo-uW@ihY*X{1UAFH10cg6)1oxk;C znI=!9nena&_WN%mX4_HdRQ5M2v;xnH`W$K8Q8N)J$6+tdeOjFORZyFV|jpN+_m!%Y}-8 z@lh43?^TEdTI!bHNO5H7cw(1o9)cIh%}DonW`(5YjvF2z(znVzf1rt<8RhPDfuX}4 z?KLUOG$m%I=Y=9_poS7PTAb<`C$4JmT;+vE=3|n7Yoe&cFjy804D)n{HrQk_9G$UD zzMw@EJ2NIArwsL6BUC@B@3Jed8afWzVxr4Ag-7U)1w*3=F7{FXcm>r-Ks(!PItR-+ zEIUp7-womk(oxwO-2E(tRQE+z%S^GQDJsEthIhx7o9htS?+^|sM(JO{VJ#scQTRO< zY*nbE-19DT9bb8HB(Spf$EW#>L8+uA28ytRf)A~jDf1DH!7yb}Vr+4`Ns6ZY6mA#F1+dOKMk+FM+J?2qReUaFZPp*Zavh^}6 zQ8hI=(2ps*Y(Gh_))DY@vfjq<`mnYTl;WbE+C{5zg#b@mnrq;i!8cKUG7Ct;))gjv z@y%A=LG0k3S@)Sq1~VJix(ohC7kC(g+-&q2O@h9KF2nLOo+D>ZOa_?ETm+j~L?N9KD8H zqMGp(q6iVu!>L;QRT_QlKR7%S=cExIxzN&oOK-}VZcOkyl4GJ3_v* z{a2Tx^|ZIA9kzcTH35HS5^~Ez`l&{`WFkB%LHIsF^UrKzYZ*#y;$&n%Am!<{ZupLb zV5W7+l?jE>&2nB<4Pr{~_&^Rn=V6gj_Cg?7Dj`QHNxfw&+D-PF;JNQG zi~Vpqujt90XiOo~HNwTg5xKlBAm!VyMD9AXlfuuUv8}guY}dW=a;gFDnyPPgL5Z}Q z*@z{|_ICuHCtDRv21W1$@r0((W%20JC{-D}a~>E~x$u7I?AkklpT$fb;tr4cs}<|5 z*K{ey7S4z=J*z%OHCAUI-MWs-wqY&@)+VM|{cN_EHM3bj4>v1t)+1+6ejkvXf9RDi zSKG)e4Jqn^vzo%?2x_beZby;Fup_42dsLpe zt_pip29MGrDT?M;B)wtZ@-FmsbekZTs#pm@!Ow`O{MiR}lPL*@`y84V93?RXlLs~9 zVDPAt*CiR7Ux%V~|Iee>0cx=ve3~wzl6Llg+Ilc8UxLy-7ByS(h z)at$M!5j!n9{l_TfQJvh7NvIehi=dBocH_JZnZ8)q<;KOc1y;TtkF@vvA!9vD0l{Y za0Dl99;S)-^xa}Ojv*Q0BWmyp&%OA50rTbB-HEw0v*ju{EYi8MyW5?}?U=Yfp- z(#4Fn+k6I(J4N;?F$goOsv9!M&HF$sB`>#}vkL`>nsr%0!FEM!#{3^krUKj%pRXr! z`4S9g3d9(UusL3W5*c*Lz5A)vDoeMw_$t(~!D>nVEAGSyg|r3>EyWfsX5-Xw=v9A) zrYs_EX$mrD!147m8CBNK*e^$OC+_q;4MQarl5lJ7E!ONfrxZEqnVv*dMH8SQ(2nwQ z*gA6(hZoW4jl1p{oLE{L(L{JmF?%;x3s&$1Z16r^tyCR$6ZNV%pD`H7!iB1zh+K^x zG+kZDx}3$_ferM0C&_xra?qstD$4&PYYZu8WmX23uQNb@e6eRXfc(NP_#gyBgBp(y zbUweyALbLT%8sBqoap4F8bj{BT5&xs&%=tE5dDtFW#4KuE*V4jV?V)9PQ7Bjd`Bkj zn*<$o80Su2mB%qqo;Qi%RSR!_AKPGUB+`1RIT0<*D?TIks53_Qc_v1`a6+S#P`rgOnrWHjfaod7!Ax0 zkhg98s8tDWC{tC3yfCr~skpVfdEy9z4;F$`oyd57ZF+%-PM%9Zii*Cvqr>qyODW-` zuIe>9t=%J|qmR#<;7d=nknmwIw$qpPzrVs#8xk`e`EqFWT1S<$Q@ottaJQLfP#Xup!0>D zNoj?IZuw$us0wqu3v)VvA?j9+f{?z_YkGvi_>l=-)c=2zk1hSXmU*OSq8=hw87iiH zvKq>rJ{P>|>}~dS&Rnr3pwQWH1A)`wm*0ID#+8$iU+BYc<5owq;c;ys8@8!Q!d~Ac zy@;r~ci0&nnkqQF$)->=zPD^Z-_sX@UZqCgWE4=ijvg2+_WsLE)uTrSR@1 zLQ9G=!O!YMI%;lkjAcJLMFkT6<0n)qNwbNdvRjLCSuNaLy30Bo2X1)Jm;~9nZBwKe z#7!KPR%s4Z&+W5T(UTiT+W#ycwkZBg)HLb@n$j%EuJ~QU0?D!jL%2uOLS;mP%&XtN z?CriXl8W4Y)!;}jN8pc7P?Ir66t=4>l0*OFR6$*I0$ub3I9ABE);wL#=dkVk+G8v3 zQ?1wCsK1rEmuwRKPGdvMiSsB=h1r7%mgElHtKs-czR&%LvniJ{%xJ=e1N%$)2&*8k zjcbOi3}R*fFQ)h?(PewE^->AD>PUVAz^r=6my`m;NNT5LxL$-;|eHT|9hf#z;{Yk`YCwD{}L_G zCtXM&HtPT>G9>ixi7?0U{IH2yJ>^}%Wy%*j{mur|35WV zq$JtW9UP=u<`HN`*!RDw(fkOF%TvFxM}M3sZ_U4kw$-+}_A3HbKm)a~s0@OT*SEm2rf;^5KLH?0XL*aQ%ucvz+Ex$l!t*$Xz}wNG zTwzK_jgG3E?arQ8``EXN<&yNx8s(BfTOBab4rsR#YZei-OW6n?mhx&mnN9G#Z;QA) zT^88zxw0sv4Nsz!n2_-f+^+1O`h6vbb#Q@wNyuWo{PSikAvLwf<20Y3<1sciE>66N z2|3wSm0n8_&hI?|-|HF+wn8&fl|fI`Z}hn@Org{n3;TY$3>C}4pS<%a7Iq-Q>#}-a zuuYzbWW8WeJoW8Lxz&9uKxYpNCZjs9N(SR2F9r$mVOIxFz5cp(AM`=_aDxpS+}AZ(cunNMgdM7L0>TadCLT_p5;KZWPEE@i{%JYDq7#_eKN zmZ{@qlz3J3H8-zv@+wcve9O*>>f3d0cvjjS8;1SfFq&q|shx`);c9AL6kO&`miwrF zOmecgUB?Smg56?f}Qk+Yy^rZyqw&=0P|fC)OR0J6h&R7+3ZImX?;8?O?yj+Rk@o%w&>n-;Z&6zUcx~ zR8;*XP@fRMp^&Wr4k&B)$+f06kE21{d=Ql9Yn-1gxC zTt{dmc&_9!ugUH0?dGe=NTTj>`xV7%8(c8qk%_>A@#&;2>AaC7VvC!Zof5@8>UyIS z)2FQ!1{c)h={h!-v#HQY`YHhXIyA!}SMK8CRDiARot8Gf_pU}dOF(l9Q zR$hPUYvjrN^b(VSa-A!lNsGs}-^A4KgSVpbEk3VdCSooF3hq{XJITaF}bnhoA1 zQ9T}+xlU%XI0G;+Fd(9NiR>MJ5rddqhVCPEQi0IaBy+=Z?7X=B@%Sj^PO_#*+G`n1 zvJm~`nXrtL@GZG0tDq}afr^|0#6ys*?JDNt=A(0Kvizwl+8=!)O5Xx)sx*` z=hLqXl7WrqwnjUZ3oadK-d)qFv-laHzHFe6*jmIO+^Dy@LAh#PqT*qe&!dZ{#cEu9 zYHIk5q+@GT`g$KH!K-#&o<@hDNMrV_vY(T0sszqL#njX(HOfW7xzE$o_Qy`Gd?o^B zo2l^gmUkkwAX!Ow_hq(h?MK+vA@>Z>O5sbreQmlq4O*CeZL}UD=InKNd4W?ZvIQu& zW|^u}FYLd-ZFhk7aBCL$j{+qEh&wy?8-+7PvL&nUseIA8es0(a^h&C?iOAbKD(>Dd zEU7HOG+e8%H&+yg4F>~A+gef?o=s(h=69gZ<=jox9lA|?VC}?E3y+pHvh(2d^|f1g zZHi^Rgo6sm$v)8a71EHO3{<~dNvDlKJis`(a560e%G>Jtc$Gedef)&ZIBo1!0k~+_ zqGEY47yL0bog?LT>>=iNyk5rObF;2h?{{JAQtEZl@dAE0)M@J5Re8th@KTI~NRT>J zuCHqR(QLC{$b+r6N$Y5Vwpw6JbHL!N}jA4pic^cf$`?84#i1#so}>X z_Sj?2LMd6%w=)ZS8R+)DZJ_Z)Rf7I%bOC;|%*zbn#oIac_gSYVrOm`9V<5ez=l ztN|B+s2eJ~R&Hp5`v>cTWMCjHznT7N9m=0Xq-8S~8Cim54fy8*WIQ5u@3baMtDMEf zUhby*x78&+MQ!U4maln@7GC?V!{;8=vIoUpNa!wO@U~#p?)*p46^fCdT#`9z+KdaK zq3eZVM$E0#TEhX}EJ((+dTj=xpZ$Eei(e|SLR=n6YystZj)-X+tE&ajN7IbjF|wg~ z##P^ky%Fn=7JnqtKgG?zH>GOUTZkcYb4zRZgMjp}T5Nm{=U-eOplGjY51};N;9#E; z*1kXOe1zb@!?&emVGl`p2y9y4OgdFIxfa6wo#C~PS^4c<<6e?Mm%VD7@0+2rCUMz& zj)ze85+WwEx(|O06z|K1?0b+t?3|&T2WMqnQ?)eh8xT>2Hbne1L0OV9mz<0Y>lw5) zXf*orXEP_8>~+2uv!=eEOzdx-EQ>{dF|~s(=QSOwjM{hid|z#0vQ*QGb!IOo-S>h{ zq^#S-=Vz$(y5K6d4z9Oi%bKv{Yh!gVi^yq_ey~dJ%luZ=gjZV%5kl$!kjDnG42?2b zo$K9b9?vs(^7`8u?G2ooXimXL%Y~LQ1?~{I%c;2xf}Nnqj0lXG5LSl_U0sXb$v?n? zG3oUcLqw;ed>yVj-n>P3pOXMMzp`?T7vef3S?h&gD;aos(t{eAqj=g}#MPdrDE z*D}I@^k+k=$TRd|HQ)O~wFer0p+Ab`lN6>;5vMLkJ-ztcwDxNwr;w#z1TCeVeL%~2?Et4Ym=N~123YS1aYcs$_oaygFJU(fORA7*lWaBr>} ztkf*l8Th7Ntr@Yqg%qpg+-0+d9m+;(ZBgLeQZIDc3AYyVKx=HuX&zz4!zT3f_!39& zVhsXcdHh*O^rz}v&t$)#Z%do>MSKe0rhz=XQqQzY%HmOjkcg4mc zM=A|Wb5V+ZpNqN$>br1`^tP`@_;&cFBv)twzRg@}$SxR6w6T{BKR-N_D#^2sfD zuIJ~AV$KbWX0}Z^qr@@?iw#^khG*Wr%jeU@g3#LK%}0&)$!SZQ@ixMX6|p=*y&RMi z-2r6X%Vo zbM&V-+~_(WDJm^{B`79R6=`VVcIp^kt?K?sXtoHOkde;qkpA}KLl1&GKaS@+Gb*n! zpEz6vS*2VTJcG?BwuIEEn3XvakDb3B8M+G4`e9xwxW+5P!>AD8wu@&cn}aqzPK3s4 zW>SY%l28Ps7lg?jmJ!EHi6Wnb(XILC4L{&V8E+@pxsr{pC*{NejfSBqlF->|*+iHb zIb*f`+eRT-m+x2vLbaVvI$uw}rw}F6%?0rxROT*jrUV=6b{e2?`kkk@%Bj+6^>;W} zsOo5WJMi&Sg;XsSx}5y9vKSh_|DsO%^+X1a)+kx#hsL*s5$ywu_3?*eptNMbWBaYI z>O`Om_sI@u>+6PhWZdRHTWwSsL#Q3!$ULb&(6P>7pta~*?D@no{6=dEim%vH{l+$a zFivpWvBR8j%Vuy_x^6-Lbo`ZNz-V*P65%bt<0U)Yw>$Z6V17%=!wDxYx;-bv;Ym1xr zrPb`0Ig3y~C!h>htwb|p8N>lgjckY;D@h7bcLaj#m~}5Nbp+(*b-@S*c_5%-+CoE@ z2mD?a>!VpM4K2BLjPczr6|nkk5E-@DPseQOxxx)uQ9>v&=pN|e6pie7!$PlaFFKw^ z&q-S>;>y2`RgS(`LX}Ge9nBhL`3x1$CyXS)_wh~TYhxqXZjLXj(8TxJvAHUSvN+6y zuxQMG8t-i;Cz}fnLn_nqxJBkpJt&u<~2ePG>tW;(`-H zj|b-HW$4jc^0hZl>|EQTYNmT9_ucNyumlDZ52F+-Lx5}DU5)^+y!2NUoa?U59LtDz z`SV{$(Pj4<9GNLDWk1xdPtC7NSuCe#COWN=fOQs1v{4S5b)M({GxskadiZO^gGVvkJ~edhrwzTW$iaZ6=`hpZBaV2UzPiQ zeQDHA-`gs-EL{jmBIRCZ#77*m@o4?|vTS&VROl{*6x0Cec-f_^S?AcIBhn+`+`G&& zjImYuj8E8p(*TO=fWD6kpNAl;dmfjyl;%dEDa8)w1QYkaI*BL6%&BfL*e}oek{%}X zdKx629-Buc&2;P+?~qk@enchG3eXTuV=HfvZy&pI*5zpU(IM)j$u6;S3}&kGX9=jf zu!pD6mtSrRy>nMFxg=+SJye??yxCYsxshoA97|HqLfjyETQ6^iE9%YHWXb&f55A2|$9IQE>_(d?nU zWma$NFU5d7Mkx{PWOpJpLxm}8(-Q`Fp$%+pNkwc|`GwN8FIj!ZM)U11S}YAX5e5R) z9bInT5Y!TKW+PI%Nk+PQM07}06jdH|e&S4GwbS6;@z)wm9XVbE-r{s!K^kaZyv4VW zs;+DDxDy5?-jA$$K>>*S;g-_(qd7R~2qepP&W>Bg(zair`Cscl6s@k{u(6aAFVzGK zGTRK3nn-km+b%EXRlu3n(G5@TozV4I|ESD*^zB||14;72$IiD{Mxn8&yGfIR!lt^4 zYiHasg#j=*vZKA^#AEqxC)3xiaGf>hI}3#h;Bbk|=t6QLLlgr z1qA{#6)5&2xwLN@6%s*21BEY8{`sl`3nD zska$KG;(YU!n)&wNYi0MBAr^4+HurZRo`)%(zLzIg@r7=QJ1$`7hW*hj|!a4v@{A7 zr<&h3J*^H)CxX$#!o?-N1^F3ndpOqw~#gGT9T)ULb zlTy~t#PtydX*!d+vMpmp@L{?X?as2(2g+fczd7L3PmWO}{7X|uK}eQy=9kZ32%OE2 z@};kkpDjyS_b;XW3VN$wTIj#24v+`dA6$kXH4S{tThZh1iCxklQq1&u>EE_tnL$(- z))^?V_n!pwAM-2|=&ey^W4*s^Q%-_}*Rbb_Y zsG<;&{Rjv}Za3xH?yrof_>t_In$j=08o>U%5c8Nb+|$2%|ywHAKQLLH@TB&G?|^wX00sEZBoJT&UrQ^oC z5GQc-&4j91`|)H*aC&_ka`c{Y-R|`qOCKW!6IpgX6kcBsHlKN7aovL;Gad{Zpeh!YNWCACtGB%!mOi@7Jzp+k za5J#7}TXs3jF(4Tl8Ib}xh^6!GIv;`%&Nj@LIv`>F%b}Amc3kn= zBT59qrIXH&c4^9rG z?)jLN=ZxMnb#87C2yhNYxz;?_1TtE03E7(JJNVY?2;_W1E44d}qsX7>B|($k+d3Hp zRl`lmcAxDEtFRA6CpGGEVgr{tp9c&YO;u_q9taeSV-Q91GOMbW5La|K=$1kx9D zaqVVpLE3lnjxKGevzjm1o*`G}Sys8t)+hCCOZgv^A?KPd_5mP?h$#1T+IxR^m=ico zvsju>&*P=EfbT;IBCwo0qPD7xVc-xElS&gZ^7j*SRttk`qPV2g%7dXHKXFB%?#>E8 z&junnIXUdB-5KVa8j8c$`%Vz z;*a5%l$Oi|x!Px{>ilwNXJ@4`zUfbr{Gp~#FM0Qo&-`MgiVdIWlG#EVZP)oxC;(-F zbd4ZG3CNL*3d$S*IB&i1?dUAkOkaTNlS(kQnlVUaI`ImRh*0T1QLV@a=~1!1fbbcS zM)Gjb#^w()V-#ijT;y+iM|UHK-7f`f>?h|Hzar>(DxSFF9nN87DhwQ=a zN43i(F`p19Z&2cCrb%HtTmNy5W7Ag?>j*4c2*@j#`*(ut0}J%kVZq z;Oolynlt9l){D>x+I{FnrK0+$q#-0BmDw)mh51JP{L#s5Zlrr2N>&Y{R{^R;Ei#7| z=>TQ1&MH(4iULRO9g1D_kq4WOt9kJ-i*`caE zc4v>LS*iqra|XIw99GqRZ{UDXR@_;IOtxXc7i?zd=34D-e7-(O{*|Z z*5{{ZoULB5XqDloyNa|&EKNa?rKFFlBF@mGjyN#la{XFeb)O6ShkSvp`k&_IY6@s<0R?vmM>s6i@Qcf4-Zd@4XF+0 z*Rwwzw7Knp2d~!gPe-8_)5SGA#SqaHI}DkjFsydkMV>e?S68CkT3jH%ixR^pcqU;H zof2eP8!iZk4WfsB!n><+g^jS!s_k zeZQk zmbi;Nl9uBJf&-rWg;~5EV)*PY3;a7p1N&u)8Pl|{h{`lhSUpb~V3y`9?YH<{c+V}h z8?SbEBZ=(yo!Jdk2YY+*^SX#diiMA+ONlRy{F#W$i7`j)7MrQgOvFTQM8{N-l4qxY zJdTGSYz#~mmcX-ueDC4&1E24wul>-u+T5wCK79E;Lm#p{MKtrxYM;%MZNvsm)sk>U zdiV)cPXSMm=-I@k7}eG*R>0BRJ8c-PpNy6J{%20 zg$GY$?F>*j09TTtWWh}9b3co+(K_59i?A3@tNI0%rkU1cYvq7v|DnG(FopVZo?%=_ zn&UH*iXlN{^I|ftOd0yeA^#cZRi}5M(tFJgLy_=S$KW2h^lHjy8&&Q1biU}#(Un#m zG0(RIHW*VkD}jmmrJ2gWk;FWr=tv^?2;bKwv3ZqPBcg0*cXxOB(jkEbU0VE8r%w`w ze8OJ&XwUn*r0$~Bz`E;;?M__7itb7KQ2Mnw_}+Kbw=|_I$MxVpx$fP5%0%7@940mW z0uSICA`FjF9WM7TVEuAPWExU`6XPt=b}A%xwH+)j;)eI5N9xs_+3=Ru0;*CUL^!%a zq5Ek4cOkOEg2t0c4Y3@Wa(KY?%X_@hm3U?Xm{T(oq)=L3mPeFf-gJ5-p2@VE=vo2% z0Wvfqmq@qCNE{apyJmJ!{k}%p(vM6L^)gu=63v=yLJ*;bKvixJLShB^SOfOzE_Cj% zdyai>i_S&ufd2p;i0AeRg=RAsYQm|vc zqa0pRWGa%`uGIeE^BizDjORjB`KcV$w>O+rWLmLY+_$d3+$W7gr&6|{?7-=ACXh_b zyP4CCI_As5=X;+JMXZHE@&yM+%49gP0L1VWeON1uU`x@x;WND+Kf99qru)DSE3#x_ zffo(U6!kizvR>$^C>a?rUIB0O3`hnr4^Ef5w+;WK93R0UTduaV^i>Of_OIjF1zKDbP~D$eM;mBsffqpCKX>{uD8_wr#svZ@ zK(^`R)vMv%`$d6ABp29=tsD}uG9UGc+t=s{4gb1vu_&F;?+>8;O6&0B_$OX&;e-Gv zmM2Nnv6mw+Bi9kJ3xEiTD4z&s<0LW)Ud4RF)WD*lDeN2JR%)w>J5j_>U}fi^rzQ@nlna|t;knoV zGg5${dfCvxMDz~2S`lbDSG{=I>-#e7VAc`g0T2+c(Hv;OnkKPtziF=2c(h5|{?T*; z2Aw0b1F9m`u7X(SEm<5+nvY|P;X9HBAN@T{BO{$$R?qTT%`$lXl0SJqf;Sbr_i8V)ydZOs*bNJ*$95`$y@?AU}6 zlwV%!duig-hsNOU3;l?bUoxh{*`oUq##L0(-=N0@%R1*QT|A} zAQ|NUOVWvhB%PWyT1ni$l8)k!q=QK#MgBXK+J6*dUD?CalfoXg3d|o#M_4QjbG%wX;j+yq-X^P4 zthhIM((xViAj<{e8Nj)BB}HIt!La<%=H@?=?gO}c^i6wSXRjpvu1;9%?Xi$RUj!Ge z+z=&`zatuTY*LcjJ_>TI6?oIAoycD5PYC4pZ;v_=+Mr6-LqlQ6*Oy-DR{OVd&QQdi z-d<6~7-Esg<|JZ<>7P}FGka1o%FXs4c!1l&JGid7RoXdm6j3v=B5;Spdn4!vyImfT zpz2NY*+nyD{{aL7g%yz2`b9uf1foNL%5Y}8xsY}Mz+z=T@{gd~eG4T3Rj%||Y`u8Y zd%P}7AFZyg78@m<&$jwNNrpui4OPhwqC$bql`iCaL477?n5bV6GE_t!14U*ax5A*Q zH;gkKINeHpo+XRr6ez5vq-RaUX0?&MQrj^H#WfzK#Z{dI4d!c68ypmr*V}#Edk#!w zwf7v?SGPHB=U)5`eW0|^;lM>loQ5Ya|1P6V@mW?Uf%vC<(@&*-U4DMTNbhY6mv`+pbh-0JVh8J+ z@e2a(AOr$VaiHnDaAx@`H@7z_&%4%gkUKA>nuxkfQ8JZ~gw*ZUW~<3ktNa=QZ$&sC>c2`B=Xq`1)13~|O@ z+9v>`M6uy=R{aQ%eNB09O!BQEkgLh=!q-htk1ZAQGAQz_LB)(iKW9LLkLSdFMU)Q_+M z#UbH8eiZ(3o6NzOti&2x3vm0MV!krkA?WPs@)`qMU1kAtdeoY<;yOhY&dB?mkjwQK z!eg3^g;aJOf;)Pi2?-j0u#}2Hy56sJsXRcf#&$eosh(HmygQrYj-a{w0|L{@l$ot# z;;*FB_m$7Z#wD@CwN2@Ce5T!8Cmm2wN*w1wARCgBu`%T9<(QgeP5;-^K%tNsYT21u z8>s6ms{Ha{P-dsV6N5M_oG9Ta3RLN}?OoOF*nD##GTX3#S86MUfG02FayT7{&1RE> zdIfR~O}*&(F`hqT=%xsBHQMaooAcbh1?@3%P{o`B-idrWRmtQSAhwF%fO{s`!jk=@@ahAg?)rKB?UX%h+>H=+lk1 zP_!62>QI+5wW;ueLpQ;&hZ7?EH3$bq8@G>2kawd-AR|c0bEa zy}KiYcxBHH$?F^V*g=b~{PRugis5XfF0J+UG;jRq9puF+R*$jYsCu_ULo*7#-!dSX zwXjnq{u;F8AIi;Ur!EHa`{WUeM3fTA3wL?hPfjACeo+rneQW!9ce>v9#{a5}eIXdE zj6bH;L~!)snl6FHUL3>? z-(JpnQSeP;Ci)^UW*t(#nJjsF&TgmUF8-m&&+L0t=(_k+*2J%`3mn5mVDo4X{qO|0 zq&_ciT&P1)zwP@28Du=}7P^Goy?XnP$rKwrKR;cr!3Phjetda_P_D-RR*fdsV~gwW zw93_gN`7Mx0Rcf3=4JN9?#{@64-#O0BYje{^w{+VD24hQ>Ocpojml+xiRE*>saAA# zX|8L;e82D*$gsxZ=6|oyJ});cNcSeMc9{{K+w%0?J~{4f3FLcen@%u&i0tMpO2Ae& zxsS3z4m_u{uicMEr7}Iw&}gF0-1u}8k229z z3c2>4YPU@C$6k(AOgqxAoZ^2bXgqc@{r%Z`3GTgWoyC3JeGw%SNq_VhIMikz+&)c_ zq5Gr|OwZ4f(|m5eNe71-j#RF?5ux!t0)MXa)}(Xe4NUeRu^N;XmkAI}T`%-Qf0bC+ zu2KLd+BB;@1=MzFEKml$qNnqmwK}Khd+J}x_f(s!)^U`dPz`(x{D7;{`C^O>D%lSm zPO8d2pJJ5bE2F*`3Kx+q-E$$m`qiQ#%Eyx#n%JrU0#e%BQ5r7|W&1Ohd?^XAbf!{z z+S<4tp6b4?H(yY;y*%BEjjOHoqT0=045050bAD=gl*B7YsQ)B{DJM-PW8ny zl~yx=aCeGhjP8{s;)E@Bs@H*A5^_B1fyR(B57vt5u#QXn+(M|o)Y>9WsQ?uHuru}r z|4u~}o4qH;%sP?ebTuh1J1IIz5mT-k)j^f_SzmDePjg=x73J3V z?GVx>q0%5ocM1qdN~d%q4N46mF*FDgN=qu;NK1!EH$#_ngD^zZq>+1Ko~XYc+0)ugT4v+{gNeeoRDces41gynq>92cXhx{F0o<3FKxnhcl} z1)P+=?WzRioz^=p&PfMOxSa+74p@2sDGbmKix=^DLb6h*6*oCx)oXLECqlW z+~9%kD+_%-B28Yu+ZW+ZoLyVvC5cCIU8=;Xd(`noni>N2FmXT9vXEmVY?#OT%~hZf z$L)7Yh|ZXNBD)gYZo;w!RVCeqyEUJVl{Q-RCg?NG$(@LjN5^IghbTPHWv(!psv~49;~18;w~H1R4{T=!O$K5fR-Y~&ndk|ovL%)o zN~jK2iT@hxIoIimFWJElGs%bqbd8Nm5E(gky16KcoJRkhHX+R@9!Ov$ACoPI|)|kzmqrNJ4ij z9S$QVbVoolTpvkHo1y_K&|9^k%S&rjY3>_U5gziMPDM<>AD3cosIta#L~Qr<2i;h_ ziUW$LXsrcg6BofP0|U%h7`1_*igFY0wIf1!huzNiXt2a)*9veDde^ja8eBny^ zT*Q^mbV>p%b*sEIQuobDGSgXLs{pbF#;x9A%JzKHN>B4KdXm!ay1Hk3$^*rdM%W>z z(U4h~PzZSLB%!YJW_xyKS95yC-P2J6hCAvp0dzLNve#m!i? zL8a|8{ZPqqFY7<2i$@nym76qLmT1`Tq@?{hddtY~NBmk-Nc6Zx%L!UMZI#?kt9IHW zZKrj9 z9~W^bJYM0q7!8^8w}Y29eOC29eOfGE6GxhMe{k?F@M7WmKQF!tEP(Q2}5GBNy{Bp=Gb5vmAJiEM_i z!R<)6z*BmYXLuhQ2_3OY)HsgQl1{G-xGk)!KR2Ek)+tOVX=B(;bN76iqNSfWaPy^?h|Y{tKI${;60QT z$<_H-qovw}OGX7(Qnok2#DgwjQMzWIYBh9PDycIu`z98B*0DFpmg8Kd*0?mt<{~%1LG)G-CXF5|*!#p4_w^2h_6U`b zKg33|Hm_6<)B~X)FkLw}g_qP~4mdr`O(l+kSslqYZL%TEJ26ycwSg8~oIbNcEsb&h zgOXYl=;I7|R&064HKlT))0gDa>b5bVC47ah3l#$t00eOEQZW15ZUZ>orIp)-)yZkk zI-D{CgBK+qU4r6Co2D!%E8|~FwB8w`NCa2^6D4&Nd(Ydm;)t+s$eI2?Kh#h0v>7_1 zSE~6R1fx|+1(1#@&F|Nc{!60I34z-6`~TXTmJ)Qk?kk8z2qyS(LIJ=qa00mXg9`^b zJ|d*r4`wUjEmmqVZ^f=|5;)nq*%+ZiY`{F^qM*3ExQlYASoalpv;Mz@V9bhMru_pK z`HS2^&ni=N|5E!);h<}sI<-CuVfY*1TTf*_=CfH~e#pcv%SMhb9?z^z z5Af8a9jBW1io8BYH^Q!fU4rg-qMbBmiKT%MrA$E;uMMT6!)_0ya#4wBF}|p~@G>=f z>*{S@K>JpCZMa<=pBgi9aebsD<^L2CNvcrRA{f;d#@b%VqwcV<6 zYC)L7gSzPqh&b%3$BMDez%!?te6A(h7G3}Z10q2ei^4HL)n}9rNo?e)EYti+#&YT5 zJOM!wI^C4~%RH5*`r&#Xh8vwz zpzjVImvwC`bFn@Ssb83h@~HUiM)a7FKN1iCTZNeQWrEUA&tqk`N&BeDd>fwiWyu32-*~VqEYtwrwO}pQ z>y*+?V~sAWb~fVQAjybDdZX6ZGP&~WprIEqKw!hjMf2j~G@<*k1#dNewL^+qJ9U5H zFslW8&C1fT$&hlNcNYT&#%e(hv?%(R`D@1_G30X1gtA8xF4GdtfH*>>9D=v`cty&@ zShb3)nYeM!CSfVUv9zQ+I+RBopgSK0VC2=AR`)8O555;n7yo`ldt@_E3)xUT(s2XWBz#uUT1U(uJ6qaGfqgLWAnlM=}5Dou+8*hME=W!OJKx@JF z%&_vAFSuvMeOq$4!*Gm|&(8Cl)=1xXBInNE>)h;|tcpx)jodkho{-2tT#jco{H&ZN z*rt_2gII5%8YR=n{Z_#*!Q=-VZzQ@j*MMOkSyQm-jq8+q=E&%ux*w{4{g|=u03AIf zH3J5H&~(zqz`LIVgS6KGd@`(?PE#ef^48GH1HUoF&r74XN$+HM~W^h9i2uW5j9f0xJKk z)lv1OHL>1L%z?jrPBz2&@73#Oeml~~Epmv;9d};5J#XRty?2@~nYizYIHZZFw{RaI zAvnK>8wKR!;|+_3g|(O#>wkVKZN2|JG&Wn-D5a()ndTturWSq<)Cg6B;Yd3EEC2;O zhXelIA1Q+9i_i(#aO_a?OO1u3B&KE*!BBCx(?AjAANvrS@B!p#>?~loDZs@@Z$P8+ zj9WhUoNBR3l$Pw_G4b!Pzyr&M`dF(X>}<)`cJ@n_y1fZsz7A8+`p|W9uXg@ww%(jx z=dJ}T8tme7zpWUlhPRdO>Dvqx65Hl))x5(Y`at3^qp??i0vENs|6+;b6PzI-~gNyZj7if2l)CnD&o}HZrnCi(TUxwNx|r=%zQvvvP~OS zLgx?!Pbir$UobffwphaD-#O16i}V%dsMolXA~YKiyCoqzOA)bhQ(H-f0b5N1#%sSu z(V?UhX+X-)go+t;NIS>?et6VF_iANr3vJ^9FaL~aXZYm*dFX_;veu)K?@~(%OjRPt zgDtRQy|38PYw-q@qipAP5IlXN+-*KPjYP`lOvy@!83IAPX}M42=u#D^mPbDxTC>55 zudk8wWixJgokkmM84L08$XrgQ z!?U^}n2l9$X$-ZKiO%rX=r4*X+ts}_rIwqkSlo)KpFgsb_o~$cWA*tXeKlb*JJ}#Oq(dEonZ?oN20b zFm!9G_`7tIE7MII!OI4dI%)maHTDKpIxOWO3R|NVjI`H*(R!XoT?T#Cb~d;jATVn9 zrm5i-r?*0Jj^$o`P)&%54wmmLPM4HU7Q-(il5%{ulcusORmn1rIx?h!JS+5AR_nHK zJ5r7Ed7VmT{V%j>rhQRBS3Tf}$=~)ZqfbJLCiomhkU7wM&~BywSAF-+J3t1Y|xXrA}OuG^!E+?dE8S&xX)E5t9G zZemk$dfsO}th@3De)%`FXSxWpjQibU5f6pFBlL?vF^*M$EWE(3cSr{O0P(gHg<1DN zzMy8a(&oTIPo?vmM-r;MG!81Vfxx*o5Zd5U>E!E`7$_U0$I-+-0@k3@CDJv z%HC)`tz&&<5iAMohRfZQNhX#O5fbKDmY+23h}O8}mD5(MrQr%g)g2lD;T1u0QyLOi z{*xf2|I?IufX#?|c?VCi=WJ~*j*5eM=*oIyF7C2PjZDL!;rQWrJ)A|;X#KXL!O}%! zx5Km^ZK#Iy&lDk|qt;kmLPBKzw6%kIre@%=R;sf7r_k#4T4U~FzNDU$QM6 zkUcwoKjCwP-s;mg>=jKIS?x3r2V)-vv{Mmb3nEc1S2I&5***u3YS&XgG&t9l9*7r{ z83>YSb*^y~A%D=T(HNR&PC*X|DWeQ> zSB#8|16vdtV*up&xKGL%W99lhl+pI$6lf9#<}^GRhmDzJrKbv}ShwK(Xg$ry7^|*g zbK67rRAILRuGQkkEnfGTk33Y0^_xCvvFd+~T6?Ve2y-0v<_q8UJi@ql*p_b#fM{If zNN@>uz3G4-M3%3MH@(-6=u>#V9p#rr8|UhZhkY=m!X``36YF>nZU90f=3P}SuInFg zxSvwSh=u>oM>ifL0xgc9vKr0Q$S7TxeJ-?qNvPP0W$S2QHnnt`{Nd#xLo3!?u6a3h z6=CjJp57bj+;_~WJ08yxVwM}bVj%BaA&8b zg6Ox^R^rCB3xAXT^AZ(JHW*9hpW_4kBYsMRy~n80b_!Vr*_rrMRL7|kCNENVdlk*> zqN}O!-5DseP3vi;u_kkInpqSo2E2e09b+Ig{~nLn9`h)CUI@nlg4bO&4tN zHCRn(&Gzw_MD#}D#pz1l{-j$AHAC=M%d_qFbqAc z^C_%OzOLgfRQv6dcK|=2WLuek+6aGVp zw-Vn;kuXcBq5tN7kV^olJJcjj@!t!z??N_MsshGe{6ot-qJxr|JV1^6-+X5S|2x8c z7*ieX-_NH(d6NvaFaJLa!8Znj6zqg!#6e6FogxLgW`(mSlJii5H=!JAn&Q2oAeL}! z>F@s+RUhQPZF|xJB}IC<9PNK!kZ2_aQtg%S5?biLB7q|*Q0j=7#!CIe{`;{!0KN48 zTB$Im^di$azHt0F>Sof14XCdH<%<5@%VVm)Z(tx&9;CM}1UEXQ*Ww}&i0mU`7J||D z=>Au9)I;LFqw$TEw2pmOTAEt-j)WT>f8DzaMRjF5q6J0RGYzL;Z||-1_hm(g+Uc+m z*DHYAXSap#Oc&`$SqGAw9#>QH&RpiL{PGER@`)mTQkm{u4W-ADbYA7qo>i&k`odAa7^zz5p^SfU5MzTu- z?CvrVxj_P;rX8FLp|gLs1-ZD|Xvxv?0O}f{l3U>D?(Pm|`A0MLo=+SW%9VpVrKF2W zt~NfS0O2Rj`NjE~TtOQ#4#2q0aDqg=57@%rM}1BAxzGSI@hy=3MMUWq4!)&|l77`! z)M6AslEwze$7P0wL}gx5QOalda?%sVy=l4_b~xDv$nM4n&>I(kEhuwK1i^+4UY>wL zye*$#hAbl!*GF}AbGgwF?oq{$T|ojjO#}Nrew0ZPqPd;tL;}cPZjsYB+pv7w>g~9s7^%xYyV;BD{aR4l zv1UR(yXnuljpyM)zQ5w-fVLW@*`WNKSxY3$%-qc8B;2CPbPtwX3JJGg?L^mWapRMg zk;*^5Wj{{=8J-gH5=D%i>*|1}7Cp5BQ5vyARKDAEY0oK?b9zy%dhzc31$pMOxFfkI zc5qJ}Q~*m#fbEg@mZSI1K85o!jwRJaq7zn|Z|waYtMT1XhPW}y^N{^r&dIRR;cSoh+h zv97(V=b^vNeDjkRkm;J&Pv#fu3P|OF@cV_XsjG;+DSh(!iK`3##=I&8mDoEehtvIq zoSMU?-+%smtv?}C2X-~R7RzdBA#!mpcFlbJG(q3F=R!;rU3FJH)cwv@Csnxg;&8K3X6#KcSQCTJFe2h$iRueIU` zsk6caDJxnz#X()K`QG1Oy1@G!v+508o&hc%-h+qqh;&>Y=O~o8v#&3usvXseZN?aL~NF_!yC zBr4AUw|G9BgbW7kY5?e%?|$@ZX?K%(o{2Kc>+@0i)r}1m$A0_Cg360bdwF*hH#5F$ zMzjYnZrsB8dPPX=6YKrM>H_I?K&Nw-BU zP3?kB>u1kOmxr4I@0~kj`y0p4Qi|E`3rY6~8m7ZUeGu8(UeBpls9BIZ!&|g9Pt#Zv zNpjZI+Cm?YcQX4RwM$X(wmo=@C7r@OIW)5WXe#zL3lexgC2-19&|!jNR7Zhz(F?lG z#~JWzG5CnXK=5r)PZWMP8^rUzGk`ZY1i+GYlv4icX6HsFSA+6ed3e zST@@G@r$*`KsH0+Anr2S9}8>&U1LK>$7l5`gI;m)egDwVZx)@}O22BOLRTPxAwbz> zGSdv@iC;183)!{*Ahs*HBxMk5#RolrC-yq)T+fneY0AQPFAfSy%IuSBStxaw#Z?w%)s%M2 z?UL!toJU&C!kb(c7Z;nB$x8-tM4!^dvw)X#!Y;$JVsKwpR58+eJjR>$sN_rzI5IUF zvf?=5?2=dPpEZ$0_x=n@!;My(SoS8ujUW4iZaZ$%ACz`Nq(XDmOdKu71+NeG_98Xx zi@6D;F7SSn-T41fC0vZYtT(f?@gTGgk#0WTeJvYzEvp|`7 z$JASx&%IJcjD&)YPc5G5=VzjEPnYno13&S{kha_pm0EXa{O-pecD=;IaHXB9`VG?+MEs|PD*{$7hc^*v2VBC Date: Sun, 8 Oct 2023 10:33:31 +0300 Subject: [PATCH 3/9] Add tests for SAST and Review comments (#523) --- scanpullrequest/scanpullrequest_test.go | 355 ++++++++++++++------ utils/outputwriter/outputwriter.go | 10 + utils/outputwriter/outputwriter_test.go | 115 +++++++ utils/outputwriter/simplifiedoutput.go | 8 +- utils/outputwriter/simplifiedoutput_test.go | 72 ++++ utils/outputwriter/standardoutput_test.go | 134 ++++++++ utils/reviewcomment.go | 33 +- utils/reviewcomment_test.go | 259 ++++++++++++++ utils/testsutils.go | 39 --- utils/utils_test.go | 46 +++ 10 files changed, 898 insertions(+), 173 deletions(-) create mode 100644 utils/reviewcomment_test.go diff --git a/scanpullrequest/scanpullrequest_test.go b/scanpullrequest/scanpullrequest_test.go index 39efbc10e..e7beeb9fe 100644 --- a/scanpullrequest/scanpullrequest_test.go +++ b/scanpullrequest/scanpullrequest_test.go @@ -327,7 +327,7 @@ func TestGetNewVulnerabilities(t *testing.T) { SeverityDetails: formats.SeverityDetails{Severity: "low"}, ImpactedDependencyName: "component-C", }, - Cves: []formats.CveRow{{Id: "CVE-2023-4321", Applicability: &formats.Applicability{Status: "Applicable", Evidence: []formats.Evidence{{Location: formats.Location{File: "file1", StartLine: 1, StartColumn: 10}}}}}}, + Cves: []formats.CveRow{{Id: "CVE-2023-4321", Applicability: &formats.Applicability{Status: "Applicable", Evidence: []formats.Evidence{{Location: formats.Location{File: "file1", StartLine: 1, StartColumn: 10, EndLine: 2, EndColumn: 11, Snippet: "snippet"}}}}}}, Technology: coreutils.Yarn, }, { @@ -338,7 +338,7 @@ func TestGetNewVulnerabilities(t *testing.T) { SeverityDetails: formats.SeverityDetails{Severity: "low"}, ImpactedDependencyName: "component-D", }, - Cves: []formats.CveRow{{Id: "CVE-2023-4321", Applicability: &formats.Applicability{Status: "Applicable", Evidence: []formats.Evidence{{Location: formats.Location{File: "file1", StartLine: 1, StartColumn: 10}}}}}}, + Cves: []formats.CveRow{{Id: "CVE-2023-4321", Applicability: &formats.Applicability{Status: "Applicable", Evidence: []formats.Evidence{{Location: formats.Location{File: "file1", StartLine: 1, StartColumn: 10, EndLine: 2, EndColumn: 11, Snippet: "snippet"}}}}}}, Technology: coreutils.Yarn, }, } @@ -347,39 +347,16 @@ func TestGetNewVulnerabilities(t *testing.T) { vulnerabilities, licenses, err := createNewVulnerabilitiesRows( &audit.Results{ ExtendedScanResults: &xrayutils.ExtendedScanResults{ - XrayResults: []services.ScanResponse{previousScan}, - EntitledForJas: true, - ApplicabilityScanResults: []*sarif.Run{sarif.NewRunWithInformationURI("", ""). - WithResults([]*sarif.Result{ - sarif.NewRuleResult("applic_CVE-2023-4321"). - WithLocations([]*sarif.Location{ - sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation(). - WithUri("file1")). - WithRegion(sarif.NewRegion(). - WithStartLine(1). - WithStartColumn(10))), - }), - }), - }, + XrayResults: []services.ScanResponse{previousScan}, + EntitledForJas: true, + ApplicabilityScanResults: []*sarif.Run{xrayutils.CreateRunWithDummyResults(xrayutils.CreateResultWithOneLocation("file1", 1, 10, 2, 11, "snippet", "applic_CVE-2023-4321", ""))}, }, }, &audit.Results{ ExtendedScanResults: &xrayutils.ExtendedScanResults{ - XrayResults: []services.ScanResponse{currentScan}, - EntitledForJas: true, - ApplicabilityScanResults: []*sarif.Run{sarif.NewRunWithInformationURI("", ""). - WithResults([]*sarif.Result{ - sarif.NewRuleResult("applic_CVE-2023-4321"). - WithLocations([]*sarif.Location{sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation(). - WithUri("file1")). - WithRegion(sarif.NewRegion(). - WithStartLine(1). - WithStartColumn(10))), - }), - }), - }, + XrayResults: []services.ScanResponse{currentScan}, + EntitledForJas: true, + ApplicabilityScanResults: []*sarif.Run{xrayutils.CreateRunWithDummyResults(xrayutils.CreateResultWithOneLocation("file1", 1, 10, 2, 11, "snippet", "applic_CVE-2023-4321", ""))}, }, }, nil, @@ -515,38 +492,127 @@ func TestGetAllIssues(t *testing.T) { Licenses: []services.License{{Key: "Apache-2.0", Components: map[string]services.Component{"Dep-1": {FixedVersions: []string{"1.2.3"}}}}}, }}, ApplicabilityScanResults: []*sarif.Run{ - utils.GetRunWithDummyResults( - utils.GetDummyResultWithOneLocation("file", 0, 0, "", "applic_CVE-2022-2122", ""), - utils.GetDummyPassingResult("applic_CVE-2023-3122")), + xrayutils.CreateRunWithDummyResults( + xrayutils.CreateDummyPassingResult("applic_CVE-2023-3122"), + xrayutils.CreateResultWithOneLocation("file1", 1, 10, 2, 11, "snippet", "applic_CVE-2022-2122", ""), + ), + }, + IacScanResults: []*sarif.Run{ + xrayutils.CreateRunWithDummyResults( + xrayutils.CreateResultWithLocations("Missing auto upgrade was detected", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "aws-violation"), + ), + ), }, SecretsScanResults: []*sarif.Run{ - utils.GetRunWithDummyResults( - utils.GetDummyResultWithOneLocation("index.js", 2, 13, "access token exposed", "", ""), + xrayutils.CreateRunWithDummyResults( + xrayutils.CreateResultWithLocations("Secret", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("index.js", 5, 6, 7, 8, "access token exposed"), + ), + ), + }, + SastScanResults: []*sarif.Run{ + xrayutils.CreateRunWithDummyResults( + xrayutils.CreateResultWithLocations("XSS Vulnerability", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "snippet"), + ), ), }, EntitledForJas: true, }, } + + expectedOutput := &utils.IssuesCollection{ + Vulnerabilities: []formats.VulnerabilityOrViolationRow{ + { + Applicable: "Applicable", + FixedVersions: []string{"1.2.3"}, + ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ + SeverityDetails: formats.SeverityDetails{Severity: "High", SeverityNumValue: 13}, + ImpactedDependencyName: "Dep-1", + }, + Cves: []formats.CveRow{{Id: "CVE-2022-2122", Applicability: &formats.Applicability{Status: "Applicable", Evidence: []formats.Evidence{{Location: formats.Location{File: "file1", StartLine: 1, StartColumn: 10, EndLine: 2, EndColumn: 11, Snippet: "snippet"}}}}}}, + }, + { + Applicable: "Not Applicable", + FixedVersions: []string{"1.2.2"}, + ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ + SeverityDetails: formats.SeverityDetails{Severity: "Low", SeverityNumValue: 2}, + ImpactedDependencyName: "Dep-2", + }, + Cves: []formats.CveRow{{Id: "CVE-2023-3122", Applicability: &formats.Applicability{Status: "Not Applicable"}}}, + }, + }, + Iacs: []formats.SourceCodeRow{ + { + SeverityDetails: formats.SeverityDetails{ + Severity: "High", + SeverityNumValue: 13, + }, + Finding: "Missing auto upgrade was detected", + Location: formats.Location{ + File: "file1", + StartLine: 1, + StartColumn: 10, + EndLine: 2, + EndColumn: 11, + Snippet: "aws-violation", + }, + }, + }, + Secrets: []formats.SourceCodeRow{ + { + SeverityDetails: formats.SeverityDetails{ + Severity: "High", + SeverityNumValue: 13, + }, + Finding: "Secret", + Location: formats.Location{ + File: "index.js", + StartLine: 5, + StartColumn: 6, + EndLine: 7, + EndColumn: 8, + Snippet: "access token exposed", + }, + }, + }, + Sast: []formats.SourceCodeRow{ + { + SeverityDetails: formats.SeverityDetails{ + Severity: "High", + SeverityNumValue: 13, + }, + Finding: "XSS Vulnerability", + Location: formats.Location{ + File: "file1", + StartLine: 1, + StartColumn: 10, + EndLine: 2, + EndColumn: 11, + Snippet: "snippet", + }, + }, + }, + Licenses: []formats.LicenseRow{ + { + LicenseKey: "Apache-2.0", + ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ + ImpactedDependencyName: "Dep-1", + }, + }, + }, + } + issuesRows, err := getAllIssues(auditResults, allowedLicenses) - assert.NoError(t, err) - assert.Len(t, issuesRows.Licenses, 1) - assert.Len(t, issuesRows.Vulnerabilities, 2) - assert.Len(t, issuesRows.Secrets, 1) - assert.Equal(t, auditResults.ExtendedScanResults.XrayResults[0].Licenses[0].Key, "Apache-2.0") - assert.Equal(t, "Dep-1", issuesRows.Licenses[0].ImpactedDependencyName) - vuln1 := auditResults.ExtendedScanResults.XrayResults[0].Vulnerabilities[0] - assert.Equal(t, vuln1.Cves[0].Id, issuesRows.Vulnerabilities[0].Cves[0].Id) - assert.Equal(t, vuln1.Severity, issuesRows.Vulnerabilities[0].Severity) - assert.Equal(t, vuln1.Components["Dep-1"].FixedVersions[0], issuesRows.Vulnerabilities[0].FixedVersions[0]) - vuln2 := auditResults.ExtendedScanResults.XrayResults[0].Vulnerabilities[1] - assert.Equal(t, vuln2.Cves[0].Id, issuesRows.Vulnerabilities[1].Cves[0].Id) - assert.Equal(t, vuln2.Severity, issuesRows.Vulnerabilities[1].Severity) - assert.Equal(t, vuln2.Components["Dep-2"].FixedVersions[0], issuesRows.Vulnerabilities[1].FixedVersions[0]) - assert.Equal(t, auditResults.ExtendedScanResults.XrayResults[0].Licenses[0].Key, issuesRows.Licenses[0].LicenseKey) - assert.Equal(t, "Dep-1", issuesRows.Licenses[0].ImpactedDependencyName) - assert.Equal(t, xrayutils.GetResultSeverity(auditResults.ExtendedScanResults.SecretsScanResults[0].Results[0]), issuesRows.Secrets[0].Severity) - assert.Equal(t, xrayutils.GetLocationFileName(auditResults.ExtendedScanResults.SecretsScanResults[0].Results[0].Locations[0]), issuesRows.Secrets[0].File) - assert.Equal(t, *auditResults.ExtendedScanResults.SecretsScanResults[0].Results[0].Locations[0].PhysicalLocation.Region.Snippet.Text, issuesRows.Secrets[0].Snippet) + + if assert.NoError(t, err) { + assert.ElementsMatch(t, expectedOutput.Vulnerabilities, issuesRows.Vulnerabilities) + assert.ElementsMatch(t, expectedOutput.Iacs, issuesRows.Iacs) + assert.ElementsMatch(t, expectedOutput.Secrets, issuesRows.Secrets) + assert.ElementsMatch(t, expectedOutput.Sast, issuesRows.Sast) + assert.ElementsMatch(t, expectedOutput.Licenses, issuesRows.Licenses) + } } func TestCreatePullRequestComment(t *testing.T) { @@ -893,12 +959,9 @@ func TestCreateNewIacRows(t *testing.T) { { name: "No vulnerabilities in source IaC results", targetIacResults: []*sarif.Result{ - sarif.NewRuleResult("").WithLevel(xrayutils.ConvertToSarifLevel("high")).WithLocations([]*sarif.Location{ - sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation().WithUri("file1")). - WithRegion(sarif.NewRegion().WithStartLine(1).WithStartColumn(10).WithSnippet(sarif.NewArtifactContent().WithText("aws violation"))), - ), - }), + xrayutils.CreateResultWithLocations("Missing auto upgrade was detected", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "aws-violation"), + ), }, sourceIacResults: []*sarif.Result{}, expectedAddedIacVulnerabilities: []formats.SourceCodeRow{}, @@ -907,12 +970,9 @@ func TestCreateNewIacRows(t *testing.T) { name: "No vulnerabilities in target IaC results", targetIacResults: []*sarif.Result{}, sourceIacResults: []*sarif.Result{ - sarif.NewRuleResult("").WithLevel(xrayutils.ConvertToSarifLevel("high")).WithLocations([]*sarif.Location{ - sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation().WithUri("file1")). - WithRegion(sarif.NewRegion().WithStartLine(1).WithStartColumn(10).WithSnippet(sarif.NewArtifactContent().WithText("aws violation"))), - ), - }), + xrayutils.CreateResultWithLocations("Missing auto upgrade was detected", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "aws-violation"), + ), }, expectedAddedIacVulnerabilities: []formats.SourceCodeRow{ { @@ -920,11 +980,14 @@ func TestCreateNewIacRows(t *testing.T) { Severity: "High", SeverityNumValue: 13, }, + Finding: "Missing auto upgrade was detected", Location: formats.Location{ File: "file1", StartLine: 1, StartColumn: 10, - Snippet: "aws violation", + EndLine: 2, + EndColumn: 11, + Snippet: "aws-violation", }, }, }, @@ -932,20 +995,14 @@ func TestCreateNewIacRows(t *testing.T) { { name: "Some new vulnerabilities in source IaC results", targetIacResults: []*sarif.Result{ - sarif.NewRuleResult("").WithLevel(xrayutils.ConvertToSarifLevel("high")).WithLocations([]*sarif.Location{ - sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation().WithUri("file1")). - WithRegion(sarif.NewRegion().WithStartLine(1).WithStartColumn(10).WithSnippet(sarif.NewArtifactContent().WithText("aws violation"))), - ), - }), + xrayutils.CreateResultWithLocations("Missing auto upgrade was detected", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "aws-violation"), + ), }, sourceIacResults: []*sarif.Result{ - sarif.NewRuleResult("").WithLevel(xrayutils.ConvertToSarifLevel("medium")).WithLocations([]*sarif.Location{ - sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation().WithUri("file2")). - WithRegion(sarif.NewRegion().WithStartLine(2).WithStartColumn(5).WithSnippet(sarif.NewArtifactContent().WithText("gcp violation"))), - ), - }), + xrayutils.CreateResultWithLocations("enable_private_endpoint=false was detected", "rule", xrayutils.ConvertToSarifLevel("medium"), + xrayutils.CreateLocation("file2", 2, 5, 3, 6, "gcp-violation"), + ), }, expectedAddedIacVulnerabilities: []formats.SourceCodeRow{ { @@ -953,11 +1010,14 @@ func TestCreateNewIacRows(t *testing.T) { Severity: "Medium", SeverityNumValue: 11, }, + Finding: "enable_private_endpoint=false was detected", Location: formats.Location{ File: "file2", StartLine: 2, StartColumn: 5, - Snippet: "gcp violation", + EndLine: 3, + EndColumn: 6, + Snippet: "gcp-violation", }, }, }, @@ -966,8 +1026,8 @@ func TestCreateNewIacRows(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - targetIacRows := xrayutils.PrepareIacs([]*sarif.Run{sarif.NewRunWithInformationURI("", "").WithResults(tc.targetIacResults)}) - sourceIacRows := xrayutils.PrepareIacs([]*sarif.Run{sarif.NewRunWithInformationURI("", "").WithResults(tc.sourceIacResults)}) + targetIacRows := xrayutils.PrepareIacs([]*sarif.Run{xrayutils.CreateRunWithDummyResults(tc.targetIacResults...)}) + sourceIacRows := xrayutils.PrepareIacs([]*sarif.Run{xrayutils.CreateRunWithDummyResults(tc.sourceIacResults...)}) addedIacVulnerabilities := createNewSourceCodeRows(targetIacRows, sourceIacRows) assert.ElementsMatch(t, tc.expectedAddedIacVulnerabilities, addedIacVulnerabilities) }) @@ -984,12 +1044,9 @@ func TestCreateNewSecretRows(t *testing.T) { { name: "No vulnerabilities in source secrets results", targetSecretsResults: []*sarif.Result{ - sarif.NewRuleResult("").WithMessage(sarif.NewTextMessage("Secret")).WithLevel(xrayutils.ConvertToSarifLevel("high")).WithLocations([]*sarif.Location{ - sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation().WithUri("file1")). - WithRegion(sarif.NewRegion().WithStartLine(1).WithStartColumn(10).WithSnippet(sarif.NewArtifactContent().WithText("Sensitive information"))), - ), - }), + xrayutils.CreateResultWithLocations("Secret", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "Sensitive information"), + ), }, sourceSecretsResults: []*sarif.Result{}, expectedAddedSecretsVulnerabilities: []formats.SourceCodeRow{}, @@ -998,12 +1055,9 @@ func TestCreateNewSecretRows(t *testing.T) { name: "No vulnerabilities in target secrets results", targetSecretsResults: []*sarif.Result{}, sourceSecretsResults: []*sarif.Result{ - sarif.NewRuleResult("").WithMessage(sarif.NewTextMessage("Secret")).WithLevel(xrayutils.ConvertToSarifLevel("high")).WithLocations([]*sarif.Location{ - sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation().WithUri("file1")). - WithRegion(sarif.NewRegion().WithStartLine(1).WithStartColumn(10).WithSnippet(sarif.NewArtifactContent().WithText("Sensitive information"))), - ), - }), + xrayutils.CreateResultWithLocations("Secret", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "Sensitive information"), + ), }, expectedAddedSecretsVulnerabilities: []formats.SourceCodeRow{ { @@ -1016,6 +1070,8 @@ func TestCreateNewSecretRows(t *testing.T) { File: "file1", StartLine: 1, StartColumn: 10, + EndLine: 2, + EndColumn: 11, Snippet: "Sensitive information", }, }, @@ -1024,20 +1080,14 @@ func TestCreateNewSecretRows(t *testing.T) { { name: "Some new vulnerabilities in source secrets results", targetSecretsResults: []*sarif.Result{ - sarif.NewRuleResult("").WithMessage(sarif.NewTextMessage("Secret")).WithLevel(xrayutils.ConvertToSarifLevel("high")).WithLocations([]*sarif.Location{ - sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation().WithUri("file1")). - WithRegion(sarif.NewRegion().WithStartLine(1).WithStartColumn(10).WithSnippet(sarif.NewArtifactContent().WithText("Sensitive information"))), - ), - }), + xrayutils.CreateResultWithLocations("Secret", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "Sensitive information"), + ), }, sourceSecretsResults: []*sarif.Result{ - sarif.NewRuleResult("").WithMessage(sarif.NewTextMessage("Secret")).WithLevel(xrayutils.ConvertToSarifLevel("medium")).WithLocations([]*sarif.Location{ - sarif.NewLocationWithPhysicalLocation(sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewArtifactLocation().WithUri("file2")). - WithRegion(sarif.NewRegion().WithStartLine(2).WithStartColumn(5).WithSnippet(sarif.NewArtifactContent().WithText("Confidential data"))), - ), - }), + xrayutils.CreateResultWithLocations("Secret", "rule", xrayutils.ConvertToSarifLevel("medium"), + xrayutils.CreateLocation("file2", 2, 5, 3, 6, "Confidential data"), + ), }, expectedAddedSecretsVulnerabilities: []formats.SourceCodeRow{ { @@ -1050,6 +1100,8 @@ func TestCreateNewSecretRows(t *testing.T) { File: "file2", StartLine: 2, StartColumn: 5, + EndLine: 3, + EndColumn: 6, Snippet: "Confidential data", }, }, @@ -1059,14 +1111,99 @@ func TestCreateNewSecretRows(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - targetSecretsRows := xrayutils.PrepareSecrets([]*sarif.Run{sarif.NewRunWithInformationURI("", "").WithResults(tc.targetSecretsResults)}) - sourceSecretsRows := xrayutils.PrepareSecrets([]*sarif.Run{sarif.NewRunWithInformationURI("", "").WithResults(tc.sourceSecretsResults)}) + targetSecretsRows := xrayutils.PrepareSecrets([]*sarif.Run{xrayutils.CreateRunWithDummyResults(tc.targetSecretsResults...)}) + sourceSecretsRows := xrayutils.PrepareSecrets([]*sarif.Run{xrayutils.CreateRunWithDummyResults(tc.sourceSecretsResults...)}) addedSecretsVulnerabilities := createNewSourceCodeRows(targetSecretsRows, sourceSecretsRows) assert.ElementsMatch(t, tc.expectedAddedSecretsVulnerabilities, addedSecretsVulnerabilities) }) } } +func TestCreateNewSastRows(t *testing.T) { + testCases := []struct { + name string + targetSastResults []*sarif.Result + sourceSastResults []*sarif.Result + expectedAddedSastVulnerabilities []formats.SourceCodeRow + }{ + { + name: "No vulnerabilities in source Sast results", + targetSastResults: []*sarif.Result{ + xrayutils.CreateResultWithLocations("XSS Vulnerability", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "snippet"), + ), + }, + sourceSastResults: []*sarif.Result{}, + expectedAddedSastVulnerabilities: []formats.SourceCodeRow{}, + }, + { + name: "No vulnerabilities in target Sast results", + targetSastResults: []*sarif.Result{}, + sourceSastResults: []*sarif.Result{ + xrayutils.CreateResultWithLocations("XSS Vulnerability", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "snippet"), + ), + }, + expectedAddedSastVulnerabilities: []formats.SourceCodeRow{ + { + SeverityDetails: formats.SeverityDetails{ + Severity: "High", + SeverityNumValue: 13, + }, + Finding: "XSS Vulnerability", + Location: formats.Location{ + File: "file1", + StartLine: 1, + StartColumn: 10, + EndLine: 2, + EndColumn: 11, + Snippet: "snippet", + }, + }, + }, + }, + { + name: "Some new vulnerabilities in source Sast results", + targetSastResults: []*sarif.Result{ + xrayutils.CreateResultWithLocations("XSS Vulnerability", "rule", xrayutils.ConvertToSarifLevel("high"), + xrayutils.CreateLocation("file1", 1, 10, 2, 11, "snippet"), + ), + }, + sourceSastResults: []*sarif.Result{ + xrayutils.CreateResultWithLocations("Stack Trace Exposure", "rule", xrayutils.ConvertToSarifLevel("medium"), + xrayutils.CreateLocation("file2", 2, 5, 3, 6, "other-snippet"), + ), + }, + expectedAddedSastVulnerabilities: []formats.SourceCodeRow{ + { + SeverityDetails: formats.SeverityDetails{ + Severity: "Medium", + SeverityNumValue: 11, + }, + Finding: "Stack Trace Exposure", + Location: formats.Location{ + File: "file2", + StartLine: 2, + StartColumn: 5, + EndLine: 3, + EndColumn: 6, + Snippet: "other-snippet", + }, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + targetSastRows := xrayutils.PrepareSast([]*sarif.Run{xrayutils.CreateRunWithDummyResults(tc.targetSastResults...)}) + sourceSastRows := xrayutils.PrepareSast([]*sarif.Run{xrayutils.CreateRunWithDummyResults(tc.sourceSastResults...)}) + addedSastVulnerabilities := createNewSourceCodeRows(targetSastRows, sourceSastRows) + assert.ElementsMatch(t, tc.expectedAddedSastVulnerabilities, addedSastVulnerabilities) + }) + } +} + func TestDeletePreviousPullRequestMessages(t *testing.T) { repository := &utils.Repository{ Params: utils.Params{ diff --git a/utils/outputwriter/outputwriter.go b/utils/outputwriter/outputwriter.go index cb9eb1955..b6cc6f421 100644 --- a/utils/outputwriter/outputwriter.go +++ b/utils/outputwriter/outputwriter.go @@ -12,12 +12,14 @@ import ( const ( FrogbotTitlePrefix = "[🐸 Frogbot]" CommentGeneratedByFrogbot = "[🐸 JFrog Frogbot](https://github.com/jfrog/frogbot#readme)" + ReviewCommentId = "FrogbotReviewComment" vulnerabilitiesTableHeader = "\n| SEVERITY | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | FIXED VERSIONS | CVES |\n| :---------------------: | :----------------------------------: | :-----------------------------------: | :---------------------------------: | :---------------------------------: |" vulnerabilitiesTableHeaderWithContextualAnalysis = "| SEVERITY | CONTEXTUAL ANALYSIS | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | FIXED VERSIONS | CVES |\n| :---------------------: | :----------------------------------: | :----------------------------------: | :-----------------------------------: | :---------------------------------: | :---------------------------------: |" iacTableHeader = "\n| SEVERITY | FILE | LINE:COLUMN | FINDING |\n| :---------------------: | :----------------------------------: | :-----------------------------------: | :---------------------------------: |" vulnerableDependenciesTitle = "## 📦 Vulnerable Dependencies" summaryTitle = "### ✍️ Summary" researchDetailsTitle = "## 🔬 Research Details" + sastTitle = "## 🎯 Static Application Security Testing (SAST) Vulnerability" iacTitle = "## 🛠️ Infrastructure as Code" licenseTitle = "## ⚖️ Violated Licenses" contextualAnalysisTitle = "## 📦🔍 Contextual Analysis CVE Vulnerability\n" @@ -254,3 +256,11 @@ func getVulnerabilityDescriptionIdentifier(cveRows []formats.CveRow, xrayId stri } return fmt.Sprintf("[ %s ] ", identifier) } + +func GenerateReviewCommentContent(content string, writer OutputWriter) string { + return MarkdownComment(ReviewCommentId) + content + writer.Footer() +} + +func GetFallbackReviewCommentContent(content string, location formats.Location, writer OutputWriter) string { + return MarkdownComment(ReviewCommentId) + GetLocationDescription(location) + content + writer.Footer() +} diff --git a/utils/outputwriter/outputwriter_test.go b/utils/outputwriter/outputwriter_test.go index 2f3ccb8de..db4a06df5 100644 --- a/utils/outputwriter/outputwriter_test.go +++ b/utils/outputwriter/outputwriter_test.go @@ -62,3 +62,118 @@ func testGetLicensesTableContent(t *testing.T, writer OutputWriter) { expected = "\n| License1 | Comp1 1.0 | Dep1 2.0 |\n| License2 | Comp2 2.0 | Dep2 3.0 |" assert.Equal(t, expected, result) } + +func TestMarkAsQuote(t *testing.T) { + testCases := []struct { + input string + expectedOutput string + }{ + { + input: "", + expectedOutput: "``", + }, + { + input: "quote", + expectedOutput: "`quote`", + }, + } + for _, tc := range testCases { + assert.Equal(t, tc.expectedOutput, MarkAsQuote(tc.input)) + } +} + +func TestMarkAsCodeSnippet(t *testing.T) { + testCases := []struct { + input string + expectedOutput string + }{ + { + input: "", + expectedOutput: "```\n\n```", + }, + { + input: "snippet", + expectedOutput: "```\nsnippet\n```", + }, + } + for _, tc := range testCases { + assert.Equal(t, tc.expectedOutput, MarkAsCodeSnippet(tc.input)) + } +} + +func TestGetLocationDescription(t *testing.T) { + testCases := []struct { + input formats.Location + expectedOutput string + }{ + { + input: formats.Location{ + File: "file1", + StartLine: 1, + Snippet: "snippet", + }, + expectedOutput: "\n```\nsnippet\n```\nat `file1` (line 1)\n", + }, + { + input: formats.Location{ + File: "dir/other-dir/file1", + StartLine: 134, + Snippet: "clientTestUtils.ChangeDirAndAssert(t, prevWd)", + }, + expectedOutput: "\n```\nclientTestUtils.ChangeDirAndAssert(t, prevWd)\n```\nat `dir/other-dir/file1` (line 134)\n", + }, + } + for _, tc := range testCases { + assert.Equal(t, tc.expectedOutput, GetLocationDescription(tc.input)) + } +} + +func TestGetJasMarkdownDescription(t *testing.T) { + testCases := []struct { + severity string + finding string + expectedOutput string + }{ + { + severity: "High", + finding: "finding", + expectedOutput: "| Severity | Finding |\n| :--------------: | :---: |\n| High | finding |", + }, + { + severity: "Low", + finding: "finding (other)", + expectedOutput: "| Severity | Finding |\n| :--------------: | :---: |\n| Low | finding (other) |", + }, + } + for _, tc := range testCases { + assert.Equal(t, tc.expectedOutput, GetJasMarkdownDescription(tc.severity, tc.finding)) + } +} + +func TestGetApplicabilityMarkdownDescription(t *testing.T) { + testCases := []struct { + severity string + cve string + impactedDependency string + finding string + expectedOutput string + }{ + { + severity: "High", + cve: "CVE-100-234", + impactedDependency: "dependency:1.0.0", + finding: "applicable finding", + expectedOutput: "| Severity | Impacted Dependency | Finding | CVE |\n| :--------------: | :---: | :---: | :---: |\n| High | dependency:1.0.0 | applicable finding | CVE-100-234 |", + }, + { + severity: "Low", + cve: "CVE-222-233", + impactedDependency: "dependency:3.4.1", + finding: "applicable finding (diff)", + expectedOutput: "| Severity | Impacted Dependency | Finding | CVE |\n| :--------------: | :---: | :---: | :---: |\n| Low | dependency:3.4.1 | applicable finding (diff) | CVE-222-233 |", + }, + } + for _, tc := range testCases { + assert.Equal(t, tc.expectedOutput, GetApplicabilityMarkdownDescription(tc.severity, tc.cve, tc.impactedDependency, tc.finding)) + } +} diff --git a/utils/outputwriter/simplifiedoutput.go b/utils/outputwriter/simplifiedoutput.go index 3acf6145e..fbdeba32d 100644 --- a/utils/outputwriter/simplifiedoutput.go +++ b/utils/outputwriter/simplifiedoutput.go @@ -191,16 +191,16 @@ func (smo *SimplifiedOutput) SastReviewContent(severity, finding, fullDetails st ### Full description %s - ---- -### Code Flows - `, GetJasMarkdownDescription(smo.FormattedSeverity(severity, "Applicable"), finding), fullDetails, )) if len(codeFlows) > 0 { + contentBuilder.WriteString(` +--- +### Code Flows +`) for _, flow := range codeFlows { contentBuilder.WriteString(` diff --git a/utils/outputwriter/simplifiedoutput_test.go b/utils/outputwriter/simplifiedoutput_test.go index 1cfcb65e0..663a5c35d 100644 --- a/utils/outputwriter/simplifiedoutput_test.go +++ b/utils/outputwriter/simplifiedoutput_test.go @@ -375,3 +375,75 @@ func TestSimplifiedOutput_GetLicensesTableContent(t *testing.T) { writer := &SimplifiedOutput{} testGetLicensesTableContent(t, writer) } + +func TestSimplifiedOutput_SastReviewContent(t *testing.T) { + testCases := []struct { + name string + severity string + finding string + fullDetails string + expectedOutput string + codeFlows [][]formats.Location + }{ + { + name: "Sast review comment content", + severity: "Low", + finding: "Stack Trace Exposure", + fullDetails: "\n### Overview\nStack trace exposure is a type of security vulnerability that occurs when a program reveals\nsensitive information, such as the names and locations of internal files and variables,\nin error messages or other diagnostic output. This can happen when a program crashes or\nencounters an error, and the stack trace (a record of the program's call stack at the time\nof the error) is included in the output.", + codeFlows: [][]formats.Location{ + { + { + File: "file2", + StartLine: 1, + StartColumn: 2, + EndLine: 3, + EndColumn: 4, + Snippet: "other-snippet", + }, + { + File: "file", + StartLine: 0, + StartColumn: 0, + EndLine: 0, + EndColumn: 0, + Snippet: "snippet", + }, + }, + { + { + File: "file", + StartLine: 10, + StartColumn: 20, + EndLine: 10, + EndColumn: 30, + Snippet: "a-snippet", + }, + { + File: "file", + StartLine: 0, + StartColumn: 0, + EndLine: 0, + EndColumn: 0, + Snippet: "snippet", + }, + }, + }, + expectedOutput: "\n## 🎯 Static Application Security Testing (SAST) Vulnerability\n\t\n| Severity | Finding |\n| :--------------: | :---: |\n| Low | Stack Trace Exposure |\n\n---\n### Full description\n\n\n### Overview\nStack trace exposure is a type of security vulnerability that occurs when a program reveals\nsensitive information, such as the names and locations of internal files and variables,\nin error messages or other diagnostic output. This can happen when a program crashes or\nencounters an error, and the stack trace (a record of the program's call stack at the time\nof the error) is included in the output.\n\n---\n### Code Flows\n\n\n---\nVulnerable data flow analysis result:\n\n↘️ `other-snippet` (at file2 line 1)\n\n↘️ `snippet` (at file line 0)\n\n\n---\n\n\n\n---\nVulnerable data flow analysis result:\n\n↘️ `a-snippet` (at file line 10)\n\n↘️ `snippet` (at file line 0)\n\n\n---\n\n", + }, + { + name: "No code flows", + severity: "Low", + finding: "Stack Trace Exposure", + fullDetails: "\n### Overview\nStack trace exposure is a type of security vulnerability that occurs when a program reveals\nsensitive information, such as the names and locations of internal files and variables,\nin error messages or other diagnostic output. This can happen when a program crashes or\nencounters an error, and the stack trace (a record of the program's call stack at the time\nof the error) is included in the output.", + expectedOutput: "\n## 🎯 Static Application Security Testing (SAST) Vulnerability\n\t\n| Severity | Finding |\n| :--------------: | :---: |\n| Low | Stack Trace Exposure |\n\n---\n### Full description\n\n\n### Overview\nStack trace exposure is a type of security vulnerability that occurs when a program reveals\nsensitive information, such as the names and locations of internal files and variables,\nin error messages or other diagnostic output. This can happen when a program crashes or\nencounters an error, and the stack trace (a record of the program's call stack at the time\nof the error) is included in the output.\n", + }, + } + + so := &SimplifiedOutput{} + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + output := so.SastReviewContent(tc.severity, tc.finding, tc.fullDetails, tc.codeFlows) + assert.Equal(t, tc.expectedOutput, output) + }) + } +} diff --git a/utils/outputwriter/standardoutput_test.go b/utils/outputwriter/standardoutput_test.go index 291a675b0..5fdb45820 100644 --- a/utils/outputwriter/standardoutput_test.go +++ b/utils/outputwriter/standardoutput_test.go @@ -403,3 +403,137 @@ func TestStandardOutput_GetLicensesTableContent(t *testing.T) { writer := &StandardOutput{} testGetLicensesTableContent(t, writer) } + +func TestStandardOutput_ApplicableCveReviewContent(t *testing.T) { + testCases := []struct { + name string + severity, finding, fullDetails, cve, cveDetails, impactedDependency, remediation string + expectedOutput string + }{ + { + name: "Applicable CVE review comment content", + severity: "Critical", + finding: "The vulnerable function flask.Flask.run is called", + fullDetails: "The scanner checks whether the vulnerable `Development Server` of the `werkzeug` library is used by looking for calls to `werkzeug.serving.run_simple()`.", + cve: "CVE-2022-29361", + cveDetails: "cveDetails", + impactedDependency: "werkzeug:1.0.1", + remediation: "some remediation", + expectedOutput: "\n## 📦🔍 Contextual Analysis CVE Vulnerability\n\n\n
\n\n| Severity | Impacted Dependency | Finding | CVE |\n| :--------------: | :---: | :---: | :---: |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableCriticalSeverity.png)
Critical | werkzeug:1.0.1 | The vulnerable function flask.Flask.run is called | CVE-2022-29361 |\n\n
\n\n
\n Description \n
\n\nThe scanner checks whether the vulnerable `Development Server` of the `werkzeug` library is used by looking for calls to `werkzeug.serving.run_simple()`.\n\n
\n\n
\n CVE details \n
\n\ncveDetails\n\n
\n\n\n
\n Remediation \n
\n\nsome remediation\n\n
\n\n", + }, + { + name: "No remediation", + severity: "Critical", + finding: "The vulnerable function flask.Flask.run is called", + fullDetails: "The scanner checks whether the vulnerable `Development Server` of the `werkzeug` library is used by looking for calls to `werkzeug.serving.run_simple()`.", + cve: "CVE-2022-29361", + cveDetails: "cveDetails", + impactedDependency: "werkzeug:1.0.1", + expectedOutput: "\n## 📦🔍 Contextual Analysis CVE Vulnerability\n\n\n
\n\n| Severity | Impacted Dependency | Finding | CVE |\n| :--------------: | :---: | :---: | :---: |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableCriticalSeverity.png)
Critical | werkzeug:1.0.1 | The vulnerable function flask.Flask.run is called | CVE-2022-29361 |\n\n
\n\n
\n Description \n
\n\nThe scanner checks whether the vulnerable `Development Server` of the `werkzeug` library is used by looking for calls to `werkzeug.serving.run_simple()`.\n\n
\n\n
\n CVE details \n
\n\ncveDetails\n\n
\n\n", + }, + } + + so := &StandardOutput{} + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + output := so.ApplicableCveReviewContent(tc.severity, tc.finding, tc.fullDetails, tc.cve, tc.cveDetails, tc.impactedDependency, tc.remediation) + assert.Equal(t, tc.expectedOutput, output) + }) + } +} + +func TestStandardOutput_IacReviewContent(t *testing.T) { + testCases := []struct { + name string + severity, finding, fullDetails string + expectedOutput string + }{ + { + name: "Iac review comment content", + severity: "Medium", + finding: "Missing auto upgrade was detected", + fullDetails: "Resource `google_container_node_pool` should have `management.auto_upgrade=true`\n\nVulnerable example - \n```\nresource \"google_container_node_pool\" \"vulnerable_example\" {\n management {\n auto_upgrade = false\n }\n}\n```\n", + expectedOutput: "\n## 🛠️ Infrastructure as Code\n\n
\n\n| Severity | Finding |\n| :--------------: | :---: |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableMediumSeverity.png)
Medium | Missing auto upgrade was detected |\n\n
\n\n
\n Full description \n
\n\nResource `google_container_node_pool` should have `management.auto_upgrade=true`\n\nVulnerable example - \n```\nresource \"google_container_node_pool\" \"vulnerable_example\" {\n management {\n auto_upgrade = false\n }\n}\n```\n\n\n
\n\n", + }, + } + + so := &StandardOutput{} + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + output := so.IacReviewContent(tc.severity, tc.finding, tc.fullDetails) + assert.Equal(t, tc.expectedOutput, output) + }) + } +} + +func TestStandardOutput_SastReviewContent(t *testing.T) { + testCases := []struct { + name string + severity string + finding string + fullDetails string + expectedOutput string + codeFlows [][]formats.Location + }{ + { + name: "Sast review comment content", + severity: "Low", + finding: "Stack Trace Exposure", + fullDetails: "\n### Overview\nStack trace exposure is a type of security vulnerability that occurs when a program reveals\nsensitive information, such as the names and locations of internal files and variables,\nin error messages or other diagnostic output. This can happen when a program crashes or\nencounters an error, and the stack trace (a record of the program's call stack at the time\nof the error) is included in the output.", + codeFlows: [][]formats.Location{ + { + { + File: "file2", + StartLine: 1, + StartColumn: 2, + EndLine: 3, + EndColumn: 4, + Snippet: "other-snippet", + }, + { + File: "file", + StartLine: 0, + StartColumn: 0, + EndLine: 0, + EndColumn: 0, + Snippet: "snippet", + }, + }, + { + { + File: "file", + StartLine: 10, + StartColumn: 20, + EndLine: 10, + EndColumn: 30, + Snippet: "a-snippet", + }, + { + File: "file", + StartLine: 0, + StartColumn: 0, + EndLine: 0, + EndColumn: 0, + Snippet: "snippet", + }, + }, + }, + expectedOutput: "\n## 🎯 Static Application Security Testing (SAST) Vulnerability \n\t\n
\n\n| Severity | Finding |\n| :--------------: | :---: |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableLowSeverity.png)
Low | Stack Trace Exposure |\n\n
\n\n
\n Full description \n
\n\n\n### Overview\nStack trace exposure is a type of security vulnerability that occurs when a program reveals\nsensitive information, such as the names and locations of internal files and variables,\nin error messages or other diagnostic output. This can happen when a program crashes or\nencounters an error, and the stack trace (a record of the program's call stack at the time\nof the error) is included in the output.\n\n
\n\n\n\n
\nCode Flows \n\n\n\n
\nVulnerable data flow analysis result \n
\n\n↘️ `other-snippet` (at file2 line 1)\n\n↘️ `snippet` (at file line 0)\n\n\n
\n\n\n\n
\nVulnerable data flow analysis result \n
\n\n↘️ `a-snippet` (at file line 10)\n\n↘️ `snippet` (at file line 0)\n\n\n
\n\n\n\n
\n\n", + }, + { + name: "No code flows", + severity: "Low", + finding: "Stack Trace Exposure", + fullDetails: "\n### Overview\nStack trace exposure is a type of security vulnerability that occurs when a program reveals\nsensitive information, such as the names and locations of internal files and variables,\nin error messages or other diagnostic output. This can happen when a program crashes or\nencounters an error, and the stack trace (a record of the program's call stack at the time\nof the error) is included in the output.", + expectedOutput: "\n## 🎯 Static Application Security Testing (SAST) Vulnerability \n\t\n
\n\n| Severity | Finding |\n| :--------------: | :---: |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableLowSeverity.png)
Low | Stack Trace Exposure |\n\n
\n\n
\n Full description \n
\n\n\n### Overview\nStack trace exposure is a type of security vulnerability that occurs when a program reveals\nsensitive information, such as the names and locations of internal files and variables,\nin error messages or other diagnostic output. This can happen when a program crashes or\nencounters an error, and the stack trace (a record of the program's call stack at the time\nof the error) is included in the output.\n\n
\n\n", + }, + } + + so := &StandardOutput{} + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + output := so.SastReviewContent(tc.severity, tc.finding, tc.fullDetails, tc.codeFlows) + assert.Equal(t, tc.expectedOutput, output) + }) + } +} diff --git a/utils/reviewcomment.go b/utils/reviewcomment.go index 76c3df852..8eb8d22ea 100644 --- a/utils/reviewcomment.go +++ b/utils/reviewcomment.go @@ -24,8 +24,6 @@ const ( ApplicableComment ReviewCommentType = "Applicable" IacComment ReviewCommentType = "Iac" SastComment ReviewCommentType = "Sast" - - CommentId = "FrogbotReviewComment" ) func AddReviewComments(repo *Repository, pullRequestID int, client vcsclient.VcsClient, issues *IssuesCollection) (err error) { @@ -93,7 +91,7 @@ func deleteOldFallbackComments(repo *Repository, pullRequestID int, client vcscl func getFrogbotReviewComments(existingComments []vcsclient.CommentInfo) (reviewComments []vcsclient.CommentInfo) { for _, comment := range existingComments { - if strings.Contains(comment.Content, CommentId) { + if strings.Contains(comment.Content, outputwriter.ReviewCommentId) { log.Debug("Deleting comment id:", comment.ID) reviewComments = append(reviewComments, comment) } @@ -102,8 +100,7 @@ func getFrogbotReviewComments(existingComments []vcsclient.CommentInfo) (reviewC } func getRegularCommentContent(comment ReviewComment) string { - content := outputwriter.MarkdownComment(CommentId) - return content + outputwriter.GetLocationDescription(comment.Location) + comment.CommentInfo.Content + return outputwriter.MarkdownComment(outputwriter.ReviewCommentId) + outputwriter.GetLocationDescription(comment.Location) + comment.CommentInfo.Content } func getNewReviewComments(repo *Repository, issues *IssuesCollection) (commentsToAdd []ReviewComment) { @@ -119,11 +116,11 @@ func getNewReviewComments(repo *Repository, issues *IssuesCollection) (commentsT } } for _, iac := range issues.Iacs { - commentsToAdd = append(commentsToAdd, generateReviewComment(IacComment, iac.Location, generateReviewCommentContent(IacComment, iac, writer))) + commentsToAdd = append(commentsToAdd, generateReviewComment(IacComment, iac.Location, generateSourceCodeReviewContent(IacComment, iac, writer))) } for _, sast := range issues.Sast { - commentsToAdd = append(commentsToAdd, generateReviewComment(SastComment, sast.Location, generateReviewCommentContent(SastComment, sast, writer))) + commentsToAdd = append(commentsToAdd, generateReviewComment(SastComment, sast.Location, generateSourceCodeReviewContent(SastComment, sast, writer))) } return } @@ -142,13 +139,12 @@ func generateReviewComment(commentType ReviewCommentType, location formats.Locat } -func generateApplicabilityReviewContent(issue formats.Evidence, relatedCve formats.CveRow, relatedVulnerability formats.VulnerabilityOrViolationRow, writer outputwriter.OutputWriter) (content string) { - content = outputwriter.MarkdownComment(CommentId) +func generateApplicabilityReviewContent(issue formats.Evidence, relatedCve formats.CveRow, relatedVulnerability formats.VulnerabilityOrViolationRow, writer outputwriter.OutputWriter) string { remediation := "" if relatedVulnerability.JfrogResearchInformation != nil { remediation = relatedVulnerability.JfrogResearchInformation.Remediation } - content += writer.ApplicableCveReviewContent( + return outputwriter.GenerateReviewCommentContent(writer.ApplicableCveReviewContent( relatedVulnerability.Severity, issue.Reason, relatedCve.Applicability.ScannerDescription, @@ -156,30 +152,25 @@ func generateApplicabilityReviewContent(issue formats.Evidence, relatedCve forma relatedVulnerability.Summary, fmt.Sprintf("%s:%s", relatedVulnerability.ImpactedDependencyName, relatedVulnerability.ImpactedDependencyVersion), remediation, - ) - content += writer.Footer() - return + ), writer) } -func generateReviewCommentContent(commentType ReviewCommentType, issue formats.SourceCodeRow, writer outputwriter.OutputWriter) (content string) { - content = outputwriter.MarkdownComment(CommentId) +func generateSourceCodeReviewContent(commentType ReviewCommentType, issue formats.SourceCodeRow, writer outputwriter.OutputWriter) (content string) { switch commentType { case IacComment: - content += writer.IacReviewContent( + return outputwriter.GenerateReviewCommentContent(writer.IacReviewContent( issue.Severity, issue.Finding, issue.ScannerDescription, - ) + ), writer) case SastComment: - content += writer.SastReviewContent( + return outputwriter.GenerateReviewCommentContent(writer.SastReviewContent( issue.Severity, issue.Finding, issue.ScannerDescription, issue.CodeFlow, - ) + ), writer) } - - content += writer.Footer() return } diff --git a/utils/reviewcomment_test.go b/utils/reviewcomment_test.go new file mode 100644 index 000000000..b92548edd --- /dev/null +++ b/utils/reviewcomment_test.go @@ -0,0 +1,259 @@ +package utils + +import ( + "testing" + + "github.com/jfrog/frogbot/utils/outputwriter" + "github.com/jfrog/froggit-go/vcsclient" + "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" + "github.com/jfrog/jfrog-cli-core/v2/xray/formats" + "github.com/stretchr/testify/assert" +) + +func TestGetFrogbotReviewComments(t *testing.T) { + testCases := []struct { + name string + existingComments []vcsclient.CommentInfo + expectedOutput []vcsclient.CommentInfo + }{ + { + name: "No frogbot comments", + existingComments: []vcsclient.CommentInfo{ + { + Content: outputwriter.FrogbotTitlePrefix, + }, + { + Content: "some comment text" + outputwriter.MarkdownComment("with hidden comment"), + }, + { + Content: outputwriter.CommentGeneratedByFrogbot, + }, + }, + expectedOutput: []vcsclient.CommentInfo{}, + }, + { + name: "With frogbot comments", + existingComments: []vcsclient.CommentInfo{ + { + Content: outputwriter.FrogbotTitlePrefix, + }, + { + Content: outputwriter.MarkdownComment(outputwriter.ReviewCommentId) + "A Frogbot review comment", + }, + { + Content: "some comment text" + outputwriter.MarkdownComment("with hidden comment"), + }, + { + Content: outputwriter.ReviewCommentId, + }, + { + Content: outputwriter.CommentGeneratedByFrogbot, + }, + }, + expectedOutput: []vcsclient.CommentInfo{ + { + Content: outputwriter.MarkdownComment(outputwriter.ReviewCommentId) + "A Frogbot review comment", + }, + { + Content: outputwriter.ReviewCommentId, + }, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + output := getFrogbotReviewComments(tc.existingComments) + assert.ElementsMatch(t, tc.expectedOutput, output) + }) + } +} + +func TestGetNewReviewComments(t *testing.T) { + repo := &Repository{OutputWriter: &outputwriter.StandardOutput{}} + testCases := []struct { + name string + issues *IssuesCollection + expectedOutput []ReviewComment + }{ + { + name: "No issues for review comments", + issues: &IssuesCollection{ + Vulnerabilities: []formats.VulnerabilityOrViolationRow{ + { + Summary: "summary-2", + Applicable: "Applicable", + IssueId: "XRAY-2", + ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ + SeverityDetails: formats.SeverityDetails{Severity: "low"}, + ImpactedDependencyName: "component-C", + }, + Cves: []formats.CveRow{{Id: "CVE-2023-4321"}}, + Technology: coreutils.Npm, + }, + }, + Secrets: []formats.SourceCodeRow{ + { + SeverityDetails: formats.SeverityDetails{ + Severity: "High", + SeverityNumValue: 13, + }, + Finding: "Secret", + Location: formats.Location{ + File: "index.js", + StartLine: 5, + StartColumn: 6, + EndLine: 7, + EndColumn: 8, + Snippet: "access token exposed", + }, + }, + }, + }, + expectedOutput: []ReviewComment{}, + }, + { + name: "With issues for review comments", + issues: &IssuesCollection{ + Vulnerabilities: []formats.VulnerabilityOrViolationRow{ + { + Summary: "summary-2", + Applicable: "Applicable", + IssueId: "XRAY-2", + ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ + SeverityDetails: formats.SeverityDetails{Severity: "Low"}, + ImpactedDependencyName: "component-C", + }, + Cves: []formats.CveRow{{Id: "CVE-2023-4321", Applicability: &formats.Applicability{Status: "Applicable", Evidence: []formats.Evidence{{Location: formats.Location{File: "file1", StartLine: 1, StartColumn: 10, EndLine: 2, EndColumn: 11, Snippet: "snippet"}}}}}}, + Technology: coreutils.Npm, + }, + }, + Iacs: []formats.SourceCodeRow{ + { + SeverityDetails: formats.SeverityDetails{ + Severity: "High", + SeverityNumValue: 13, + }, + Finding: "Missing auto upgrade was detected", + Location: formats.Location{ + File: "file1", + StartLine: 1, + StartColumn: 10, + EndLine: 2, + EndColumn: 11, + Snippet: "aws-violation", + }, + }, + }, + Sast: []formats.SourceCodeRow{ + { + SeverityDetails: formats.SeverityDetails{ + Severity: "High", + SeverityNumValue: 13, + }, + Finding: "XSS Vulnerability", + Location: formats.Location{ + File: "file1", + StartLine: 1, + StartColumn: 10, + EndLine: 2, + EndColumn: 11, + Snippet: "snippet", + }, + }, + }, + }, + expectedOutput: []ReviewComment{ + { + Location: formats.Location{ + File: "file1", + StartLine: 1, + StartColumn: 10, + EndLine: 2, + EndColumn: 11, + Snippet: "snippet", + }, + Type: ApplicableComment, + CommentInfo: vcsclient.PullRequestComment{ + CommentInfo: vcsclient.CommentInfo{ + Content: outputwriter.GenerateReviewCommentContent(repo.ApplicableCveReviewContent("Low", "", "", "CVE-2023-4321", "summary-2", "component-C:", ""), repo.OutputWriter), + }, + PullRequestDiff: vcsclient.PullRequestDiff{ + OriginalFilePath: "file1", + OriginalStartLine: 1, + OriginalStartColumn: 10, + OriginalEndLine: 2, + OriginalEndColumn: 11, + NewFilePath: "file1", + NewStartLine: 1, + NewStartColumn: 10, + NewEndLine: 2, + NewEndColumn: 11, + }, + }, + }, + { + Location: formats.Location{ + File: "file1", + StartLine: 1, + StartColumn: 10, + EndLine: 2, + EndColumn: 11, + Snippet: "aws-violation", + }, + Type: IacComment, + CommentInfo: vcsclient.PullRequestComment{ + CommentInfo: vcsclient.CommentInfo{ + Content: outputwriter.GenerateReviewCommentContent(repo.IacReviewContent("High", "Missing auto upgrade was detected", ""), repo.OutputWriter), + }, + PullRequestDiff: vcsclient.PullRequestDiff{ + OriginalFilePath: "file1", + OriginalStartLine: 1, + OriginalStartColumn: 10, + OriginalEndLine: 2, + OriginalEndColumn: 11, + NewFilePath: "file1", + NewStartLine: 1, + NewStartColumn: 10, + NewEndLine: 2, + NewEndColumn: 11, + }, + }, + }, + { + Location: formats.Location{ + File: "file1", + StartLine: 1, + StartColumn: 10, + EndLine: 2, + EndColumn: 11, + Snippet: "snippet", + }, + Type: SastComment, + CommentInfo: vcsclient.PullRequestComment{ + CommentInfo: vcsclient.CommentInfo{ + Content: outputwriter.GenerateReviewCommentContent(repo.SastReviewContent("High", "XSS Vulnerability", "", [][]formats.Location{}), repo.OutputWriter), + }, + PullRequestDiff: vcsclient.PullRequestDiff{ + OriginalFilePath: "file1", + OriginalStartLine: 1, + OriginalStartColumn: 10, + OriginalEndLine: 2, + OriginalEndColumn: 11, + NewFilePath: "file1", + NewStartLine: 1, + NewStartColumn: 10, + NewEndLine: 2, + NewEndColumn: 11, + }, + }, + }, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + output := getNewReviewComments(repo, tc.issues) + assert.ElementsMatch(t, tc.expectedOutput, output) + }) + } +} diff --git a/utils/testsutils.go b/utils/testsutils.go index 6b3740caf..2fe2a8822 100644 --- a/utils/testsutils.go +++ b/utils/testsutils.go @@ -6,10 +6,8 @@ import ( goGitConfig "github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/plumbing/object" biutils "github.com/jfrog/build-info-go/utils" - "github.com/jfrog/gofrog/datastructures" "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-client-go/utils/io/fileutils" - "github.com/owenrumney/go-sarif/v2/sarif" "os" "path/filepath" "strings" @@ -107,40 +105,3 @@ func CreateDotGitWithCommit(t *testing.T, wd, port string, repositoriesPath ...s assert.NoError(t, err) } } - -func GetRunWithDummyResults(results ...*sarif.Result) *sarif.Run { - run := sarif.NewRunWithInformationURI("", "") - ids := datastructures.MakeSet[string]() - for _, result := range results { - if !ids.Exists(*result.RuleID) { - run.Tool.Driver.Rules = append(run.Tool.Driver.Rules, sarif.NewRule(*result.RuleID)) - ids.Add(*result.RuleID) - } - } - return run.WithResults(results) -} - -func GetDummyPassingResult(ruleId string) *sarif.Result { - kind := "pass" - return &sarif.Result{ - Kind: &kind, - RuleID: &ruleId, - } -} - -func GetDummyResultWithOneLocation(fileName string, startLine, startCol int, snippet, ruleId string, level string) *sarif.Result { - return &sarif.Result{ - Locations: []*sarif.Location{ - { - PhysicalLocation: &sarif.PhysicalLocation{ - ArtifactLocation: &sarif.ArtifactLocation{URI: &fileName}, - Region: &sarif.Region{ - StartLine: &startLine, - StartColumn: &startCol, - Snippet: &sarif.ArtifactContent{Text: &snippet}}}, - }, - }, - Level: &level, - RuleID: &ruleId, - } -} diff --git a/utils/utils_test.go b/utils/utils_test.go index 9146d6476..bb86b0c97 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -9,6 +9,8 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-cli-core/v2/xray/formats" + "github.com/jfrog/jfrog-cli-core/v2/xray/utils" + "github.com/owenrumney/go-sarif/v2/sarif" "github.com/stretchr/testify/assert" ) @@ -374,3 +376,47 @@ func TestTechArrayToString(t *testing.T) { }) } } + +func TestPrepareRunsForGithubReport(t *testing.T) { + testCases := []struct { + run *sarif.Run + expectedOutput *sarif.Run + }{ + { + run: utils.CreateRunWithDummyResults(), + expectedOutput: sarif.NewRunWithInformationURI(sarifToolName, sarifToolUrl), + }, + { + run: sarif.NewRunWithInformationURI("other tool", "other url").WithResults([]*sarif.Result{ + utils.CreateResultWithOneLocation("file://root/dir/file", 0, 0, 0, 0, "snippet", "rule", "level"), + }).WithInvocations([]*sarif.Invocation{sarif.NewInvocation().WithWorkingDirectory(sarif.NewSimpleArtifactLocation("root/dir"))}), + expectedOutput: sarif.NewRunWithInformationURI(sarifToolName, sarifToolUrl).WithResults([]*sarif.Result{ + utils.CreateResultWithOneLocation("file", 0, 0, 0, 0, "snippet", "rule", "level"), + }).WithInvocations([]*sarif.Invocation{sarif.NewInvocation().WithWorkingDirectory(sarif.NewSimpleArtifactLocation("root/dir"))}), + }, + { + run: sarif.NewRunWithInformationURI("other tool", "other url").WithResults([]*sarif.Result{ + utils.CreateResultWithLocations("findings", "rule", "level", + utils.CreateLocation("file://root/dir/file", 0, 0, 0, 0, "snippet"), + utils.CreateLocation("file://root/dir/dir2/file2", 1, 1, 1, 1, "snippet2"), + ).WithCodeFlows([]*sarif.CodeFlow{utils.CreateCodeFlow(utils.CreateThreadFlow( + utils.CreateLocation("file://root/dir/other/file", 2, 2, 2, 2, "other"), + utils.CreateLocation("file://root/dir/file", 0, 0, 0, 0, "snippet"), + ))}), + }).WithInvocations([]*sarif.Invocation{sarif.NewInvocation().WithWorkingDirectory(sarif.NewSimpleArtifactLocation("root/dir"))}), + expectedOutput: sarif.NewRunWithInformationURI(sarifToolName, sarifToolUrl).WithResults([]*sarif.Result{ + utils.CreateResultWithLocations("findings", "rule", "level", + utils.CreateLocation("file", 0, 0, 0, 0, "snippet"), + utils.CreateLocation("dir2/file2", 1, 1, 1, 1, "snippet2"), + ).WithCodeFlows([]*sarif.CodeFlow{utils.CreateCodeFlow(utils.CreateThreadFlow( + utils.CreateLocation("other/file", 2, 2, 2, 2, "other"), + utils.CreateLocation("file", 0, 0, 0, 0, "snippet"), + ))}), + }).WithInvocations([]*sarif.Invocation{sarif.NewInvocation().WithWorkingDirectory(sarif.NewSimpleArtifactLocation("root/dir"))}), + }, + } + for _, tc := range testCases { + prepareRunsForGithubReport([]*sarif.Run{tc.run}) + assert.Equal(t, tc.expectedOutput, tc.run) + } +} From f6ad8e80d86d4e278545591447888a550e32bfad Mon Sep 17 00:00:00 2001 From: Eran Turgeman <81029514+eranturgeman@users.noreply.github.com> Date: Sun, 8 Oct 2023 16:15:43 +0300 Subject: [PATCH 4/9] Bug fix in Gradle dependency regexp creation (#532) --- packagehandlers/gradlepackagehandler.go | 14 ++++--- packagehandlers/packagehandlers_test.go | 37 ++++++++++++++----- testdata/projects/gradle/build.gradle | 3 ++ .../gradle/fixedBuildGradleForCompare.txt | 3 ++ .../innerProjectForTest/build.gradle.kts | 3 ++ .../fixedBuildGradleKtsForCompare.txt | 3 ++ 6 files changed, 48 insertions(+), 15 deletions(-) diff --git a/packagehandlers/gradlepackagehandler.go b/packagehandlers/gradlepackagehandler.go index 75d0d7b9d..9f0bcd89b 100644 --- a/packagehandlers/gradlepackagehandler.go +++ b/packagehandlers/gradlepackagehandler.go @@ -61,7 +61,7 @@ func (gph *GradlePackageHandler) updateDirectDependency(vulnDetails *utils.Vulne isAnyDescriptorFileChanged := false for _, descriptorFilePath := range descriptorFilesPaths { var isFileChanged bool - isFileChanged, err = fixVulnerabilityIfExists(descriptorFilePath, vulnDetails) + isFileChanged, err = fixGradleVulnerabilityIfExists(descriptorFilePath, vulnDetails) if err != nil { return } @@ -106,7 +106,7 @@ func getDescriptorFilesPaths() (descriptorFilesPaths []string, err error) { } // Fixes all direct occurrences of the given vulnerability in the given descriptor file, if vulnerability occurs -func fixVulnerabilityIfExists(descriptorFilePath string, vulnDetails *utils.VulnerabilityDetails) (isFileChanged bool, err error) { +func fixGradleVulnerabilityIfExists(descriptorFilePath string, vulnDetails *utils.VulnerabilityDetails) (isFileChanged bool, err error) { byteFileContent, err := os.ReadFile(descriptorFilePath) if err != nil { err = fmt.Errorf("couldn't read file '%s': %s", descriptorFilePath, err.Error()) @@ -125,8 +125,13 @@ func fixVulnerabilityIfExists(descriptorFilePath string, vulnDetails *utils.Vuln directStringFixedRow := fmt.Sprintf(directStringWithVersionFormat, depGroup, depName, vulnDetails.SuggestedFixedVersion) fileContent = strings.ReplaceAll(fileContent, directStringVulnerableRow, directStringFixedRow) + // We replace '.' characters to '\\.' since '.' in order to correctly capture '.' character using regexps + regexpAdjustedDepGroup := strings.ReplaceAll(depGroup, ".", "\\.") + regexpAdjustedDepName := strings.ReplaceAll(depName, ".", "\\.") + regexpAdjustedImpactedVersion := strings.ReplaceAll(vulnDetails.ImpactedDependencyVersion, ".", "\\.") + // Fixing all vulnerable rows given in a map format. For Example: implementation group: "junit", name: "junit", version: "4.7" - mapRegexpForVulnerability := fmt.Sprintf(directMapWithVersionRegexp, depGroup, depName, vulnDetails.ImpactedDependencyVersion) + mapRegexpForVulnerability := fmt.Sprintf(directMapWithVersionRegexp, regexpAdjustedDepGroup, regexpAdjustedDepName, regexpAdjustedImpactedVersion) regexpCompiler := regexp.MustCompile(mapRegexpForVulnerability) if rowsMatches := regexpCompiler.FindAllString(fileContent, -1); rowsMatches != nil { for _, entry := range rowsMatches { @@ -152,8 +157,7 @@ func getVulnerabilityGroupAndName(impactedDependencyName string) (depGroup strin err = fmt.Errorf("unable to parse impacted dependency name '%s'", impactedDependencyName) return } - // We replace '.' characters to '\\.' since '.' in order to correctly capture '.' character using regexps - return strings.ReplaceAll(seperatedImpactedDepName[0], ".", "\\."), strings.ReplaceAll(seperatedImpactedDepName[1], ".", "\\."), err + return seperatedImpactedDepName[0], seperatedImpactedDepName[1], err } // Writes the updated content of the descriptor's file into the file diff --git a/packagehandlers/packagehandlers_test.go b/packagehandlers/packagehandlers_test.go index 3dc415b5f..1d37b8828 100644 --- a/packagehandlers/packagehandlers_test.go +++ b/packagehandlers/packagehandlers_test.go @@ -682,7 +682,26 @@ func TestGradleGetDescriptorFilesPaths(t *testing.T) { assert.ElementsMatch(t, expectedResults, buildFilesPaths) } -func TestGradleFixVulnerabilityIfExists(t *testing.T) { +func TestFixGradleVulnerabilityIfExists(t *testing.T) { + var testcases = []struct { + vulnerabilityDetails *utils.VulnerabilityDetails + }{ + // Basic check + { + vulnerabilityDetails: &utils.VulnerabilityDetails{ + SuggestedFixedVersion: "4.13.1", + IsDirectDependency: true, + VulnerabilityOrViolationRow: formats.VulnerabilityOrViolationRow{Technology: coreutils.Gradle, ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ImpactedDependencyName: "junit:junit", ImpactedDependencyVersion: "4.7"}}}, + }, + // This testcase checks a fix with a vulnerability that has '.' in the dependency's group and name + more complex version, including letters, to check that the regexp captures them correctly + { + vulnerabilityDetails: &utils.VulnerabilityDetails{ + SuggestedFixedVersion: "1.9.9", + IsDirectDependency: true, + VulnerabilityOrViolationRow: formats.VulnerabilityOrViolationRow{Technology: coreutils.Gradle, ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ImpactedDependencyName: "my.group:my.dot.name", ImpactedDependencyVersion: "1.0.0-beta.test"}}}, + }, + } + currDir, err := os.Getwd() assert.NoError(t, err) @@ -697,18 +716,16 @@ func TestGradleFixVulnerabilityIfExists(t *testing.T) { descriptorFiles, err := getDescriptorFilesPaths() assert.NoError(t, err) - vulnerabilityDetails := &utils.VulnerabilityDetails{ - SuggestedFixedVersion: "4.13.1", - IsDirectDependency: true, - VulnerabilityOrViolationRow: formats.VulnerabilityOrViolationRow{Technology: coreutils.Gradle, ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ImpactedDependencyName: "junit:junit", ImpactedDependencyVersion: "4.7"}}} - for _, descriptorFile := range descriptorFiles { - var isFileChanged bool - isFileChanged, err = fixVulnerabilityIfExists(descriptorFile, vulnerabilityDetails) - assert.NoError(t, err) - assert.True(t, isFileChanged) + for _, testcase := range testcases { + var isFileChanged bool + isFileChanged, err = fixGradleVulnerabilityIfExists(descriptorFile, testcase.vulnerabilityDetails) + assert.NoError(t, err) + assert.True(t, isFileChanged) + } compareFixedFileToComparisonFile(t, descriptorFile) } + } func compareFixedFileToComparisonFile(t *testing.T, descriptorFileAbsPath string) { diff --git a/testdata/projects/gradle/build.gradle b/testdata/projects/gradle/build.gradle index 492d8f65f..73d6875e0 100755 --- a/testdata/projects/gradle/build.gradle +++ b/testdata/projects/gradle/build.gradle @@ -45,6 +45,9 @@ dependencies { ['junit:junit:4.7'] ) + implementation "my.group:my.dot.name:1.0.0-beta.test" + implementation group: 'my.group', name: 'my.dot.name', version: '1.0.0-beta.test' + // This dependency is required in order to check we fix only vulnerable rows implementation "junit:junit:5.7" implementation "junit2:junit2:4.7" diff --git a/testdata/projects/gradle/fixedBuildGradleForCompare.txt b/testdata/projects/gradle/fixedBuildGradleForCompare.txt index 576c0508d..440e4058b 100644 --- a/testdata/projects/gradle/fixedBuildGradleForCompare.txt +++ b/testdata/projects/gradle/fixedBuildGradleForCompare.txt @@ -45,6 +45,9 @@ dependencies { ['junit:junit:4.13.1'] ) + implementation "my.group:my.dot.name:1.9.9" + implementation group: 'my.group', name: 'my.dot.name', version: '1.9.9' + // This dependency is required in order to check we fix only vulnerable rows implementation "junit:junit:5.7" implementation "junit2:junit2:4.7" diff --git a/testdata/projects/gradle/innerProjectForTest/build.gradle.kts b/testdata/projects/gradle/innerProjectForTest/build.gradle.kts index 85eb85b4f..4082d4d84 100644 --- a/testdata/projects/gradle/innerProjectForTest/build.gradle.kts +++ b/testdata/projects/gradle/innerProjectForTest/build.gradle.kts @@ -20,6 +20,9 @@ dependencies { runtimeOnly(group = "junit", name = "junit", version = "4.7") + runtimeOnly("my.group:my.dot.name:1.0.0-beta.test") + runtimeOnly(group = 'my.group', name = 'my.dot.name', version = '1.0.0-beta.test') + // This dependencies should not be changed runtimeOnly('junit:junit:5.7') runtimeOnly('junit2:junit2:4.7') diff --git a/testdata/projects/gradle/innerProjectForTest/fixedBuildGradleKtsForCompare.txt b/testdata/projects/gradle/innerProjectForTest/fixedBuildGradleKtsForCompare.txt index a174b811b..d192a53d7 100644 --- a/testdata/projects/gradle/innerProjectForTest/fixedBuildGradleKtsForCompare.txt +++ b/testdata/projects/gradle/innerProjectForTest/fixedBuildGradleKtsForCompare.txt @@ -20,6 +20,9 @@ dependencies { runtimeOnly(group = "junit", name = "junit", version = "4.13.1") + runtimeOnly("my.group:my.dot.name:1.9.9") + runtimeOnly(group = 'my.group', name = 'my.dot.name', version = '1.9.9') + // This dependencies should not be changed runtimeOnly('junit:junit:5.7') runtimeOnly('junit2:junit2:4.7') From d46eeccd84b3eec473815fd778d2a43150957f31 Mon Sep 17 00:00:00 2001 From: Eyal Ben Moshe Date: Mon, 9 Oct 2023 13:32:34 +0300 Subject: [PATCH 5/9] Documentation - Update SAST, Contextual Analysis and IaC images (#533) --- README.md | 26 +++++++++++++------------ images/pr-iac.png | Bin 0 -> 214611 bytes images/pr-sast.png | Bin 0 -> 72235 bytes images/pr-vuln-contextual-analysis.png | Bin 0 -> 73664 bytes 4 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 images/pr-iac.png create mode 100644 images/pr-sast.png create mode 100644 images/pr-vuln-contextual-analysis.png diff --git a/README.md b/README.md index 7cbeb7b38..f760abfe0 100644 --- a/README.md +++ b/README.md @@ -198,18 +198,17 @@ When installing Frogbot using JFrog Pipelines, Jenkins, and Azure DevOps, Frogbo When installing Frogbot using GitHub Actions and GitLab however, Frogbot will initiate the scan only after it is approved by a maintainer of the project. The goal of this review is to ensure that external code contributors don't introduce malicious code as part of the pull request. Since this review step is enforced by Frogbot when used with GitHub Actions and GitLab, it is safe to be used for open-source projects. ### Scan results -#### Software Composition Analysis (SCA), Vulnerability Contextual Analysis and Infrastructure as Code scans (IaC) Frogbot adds the scan results to the pull request in the following format: -##### 👍 No issues +#### 👍 No issues If no new vulnerabilities are found, Frogbot automatically adds the following comment to the pull request: [![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/noVulnerabilityBannerPR.png)](#-no-issues) -##### 👎 Issues were found - +#### 👎 Issues were found +##### Software Composition Analysis (SCA) If new vulnerabilities are found, Frogbot adds them as a comment on the pull request. For example: [![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/vulnerabilitiesBannerPR.png)](#-issues) @@ -225,22 +224,25 @@ If new vulnerabilities are found, Frogbot adds them as a comment on the pull req
-**INFRASTRUCTURE AS CODE** -| SEVERITY | FILE | LINE:COLUMN | FINDING -|:-------------------------------------------------------------------------------------------------------------------:| :------------: | :-----------: | :-----------------------------------: -| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/notApplicableCritical.png)
Critical | test.js | 1:20 | kms_key_id='' was detected -| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)
High | mock.js | 4:30 | Deprecated TLS version was detected +##### Vulnerability Contextual Analysis +![](https://raw.githubusercontent.com/jfrog/frogbot/master/images/pr-vuln-contextual-analysis.png) -##### Secrets Detection -When Frogbot detects secrets that have been inadvertently exposed within the code of a pull request, it promptly triggers an email notification to the user who pushed the corresponding commit. The email address utilized for this notification is sourced from the committer's Git profile configuration. Moreover, Frogbot offers the flexibility to direct the email notification to an extra email address if desired. To activate email notifications, it is necessary to configure your SMTP server details as variables within your Frogbot workflows. +##### Static Application Security Testing (SAST) +![](https://raw.githubusercontent.com/jfrog/frogbot/master/images/pr-sast.png) -![](https://raw.githubusercontent.com/jfrog/frogbot/master/images/secrets-email.png) +##### Infrastructure as Code scans (IaC) +![](https://raw.githubusercontent.com/jfrog/frogbot/master/images/pr-iac.png) ##### Validate Dependency Licenses When Frogbot scans newly opened pull requests, it checks the licenses of any new direct project dependencies introduced by the pull request. If Frogbot identifies licenses that are not listed in a predefined set of approved licenses, it appends a comment to the pull request providing this information. ![](https://raw.githubusercontent.com/jfrog/frogbot/master/images/violated-licenses.png) +#### Secrets Detection +When Frogbot detects secrets that have been inadvertently exposed within the code of a pull request, it promptly triggers an email notification to the user who pushed the corresponding commit. The email address utilized for this notification is sourced from the committer's Git profile configuration. Moreover, Frogbot offers the flexibility to direct the email notification to an extra email address if desired. To activate email notifications, it is necessary to configure your SMTP server details as variables within your Frogbot workflows. + +![](https://raw.githubusercontent.com/jfrog/frogbot/master/images/secrets-email.png) +
diff --git a/images/pr-iac.png b/images/pr-iac.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfee87808fbe907fbbeac180ffc08d1858e1c1a GIT binary patch literal 214611 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

<@?}ZxUO8kr zfEPjY%qR5Z!%q<4%k0#MUcPwLjH5|DE1FqEftOSJ&?~IyN3KS8TGYMQ_0rU7^WdY} z9?Xm0NW~A5lY>4qk>9AbBELoVSxjuxzIpuuO01eX4SP0z6OQOpfGH43;Of1VdUq~w z5`J|PbaUKRuzo+K&0+Vfi;@PB^CoXtlTfwxtoY*$mSE32EO5sZu|rIsWzV>1`g}932c{B*L2#?+~nn=IP6mRv8J43)i`H(8O z0rySzbfN8eLbK;%hBV^xLUhaLlau}MYIr4d|C7#$Ff@o-#>;2ZQeww(skOZKtMBrX zPwGAQTc+s=6ziYNg-{r>t=wC%$hAKmdOl6O*seijVvwcrJcv8&bW-=&{W0Dq5;?7c zcI1C1>SZgmfE>{*1xaqjCggLU(lX7Y%6$NeMC|8f(^%1R2Q%K2(Rk45eZHv}@BN;n zw8U8XW&Wx9 zg^WN|2XnHt^qZc52Z2_4)EL4^XogoPNJ#w|!UQ5hYXc+bG|KqnI>IIxk)|^kP7NNr zwadzfP|&7MNDf_@ww4Fq*jOsQ*gui6uJ(~|n>rz*z#|IYU{rEECB;1!Co3RI`QD1! zE8l`0B6tuoVB{zaxncx`Je0vpu(uy&@Rw+yHI$$CQ9*0-P)&cUCaw{nE-|v__-JmTjv^w*L@vdcE!0BkOmXwvF8IK4Ta`k;Sg|7PXoWkR`IC~c*jE8uN?Fe zr9A?R-Bu~B!D2?O_p-dKdbZ3aj2*&4MTOWcT>=4Z9^6($Rv2^r5l`V~C0Q}q{ic3< zt269t*I%ue(UD*YdPN@l9w7@Tn~Uh*%CcjGf~V*r+xk-c4D~zXl+>^e^Lr@N9!gl- zM-$IYNWWFlei>mMDaKU2Q6`?AAu zmm~dae12r&k)maPGD{X0z6+PZG;VaAz?+&^2o(W5;(%INJ z+BngwXLyg_25sA0&iu_}t_ueAXDvs;Iy_WDC{!_gD4S2osqRbhd7`p>|C(wl>k<}>k&nLd@y&AU{MY7#zjeS70d$b;Jk4(WuMXIt#cpla`w(~*wK<%`WF-?LfD$_) z=sL&?Xj{Qewmz&l$qJ;c4$)9MGN@k<{Q7xa5c3BxHHnR({CcwuF=#QSNV)_O+l@62 zQ{dlegpIp*@M%ue*LQ*H0QLU;6hKB&Sj3G;2W#v{_Nm? z8a=eI6gFG2T)hr|#>xJ>!JkS3%usg8kuLF%MfuYn{i9)v1UR1RHf3z_|Mx8ZeI=ay zm+2Z+lM?jT%m3|t{zZ!gfv>2>R&`NYFaBV&KZ19EPHICOI-31_!*V<0FRS>ES^QfT z5!L`Klc0G-GX3!{Tj{^%_5V@Qz@2Y^fz|FYRv4)KA>TS;Ok@y&0DEwF(B9tuK9hKy zSLF%ixwC4C%Q2*h!82HGwv(=vl+OFr|-A2x~NaiVFHJzWIZGzsa zwj2y54}+EqR~sT&bi6(AI^eJz3j9y@Aq+zUmZ|&Q*TyP0NxS|f?R(auYfQx3b8~@s z-KIb!C&!C^PFu8?*e!EjkG!U%jWGp5=BoleohCpwmHU1TEV8 zfLB9OSXkIFy<@iAr2zQ!FXs%Gfp-T&jbrsy_;&!JkSQLO3rFOKOw>>nj+4;x=bSBp zHG4|sGLImq5mcN9wRZvI9RsM}2oD|~={Ds8Dui>PrW{F2y$i6Akpe1Y#(~F7OW!8_ zAMU>Tp{^upI}ivKELgB$!QCOaySux)y9AeD!QI{6U4y$j!QCCclbzk2*~z^B!1vp^ z+{@|i>gw*Qr=F@#klO@<_{+KXFYT+s`-Qxog1Mnk~=X*c?+{%cTF4Z-R@ZD5`+hY%W5gl1@0 zhqQ0lW{*pb?aQkOMLy^<}B71Tj_o1cfMTMK5-71ugyDd3YxZ# zww~=mR`O^RiMM;_1PfHqEUYzSk2s2D^0_f?qy*VM@Sj%K8jboxW`^Vqn-uatNP4(= z`Q5BXX6#qzk-?gmSkUOk4l1Oks;9llqn0X1o0veOPJQ+0vYMdI zjxB>mCK=CC8DgSb(uK>w`0(M#ZR??v0HW@6F^{1e`>I6tcyb$t1-Vuwy1pXIYiHz( z)5~zs23O~OG_e$s)a&6e>$OdB!&d6riEJUS0Xg|$Gsue(KX^7d3WG zWk=^za(b9#yM9Lo4 z_bSVU_Lp!TG8|1tBO_);25c~Y+tEKqRzm^@jLL0j^#}r}jZOKtZ;`Gfd@1>}g}J%0 zg~1{pHOIPSmzeF2`k$`UnwhMIDv!)B8=GTGwly#h<~w+v4cxwiXRd9?I^R`)hP^Up zpd+iW+!m}n#?}yJi8G#UxSvE3>yvunb0yJSt~9#6m4=0dQ4md;DV{+%&L2&4y}GMq zkh?x$`1rb{H7=No;6e4sNKMwD)WS-$03+)T=~OpSgZBw#SJI@(qu#JX&@{@^?=BnyB1ybAFt7YL5xqDwuSJw)eA zX-Bk$_liByTWE&fNci$Gh^9DuaGCe8X}A$hUx4tAVAM7_?N6LWb2>ep4&0Bp z-(D`riBAjMWz~P7aCooDnb{n2;Go8AF$Zz%#x#ls}EnnL*n-meMP zL++#U603{+6;qe60K+Y~inpNn^3}7@wTx%6o)>Yw?d0Ta=k_JeuHQRw)kT&bwJ#pm zL*F-^4*~+gTb(}ze-pVQ4+rqSHO~Upc)t6CSud~{#hMiM8j*!jy1yF+KPdovz;5<= z(|jtOo3x%z*!OL_6V6?J`|Y%wI-L{xCWwuv!RZTz3srM#5|b&>l|;|lJ;a?>^NyaO zrDk3X#81isThcL9)s2P;RVdq`n-NmXe0LOG{40q8JK<4FQ&XTm6pFd0kPiVrcG=RE z)}Tjp^TD=?$3xC*aIutcn&xe50An1P3UpGc2yOIF*UXh{@ddA4N^1E6gu(VOoNCi! zXp`lG(%E)GiiNo`w9W*oQL61BMeoh~{sgEww>C;JPLc$=A@^M9*or2la?RA{$d9s4 z-D64*3?*+okcQ419l^(o6t27IBUnbpxIR72tu5a1G@yui*PVFXj<&jitVCHi@) z--zG^@qq}G9+6sQdVY8%yGSTkwaF6Jm`9uhY=qYzq0=P%gy-w6_;5)GGUYpPq+{Si z?pV-SWJ3G|s^Sd-t3Ef>@yHaUPGNTZgsp;-lg(XGM(n`Bys(!gV z*pKIPh{^SqG4BvwJfBXC#1o|q%iGw58w6wI+#5ykSucXFRk))Wl1%YFH&EdLh99gdZJ^MQcvsEtS2|RB+ z@|EHr;cFICSYl^}r;my|`C{!N`SPW$>FF($yJ*4R+L&C!woi+ugywtHo2KnRbX^Wu zZ~UCxZw0`M>?c_p$hSp#JG0xxrdgzj1gsZZM38a(jl8w*e7%z3D@gLUuK~;j;BnT$ zjkb?2LvTrbT6sQ?&g&JYd{K4Bm@#!w#lw)liwFxtpH-u8B_*fkgZH>5J2|{%x(d$bd22Bdl%GpS2EW^E~&@8G2iA;WplMY8-yXiNT-e| z+-7`m7Hj7v5ZZ$urt&v;2KTG^FBgKT5ivz@7GZCtw!AnRvk%VM+UY)^hk;*(J~@Sk ztnOo|NgDg}Vt{&%kQ5!C>%Oc(#ezy>)yNW47}j$u5SF<(x_^cAKw8QC#M{z+VuFdO zc7!fep>OKJ>*(hfs9A5hCJ%7wSZ$9GRz<#)XqJ9qG9WNU#NT1&a&L88qsmo@usr2G z;u|`6Rs6;C(~tJL+rtx%qf)`Z&^6Wj7|XY(wOVIaJkC4;E~N9Yb{%+UY-pHwMdSXH z#sI}&*y6lOV9lKs%fPBUY01$t>K)*i$E34+gd9KNW#Z}Lu_V;y1Q%XCbu)88|FAln zOBeA#!bUtszc!}9#zSqDzn3{;6pYO%NG-UAXkzK&R*L!`b{x%46< z_mDpbAg@9(jWFZx_RwEyI1Dd)BR}2lU2M3V{uz-W~&wND#h^uND)JdVM^_(G6y#$v^jW)8_DdN z+tZNVK}4sMRk&az%K1GD@19`ng|4NN#>LhH(Or=^Y^;#6G)^3R>@qT6hTKXc11XuC zB1OH?_h7ds6as!)8(sceL-)lBrFqGTLaxI7U8`^1VpaiL)2BzJKpW41U{F~y&@r_G zp)p5%>skc{W<;ZVXmC&zxo0;NZ2}5>#3XHE0&3>YSg5fUC#0IDJI|TtjRFWB5mTP^ z*RI*wV4u_q_pRODe5rO0`>QZRbW`c&+?um?HoOd3`G`}sbjM(%Tv71sK5gK-+1eLU&cYX_dj`9xVrCP7#l z3|fhgPGy9oTZ1ynzparYDM02o?LsL!0SMN1RQGdINh4iB+8B)IfgSk~^!f?vyY_>x zFP2M19Gj>%$UDF-9UEb9(ebFm)1UI`Qk&G7uh=TlFe%5U5iW!HF!8?Y-hSD<%TY0f zkg{H}T|;&L5kkdjYo9z(31w=9+zTi|h6A8V78mEGK|xWZ?d{!<-~ z)MZCFB}h_X6z`ysNL;E1Z_rU60fR~3c_K@|AhZg13>_hCUX&V|cT2LQ&n(p++Jr&9 zg@Ury6-!bVg|bL0sOYSuDVZ$UT)DQ6@~g^5K7?3A1RE92;(*h74_7C*FJriozx z8b!@|Wgv-0LqVlIA)|y$qynA?zC={ba?_62fPo*|Y6~A1p3NZlw1wGK>~$_P>YvEw zANT@pGa}%xuAD&bMx%ornI9R2B`eXqAT*I)5`FsOf=e$bVfgJWTLeijT|ppC4^+f2 z5*A0~bDl!rPF0dWcuL=VqY*?7_AQBqA{Y%mQ?=Tz)0ftj?eg|l^)^=(XgfaB)K4Bw z$Ez*y*lU(cv=SeT)Jse=(4d3}lluEZiptt5$?(N>Q13pUh4oEx7r6Pupjggi!A@ou zGZiH#Ccz9LheL3OJr3q#2@C@5?zlMIMuosnsExqmnbXXv9%s`sFdp*U1oZe)P_ z(7W^SMWT6~tY=&ny$rfAu=sh^8sH>Yiaf;hWnQRnIuC8&n=&n6ON3gD!^&cdO zr<6N6aKK@eh6dkD)^K&ScC<}oHDDUE=UI6FCyW){27Jotd5vA{TL*agZ zFP&-S`8s92otVrbBQKm1Ai+jQ_91x|(VorqNGiZ({CH+@#K3%IvFW%d4i5tE_zGT{ zF;9t+;SQ=QZm9Hjk`k^b#y}-V3>oWkND%p3XsaV?(S@vF3^Vns+ql%_dZWh}UZ7KH z$3zNAI$IM5L0^{CZ|09aU;xvjvjh(5f{r7hNvbPSyaY8}FU<{WWg_NR-7wmXzDMT` zO0+*-#^ydLg-D|Cky>k*z^vz{0FkMguvr`# zE!05nVKE}!^#(|_sIpBk#Gana{5(ViRkgJW5B;mw1`07AW%sxrkhTrOk`GC3R-4hR zPhU7%qWrOVO2%DwM}V@7{Y#VgBWj+yPIdA5@h41DUWh-n-k&XZ6p$E{Ur}mtcnvi3 zu-%zIj%FloaYl`rG4FpKszLzhF(gW7=GM=fv@&%yHWigl-OPfj8QdJ#> zp2i!oggp0sVqZ(==gUTx5K3uW+?lK{;^qh5bDTd39N%YZusL!yTn=QhzIJ`sh^wGD zS-+df$ebd2k)pW2BP|`*qxl+VRV(OoERGaaK`e<44==U+;nSyfju!U?XzWD? zKZA`f0YiyYJ)j_GUKj^KQhF338) z-3#NR^zQ_4P%6zfZ@Qc@!ppdY&pB|+w6w=d`LAUokBZdKQgbt5$!%FStFNf|4&T>- zEbbG^+Y_@KsvcE*{}_LN!odcca|xq#AE(cYHv?@bqK+^ZmwP+x8>H4}K=PEh{cJJzTB%J6)W^uuo3 z`g5cpXqlvCmv3V50@`!Hf$Nf+zS3Sb!ir;^FlZ2sfb?oYx@R{g>2wr}+91OrbGh6* zt}N`tsq;7w0}zqw@<7) zyEvYRws@e#h^z$+NZUA`7;OeCaKgE>inHWsxv`NuO81bxwMI< zh(^t4>!SAPjvmW1Am3uZJ^1C3!jZ+&X??eRO=Ls*LTZlS-ekD{g_ijU$E#QaX@xak z4+idiD!m>jR-MTLs+9;7Xl|vAF7)Yico5<1-C+<{zxbOc$z!%H*fExD?&Z*F*CEB5 zL)3^K{!{YStn!vTeI-RO-e75Di#5sC`0*yjOXFHkKFt3bAkBM|yg)5t5v`NlR zakrXUoB-9=!*FAzk`nA|NAlbL%MF^uLecgs{3$$qA2sZQbcsl;*I{_X7T1O4gP&X1 z@X#JR=uW3prYTs3ZP1dy9f)eaW;vJ3_*14^yRXlL_cF4_5TI(F1-#|%#p+7)cW`Tu zzOa`}kVwA2twa*)<>r-Zc6i)r;OY-T6=u)E<=m)NNfuPAvqGH;Fv=9*&5<*Bi}r3) z&Xt?#zIt~o1DeNr5=V~zajT1{f@W+hQD*j0kyt)@me78k{p z^!{2!SFzHfu;5QYC0FiGcJi@e+{61gUe7l`c~l)Dd2KDOwN5@RBuX2oGJY)^g3VOp zvLWjD$j0r4h8nliQMi>Qe6iR*xXK!T=uo$>6E^Dmb=W|HT=?U1yTgwz(zTF$$nS({ zeEJHi3=R#-L9!=8Lszso{_jkf=ej?dakW{k#L`1pi@2cGcp#;TpCgHY$VJmUE2uvi zJsk&yPH}ca#U+V32Pfz5kt8vu2RfD@#9}H*>UIUADdYb=e3T-N+uj)KAvm@+OJx&8 z{MCw+n=*S>ZZVr8AcziT6kr;0!GC~kOl}Zctl0MAa8{lnOJixW8TIjce;EnYTH%kb z6HGN)h8Tr7SN5phi7jmD1R1d8k5EJaAzBf zEFD$rXu9oGzYuT_?f&4b_aHlSCF{F9bq=L^*5T zcUsu}J{<5FVgwF+V0Kk=6%yC~&iQUH^RrcP=cQkR%E%PV*VgguXUhko+xd@2T*Y7F zsI&Tfl)O;Y5>0VA4!3JX7sEaNVAMBCo$L}AU~Fibx0_SZs)2%@ zZ`8l6A5hJ6tuD#W&;I}&;~FkjeI(v7y?ihR-fy#K-BTT@uc#u^WZ8&Ae37>+QL zxMryJad0(=cw2=7AZ=6mv%*rVjNJ*D)^BL9*)O!0vHm*@-q#eNH!eQ1wEObt`CV4w zv?%%E2dpdXQesk)E?vXTI*;&y;*nw=7bMz`Nr_d1zuBKZL4QGrof1Dk2;=5|P`*2T zqTjvZfIR~u0jv(G`wXYWbLF15TgIF1u(olKqdE{&36&C_vdmr`}A0zu)Vo`r9l1=VPSA zuOSmL`%L}aqx;K3pz(V{D9Kk)`LA&DUxP+}K65kS0Ri3QWk^Zizne#Y`aB&7fKXsF z`#Arn3;#)2`{R!bKwG2cwgfD&|1hlo^pOwfG=m?;3V~`2Rc24V0y&&zbgIL9{v9;An@uR?0}pH^g(wFQNb^E;h|uD{Ip?JPs1N?eI39T z2x)b{*X=!;(A|(&ym53a_r92&p-T&~HEy=Ua}`vM)?bH+k)A;OW&)r;kg@3rs~*)3tt> z$YY`gGma9Fq+ob@8p=288%i(FZ8iU!w;R>f>+^mok7W!j9^`s^; z5LEOoW^8Ez?q5T~e(u^$8Y`+LAJt$frW>+R5Q?W8pq4LEci>0WYPWaaeP9)#%9N-d z8>XN-xOX;Pk`Jo$RN#^v9Tuu54b`19EQAKiSG$#_xq2`;K zM7bR*arQ}j?zIRmOcvnK` zc84UgvBVZFwWujuXJJt&P1p6W1FVHuG9?K@8{U4uu*TfdNS4-vI+O9L{3Cx*hH(H$ z0a7KA!Z;wpL*B!4xL9Y`wnkUP+|r3`n?kK}TX8g$G?JcJZvS)=l=?x~DIv27&jVSp#i9ZBM)~>=mAd9hOm92F>zcZ@r|CYOym@QAyg< zGBXQp%oHm@uD0CbuB#}2^c$%9v<;0)!EzqazIM3Oy?cP7L&~Y+^4!N5F=>GJrJERI zqs6|Eu7Ig%O<7e{MU_&kW^q6`Ta?S?gY)^I0Az+{+RVg-W`ySLr)A%9(y(iaZ$-z) z#=76D&PyvQ)}(UzVo2gh-+j;EpBc=%6Y9=`S-y6#om=k7JLdB4Ax+hGy|vVGu%!;9_HWH*Ta=;PP(+;}TOILR z=*x`;xFiA!gf?~iFO3xo)h1s_))5iF8_)b4U;buh{p(EH7X(1orp%n|6y7(wBPDCQ zm?$Lcd+Yk@)5_v(S1JQmQ-ZrOg!+Llx@r$--8HVWDd?A#MpzT6zy$=Y4*jUKtzz-i zR9dz6izS7Kh#R(DBgu6MXUT@I7fQYXa9BA|tTEIdUs?BWr8pnn%aUTuS*Wu;)Td{v zdR}f@1B>m*2p)d!?%wW5i+8PO_OAV97Aq?Rt*+imy%h!N>|Mm@+RCE`pus|lSOs}YaXC~A1E8BgX*{LkK)iIL@6$Snv zC>YZZfwUP@@#Cw;EgLhHCy<<=mRNK~V{jD+dHHk@PiRm)ZDT*Xmv&KWHIx-==h-WH z^NU5awV_cQC;r-|@(AC2i=&cLKzmayB)|#d`EWMTnhZ%txuH7SGfcOs5_F{5Y(pFa zY-no_<;E@cu4@&Xt0e96%g7oOlW%`x0045=egj~M@3{5iQzYIzT5^cSDU{)@e|_!P zz!Bt#kY%b$0R`d5C36awN@sLf9rmxFR;a2us`Z#-YB5kic065y>YeK8sR1}2Gr3c{ zlG)o`y_Z?f!;SQVWRjOam`dYmb;c~~Is6qHC`j2#2r9e=G(u%Qhxjlr&yT*S%Q{2Fc6!64u z(OhO@s+M7uHRR!?g=e!FBPD-&uNBy%QX#FA%e*#3Eb}WXq}+9D&`be_+^sST`*q}m z!x)QU0mz3^Wpw&>wyu~5jVu*oV@*s%y+Xz)Jy8%UfKmNd+vq>f?|#uK-!M4-SOBY# zxyx(E$zmC?w$AWJ(cMnL)=(N&o_kGR{VEmBa!X@W&ZKAf%CIM*FQ0Sear~elBgl|z zjtuTp|NU6CzQ51Tjm<3^G-+kqe@pKp%pt!7XDFAOd>S_fDk}7r5maV4(=1c{>GDO< z0pYT$iVB`R@-5uVT{Zq?Vp3ADSgq--NNEr2%P{K%b1`QoJqEgoC&pS^nSyh#_@~v& z&=AOOyabcP1bNJKA%PBfrf;EfyD}IPvjyvBuP6W@Y8-=@7qyWDDKQL^?wqKys4Yr@ zYcbJ`6VX?LSVu}I+2h%#wyieC&j$*|_4`3V7usRgzHB&~ffWc=_5ICN>Pxq4FuHd3 z12td2i`#6#GV6JMVQb*kz+mEbN~N!lZ%lNotx*)dfB_pXqmfj)Ql>iiLKelkpM(L* z_SxO@(PV6aAit@j8J4B3E^dd`bJ+D`Wgx<@LLvp- z6-cNX7}@5)T$fcA*6yH82P6N-ohOk8*m(@4cRnt}y)%Ur_dBxf>MScu@71<~Y=49_L1qNcJE#s3m*Y^BLgY(XOqV04oV zxuRl)ppfh4#HlNIX!Z1QhKTF>HVzI~6eTt?vAGWq8OK6wBgPep6_yfx{xW&vhLS(? zCDyY?BQm~5p|{M=q{Z?F7(nG}dp=QOS^h=86TS#P=sX_Ef&Hh2AIbWQ1psFh{=F0` zrP02~fFMj+F1N*KM=T}iGfGunNL1CtPl@|B1&`{M5I$D_w)^#s=NpYB;f)VSW)m&B zHk^9hhR$1g<$DcoYh}G+jQL)9Lx=5-rK<^+dp!L5m#<7YL)J}_Cy!caVMKXJ)fBPR zdPv9b+zkjEle5Wg_JJCE4vk^BEgqL{z z2kS5cAOOpO`^~fncTjAU@EI@|M@D4HqN6Fp4sgcL-X?hxPyfU2_s=q*;wb_gUoBGWn>u@km$)3 zV2XrQ!tH3H*3?~o!n+ zNq*viDx%JIW|m{)2lpl?Cb%e-5|UtXxiMVY3~St}PODWDS@CSXZ@{6kIq(}!7k3T2 z+w8U57_1hp1)}RB^#Jce(nM4 zg|U&hUt$Tm-6Z?rGGYE_Q@$A6#S`xP>IOR#$auO9=h8mx-V>`C1R2CJfMQ~3a9Ch& zwcz4il?1g7cf3;7QYsx+c=_qiRJnW6~p?gtV>^D4)i zo!qI}E9b{&x|2`BPI{Jx6KyX2Uiqb@^1^lj+QP=xJEyW^jqGx1_rX)demsv%*atIZ z)Pq{?Hwr+N4!M(r3x&O80D<#?l^-pAJuZlg)W&u~%GxdRdSz?bbsqfmy#?bViUTz} z{`RdLHY=lu(mQ5LEjA>N%-8Ug78O6ECO7AsPgic=;c!;kgB`(aZ*ab_wkd(=)0ZQp z9}|l_zBm0A8rtgmQepqXPN%LCd;CxQP;NmaZDb=sq`cQ7fsTo`9^zJr{ZS|*NKbml zAWJs2_XO6Lap~ph0Wv6VG7 zNnB=#j-CBIeYnnYEb^8i%+5g+`weE#?B=&j)fJU>%2+%H zgzK8OydJB@av$MO^2=W-&I6EGi)So#^yT-aH%4SR#BGTxN|Z}8bHmvhh1e*Gq z+B!Sa*%x1o>m^-QmUqB>Q8kpR|Bm3P|3dKoRX^$1f0{w!9<$LA1XtS3?gANwQH+=C z1^=+|A^w;45gOjf^_dZ!h`pYq>RlA#vr)CS}q8ClY5%_=|jfQTMN^ zW&bb=z_5!{`sMVJJ0%@{{tFWL9{}!;@u`adMnPFisXFri*`1##fD|tWQ+K}nKA3-_ zGq_5>s?LyGk)sLxrVjtHFkSosq@=|*zftn<^Zef)0on~@oeVAw3jBkJ|B%lAr=sER zY^jp|HQTtDNCm2mO~uh}`tm(#Z~2_O}LXcV@dyo=Bu4n*5HCMxy;v z5E!RKGx4~NJH+Ur_(H#-eCo81j5hpLjx8B{89=g#;B|8L{dlDZkb7WmaRd~O`GkVv zB5!ppzF%bvE=4R9pD>?*g=eE!d=R#soUHbfCAeBN*EDyTL$j}CT5FSHV^2L(-C()I z9+5Crv_bK<1l-DKG(9LBPL}g6YyG!CoM?DhSde-1wvaA==&eSN>w}r84B`d%qLfd6 zSIHcpzSyYzMwU$({&<#-8IaDPD?$}s)@W*h-u}_4ev+}sWDlFA1v7nh=0LviC&~@Q zG)*x5*6t9ZFfJdYa)R28$E#e!YO5Ef{nC4Mg69-`KUCU*v)gu;=&tVc+;lzH-(p7; zM8HZ6wR#gcMg}Snf{cCh<5q>ymFnYMw!KRUJ_7|YBcV8pkO;UZRR_1`rA>#`8A{!W_n)uS|l^ak7aH|D&Dw2ZVf z#c#tjiPv}3KfpR|GLGniT|1D^R-pkL-LcJ7e>>N+z10WG;wo!UtlyKc z{#=yT??BT~S`TIm;Ip|5pB@gGy;?ex;*lU(P@Sr3XR+84sJ%St>Fu7>Dzr1nP>L6p zP|%1B^L7dX0{kB!mOoIM+*3$ra7&ao`9q`lL?ao6cF!7G-yT>R6n72f?qa z^%OiM^a-5PSh*g(OSrp>*P3Q;t0S<8N31EfQzbnvP7$FNNNq`b$JJ_k&D-JO6{~_# z45UG5Dzt2TK5&`dx9g8x4MAn>1G6q5+|wDo#aU%@djT8HfqfGf77^0Bkv7)Vt=~)n zXniwlbN07h!FGnv8xd%5@RS9eB${LCLK-c$RGBx6?cgw|C7QKy#i7lGg)SYfZ1Emc zEshK0(3UB+v0+uW3oyipQbp!b2K>r%H)W^VyT+D=FBjWGXF*0maBa57_<58TvI-sh z>Al}VSKJW1-^-v3DxyY1xnF#=6TYDB@ZD8u46uVz8omb-2Z8*LX4~Vg==`sPJT^Hd z!JCrCq>97*HSy$fAlbsncJY$=2E+}uu@2sOP;Zsa0+%Heyp6FlTo~gB(oiBLn*x2AjQ~th zUZ*UkOs?f)CAr&Q?wvBo)&U<7Z(ZF#)jkb6;hduiK3YQXz}*%Olzx}V;P3a22cDOp z%AvVAE{$`y9F00nESZx70+KijJnn2=rSW0s_?3q-+R%goHwXoS4wXv%qi5ZTdimA6 zueEZIPLXNC42#N3ncyE*7h#7^muF56`)8VJF*-Y@d(4+k!Uj)B>dhvgeCTQ@eH{vR z!j^uHrE4|$BgEzOK>0U0jYULKXe#^UE6pU;pDagW!&0sPKxB2vfhch3#1qNEBvZ@d z4P;u0sdgCHg_NnXEDe}4dL?YmFY<0thGYmhS}l~9R`?23La=@>ZCZ5kPGj`QY0{HyuDaap~w4am(1Ff zn9Maw&FgC_T=VU$hElTfVoP0YUHJr86@4MDF)> zF#l5vKq*qa*hYB#!Do;C7AL_yRJ$rHyWhV$7Na z+>0T;Zf@Hdo@Y^NZ`$~C{B$@sdK&}lS@u)>cLFU1F>qK6S%DBo7J>n&8C%WXH#{W^ z)lXO$U}3m&fnyuK$E)oqRusDHfm+-JO-FX0T(R^E%Q;^`!Z7Pf+FX{HkHvZ%Z3o18 zgF0WXo&y~V-SImSFL<(T28h>qDtx)=J#N6{xo~KZ$?(AVNp0dt72u8$Dh#PpvWBhR zF2Gf$lhp?(;Kf~^u)aZ{8C(n-QUF`5J@`yiVSer727eNQmr>cabp3Wf;aJr{u-Ta1 z?M46ji$q4W?x^%<0Rm1l#d6|7At{WuSm%|U*e;PdxKsQSg)d5|G-Z$)ezJAC$M`md zir21Tm@T;s^d;_h^PCfvswk(Z5=%t8IrfEBysmxk?kU;kMCgs(PtNa4^h0&PkJjU8 z>#&y`g?dQ5`2ymiissX)t|ZLEv}!GbKlb+iC>4t5Y|t9#%k6PF*(7bz@umiCgCoIB zb#2m@r&eq7`RKGY%NQ9TfSw-7g7}lXn54#ZRdX*H0`8R4^P!@_ue_t9O-oyYGO4!N zaVungo~o^mhTA)TprFlQ*VWfoJl0P8FO@X@Fj%XgzS@WC4H6x0FbLxsfO@^qAjC*tQ?9ut=^(VqYm`_LEsC zkzJ97D`1olk_+%tknloCw54b{dtv&WLX>%rf+dZop43LO@i`Hr^1r~ynnY6>G}5~+ zmBCJCvVbZm(l_CbRk`2Ywb@dnV7OdA7#M_t7zl5$-4X@7#o=&~W{FaplexYrqQs~_ zx|4$Ysw`_3^RAZJt6aa{L2th~$L{`cP5}NhESm8$& znDph#p+$Y4Urf=*k6~tYJ8qHz$&Pq%r@9g4Qx`jN??_09&q^L>B`D64t_iBNhc-ZH zoRsDFh0ygBcm)@4b_2nmwko-$CEe?$Qo!4mOY>^UAXSO4*K z{(DNJO91BGzc3fxH_)R(ryf2FcXyhco;SjdiHdM3fkICwR**XLG~xT9zL2NO5`oAE zkx#%DU2h;7Cqd_j6mJck-|-IRJ$Rv7FsQ9hXz|^$lQnU83qMG**Li@v-}8Q8#Ho~< zFs{2O9+W|kD%lppgim~GX)6gXb3MtPC%(qFnBnkL_Rrd`F0)@yarBg@is71Yn=Y5Z zN7DA*d!VC{zk8LDDHm}whVr;c+Dy!}d&AdLzxiI8AGgkY_LJ3T2B87Un6{vxGX^;9 zPv@#HRQL0^kV>vp0QQwZX4^1?Dgy~S!^<6FHmjf8_cEf45od~GTga5ofC}A3_eHREg-Mh@+5I%TSaml(i`LiTg`j=j_Y-N9Whg_Q` zGz4ClbWuc!_jt0xxsTRASW{k4hY!+fF{Vw(Ch<4)hoKF~<8KT6SY|mO>WJsW(j8ZF z3tczPy$8YtR|xq`Q2InQ)MhwZi|$An+%~4`DA{zA8}DrKMr$;W`)XSbw{T?&M??8O z(vV163alG_&t5y13glw{yq_5MU%mYIL*&XY2hh^V@A3x;sC2mBAu6oeVYrT=?rg0E zys>^FwGA%=VpX20;-DZB(nwUe%3YVf-(psZZ;^m}EKiK69>-Ae?DONgOh^86TR@k; zIu`_~f)P)JVIT`DV^d;kwUJ50QMaO(EWY=tZO|G%akLd6y!|(9(3G zSjfwMe=>9Tbw~1pN}WFh)-CCzBMzI5v{cv!baT_W0(cP^Y_X;|)R3ifxkYh0SIJ=- zdJ2d#Lc154SXT4d&;VxU&O6GH#@O$$8>7=x*5QCP4WpSS$_>4))=?>Sb4V&D*e zhN6AaLl>o>)}e18(SvU`A8r5*kJqSlq*V-)zfd4^*~oaq-f;&bv4omhwszL}nbuy~ zhx_!<3B@Fa&XVrxw+tm#AHW&KvPow7VULUO5xF2H-LL-%92yr4-T;yuawSA^9wZfR zYyVhxCj}jK2X(Rq!0aIp-a|pHHW1Pt4*d(Xk3-HlqEKN)Cn1cek14i}gsK!2l~9{Cok-iZpW(Rqbdd4gNf=735&L z2Lm!4sv}?iZ15oG*$;xFv_4GC;lpY3H;6@U{kPzRI_P&-mGeB`-ZDGXR~EMf9~9E} zU4ygv#JNpoe5_ zIE#PBUhjOiek_x5W8@P#aeYN?MDF8weI!8tcaM1BOJ{)phR;_zT2lik$U`f~1g> zu$d~dT`$9}9!#Zzmie)8KyPum`L_A#(yvrGk@BhQ1CFw_*tkrWB zr}rN>FG2X&YK{YNMJLdFNJm|e9}JC^T~Amv&%JI=-gf-J_rh_0AX-?(Y;^*QDO2VK zI|>2kLG0C(l;UV@UaM_iO>IqE;gd(kboD_2N8#TWwrYl;ZVIBHamj0e*cKP zg<#pEP2W%cr`7UPsMJ@~Mg9!MY4^^Wp`Pj7AS>M;&ggPxnU`e6*c_%$5_YFu9N(v~ zKNAuWa8nHa#2S`GwG6%*R2UMdjn{N$lni44^-pL~cuFIfKWINdJZVnw*FNjmP@WVO z$8)8#NOn0lf6@&Sn2~{hLUh2M_9B_Q%i*Dt^uH{7I>*$D_YxkEDrd(W`45ZPD{ zq-TfUUAl*X*7_qX@4Ns%dvdFdG9si6cTWNh*2{XP`L{>78)U?HdasNv+4qbJPKaU2ey>D| z>0O92Ay4ZC>XS2TT5M|txzA?Vv}P2AwcP)B`Vd+IZ5JCCgQ~M|V!>Ab9@`#T(xW?N z389XUR%J*3L%gQ7!fD#GyJ^ROS)#8%?yQBXuLQ-be{9}pqW!0~i8tD!kJs8R{fjIi{oR*VfR;g5~$@ zh=_<^*Rz$yRyM4)qnucRx;?tq5*i(}U-9nVzd@XDthN*!M}kFdXClF1*VF8r zsEK($ER4Goi30w~3%C@Iuump-z&lA)+2+T z*%BMn8sbnR@G!xlQ#zwUjWtn#)>2d-t*D$T3^6f( zkJO;UB+H&~MYHQid$&(8Nj7QhUD4%od$e>vySX;Ji#rH*Cs)&wdGq+wtLo^P(aZ}W z@xl;~?(U##7em!-FJG%otMLFcwD#cVD_;kS!R}Et+tKFaII(;WGh#D;F%9m@?swY2 z?)o(^Jl@@)%E3D#&mWcVTBUR3U&{KYRL5n&rfJVfDOYB5 zej??QkiBohQLJVzcha)*$~xHF!OB}a3e)$;md~K5KlrTXd763)i}}Uhn~gS4cSfRhwu*!PD4%$75@u-)UQHPi1Q zu{h$$^};EgzN9Bj4AGI|fx|>)icx!-&~~((-C7?=XC=B4cq z)l_wR*E*ZMPsnQ1S%Vnsvk z=md-6OoX+tTxr`sL>aX z`M11fg%fK4lclJk`xK#u74!qAQub!-Q0ab7PFC@0BR}-%@^GXRfB$-iKKkEV-k(~8 z;0c-%O8<01T3$d2&Vpv7c5u1;$F}(AZ@9mPQ+G77@HGU2P*x%GwzB*E_L~26l$#uq zre^_qfF1mQboD=915zKC1$}Q*2PBi`{%s2W+ny?qH{Pfs_YUb_wf!$|;Qku-K|82A zS6_wt|7-;MS0kWwQat~C>)&2h6Z3{Ig_3Z{^>-Qn`&3Xw02)DwbbbO`i0T^Wj)iKV&Q@qPqty1CfbaMk(nnzr))vG6d+}+*X-3jjQ+HbG@o->}co}Kjr&KQReeCm5z)hxZL zW);*k%F93|Nn}`_V2 zc+(=Yv%6IVUms4wCPHKh7Ja`Y>5?-B|LIhPzPE8bT2A7@I5^Z?BSg_u5Mrp&a`w=q zr^iw-P_dG;rj>{Nb&>y@ssUhnzsMhizY9xfeOyx<;T?)!Id!qmvtakMc8&2IANgN0 z9L&{D43I&5JPWUTbN@oWkE76wVXUJz)Qkl^2nOa^g@c3eUaD$r=Y3+5lAN}Ir4fJH zLoFo_HcR{R0-sS%Joj#?hCh#JwV)xTou_lI_v9vn`&Xqp z_LRN{LMM9DofmQ$j20RF;El=q)9nzFMExyv8)=ug*uRGz5*f~cC;xC3vwk{izwdQ( zG>uT8GrdY>&UpKavv6cr#1gFD#c`(Yrs?Ya|FlrHSO`yh4vbGFhg|RCRk4C2iD@gS zzN+n(=4laCIjDP^mLl0Ni`4VdPd zo~?H%>)|vzwqIOWuCcU`?_X4jI-a$EJ%guLO3=ny_PZ)HA@QASg_;u|BUi+GTZQnNxXnXKeXJ?kX~CL%I4q3#oKEQAWxOd%C08d7;dJe zk9U3B-J_`RiEK|xHrI`7>89a79$va%dxh|@_u$Kbf_01}=52P}$gpb`(nI)z+)LL4 zOU-ewd-qd4NNE13J(9zeDfzPbPgMDs*bOd{+a!q<%&DVSrXLr9H$R0%IZM~cSi@w2 z1$u6gtB4%-_ow$C+e35qHUw<9_mH}X$FKf)yZ908ntt7Rxh~eLp%>Pwgs|on7}rkI zU=?%~OTt+WGd4-?eMG~f|*0*HO*}*s$L4Rnq{?9J07pQ`tCgf1byX< z-4j+S@?Q6cgUx~rUy)?rtHbH93{}ooz*4{eW>`NLD)7K9EfiK?Mm~7Gj^A@Pag+F7 zzE$vYk__>#Qnam%URN|5T=i{*585^ee6ZOeR`NLq?IA9&q7wZ1wj{G}J zpojCZH;CT%#&#Oq32t5E1?cO8yOW!r3oN0g|NOy!WRv2*B@S4vkwChfUqNn~av@-1 z?mz2ijO==V3)c769qT~l7lTbV-6MU0#wKQg16Y@||4R%0XT0xU!SXI1UoN<*GrmDD ze0L-m1wT1?o`Qp?K8xCSC8G=$Wxuv$MDOyop(hAgzirPr@%>Xz8;ZPurHq_hco(W4 zLhq;C)OxFL>gvP&e_EoSDH?d6nz)+M!DyW+A{|ywMf{u%O=@`feBY$Leywi&YFT%i z86{{{v$T92SY!Ps*89i?7HFc5+e(<<&fiVE?H{(cJ?~-d5DoLkrT35?oxb{1dH>q|8W2Q z^U)+B*zVv6COiI*WBK0<4*|0*1-_;nKlaW4B&YsTlYV=D*&W=Nny~*miNs&V4H~!_ z@=p`|wKcY2upS!wHOTX)eg0<>j=wCZh~Ms7e^6ro`6!DU+G$KlI=Hk)1#g3NWlW;M z7E+new_^F82ypy|Vc~eedKa-pdl(`6kIFtv$PE3UwT-Lh?(|fSGi5>Mk87WVg!Z^U zU4YbD8c!M2OFKOYs^tDxYA}J1;eAeD^}qgr7X!S>^fgqDKWh2END3zbriMYSM#6vJ z&HuZ;Z)Sg;bqzuH-k<-W;v%|8_-}{(5f{wc{!;+W zfBQjJ`d^$kZUdJp`p0tv(;S){%;-#7bpOf}wXA03g0`P^l<~G-&F0j_+=6~N=0+)#r(t#E2j=E78V_Z z$gpqL8Oqhz|8g4wionz_b2Ym4XhYLSlPFWu25HV&oOCA&+oHngFeHxI^d!z4mV!|C z{^d$$IU;~>6aGDkpM1>{9aLhGISsiaA_#R#0nJZc)&e|^!Yt*lDG^B$ubV6o9wR>COTd`mZ~d; zM?ND~y$@beQdJFvJfUCtHm~qMx9uNZaU^+GWT>L~;XEZpCYQL9p|EUb`OuT+{b?|Z z=JOqg=G7+zu*Z-CMM*0yFW+?5yyUpAXIY~vnIf0uq^#*^ucRa_EbIV4r`!r>!bSa{ zdhE1LMjR!R176xkK4>j^2P|TpE!xGf z8u2sAc{E@|#N6>s;cGv^{<_b~7+ODEgcjDX`#qJo#PgK~+kr?T?Ru-F2G`88=4E3R z()Q54ASPuq001B(BLgN0l|tHLiLYQA={r^jJ>KUOcgG6Pts*mh-&gqn`6=$&*4DHz zw7S7Dqr5+>0wNh90>dj8R;wvSIZB%21}%D)HMP)yUa_?1+T6xKd{i{FXw=N_s{T)R zr?1_Pih4dveZ=uC#ntFW({);78EY;2?uWYr#NIarb0z7>!3rgH8gzLS6mx2yv6Wq0 zbRON^Q#q}dD-C-#S68p9fyDftVo9U8;N%=nf4IQuP3X4k$*QW>*Pudbk+cw>`bpKw zKkHq;d7N*DgQ~~+N}toBq2^NY@IE8-_4WUnHlG>yej1XTv%q>6&6EC~JIUK|;O>;M z?cr*ii1+&XdV71D`I<5)ZKZTB1emQ(nVnF@%zQAYsjC~o%~^+EM?-6I6L49xH%iP6 z$d$?KM|F1Ebn@i8Uw`gY*Z2140mt7O-z%|hh^R^alew}S;czc8Em*ewRBV|Hn6f3d zy`7K>7!eb1$^$m-7EkYvEI#*tsb8K8Y%BX|1Zk`ElS|ml#EWWd|YMx$6Bn#f@u5sj^W0 zw_Eju;^N0^TYOg2G|94RwUvnc5YY3rXd@5WE*%3+|7T}QJ-P|;e^TT7J0b-L)?z~l zE4kB2QSe(V1Z8TU=lh(w2ytCQh~0_KfcUmd@9cQ^n+x&7C1RJXBxo4~AUCjfO(^>M z#(1x_&1$f&%4k*}+V=F|?HI;QpNTp<9b2>IQ#o#txh*)GotG^LT@p+B4SFr@ z#Z*+~v0itH`fj==qwvvj!ILOk2>^#Qyi*45?5tFj6y; zLm_7yS#C_|Xz8dKXuE&lh1ilU?sp}1RX%r%Z%*6!HI80gv4pD*u(J2-OW;O?TmzWH z_wX^6K3MlL%9eZxUOP9%!0Bz`N`)x4hMWo-4y*Q94FFWPF+7&KA}GOZK-M-yG&*t zynl`gCh>X51Q9Yj>`YkB+eJ8m2>SXu(y-EniVz`0 zwqB$7qHN{}b-(w(Ib9(PErH6t@z`yjgt?l1h%Y#XAj*B(i2CHN&52AB4oZ!;;FD=4g<}cTcA|qMECAF>UU%6pr5Td-BcX~!gM|)?T>W&^hO;Y>E z>ajk1ut8)BI3G~&%X4njs<3#RtAz*5f;^pq^>=K+JeRhmfAI7)rq+E+|qo5X7|E45UkU$FpCz^GZOwA@E- zDQhmw%952xQ7Rywt}v5v04OObSsC~KB=vv3Jq~`$cv!A;G>cdRuzW)Y$bIdxMaLy&iqhAw=sGhi%7@Zs z=@hA~7PHjJ$P3V9+c-L2?h7_+_I_}O0-zfsc|97+NMRH`%o3z<4$ZXxZTA+6AtJ9G zgK5T|h-tfj19zL9BWIe}zi_25t7__?Vwi|{vGRCy_J(43-k$~9WES>1 zZ#qFU=&~pI&G6sm*meF8Ahbu*T!PbgGjq`D)Irp__(K zpx1m7_VV&>cBX#2Wua6z?17GO^3Ct{>G2zY3-lzPDz-O8E;%l6Eob5vh=84Tby7oS zb~v3kth<>welmT#HB#PLyRbFgyYqh2HMy1SpMS*O=JkN~K3=Y8K0Q5w zd-y@YPmUq>9V`amiUVt{V~#%srj};HP-kHpgeVuG$>47f+b=pV==m=(q1nY<%8$+x z;^3(3X@#guw?>EKa%B57}-8VMdVE*br2lB=5edl zg3vY(r=A%CfRWMOSlfKTH~9zzM|*$}4(SE=H1w$XBxmhNcJrN!dp3_r1^|Im)df-l6yquD6S(*dAqAHAYh79n=t zfkCQ}hL7a7JGU@0@_F)8srk-KQe^dG&;7=BOHM6EfD6Fxsnl}6udgr6=>BYJuE5rp z`HnAO*$wWWZ0#2WU8`jcaA3Iuyvau@+Dd(R?1V(y+l9taBkN`ZL||gKd|UYxT`dIH zJ=~L=FZBH{cOFjFml+XpAoAKwu7`F%JAjbSX42BqA`RxzT~$@}L+E8*UY=VS+wt6B ztvYXn2Y+@VZ4@spi%iM9fi!QgP+0b979xb^>7L*NifUq zBZXQC#WH5zw8#EdT)M zrHBnPU!mLL3-Zy_`1Evl%xSaQXxI~+v$Njjx$t&1l9K83u0oNyDs+ifG768?r#qm_ z9~K7($9BE;L*VN%X5i&pfXS+46fwWkgB{)L&2dG?+slk10jG`CK^uMHaQs*p5Qu## zKl?I=lX<#Q^E~cJ`~@411F7F;%~MTH&A=^i<_*$o}Go zM9K5zWqrY5kX`_Q+`@MgJX0uKZxtGvM1 zxY^o=0I?ToKU>W*U+JCSP=Rr?vyBe{#l!G&asIb;V)+Uc*Nyxf+I1i$NWD6c-{{|+ zdm%}jPT=SR0WnIdj(*{g_6IW7gzgaFJFSmBbLK0biWL0}0=<#h1Li@cO#f(df$Z>OGLHrOv_d^Ss%}rlsAe5R6X4sUN`u@ zY>Oo?&u+ZExklGGKHnYgXA0gw9mm5kF*aUwKZ7n{mG)vOWQo0gi=8mm z$R@%d;JBQx>&}0_*gfHPtbE-20R!^bK}%*tU(oe^^+(~)Jt5-u?ngY~ar@m_T2fwo zs^z&AGBd%o-Grluih&%m`T>J#-R1f8+oG=P>gDOxE){S-|3~razDAYi*RL;^&*x-2 zy65W)u(GnU0$MM~*iBbOkdOmI`w9eHZiVR3mtVw4JKg|AEKIj|DJ9IliF!#r(k)qEcXmkakp(`PE)<737|J^Q(n zfZk8W0?#`g@o3YX6;g-4YOOioK}LeBJ?eN=E&WeXJ@CHfxiLd0AN>EkSRA zw(W=4pRh#gP9IT)NP9ojR!>j&w;-kG(t9A^9;_3sS*n$5RNXGu7FXOv9Fh_E(J2Wrnd;xK{G75%EY1Bv*%_G&Wf;eO&p7xz zR*NVlYVzqUdB1$(-hu-XSiK%D`bc~V5hrMlg?DOQ&(}G}Q>j=p-OrlLX9`B-O|m_s zh&L*<*iTm-!GGccBFU~Bj#1U&a@%`v`+14P&-Wc0Zm-VCcq+SB)X9}<+6!;3Py3l_ zLur%fhj_aE;i(}TsP0_TA3lWE?2qd|^p9kF=BzqzQm}g79no`&zsq=qMHH#{YC^57 z`AgB=Y70lh_z6e!`x~%iFGL{Y4fbh2>vEei?JN`QM)8`RMUb?C&Z=^P<2}uE?4&b& zUgNo?wzKziT*>!*FNSbZ{q&vNg8zv)Aku>H)yjFrWyLwcOw+);ucFG7lao`?d*hC! z+He}7$31iDS#26y%#&~jawtN<>r62x8L`$c@^0(+>yxek@i%<-({qr(ScrTz$#P2anWl%g%NMZ#vTY<2!xFqvKXmC?@`@w|8^+rIFuf9;7 z7)Tt+)ioGR{-Q`OB8;3$&&-~uoyZW6wX49pH}3?<%UbS+v-HT$&bfUrsv^fWk6Eo% zLLP1!p;jPqqnsoD!V2GG&)PznmrJG-7@3S;x16hGlc)!iN#zHcM?;4drQU{Q!y8(b@{tRdEzwzs1uY(gysZI{_JQSe_j zIM*NC$MBiM@gE;LPX)w5Us@GMx*OSQF=X35S8Ubup8bURQKmyojd4)!c?H%O^KFuf zy?8Zu=g)g1Cb9xvwlhJ_*<%M{?(;iES58uC{O-jew%HKP{0yKY$D7sB@ntF=Tfo=T z>wNtzIub4XDt9n$$-4I>`*X+h-oSZBPbmVDYG6iz(SRbR=alZvGuFt4@4dB7NYWy~ zdAo9fd&}xDBWA*-d>qKIuVF+$`-e>~y8@MfNuMuub*^0Pxa!CZ^WR|_es`3pU?-gt zrrj;_n_y6BTf2duqL;EBzDMRurH6A=2EU0y5(RW(mgUa0NDUU2h+;2iRj3&WUBk*? z=)0xBhrOB!!Kiby3~!E~SJv8;LYwv0pC;DrVZd4R8_!^cNG`X7pIy%BD?Z9t`OD#K zsgo3rCkHckHXGRvO{fbhE$qY*%YZV8UL>O5NbeP`bkbIGrgLb^#`UawKBc)OJI*&+ z6w@)NM{sf+)rw0@b&? zBB(i{oavpyt$rO_&=0f7a66(wq{TU;QO<9@-Ai?McQ>2&v8#1IR^wLD+z9~$qmbxb zT@JvBy;b|P4GOEMXbKrWfyAtnyp(sKtcRD(wsim)ugo(uGvZI#VT}DD&bf@K+{$;% zFFw1&srwT+FieB5CA%Zyg-+ASX2Us5dV0BN-2Aq~m}n282ClF9^4UyaS@7W-JrG8< zsjz<6r(E;4r@78j>@^sfcyNT5=k+D5Dmi15DD-1{v(qWZ38pQMkr(~*Moj7JK+aH$ zi;d*Zo0yRbk+<){qIW0j@v*18*XF0f!Y`e;*W$Kqn=^j3>)XMIyyB}lP~4iCJ}-XM z{x+$eF6XU>^(|-+5fNdq?Tt7OCd9mNZoU)F9i^HzPq0cppmqMFIj8a4>sP^_R%0dQ z_wSPbjwJ*mwK@@>A4HcA?S7-NTqGb8a)Db8zbUF$Li)6RyEK9Qi`GN~;-0iL!qP7Rd7;zFvFNceqs*6kNzil> zY%Zg?=Wd(J2gQ8bm)9ODuTM9^rjCJJW@)Y&Nk?e*pV{8ChgA%ac&h|)J>TCG3FxR7 zyTA2~#>7$*pI-)}T@DLhBD_6s2)-REZm|_8rhF1f1ILhmQmK{O1i(=SL4?>P9bAL} zG8wgl*u%u!m&|(0i}us+*IUlXh*WmB7O|hqt2B(gl+ys`XS&My z3Ijj*aMef^X}42X8eYNw0q0#%+^HPp1l$&E9Klhz?pLJaiUL}MQeGGZD~&$%?Iz?V z@Aw@ZQHVOxuOD(~>G`)0qI(ttX?Vr`e*Eyl+rZ>DG06*A(Q`VK)AX0B-BW!|OG*8E zy!IQ)JIYwRv5U<7j?4PChvCoF9fPM0tJQ!$cqO0fy)j?)B0cxhI@Spu1nwaknxvEC zrGiWed|eFi`x1sOgNcfISEM5ym7pp&=xY~F%?{#MsxR&9jELwY98T03(Nzg2XSyw3 z;OYu5g@{l_SVY|KJn=^G$7Pzv@95_ZAPhuF$0x0J@g|a4U=EkReMe9{YxB76#(LDR zXarJLAoqza5YC1YOie0noh*i-{lvn;O69PLJ1ydz^6i9hLKn#-<;MT2IlABfi)yCv za{GR>qzE!4JBBhaejlDG!iE`;`DD;xX=?JkI~f`t?=I0>7`>T}LAOm*Ol4Iv3W)?ND9Dr-6;F$M4wx8K z@+h3}r*m~QFt5A){DzB8^_YifnN2H(SQW>;E*sZ_?F6KlRlIUSB4TK<2EIE`rb+QD zs@Ns{h-L1?9)FAPZXr(+%Q(WM#AX z;X(up`b34lpB^sPSxQI*QNJvIt{8mC=X;q?wbi@qK>>VR!&28F6-mQ=rKIFc^_tgo z06Sj9UKc?Gw!MCy_a{wRE^F#aL;3o?SUCp@cs!Vj?P2SlwmXGNi?@k_AiOmhRLWRI zXzrz@>%H;5otUc=so&Cen=7{W%1+f?P;0!l9c4N`*d~=3(C~?g@%(oOIY~EiX_v2k zVfNT2)<}7N*d@T&3G%l-k;?e^a3W5Ha1TDG1JtdWMhm`?(M&{oevOa~_2 z6|<29KLtJ>(z8~>o*?cT(;*}AccgoQpbgON$sEFNw7(?198bebs_oldVh6RX&1$u{ z4h)Yty;dt10|T<>RMEkz1qXvD9+%|23!!q&55myL$8Sc{-^Sl6w!En%47WX0WPWdhxP zi(H@;2({}V?w7ZmC(I}VuR^N58;yqon(dtjdr2N;J08erXr$FbpfkuPyI>|<73Tus z>YTTU#-gJ^=h2cPZfw}!BKXJx4L+}Ujg&P2Zwh1+O7+_CNfoU091imYNEMc>G9^FB zuN4bte_xHe4GRc}f1Kb4wSL7721g^FPQ}CasQ2XHRS@><5O>4cC6L`S59)ZpCK7IozNSg+Nf1&St(al zB=DjZ_K5-`L04c1-+txFq$4i}<@;1OT>-C$!AK(Bn(FGXFj>@jF{k$xgG)=?3c)ii zY0WaaN=l)eD465C2@UQud(Ox6`^NiOjGO{eUC)E%x-A!mK$?DD=i2*Ps;$%mHekQo z0Qqd0_>O$WC=O3mg|dyt9PyO(8C9elyF<%QR3qil)2SjjRneD&ImD6sGEb@Ac z;x<_^N-(#BrXA{DLPYD-CK07#{jQ8&d{P&VRE?oxGI8>0t6!u;Oecr)0=jtnx!o8#sOJug*C- z6OJO9<|3)8nkP{PWJ}#vj$yXJ&&gF*jv*%>b03JjJ(_B3&4tk2x!6swBIB4pt3oE` z7~OU%Mq2)of;Gy_*meax$cps8pbfA8C24`TPBA=O-gee(U;*DoXWH7nUEZ>D3HN4d zW|pHam=Yb6!c%3FqM!-!q1D)k4O%a!3il}>6k{q!`B54(yEF6U+_zv3Ii&Hv{rQU! zahUr4T8k^r&VFKiynF_Wc>C(eJ7LvwzT&cJIBNhUq>ex{lu?sors?m*FQcr#1$)92 zrK>`H5^nckQ{Bg#X5J$c(?*KiPrtmh0v*m_o95I;lI$^*zbeY1eP_`SAsT5Xk6y~t zKKteWwhsgX?}n__OYVx&{%K%=-aROjMD)%m|CWy@`o#Rb`B%=QRV8l+hj4(t1mgnn!`K)aqs3DMIadII!( z-$cb&$57{QC%lc`0WLGSq>qB9!k$|6z3%Y-eBNCYRClr>4VLxLk)!(Pd+duFJw@ zO_i@R)5!b8SLUJ)GR1>k*?wex`XbSt6@`k1R{iti5x+A@tQ0ENz57Tvyqc``Bdv#f zf)NRRt%~6zphgh$5{LRgy?;XC6w3Ey95<*~-Va~>JBVF~3X>@m&5ssqughxZ3hf1* zbUa{LdivsL$mFLdQZVS{H#b@|FZ7iiSBBnYXCUn6rL$!P3LzWZquW;JYNWue(I)h+ zmXL;waCk~$31gb>{qK5*K6tbZOm+j(Rd>$S?@2i!4Noebo@<46nJ@Lrtu|*m_D71x zKUzabfv8j-i?!cMn2f;kcuPz}M_nv!YCtW3OR?-!52(w?2Wkzm1>UVX-mmQ|qyq=( zM6yG)29v%oKF`J~z9-nggylF_yiC*JL@@IoK>{1)du`D3^E!XIe+;1-1OgefbhM%2 zVuCCI1meADSY(^_izjILa9Cs0BL&fAw@el;$Ipi+1w(ExRuVX-gqBRR`V_79U?kp4kgkhth)BwK_WFK&F7Qm4zi)TUJ`o3_Z% zNIBWwEfN4*kN%-@nE;uKrL2coxE>6zt<=Spy5mra+{(}jBgv=`F%gk1ZsqZ3n@4p3 zh9FvYI>$Cy6Aea}ULD`h4}Z6Z0)injQZK&vGwwpEY$paWa2@RXv5;XeeKCBLiqCZQ zY6h`e&KtNx#Yxg3igs67piYAmm}|`@2pNPktSlD>VX$UZ)JWJ;7bK#T&F;gj0CV{0 z1Psf_veY=o;imm;*lfB`=yEi{OXG;A_$uyj$N~TQYUA(bN`~Y%q>Ed#ZgAZ!yHdaX z5TN?Sje0el#ZWE-sr17ikSn9RutkH_c1aJa$vMO)o;=R-PP0t*Y$BY z6vG)J4@@pxwHu{SF! z67PD-7f@HT#MNZYxPZ0~UC>Yvb57psZtR!#u$S9&UlIYY#&7l1l>4e(lvgC4FZPI3 z>ev@WNU69946NsGYv)X(B&lxxURy&{eMg=S6;cNE=HZG1oTe9E*QX7;dWhCSBpOYj znpM$i40utSSO7klCpVwlF-|f>s*x}-J3SMwP^M~g*kbOVF8Kb=B3*BC*iqkjgL;ob z#K6&DrNwxSwkwA3OLlWICuvH?445@f(hyF@(870=4eKyx;;f�l&wUl%Y#BxV4^l1?9mIJHJH=Q+-w9 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 V? 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 O{uJd@WnnT8pZyQ38iSz# literal 0 HcmV?d00001 diff --git a/images/pr-sast.png b/images/pr-sast.png new file mode 100644 index 0000000000000000000000000000000000000000..34d15c23a35eda56f1801e65aff4c09adfb0ef8f GIT binary patch literal 72235 zcmZsC1yo$g(lGAs&H%v)?(PKl;1(Q$+W^5eKyY_=clQK$cXxM(pMAUg-fq5s&bep$ zc6UivS65ec*Zr;_CxHlu2L}QIf++b(R0#wGTo42V3=;qyR8uK_iE1|Kag*LGS+Mdl%O=_{@Wg z^aaOKueX%u^1+4)J&$SO*obhL@&^cP!-hE)s{~z0vzI+mLw%`*1FebUTM(V|U0;d->4NqjqR(LF7MTMnVz| zb>m&`2|}5Ba+{(>(}%fCLU*r1rbzQ{F^Ht`1O&)Q-NGI26}uc#!pA|6`#C+kd&UX0tm#XDL%OZjIwo*X~CH|>5KF2ymo(oRpfYn9KP)=NAg86lTJ zj(fbC^vJs{O|?B({<vh&wnti9nOlK(UZ9iD;I zo`{#P{cue&zyrA~2dV9|@6ArtSh{us!`aRdL{jjf8HZ@@gh?d1SpYX(4_7%x78ZmE zh8zNc&hPH{GXm zL~TZL5<$)+F+*?z_Xt#Egw5~9s|5WD%A!v}03y*Ty!wWQPrpiGSuki3-9_5vn7!v z$$t=wh8>8(kVlKDkFtM=cOR_TnHy9a$cQ_O$xz6oQm6K(GNSsb z%2{lyvynt9Hz7Eo6;-012~@a<-eiOno5%wyamLEVip0{!qSC}$d@@#4F8VpWHBEom z7@ZwmrWC7`t`s-PMGlK7#*$fOc2JA9D5=SCQd1qstejNPD%K?QP<{y=2T5~E!y88$ zCmu%>H&*PZYBR$+Ls&dg95Fp^L17U(V?T3Sq@(EGHzb4 z=-ST8$x6Vg>K62b{zQ^cB<)k$5AGk_5su%R5mr8|Fs~r3*ztXA1GLS!-MAs&z&;|p zV7#n6raclPARuNVvg5Pj^RlQg8R72Y&*CHDMg3R~`;0S#v%>KUk0op>><({@$w&5B zMoFev#yX`t|2F^IR9pTEJQF-2HXPP0-7yPU64QwN@Zm_{u=%dfF8)Z$h@Qs2Mz6+k z<$mqGiMeT#wQIk9r_{vYnnjLk$qc?Fx@EXi+>Hl*^^b@V?i8$)x%&Ki-X)Lv7iWwX zK+A|Tp|joz;j!2);;kW)8xkzi43Y-|4OwheoZSfO*8WE0Xw}F?OiY_{{gh;ZK-x&^ zRB8mbfR<5XaKrw1wgEOFcKr}2_IKJ9wyqlqweKnQ_)BHKPQJI4^US?eK2c32CJplb z`nF?mKyt~sb!WFBF{=iL=|X zrE|!cu$U~rSpO>id1S4~7A>u0K3QXwu$?ww zNNr8ML(TAz{w(!+q|!0{Qbar{JZUkNKbbRy&vK3ni)#uQ;>+5#BQrAGI&7U)RH;Cv zu~GYFF2qjJd*2o-wvM%gJSBuxqM=uO^Q>2dtDH-fi`XH@UVevq8}`z=j8&t_c*m?= z{#CwYyo9ra`?F=mYNeYQqQi(!-S}c}9pRDV9A+uL##zg2Kh$PmEn(%So#M)KI+2WTP_>{E(t!?AVR!_4U%i_Wc%Yy+Wn!?IoL z)M8uV)3Z)P3-+1oN{d^D)0>IBt-Onkk&Tz$w~XA3rMF|DN545_2O>G7QsQ0&EWT(j zl~?r_yAhjT9c)s^dwf!2JmUd)WcxSkj8vuAqZaOu$*@evk3X8CG7XW4gIocA80 z_sAIh-`T}_%{rI3q0Lb%cyoNangtHu_ghXJ6>(^-6}Ojpm_C&ok~(f)JcZrG5Qp#= zd-7g>zbLwLxZax>SY~Ksz|{NEQSS+V&(0ag#71ruI?qxD0;kAH4eQNO2NG!rnz;<> z-Dp%_kdA70%cCFI>9x7g?k;`|TId7~fa|Kf0a1~^0|XC})GLURErWhFB%5h^b;(!D zzye;=UM@~A~dQ-X+kYFU7!FqOh#s+pluq$bfo4h-*pN-WeO=M+3 zXx_^(AfQ3!AQ0~*(Dw)L{dxCyqXR*p-~Z9xAJI&(zgxitGr|8ZgJJ&BQAk-tQu6&@ z+0fqD*xJF&#<4l$&F&r5thtK1qq?jNx1o&{y@8R<7h`&$mF*uOAiO~C_o9`tqX7VD z_0`&e8^}lcpB~)r(ENXttR4Ou*82b%{%B!fqGx3I zFYb3x-al%&70iLgUo}L{t=`4+PJ^F~g@yM&{r^wP|0wlImg@PDJ zQ&Uq+N((d>=jVm5$Kd{vZEY;?3S8o5oR_B(nIQoQ`S6Ron)ElO-X%~95j*Kq&^I-t z1)I|Bh#@>MwG^biyiCPGspT4YSluy=3HCchZ5gmz`f}^-Jz{m!3&TZ8p#M13A{zSt z>BssR>~@vE{brV@x$Hc^((PCNf zbzCI%mhondQiUPz@D{uwqB45riAyT?hhIa%b`Jd3A@r%qo)i&?Viz`5z$^x%gQL2j z^ksp$>tD+WAKVnYRk)A3?jNC+JD?K&uTT$I7=a#O{p zs2|wHgF{MVOijykV1B-;gICwn7&N74E&^5F-SEy17X}79gG9aFnI_wtn^H-*flp`l zdz3HO|D1!yYY2jFt$L5yTKuxbTGh=007Jy>$)XVD<`<3q+!A^FZpp#HVZfU=AjE7! z>csihG5+9Gb(WT9@JJOz$Lp$$)oGD#vEDVO>que8ERdl`;z!=AU(n?DExT{WU*Op+ zR#}f8Qwn8Oc(}hY=I;(-XNdzv9o)8U1NXQ)!Wwy#=Zvkh+L1)w4uk%}%kFVMz%IeA*g05^Daot@v z%+deWt?^ixd9Ici%Z#PM=dWO@7<=rC$_@woLB|BCg}jtIo3|6A>8U(2`61C@#Z-gk zH&tn*5|L>&(5l-SF22*vRnqEJA<$GGczrd+>+@JNG-|!>kZ5RWOJ>=IN9OCC(49_K zLjmz{Kz+CfZ}O6}ueOBT&L(5t_>i_h6{Rm=h(zqsKh;4#KE0^je!?iE7kq|*fSOFk z9GZ`bG%V6$vp!{%-Bd$Ae;(DbzpUsyi+e~mr^YXS8I?P$u z+Ao~lc=Y2fiOl2cI;X^<$j1w>BnSA@MA={VR^crbD?{GG<>h}+1YX7a^J|B>3Z*sQ zWL{R=hw#`J%ITDy4W6gh8#2%l@vApSYx(1Hu3g$^J6`8HwZ7*B%#%1u!{S0DwogbK| z)}o~o)@~looZQw~-b<^un03b$#fJDYQO=O0DqObYa^i&@mv@@;Tnk>eTEO&~6%HV8 zV`I@L-@!CydRBg-qNrQ`h(GM$ty%XYyLytDo5($J@0$^o0mPZY9sdhev$CnDR9a8Q z;o+hWAJ&aIgTNC8JgEF&A;JJYmoqPNSeyA)Gn+W5N=9D`hLu>YnWTt#Shk^r;SVq~ z^bEb{3&Ys-csJ_i+}$mzC`;pX`6oG@fdsLG2bj#tU@VN;R!FP0+SSXZ3nmgUKs9|J z$m2=h8Qon@l$975+=npr4hz?~^c|_oU>e@-&_4||t1K8f6`KedZ+#<%}e^ zSh&j2CYf{*-3wsn8(%1m6g)lyNOp-2G1Oh&ZBACyP_`p*@m zwm(pkD?L|n9<38v+922BnP)H#xdOX0Gk3@vm}P?0Eix z*pzsU54SDzEt9FoCxnS3=8q#o%FG{tXR0*7?L!d$Htswq@QV8KTQ?Wm9X z1MsY0mOs#JC`f!*=_Fu-DFU`*uMd0=vydO9rsK~ zpL5#wG(jBdnavL#M0K_nsOnWrB&>h8;SO$KM^2s>+o?+r6eJ`}GaC$BsI^=&!K4To zL@!Slay@p^ZuwHQ*Z?0?S!cEq==pS@W%5=2B`6HQs{m-1035QHX>?h|7dF582u-_p z>N|zQyoD~*XjwJf_KmEhU0&KBVzkeeyaC#=HPLtXjPncZIf`HTyRxLm__upET#Qqr z&h|I_2GPHTFK`SGpX)=UZ>D=dk5B%DUoiYE?k65jq9-6QvqJaU=97{4;MI@EX**9v zUX1Ja9%$+{4c~)6ULjA&f9M7YdU?*wv#e;ZwY!0nGPD68teRe9&S4?zAssIa%SCqP>!aITa9rhFLoerEr9B!PE=cbb zy(ojcsgRxqb2h;Rs`j>^?Jal$mmgPzxCB~ua5X8PZa(#29o`jfZ;R6`KZ1tzTb=i8Pupi|GDt4VL0al=@Q0T> z5tG1;JSiyJYS!&dUNLMhdol+tb1B&kGgze530RA~Mi4wKD>NLd5bV4?AOxZ9mK-{l z^KWy#kX5@NXJ0O>3~F6^5r`-Btbq?$O|xvTFGZ6D4knI$rqO?;qwBYv#a0>ACF?UG z>>r&`b8Um0Z5y<@#DI2}uqS?@6a}n|C;zoJxgph#B4?2)KyS}4a=@O zwgd=b46^}`0GI9RvR1HYyXV8aIGuD-Ie|~2+d7g49k;mNmdvgz(FPX&Nz4e?$Z$UgJlh(~3zx_uP4FiH%7$0xY=ddGdg%_bT zo_lT0S_@g~fdR+Zp0?-bmxFR>qM}=4_KyID^0>eOzgq#>7Jh&3Ied#3h@d90gw;; zw;-mb8Ckc_C?p@~d|7K4v4$2|S*H7(`p(SfW=EtNg@$i%Sw+>#s{QYU9-{o79vlRj z@CWyhdbBG@a()#(-2wE5dhgMXjZfu~p55m*YWLCk6Ww7pz>he9oEg%=nhF0{*JE<| zAZ<+(eOV~as@h< zq&hf8!?}3MA@QTqIlc~n-^#F!L4ms^rsagZOz@LIf^#%F84hNmcR&CsWpEbg|%{DZz@S*T4=!|(u8_)s~jQ zb1;8jWVs4j$9JjC&xPY++UQ?KQOb!7)78KVZ2KssWQ6E^lG^m7kw{XD!c{x7-|bff zVA;Yjym_)}UgYq*brAiE*;u%hIK%kGJlUZ+EtEUu0(>^2d@Yajk(~3bv*Yon8GMmB z>I#IMsWq#Q8!z5v>s<6+bgu!>BIVc9@D+tV9eFRSt}m)?yFb0CNiHs0-gaaR4pfWF zbn1Mu-mduq0)uLT_RYJOlbaVe0|dqwA6$93B>})5CvoDB81#didKlY*0y8qSC1W3=^2_0MyU34eh~_Dr+f!x zUT?~Eb}xF?8(e~v`zsuJ%0V!Dj7-WR+0ZzHQ5c{^=}&KGc32uYu?;eF0e1&Yltik! zP}jt(nWud2B_Gg|`zX)aWx43+xvx^uV*PlStIT`Q-E*7E2hL9^^*TVf(P}dId?yBD zd>s#fAp&7Pp-+hsT2rpR<)^frhG&w-5k4yx0Tlu`K&DIzc z32TZ9Sus2);K{}eQc*uasG=k7wH_C64{rE@rt1P4fl%lOc$#t>n|L}$(cE_FZE=RN z`y!LXwWOZcSeVFO`l_7Q)OUuJTAuEa)6Cz}aP?M7lO&Y7(SVHVa9v3v8H^2Y=RZoc zg`%NuKPmaMYrb&+P87a8Zx>cq6J=}FdtT%AiPVtm)BuLa>V(^QgDa#UOt*esgo!l{ z(&cGX$LwWLMMpONuWcC;g^H^xK9xte45}SRkgOZ5yKDKFKqqc4|AR9we7w`)mg@-g z_OwatWu;0iR+aaG+@i8?C079!c&z$HmsnmQvrSx~*%*gPt&0zhE&iig9o_sn1@a_q zVIm|(E7SRPEWw`VWiy)QM}$>EVB9d`3-y?+seBZP@BmXQ2Ui`QOhC$8UwTyX(?0t> zYKe!f1z*^cs<>+hf94{Mtbph#+30t?srL0m7+N~@JDa*Dx~t&J!UOJNguQ{?eur{` zXRQ(^V5`0}frgQbJ-REiNKmF3xkY7Lm>BUW;j^zOSY4eUkwVvOnPyRZ0Pi`M zqrQOC(So!`#Zkrz-KIXZq$EMPS~=AF4U*xDg@_*G87zrw|F2nQW+gUvPslKfg*A-hp44NSn}sJ6p)BB`HOAur|o8Qs*)U zVYaYz@sSW<;9v9vybSSSdEf2VX9D?}YU3|W)$&OfH*g{7H7xE86kW zAC6k2Umb_iqLZikTcW^XuMPA`cWBnqcOz6Z%>ywzJ0{+!_u~)~rU{vqoP02pEa!R% z1*jTcheHg)@P&d$@QRVxgPMh_nYv_KVF z2K~TF4xCoq5Zt#nut4W7hr?2?!+CuK1Cs%i#~_TS70%L;BryWsm_=I~-xMr~`E(So zVJdH1B9u&tht(MZ@X?g;j?C-qR@h5NUvR$myzkm= z6<8_x>C`Kx(?U3@MK2L;5?d6q1`!Ix7|ZmgxLb)63&4lC zjnB6MMv9@7{`p;u`T4KX;(OrkZsb zfu)^)q7th{g&fGYCU6eu@?8jpjOd?5v;^wPr4MRCudYY9<9`KZ|9yP=Ra05_m%L3Q;hvBA_Lzt6h?-XT^>Dnyk>-?x&} zDj7FgvG&UuZlW2z7DuTn9V0dh?i1q}3@OZ2&al;StT~M~3Q-QhE0xe#2Q|**Y|5M5 z&9g}C(bf1JcYW9S8`9Ma0{NxdpJ#W;%%DK&!7Jvt!pb|iEHtE+O;n{ir zq}K?3j(w4%{vQzI5e}LWudH5m%Np4|YG4v*YxxaXuU)yw}3OqtCo0LDTK2whj*p9j*N5k?Y{hIIe6f0 z;+25E@(Rm;ROq@YO;^oE&5ERNvmtLV@KPOM2)ijQRY4Uj^ot}kTJohVGN zGz2*q0oNRM>eROs2)femG#QR zakspRz1v3r+|vv`lo4ot?LtQqiGl?cfy7ID{@S@2L9F~8p!?7_b=dNd5w6o*C=0_k zwAaPB3oe_+u52api2y1s(R6bRTy^-O3;jIBrbXE`(a{%NMVu;`Tm&BnBwM~25$FN< zG{L@$XgTcv+}}{#j9H3i|CaHyPSrfe%-8X-SLlK4|=~VPHFkC<cr~Va zhL6YtXJ7#j?sF$dH^wug08HS+=f&x|9S2w>*qk2d+k=roKeHnbqhBF^AN0$H3l3DN zS`fj=mG-JEC#F*Kg5Nhfb_mHvN<@P-2q7!j9ox(CcS^!=<`5_eli3MV!vhd%b)MF8 zG&^|{7IAhfIK{7xk^9s96?i@nbmn^I9*BR^VR~FJ=Y~ogBr_@+Q9{}h-cNIw#-ZU! z$=&^>U=F(TYA;{*XjX!p7_)`58j3E&J3?Y!a{p~lI@koz@flgrRzK7av*QF zB%xd?y5Q{Xwu2wZ_PEu!->ik|k}knj&E^i<70XUQPb;aFlw;Mr9sVmv92HnPSHkEN z=R#L#s$-Yl#piSYzrbF0&9|>2{y$dN7ORs%gvIx0XX`Lw z8}lk02v-|5?1l#re>;}E*(N-SKhAe`DP*isAPUPS?ynED<T;G+stdu~N^t%N;DC-hvLWdewq!$^iM+_X~U-`-m$<8s&L8pVsGzR5S zP!?Oloc#jvG@UxN(u&>p?)!MK4XY}FJfEWhG@uW~!Ydx%Mt;;U8_rGE6ccAe$YlZs zs-bUaB%1n0@(_SKZ>rOUKGRF>A2!hzcW%p*-k}b_h|8u*wYd5U?6%w-j&0a};}7Kw zC7=sfk|@OUN8m;6XAL56)vJp01Hu@u6?-Mz>kvf4CwyeIa z>DCvq*mQ|Zqy$(-Os5^5u$TkY)sPQez^Rf}A`L3KAfQS`?j_lMBngY~$}JXaHN)D3 zlq4E=<`@kzwZ2HzL7s!f>T`fHm^US$ycJ~c`FJ!}Xq7mp(wX!$EZb26|Am2%O?9Nq zuR#NUvQWZ7%BivoExV!nSdvH-tNi0A*$;G};J5Ch@4aY$T^rf%pi*%?x1b3ok|`%! z0Q*h93$GGKl;lF3=42@U1Palhk#;iPL9b#XEHhz?Ss8ZuD^ymqiZnJXnr$Idobf=| z-7XZ`1xh|+8e4RhPuV6AXm*3&;nLXo)g`23m3pNebHS%!>Ge0qckE^azD{RH)IWMR zDSqMwi3)5IlR_aG9y?ysASl&ev835bwya3Gm_gC}wM2&>LF1|oA@Z3op?og7uh$D- z__=aLLB&dKsy`w7MSx}_ryG0$Uj?lpI!0x=^U0PKtHZWVzXv}Amif9X5(s8s-KZ;f z^2-4&aOwNKpL?eM32m{QtQQ>|V1^Sp>>T5>!1uBuk}G>@60uz;nGVDB3H*vyLGU01 zHCTAYH|TB%2J$kwF+qoivkoO`B0(VtAu~Y`^UR$%?4D~J^*+0LtHr{_05xbLxZx}z zQqU<&2nOllb`P3V#3zIH-nZ8)o6^NvNWE{P2YF|?{q>4;fF+u!sqfG!i|vosWcJ1v zs6YL7iQ1luM>y4hU-S!H<%U7i)dD=ubt#NYr;38uf-3l*K9L8R&1I3nXRRKlMi6j+ zx)N~Ht5cjJh8bcIc!*Rs9?M&OLGZKZeR;dtBmQxwK4~SGxen_kON0;9iDU#dP}yfd zBie5wSYj{F(M`SAXDpBs$E7GYv_?3-SM);>8Z^5eT9oFRfF{H%axQ(&sc1N0Z$-e! zN=4xWN}wLE@Zm&(M4-(>whFedCvUhXFfx56%d(JAkawSj$`xMlZ z1+w8ObZph7O=U&Xkg2=w$iV$ z!h4@FYtOdMzA|tfP&^;rJd2QJl5ch77Lc;081sBG&*FpNl>Zi}b!2**Fm-*(%SpBS z0rHq@1Hmj28@wW}XeR$%*&{nHAw`x_b3v}sO7RNN#-2_LM07k2iltO_G;q&8GqV8; zYDrW%qlEz%eoR6_#s;_8bNdz+Nl#=!IG^#V*MxX?D?BxH@X3{2k3XlUWm^C~vh(*} z2HJ9Yz6CBK*_j^~K zh2p)v7EmdiYq4n`Wq>L>Ok%XckI7*|VIeF{ir3N%l7J==!~t1aL?)3BM+(QvFw?S7 zvk_TxrW>w3K`Y zjtmFYn@FV>W1z%W-jVmJziu%S3NG(Uj>JjC3kTD}?aEu8-=jt=0sJ5unD?qu^3@Rh z6g&~>phj`VBueU2XIN=fZxa?arlzsMDrcfFf$*^UmT5C`c!c}fqLUyP?63nfW`LX5 zu!HZuFU&;Nw`K(CYsfnu|I&{=9`F^EyoULKDvR$PmP0)ZPK z5J2@Z`Zu+`US93a>^zBm@NS|>d<&?ZDg8jd8TFv>O+f#P2YZkaDXaAHB+5PqFmcck z+OFn4$ObPL{r*ILSH>B|;9SArdoJ0*aox;83;uTJWZ{3aAZ*QH&qchTJ7x*A#*p70 zewF~UtVA^1-~s-97^)O_g_eC6-Ab*`7%_EBYf!owWyh#!E!Pl{!g%R^)3Ldsl)gYg zf^Gv197j`=Tpc$UHCtqqbm%iAG#vFSq8Vr+-h091uOIFO!I1n*(O)+aVWI?d-8> ze4O+47I1`J-L|1CdXK(a_i0{htLb$T{U2CaA;Fx>a$4{xod6E;DJ?-HeAXXFk#G|u zPezmmmo$&*Rp|}EP=rrYRT0qF5E&5aS~_cr6olb6R1@Dwy7$2B22cOK*8NX>j0OAd z)Hg#hyKcbp?tbI6gkR|ID5EBVk8Y5F(O-MEc+T0T9W&ps0ef zuV_QCzvIe$M>YAui266i1Y;=Q6MF{qzHkZsj*ImjRkHv85s}#?geVBxgESo_)o-}G zDF9%fVj}bYtKon@JIJPc!(>u;ecyrjUEJgEsLau-F~I&cbHbSe=qRAm+YD8ynZM&o z_J#q-3jcL5_!s_nU{=?62_`?2$D{v_OAy_5n)ZkB!O@;Pk?!jD@v*S8v-6KUtx4qH z$4k!w_MY9MqOC3J%C+FQ>llCNk%KBICnq;e$C@e?5=u?WBH}c?R% zk3d0J*QUeJga+h*1~ah(YRPFc2$WuVxmyh^K`|qnvvIRbNr`_e)4Nvi!kPt1$=%}G zZ^E#cg^O=|5t_&66(IGbAH$b+`}l7Gv5^eAgQvNNZ z#&58KmQ*7XIC7w{$i2T)L;*vT%~S+>N1n*`?Xg|MNpi1H#;a`*eUPxA1bRIPWkWg_;-?%0l@a7vl77n zKV(=XLAOt~L|&kfvdj70@LZ8_cw+;9;N|e&#MzDZ^!Py`;ff<6A^qB7y_R|kPb(BF znML$S6rb`G4UM0!*KtgH^0QnncoVdDaH+UzulD;VSAtXI(qKImzq@MZ zQg^b8Z{2+3+aK$SCV#Tgda?ff=W9i=DOIi2qQt+jZhlc#=ztGkrg73XXrNPjvpe zlzr>q=$LzCohe*K$)<66jmqGdl&*maFZ*x~(lyBZ3PQ%`vfcMm*97M~{6U71v2NYDSys59Z$MEkfQid}8 z=R`t=XYL^h##vy~6%6?E=H?eENvT|4U$Dp9p|P2Ek4I#MRgCwXz`;>|>9udK)OjB$ ziNW3pKcFj_u54Fmr_$~RG&n~ z>F+mL47KKU6%~aHHc+=W4kUxV+}7+rPWE5@(z4E}4Bjn%-6L+7D54&)@YtNTEOf8X z9UcjQLL@Bj{%~dQa4@3wX8yIMU5#}93OLoeL`}l4`&~pk;jBGb-mXfbP%A>0)%sG! z?PX`LsJ2#x(Cx8quEZhv?E?B{1=C#qpEK_b%bJAJ$j8$#Wy(9x=fE8*_bWr;=sgfu zEu*(LFaXV>=Y^6$`Z*qJ&eGpEr*^{gb=yq%eoigJL*}ggf%{~wrA0Hv+4G^atIQqBb~dboEUWEM}Y#_qq$;NX;07BUx%-t zKDAa;;*VDmy4R6sc_%wRy0rUy z6m6f8Wa?8cI^KejW;w#6^Dgk>h!yvn&ub+5JT6Caec`{@Kk4Nv{?ms0P<-%y*Gnoc zCPi2Na~0yFB;13#=3k-Mul?NsU01|vW|kR#k}LxYSi2m=4HfAH9;4HjriBBCzlM&ajdF`wex@t&vo26IccIBT~g;5=+4h_n|I=pBj_N8~@|YUPf#X^Z+g#Jp94-_pRgac%{wb zZ3RLwR!gl1UmPXFN&aVbeQ2WvV_EEc($G2D&|)rAY77?#u7>nHYrXMq@iN(T#M#kYHU z7N>uND$f2PaISs5(~E#VS5`!UWOeK;BvwRC{p+RcSDMHMUX9RlcQl$@vGE6YOcK#K z2Oyd7V{2<`5rZkcKcE_mzsNcEuPgq)EFHG!dI*|eULHAIJjBVEjpKzm@!`a&1F`!GH(?^lSEU0a?h#=N(eJ+|a;BaY3tfgR(P415*c z1C`B*OTR;)SN1ZqZUIm8y$u@X{^Bira7sN{S+zV!`#^?naQPKG5b6Ks*GGGZH zJ~mg$z&TwIASOB6CdXc)JOLbb_A?9WjBVaf5i-x({iMYgtiggp@yT_gM;5>QN| zguoG=MWIkf2WR#56avX&*pFfVir>w9ce-ePO@C1Rt663%7iNNxn;I#9&z|JPYL?D_ zkJPC?Sr^}7V0{Od$u0G=H;v0<5!krGQ;*)gW{bRkWJDK>`LBiVMs6$S>V3ZL^>cEK zOKVx3?Fc~Q{6CT?<1$Cy5VIyO z>DcK0yyqk1(}ArrT*lhX)|ZP!vg`ripkHmsHov_QDL?6tPBiF^svX&W%WOYosGdAo zs1u1hS+0+3z7TXfyiSr@&ODh!6LDq&#zfX3GWh?5-n-js(4(yic%A>^{fkLIXbxUu z@Lc2d$;JW+4UG{13f4GVuwu97CpCP)p5gJJ8fSo{afx8E3krtA{y`+s<<29J=J_t3 z=S=Y^)a$V;aRJ#Ow>+6Cl*o0{oSa+t+b*o(%azW=U1;6QMqST^eh0&Ao>bir%Q-5B z_4XB>lCKF2|I(2g`Ob1DN41(LqZ>a6Nc`?R=E>2KmO|a5=LS*nx`J8^5$@e9o1N}k z(cl!nHt?O@bZLT2E&o1f2jlgRJ}&tberjFGrl8xoE6;r>mMyWg=RHHN2# zhBi~l2zPJyW4sE=QaFl@K%2+r$L7Wo#>jItQ|fW{Uq%v;`CfCAbNuOC^P$EfXBb%; zQ)wVW5BS}53jAl+7=EEqkB;@(>I_%>Fz4w91V0##3EVU`r^EP7Z6q`kwYs9z+Ppkr zhR!L^#r!M4=nO#T>`+__Aa0nb%iJ4OKg4O}Nz_x;>d~KNrA<2UJRf}Ci%XE<(9q#P zjA5?ucO}y(K!8Pb#EoVgZhNr~;c@fte&FLgB_gT~ZR5`md?_{Nuld7b<7FwQu2@Yk?wp<^_}x@1Y0Gd^2fC)|EHz9p2zZ*dFKpf^ z$KgWB!rN8UT49$lug*~T1Rk_k)Bn#3gOVt?y!*z96?Io*79(*5e zAMe9$IsKaqy7_kFzV4OUBc>@Hvv#-)M4v1)G_|dhoNJkXIx7G9K16}xJye^47dIFEt;uJ|=iR#>+Mtmn{yn-Y#QtNHkU6Zs ze`nFTBbYe>lX-cWyjJ1B1ro>qd$2mr2`lKpiU+EqskF#REm`q<5Mze+M~LzRgoc`W z*Cj6)yHIjj!yfHl>Mooah3Y-)y=%q_2J`KGZxn-ItHu{={_Q&ydKWMhfpI*>zF&^a zm^(Y~pN7cG$&GIBZ-2VIMfy?XK8gKLLj(H$LQe*U!Vlx_wVCrhH>aJDXtosg07^r$A2bl7^RybMVE<Soh2FmMD%Qn?DRNj3N6R?Me^VGq&QiOnwh z+xb1G3+6yVjrUq6hK5qcPvfkuNS7uYc(P~^DQ&Uc77$?Hz|EJ}si*73Sjh`0CnW@0txC5JH^s>w!?SeL9!snkTJQX; zWImUo1M6iiAL&1)@k>dSD;*^Df3Cf~#?>4lR(5AA{WGfC~LZ-)(8rEQ_ZHgzZ9p^;~EDfX8t2#TP*D+h`S zgK$d2n433T=w(r1Vg75io8m(Bo?z#YaVbmHRWj!D1oM*Vp%8YizCP^XnR6fti{n z=*kj{cYE?=>MuG@xr+tzVqG^+>XBD+A5xFB13fa~{e`YBR#Q9SI`&}>!8O6-Z-fqV zz=GYlVhi*R9wE@v@LGKf2RA2ain6dV4Zr|6fuD(jWE8Zm&g~t%8W5Z4blU> z;DlYdit{MT)^7=DQo8sT^F>`z&*c2bc&{n!OC1A+2!udZ<`>=-7i?sa=?CKZUC$|DF&R%Ku@qVs^#89@PY#DN2c>jilJwuz}Wo?XihXj}z~C z49g~I6K6N8SYBBkSXxR@nksga#kwR5;u{kVGbA;8QnS2p=}sLLdxeM z?N*u4g8g30xUx>zRNx9R0t=fDLP_b?DCW@2#~T(M8e;Zq^`#jX?_f`2tl|51S2kfA zmY0%iWLNGLBufUMtV%hb2em4gW>Mac=`w&ta7tqS73@phB^$+3RKL zhy}9~?TM*~j?(U$$fMUhwG4KwWv@F!3>=i)_BFdBaH-Z_f<+1V_BU;-qxp9Dkwz1w zP%>m1s(!U4UAj+oXcTcpxtSOQ;!)WvDYpJzEnxwI9qj4JBHYRr3 zB#j%JjWsbQxaXzM`@VkPzj7sWFnjNlg~xubbuhn?`vI>w^yci&Z3<8G^8gBLF0t=j z6Joh`WY$K_5X}$uwT$D9cac>bk_aps?5LFTZnj+ZhDNAV*~6wUuqjaNo0P%jq&{K7 zOF1Q7GN2o>kw1vAwxGKkG6ePa-|M|Js@CeW8c2B{M z#oM_=R!3M<^P&Hn$PnJewT7Nn7EH!b6CpPnwVC`gHK4v&|fN4hvkc#Vs>y<$-l;sE*7js3xib?$M^f6Px-*6`GFo3NcLNEmd%JyFgFq4$tI2L#SK^`{;8J-`DTy>bl++y#HfnQTHRRwv&o0)}9}$2tnIOyB6U4r<_@9 z%t;XQ@Tkr7#zu-(h;(^nsOjFN(*%pla|`LoWgf@-tcK8XIm#$@1JBc{R3TgRk}iIh zrPp6N-32C5Lm&KHb#FD+g8pYu^R`mHpm)*A_r60D>{|gsJaIXh6m-JyUWSR z=En>BWPSgRYdLwUUrC1J67_ZJ8P$N}R!>eQrjFgQO6~U_dDrW>o2BaB*~>Xz@0&rN zqnbP;8WsYv`ihsbrZ!?}fWvdphVC;05IMR~+Cs2o^mDesuZf>I9nI&WQvtUh@Kf++ zx-LDc*q<-2Z;JYJB4$^6yQK7W@g~T9I!OeJP92)^iq7r4f3HRx7V-Fdhk1jZ=3Zx2 zB$$<$Z-#O%5;<6m9?vOnT9qljI7Idr!9d?0M%=4F`)Dqn8Wb$#WxSQID8C`2Bh$(6 zNT-=1U&skY2etS!4^2>0ASh2fk-keg_ybtACW!MsXg7E{EVE*oJ6NsKJDebFb~Rp{ z!PIVL^*1CUv9-m_t=1BrB#>N5*r)iUb#}PhUB*z>mR%~H*E!6NI*PPWL5Bdxu#H?` zVcin<%^T|!iwN5U2pA@-jo&;AHSjrX9ar%F*g+0|HHflwOHIuw+?Qu>Qg^WjsK^00hy}$0uvK_W=)acoNVfHk?n3PvXT|6Ce zFya<@u8`GQTV@pSmPnO;sUIPV1OZ;V#pw z=KpS4+$xI*irh|V=-EoZxtkp%pkf;8IXZ{fJXo=H3AYZBX&4qveMeW;RZdC95`KIx zHCCTpjrQzI8vSxa50K<;Wl>Y}!kD&NNlB9D2@O}#$6$$`sC$t&o66=>B;~H*<|dtR z@iE3?r&%k5=q>L~I7V~~XHmLjf}kfVHRY#dN=~zztOdH@PFCYfwTzR^rKVf&VA-D7g10#d$Df%mCEOUv(G=xPVQoh5hr4yXEJ8g_WF;>FD&op@seseeP4DC96w@$Dj%hNg`P=u6%6)r!q>73&E0E8rEh z;`+08cFzZMsRR7w9O}9h#5-d&6!!@Ce`j>fS_{3aZ@-E;_EU`4%yNs=6x^%(<*WP0 z3_lllHsce?YX`sPnY%V-fOjM=c30mov?$icQUq|A z@>w%SK6h9^2+VzH@FVgGY}8#7+5kkttdrBH3+amrV#==auvu8y69O^=w$Kb#U$Z@s z_EO_2?q}tBv^_?7&B3`dZVk`Mo%AGQhPf~8Udfu)58ZA2M8PEfJFE)@{yjH-i<25d zCRTaZAyL{&KeEp4oeUzrQSg5jLYr!xnZ>1aXmddIti=)32IX7J%kmv$OtFkqeP3o~ zVbT6ZIXCfZg4(Q?gNvz6q4ihCKdB2RT9C_|HpcLz>xDY1VJQI# z&rmQ($}Nl9C{*L-17wAs1U8<|kV;@BgsGoLWxZOu`viYfEJZ?{^s5qNb_L118`h+V z%7h6G2*;Wp!_A@y@bWm*vT-!&I0%+7K8GPejjqG@l$A^T8o6mX_Y^fUcUa zoC^1b(Fc~EslbflgWhnRzxN^fTa<}atC0(z8Pp@9DFN^N`}QEA9|;jjLgw}9q~pY! z%?9LqHQJiG@yhX)7yB?HI=@Cy*zw*yb1*z+Tg=F50{OCq*l>BDU9Zl&M|Vjkau=}$ zDV5*kE?0BMwjFZU_N%wP-sn`N3IY!C&b}(wFbTK}QE?}Nc9xI_+Yg`kQYhxIFv0}K z3T!>0Lj6z9$}Nt1=D>^1r*j2WI11?&bl<3~3u*TL%7%kb-y3^=b~mvb*+>fvjL4#c zM-0W;m*>3(4Cr`xaF~5{-eINjy}tvgI-Tg;-_~Y6-HCNR|9bZD>U&10*@k9Odv8jf zN0j@px@3F3+{6j76btnaxq3Vh2_CCxUX81()nMSbf>vT2aaR2LJbgy>cmoIuqb%YN( z-jq0vWwEwL1^e?<;N{-dTzTd5KgMNZJ44RSfpiF*>Kh3!8JY(p=@ez$C#qypi`0Ev z1yixqr*YrRU_dyiubUG2%`yN$qr#0;6 zb_LZ}cE_qKtmrAejDma$J?KsvGy9T9Woq; z)Dz3Mm>o?q(%j<43)hKZBz76Er897TIn*(|4G?}a0=_;2-lRInkrq@3ht;Rf{k-bE zk~iKS6uG3KzYz_^WdDHeHL<1)y|dl^wMGOQ+~u%(=CT%G|52mY8KVReq_%s?p2+jB z1Jq|Gk@+gmA{bN&m-iaq5;kXY)cLjV;2v+9UZyPgb?Y2V^RRT^);TH ziYME@lRSt!ZabMG@}KGm@bl|BI*)XO;CvK-3r?saZLe2V&K`{5TKicl`0!5uTzg)Q zuM6WFdi}G>wst6JlkV-Qka4xyyynsb>O8>j+2xG1C4IB*V05Y`@cqRhmRuku_dCExvYatgne%I?MKYs&qrX}7H!Hf&z0B&fg8k^neej_ zl`!Z`s}(~7!`YeN{fU`~Kn+=hg#DE{R)^tOqqQvG%44Xt=E=uupX=;=s0$H$p2V;i zli)5Zfo(xbB-j;BB~KN?lj$CgbiQEc_L=ZDg#fO@kR;KDpPBf3Z`4r>Sa!? zO!%;A@q3|utJOTU>#bvFEhHy#PeuxbbkZ499vAmQIR6O3edzgl5b2MuVujo^GyZtR zHzkmMUkJ>t$oU_Mt|bAtn8OjX^#tJw zn%5z8mp*<{zJ6=IO}_urIURos4DFl8m9dgS;)H`PHrQzLkQV1;vNIHeiFelGb+8!Y z7)43o(f=QJwq%8X7!tG^&QEa6*--o0zSl1ngc}LX)8$Cn+nmb}k^k#9M3@)2C!Ijp zOX)1}|An=oA|Zb%iMAs5p#C53O7PbW#!?de|0jz3=a}iOzXVRaU-U{g8at(bOI6z$l+@fB}AQsw_HiiC%~s&vB=#Ra`{OmUd>S@y`)gSabjXV z2a+7I95+m*1#z7d05^dLfg8!?Y33eXN)@z>F}o8OoYq*-0& zPwR7n#U)RMYIhc7}_Q4*XG8tJ}E;d+tJ-QLIzw%-t%gblJI*62Q!mGS@g3*LMHx8{@vkf z&ekwAAIN!F`0FmnS3SxOTXL#SqkCSSSG6@;e*MetEju9VX;8X&cc+V~VxlUHk5BkL zq+2|tiP!HAuV$q&IZPD?{fH|V;g(Ek_1>X$e0Bk`P?IEq57gHjLn9H^i$QWxc@MECTO`e|az&51^GHXg+@!=R``sSTSY2Dz~L?Kjq z7g!IZ{%8|WvFpW5nwpN|`9^Qb>DgI@L6#EX?({Ly!B`*3efaT1|9c;X6ITRa{IQ() zLngESE$ZIh-rTVx)=j(DGO$uVOAbUQ2CCM%u4?d>lx%l0(E4YmA^!;SfV*ZG?oJW( zNHY-2aykrk&%;d*0D8G{=c6X%Q=pDVm3OtTy#2B|vjn_+z*l{p$LbGH!jpS*xkW|q zW68aMmmM+WUij_2ojAD*o%LzPJU*e-x_PwmljYsC9-R0cm$hlFCjqH1xLBr-_alqqmf}`Rg@5?P(q5o3c(a`*C zwp;X;ljr%Y4%mbuSqtDa!CEaa;0eB`y3;`;=WUCIbZHS6&#VdxVDKTm|9P5^OBY`# zYYy5{*cRsJ^JKWLD)i%<#HS*tfMA;~t~9Vti} z8C*|Vu+^#T(*8@2fThRF1A^iqBC;Ip4z#Hhzn$Swx8yL=XDvUinFd0j?M8Su?;37z3c9`)$S=5E6->Ya1qda)2;pXFneb8j;$ zAYyj9-kXDHBWZ1%lT22JAkleeU+RhLWc*EZzd{4Wo}d9>m_?}cN5+weZOMyYmp*Srz z;+syj`-YkZ_B}s(co(*yP3N*{$Pvm;Zjac~vA(xPbc;jASCAiw6=l1ugumKBTRxqm zoBM0B5TMPX72I52uEJCGWBHL)1QyFOwQaTIzRzkY|5EPR-lU&+SPboY!trA6XCF!~ zrGqjh5VFtyK6;kd?M)=X=h|<%3M``O{^t_*H)BX68Z(`Nci^fzn?io-fWJ+OHql=a z;)h^URvy38Th~w2sXIw0bpAcayOpi#gHViYkD(+YCZPBWPwyBzEW(ykvmG|gHNh^R zUW+|($-tljVsFb`T?JZ!xh%uwC@Jm_&bT(kCV+vl%YF_Z|HB}O-7Jhr!ajpAwxy{Xrxw4Yz@g ze^*O-yh{y_W>}D%4CnUNcM=IQTQl8HHA<-S2k^Fbq(5HN3D?OQJW;#-y~C~;ByvXC z$sN|z9XtuG+;EZZ)|*LpGx2@uCjd+7hO4dIV5V<(rwk$N#u?9XiC(+SXT(~{r*V_jPl?)cTxm1 z{^#mQ#7rW`fvu8$5#~?LVGRu9`p%Bk{JjX`7Ubuv3J{YLjNLZnKDc6q!*KjN$735zNHMGTva0QJ);}8;DDrf_;Hm=8@-aY*z zwp|cj`~mbeJxbSR5pEGS4>L^o2nO zangZ5kcb%P$NT*N^PFFElAj)$e$}wE4OwkqG^_*F9d1QQL0@%oE{71twZ;Pip7`g6 zx!44fegBqw|06Tsq8S4Gxc<6U^kruA>B@+4qpL@GHku=onr!UnPf7GEUr!1w1;BF6 z1!Tg{sC`kKz(gaOpjjJFa;0l3;>8kfggVu{+>i>%Ynh*SaG0e)ldbR|0W@m6RJ3=) z1sK%k{MmLB;ebl?JB8I@Igw3>7{q<^b0?!5bhkmgljPsKJ<&U zU8NeoB{#zXyP53@&Kqze<`Hw@$32evU7Ax}t^!xmnGjm;THP=3@gNU4mU(KIbju1S zleiWyl0#^Gf5(*|rKdDCl}UPtd9GYnFyqMNr{D5+=R)&aUeBU!BtJ0y357at%QP?m zT-|TYAd%UJxAhD;(a_D(BL|%Oo>#j9X1LQh15zYRN!Cqf{>r8f7P;l5a1{|dP`xhu z^`?=Z0j~V;_rH}ZL8VIh?(Z8*mA2Uh0hm0>C>ThZ?+}$W8fp&=$1{9Uxvnv(KZt|w zKm`eXtXF375`HUm*PA5}5ErsgZPX9@OAr`$!G?IhaA3kb*0QxH+NMo1^^I>7)*dZ} zb(=V3cZEo7ydHB#TwJHmCLbNvJ#^mq6-iJr^^?$hU1VH^p@nPQPxG^@O0+`^1@M^o z$AdnRoc%g0+#xffUl7Ml`)2K2Ty|L%6h26|VLXM z8!=NSbLBFr;rQc|Ys`UFx;_g<`WNBIySR+Btbm9z%pJHLj9=8OQ?O!$6jV3lAwHoT zVn6z*aNInLy!1;q*)EFEBSs6DA`g5Cs7mjHtPJE&T8MNi>soa?@7dECLb+<$1j92O z?3&Jwz{X2km&e%&)6iN!OkzMpJHClG{Td>N!a>yEUAHI%JcMj|?r&ZfQrjpM0p*Ad zLTzvKDfK3g$40zRiJtyz^^A(4O}xQS;)nE4Nk6EaSUsOr!d(J~F)zYqzDZ!IA*#mw z!N$_qdv=s~>q#Jk8U8s4_pC(KXKhO8t!V9n_D`=@%SyOOA$RLaizSIE8;!Tixgt}_ z-Q{&Yu;^`1-p?xk;stEGdBAuR-Rn=C9)LUMOWUc&_;y&j0>q{Z%68IWPSeHZm}IBN()}q7FMALb3_w(#Wz&YcC}yiO)uX(&Vr3w` zn6y&oqeN2fnuxdC2*>ftX0R8@+pgq8(=b`{8~h$0HE!8KraX8nh>La=er>F?Ivun- z$A}}D{xxw>MEBl?@;Wr1jLobtv#8*{`|A}tqv@iN{k zF+TZrP<@UP`oQWqw|owI@g<)7vA)tB0fs)9sk>Jh=&Ug=j}AowHr%NiX!w059nToR z2?yIlS)^u-W^7MW3~XWP*;pf~hYp(!q#upqHXYu>ha;kKp9{^tOe{KuQGW)3S%H%B zJ=@o$rQCMQ4N@=e3Dk~D`A%ftS0+7sw>n}egf-{IcQD5_gY7IXFpiHoZytnD)0K0xyy96_Ji{+RzeSYr@y%#~BgqMV6|g0i377A||qHJ^5cN(WU3l^d>4N}qFq z%}OufiHWf4t)iXPvK7?4E1WTD$F`2C+`3IO^9xyFjQJ-&ZL2ABf)dAPO259_zCQA6 z;ZMYZI^{`ed4nMjD-%wl0z|yxX7l&Jmbu{-d+~5~&s|4mqWZ;%{#|$Bvw7ExdFf4s zRY=zcmjC8INpDh1-L%Uzq3^hU1QLblp0$^wwq?=|45Di4>2;6_aP7FwCzH)tL&4ih#DbPPX` zWOclq4_iX?Z(Ivi^6*BKfa6&k5d-%IT^`nYVxhNjn?KvzR!zBh|A`LEQ6b;XtzbU# zSZwVxz>8VPO%(Y9g}#i8%pVYaA{Y(ydtJCn%xTr#&vlPy&8cFE zc@taCRwXLB6cv!NF@x?V1XLpfbaFh<@6c6u@+Sohr37q++j2pVp#Hkb+Z8Qc;3%Qf z;G8VSp^PmW1h~wfsA7_>iT}EoJ2P*B)LY@tpXLGj4-_S49~ds;+o7WPIu@5E3=mrxpy&7t6+@7yJa{~= z?(RzFII*>*4pTltf(B|d&h>OvD=XxeC$QK`mmB%=>gw#c6_3i|q|m(gml@e7*Vi}t zUaGtSvG<2@`jo{lY@Nv9gZ;hfc+}p~K|!4`p~t0YJdaZ(H`~py)6-MSz2lN*>$Aqu z_bY~Ld`JEyt2Q`Z9bT%?(Fel-uRx4k!F+d;X%i$N_Fd#F_xpmiU^4H=RST=tZAH$u zSx0Zzh1oyHe+rLZuGUb1T`#eG$?mlC$I$Da*R1+C2@;cvl5h^adp!u>B3_qzbj}dt zkyn(3Q)I+DVpLXhGv2gUd~6B3eKsxdD2VzGER{2siEmB`<9{dq5U<2|=yzc+n8I^* zaxOW2Zo2tVhFRgvW5MHn^+Z^%tzpz?A-rnZI}69%!v= zqd-Ll?F^Xo`0h|b4{L3o=N7#mXxDa3km z?w7{%nd>7@$@PCWU-@zG*ee_|GB%s#c+vB+QDq&FyuFePDL|926Rv65o|^72D%Xzp zuk4Nl5hQ1SmoZ{`NQWrN-i2<%BM=D!Jl39|Qqt1Y#|!+Lx4=`eU`pOL?e&uyePBUI z#2sntSk%Ab)1Ye_Dr(0A`E#5L#7omLDo00S%_^qc&3LwZ5u=N<^E*O9 z!U1E<5D7F|x|mM6lrP#mZj{L44!iVB=s}UlGP_(qR`ZKsaxhLMP-*?>J zo*XvqQL5;AWmJ;y5K2w0-=L5y@+-s#JVTMo@=GW;L?-1m@DzNG82s#cCRAi_R+pn8Ya@EUX`%N!DRYNb=nyha9#g zzweszy8(ec82T?qYaEF0vpAfY4TKzNYgU@F&;1Svp4`U7uAJ^Q_X4tBvQaw4eH@-| zP;R%dx*#GZ;(H+QYG$JDqXRxs!TPS1lhlQ^p$T*M&BW%>`P+s<7N%W3VwsTAgl~u) zmv$99QVSkI;G0=La)a}IGUB{H;eZI`((quKu>S+;zL6*ki>H(WEx;(iZK}9f>m?wv zsfmM6pi`x(&-m$hRheD@9McgID{vLn*@+lSBAgpX9$hlk>zx;u$7}s*=$>hnJ0UGC z-icJpaSDM49B@|)BN$Z`ZAkS42`31S&eG9iaYse2K!d@pL`**_O^tD`TctpwTpgvP zty4ZwByfuW3Hd`%{+p14*Vw6y16zJbj<|sX<`fU;o zY8pjf>?m9b^9`H?4&PzEldz|NVajS%Z(2_30ZTB&GA&ljCrswb7Y0};t9Ne4V{5i& zvZ3N;11uNM&*VB6imGZb7l$TJEC)-unti5}Ds{UtOtfC6w_&;Wa_q7d1Vth3qP|Wz z`&|25`^|3LY7}_VL~Znj9c$W_`%{TbcYUDEqYj{`wqc3^)`#GubtLkzcflBR_ncFG zM9+9go`E5r-Aw0?8V#3jq%C737j{dKBV@8sJpbK>`ICH8{^ISibj9LSeYgCp!sk2H z{JJn(3VB{Rp>(Jh;EuM97o=zAJ54!l(}6o&MFX?n!Z9yS>0Bofvm2!e!3A^0)~LZ> zk<@Y@WQK9W*1DkqU#}ib#us zf6Shp+*pjsli;W6my@mu)p8c>>S9iD;ozV}MX<2o$RJ_J2sS&P?^{%?JW_8V^|l=9 zT$>gL@T_Jq7@4pcAN!{qJ#Jkm7*Jkm*y&Gmw%j?UKk;YD8=_f8!dPQHVv|=<5#@Kf zN_V?27zC$i4R?fSW00+taVL2aP^>@|9X7ihOjfQ31rbY+MDaD}q}t}xW$$8-8!r}+ zb7oGA;!NgzRd1S+BZYI}WRkhJxUQ}yK$|v!vA{E;GF<+7m%CXe8?$RCC_d}W+m_vx7|Im!y5csf#*w1&o>I~KI3qr|S_X-ZGjC_L@PlrNqHVAr!Km2lq4udyU3>%ye z`$VE9Q2Qp}$*NSd-4Uu$t`gQF>7aJ?Y2IjlALTN>7VfS`HD}>mB-^lA0S~z zInT8$@(=$1P3=3#)KYV{N{RUnAY-ID<}#+#9Baa8Bp_Zw>On_8qxR5;En_0V;F4gg zHLaw4lv)nk5u7TG2wy`|#ki&#k0FKsYMP7W%d|xa2Z$>fBV5vejvZL-jV);b3j9X( z=#qn75f;gNx$e1Y5FP3_61GmOr#>Tj+cS6GuKm0VLlh~1BlN&idT+g=otT$fBtSoK zt#Uwzta|7wM5U-&V$1cFJ})`5yiylv+Rk3Vv5@h*oAP?u?&!{6l^u07^?ZT(WM!X;xXi+>0z3eTCvoTn>>cKU1 zj;&VUp(r&OEooEf#0ii(pciU|;^eiurU~}JeU$L#XECNFGG-&TECgDf8Aq67-{qL# za#3PHO?S&vO5%wJi&wZ$JfURja2ud97| zH<)iqxhd}W@a!9tmsT$*&c&a!VcB?Zy`QU5Ww9aA(mMM*)Wbht;Sxe2ClDTp$Z8bQ zVh4FE;H_QG%HBx@`^aMMprXZx>Ej=CIr*zu_jJjUlusc3W+kczEX#CbgnJ2(=)Ac0 zNpv#D0$M~BdP-H*ZA%4@)H~y{VS2$fUN`IM*cQsA(kQQ}Ap2_^#C0fDGT}!_^M%L@ zJYx7#3sucZQV-q5?OpYHW9s9j+K(kAB@6>*isQj4&CRG}RMd*_T77U)L;5^nV7Lzq z_5t3FrPm|>TN*@&QEv~?;vQY?k+rDQuPFdZ$8X+}*{wCCz8bK{lFV6(DO$IxSWSQG zL$oxwv9>YP{pAg3Oxyfr9>@B3bISw`@gAH4nwlW=`q)TQTnoQoO$t{BO;K!$Lr^^m zbD-Ze6;)ecDty*~%J7qc)y@_r9v|_8eXnb&4S$`}H}@@R&gM6w+pL>Si_xi}^x>}8 zspH;qLPWj?^Ch$tyfIN?#*`Sf9*L#PqnrCB+q#&UFQQ5CcFR?pdOfO~;qQC8!G{){ z+lk6G^8;@d{iS>hcG4dQdwhau1)nQ`pPs)4_KU{lhevvvUIa+v!~Y8Y%w=`-s(VWZ zR^%#VK~z@#YS%5*s{II>G9+oXrYZ#WcQoM_P8jTnpuX447&kVyOV)O0EeP&ieDSr{ zwlymBElUu-?(Maleo?;qAPbel6PAjBj9jwK(pylO!FGZPeuPl)+}x|W>eY(hu|v|2YSv|&C0-QJsfAnSMxOloV3K^z^q0^R{!Ul34#O@HLZ`> zk_J1X!u1uXca+ya`i|+#A)!|(g@!zTpnF981$X`U`+GP#S{s77VGBx>X@24sW@f~-R8Gsgu-D-~-X|n~mx0~v zo;B&7W;dtviU8i7Xr=MsNV;3Qy^KPokW z5gACR?%9%X{tm4ET|*?8WlHF8FljGSi8m_$na+PLC>C57BuS)Vfo7QhzoY*h|4xV8j9O&*jZ793{+~GFf9LhdLomt} zPJ&wOKlAuk^!M+1W&v=aQ08wgAB6DW;DX2k1M~7IW62+xQy6uJN?RwgS_%je5 zxLI~aAz6?=!1%HkA+@TQmIFCg39!lp>JHy!{vEu z?Mcf$z3h@Us8i`-$B(C%ty=hWTi%7&7~glL8C_xWQi?~U)8~({{PCYrBw#>Benj<) zSb*Y;Cw)NtJ$-ENmpm2+;m(}%%{~84uz49|z@CKAlzGo{%}yWn>OI{%qGo4iEcI__ zk2h}PT&?)*q&1F?H8>jMq}R`vYgo?W)vkswS}vp>&smG)`SXdA>y=@wSJ)oOWZtaP zS$DctG~R&vEFjiccdo%edo*t|EtNS>`EBBbZY;mgtIMKq5Kp%SW^W=ZO(`d?3{npg zQv11GtVBMg2z=ocih_V&7)>~9IaCd>S`XK(WMS=X_dd&H2cs~mB(z+t$pPM;m<+nT zQ?g6UU8&$V<*IEv8JqZf&9zLo3^A}R0(C|mTdW`5V?yP5m zZ3ZbPzl$-2*7g`sKD z0K6!D3IqF%wZz^GH|HIaY*Hq))bOj`S_6+<#RTW84Ykj}x$)+NNn&IHRRm|68-7j= zF`B&HkLUC$h;8d`2e5KJ;p74ylCyZiN<}|@o)tvl7shm&8T@0;`j8>kC_6AICrQMg z>>CSax=(X=$k$I#A%BI{^jX?>i`%09VD6lw+g8I{Ilopp8X~Ow3m?GGv&|v|Jt8yw zuZ2hq8uhFu`lxq^h?`3Y+d%;2k*O$6`NPA@!OECP2M66|EyBvVRd!?cvO0>*%v!@9 z%MH7xmo13ng{p$Pzcr$e8G=+%RGWyz_dgB7=9M-#U*GJqY^q$-)*QuccwCFP5$4D$ zfP<*_BK7HuheRx-P<;WraqqCVSe%*LTnC_6%84U zJsO?=So!(ewAzhA9d)zQ6n`ery@UPQ`(QgBIV6B7EIoOB^;}f1%MF@og+1O{QV*d) zhDEoqnWT%BE^l_(E_FB#qT4ifyIC^H;`AZydo7})oq3Etuo}m#Q=4a>Kiaqpu{;mg zjqYFX{CHhm)-D^oK#t?^5`xd87q71DjVr*>W)xRru7J@c}RIq@ACyc zq`96y^Lc|?8H z%zMo0Q1ZDytZQ~0(`HsXl6+XH)?kxM%*+b_D=D()W43W`r+*J709^;qRSTcZDvbDy&0*8fqqV3;~E4|C7X zi+?mBH{0Fsf1(p({=C7T6$Rf?{Jp?Q~>wI0Au-ZT4X!vLajt`mW z{N@?xmSRzqgZysF+(e_rl0X_! zl=_~TS{O-)gj*kUH%33XBGFS={WH*#Y!2bAO06PO@8z|u?r^3=Ug5)-%5M0CTjQ*` zM#{0=bv3f8*Z_m|OgW7eOz1!wvq3QnZFk*q5b--RHlx0c|R>qE}g~Gf;MdglEJJD@kNz zZ!GO-vWeEC=BG9G-R`-@x&IY>{OuemT`i_h{s}5Q)9~_+}#R8aDaFlgvt3#Jh^(>(f8+qUJInbZ)29 zC3HKp<3~J36{-=v*d|UJ+F2BZUMiwzAI8->%=6eiQw+N@8vTQhXBcFU9^@+p<0B9X zQwn;AJ^BHIgmB~zmO#A)w6$aQL1e6zMeArk;Id4q{wS%=tJRHk5f*MS^rKp-4qr-* z!tcgVO0&01zv_0rs)Yh%@Yg%So0**VmfQR7t~=vwKmadNW@=Y8^+%Z+>lSse8cVUt zmr-IM2D@9VYy&O8+Jg4Ye2%s$bMMC9TmxP5#P* zE`Yn7jII{<5^#4J)24dU_bIr@gC<8&<0YIpZX>>HWw>8QsSff#+-CV8X}t9WHUb>K z8!dw)Cf)LVCk;5F}nXg>d z#^AW~xNlORFwRGfq0XH4y}Xci|Aq4OJ7X^=2TV4C5TqHr zicz$;{6`p37<)veAH-^rQz2o`_+PHY9;8z`}6o~$3G^5^lHKz5Yi24F-t$A94c zKr5~6bia_1t{itWA$>u7)a`Pmn8*N#+r^WiavKGzY4ES(RyhXS?e|RE6mXM z**u3PS{K6XmkIHvBhY4USro&YgT}G3|7A?*(5pNdHs&9+xkd7!Frfy;qag*ffULfU zO1Gs^O5Tq6jR)tpTSD^Au*oKeaGqb77;mc#M)g*|5Sv3MN?Awx`27XQc!MlpN9?T$ zx$X6eI33nIZ&W3)Ns?AmZOFLjmrf&thCNo-PY)>g5D%)ljL}HA@Js!k7=TFRC zS0pF9N|QzmA2pr7O2I?m)?wHnfgfB!&`f9ZMXNj? zD#)MU?fZNex>xx%E@L^AZya;u=3M{7i*D8Z~wF=863T5G*vp zLy(}=a-&1i@h0v%0`7AXYvS)(CAz(-P(cSYvo{LbU`&O>v3|;y83D|I!e<|qw++(< zMwa@Jz5to5hnhIuT27IvP2uDdrix&~wT-U4Q9_R|b#f>3r%J*5Rr*DS*1eZTu4@F0 z2F)?=R92K}in!e#ld9o^morscE|v--O;1wEk%R?qkCzNlr>pxV(Di<<^54}HNM=zf zBhd!i5U7>9w!1EV2L@W1Pju{68l+b(qmKFcOufP}c^u8uu4hqsP<=S0qeT*_qltU~g&4aN^&mL52zy=e z3f)Z`bA9xuy=-1@nFt~4%%~Qqg<6QSS>ow$30UJV*MM!t14eYZ6w?VnxpC_D5L%{Uz`T8q5Ni{&luS;>JU!Nv?Lh8zi=Uk%Xdu1DGL(f_kOCMg)Du>+lyof?~)XhjjOR7 zGW27(!?GQ@ce#@RxO86#n8U7C!)Ab(NLvY3pvGj4TcGaXdjBH^+u9e-kF`%~^`NZqCjNBrJq|vf%ks>KL+TG)3EC?&`PIxby+0M3&ljrc z=%ls3BzR02D8nPaN$NQ#(#$fz`>ZT7RIfO&@HLH$+vhHYNzM2d7` ziw4Zkeuu~v`^hw1QH%XUlb&TTCK@`8-XFxFR8$6ulBBKoq20#WaL|NNa8eTm_psLA zR&)N?lE6MGb+3IJr)`spcrAuoLd%ef^%-szMsMP;V|iF)KeOz@YIqC*As2*p;fhGt zns~z*Fko_p{NzMtx0y&b+OQBH+^pv}JsPFao=D(b_nc(g*YfuLQ5*z&Nh=USHy_B7}h%Up@20I-98uY!bUD z4xfE>%V6&aBW42qVbx|@#@oEdwdK~+K~m>=RIzF#`d01^VWghR=7i~t6F>UFHU?lO4m4n=#TBuX8etn9woBVaB3ITZSoc};10 zJDQN53+yGXqM|Q_m3w@BezMSRce)w1)L!}r4+CjXCNOb-@RgI4(hnqCqbQ@f3W*u| zokdPcEcxDRdc3bmTmRAv2p%5fBDHNbXr7__2l(*=1TDnVc=ww>Md~k*5MxVvUG45- zJihj3HN6~KhwLFx9BdMJ)B-4~#O`$rk&sHP=mTmIfns?7ykZ7;|KdBhg}s9;3D}e( zNUli#KQLVfGz>P}7&LQ@&VT&)Z;sAh0D{d{z4uk)KK<7kDJa3N%aEYid7H`u{gJ-e zfd)px!Q5mj?SHA;KVlL`7t8@pfTcl2h*BF*iLUlPpXz@Ip)(VVF-*G8cq{4e|L2nl z$B<|yH5J z&#lsfEq2no+!+*W^M_WYrjC(GiTpZ~f-55{>(UA{_&+)O|DnA+@L*DiGQj_GZ&Zwr z^M}c(e0hIhFmu6kWDx>hB)vf~Z-G692)S4m6*B$@)r>)xgemgJ`wdP<4G&Af5gQ15 zG%J>nlb8PHVv#&TWcr^w97F<2phChNS<8PIjCfWpQx47Ia!`0DlLE5zMh6PY+00iJ zpDs5nhmwn1u0x9XD;30=dT5-C(JctRk+$OW&~mfK)Q4K7`2P9uMbJ$di$I;s{7>Wk zBTVAu9Y%hBP^c=2g+d-SWeSgKaoxY~V0|f&6gKGox#MIsac_Uk=d3v0z(3P^rqqa_ zTCdrC^7u!)f=Y>kyaj7Guad{7pIfeivo51at6^sQZ+PJ9!p$85Okvu1U=hlGtFL{g zu%7u;P7Dx-;Vn=YnNd5YKJwL-{*!Y9)`MrhddXTW+FNT+r&U^wWaE^I77uaN>zSB>jTc_gqQaeu2vVfS_KHu!khBfk2c5r#!E*tq~&2!T0MInR83zCY5u^$b` znM$=Qc~vXbS6$ugG+TqVZX3hYLS@uS4L2$4JUrx@yiLRZ{eK@6$Oyxe1l6gxN_ff$ zOinfMe~?Jb3kd;a3HtHgoGd1bib2AO+edX{W6GDCd4ris9WG=H42^G&AQ1v4eN~>% z9_D&mqiD3b()nEdF&ms8u=a$jwd?H^(;MZfpjp$0t(MVXh&*gf}zm^0X*7&^-3c~4_ znG+swj-{lfrCl#~q$M))$>^28BEH-%JEY{~$R*RrD|;Q!ewQ-ok9#+>T_#-Qat9ks z7lqIxDEMG`6^5ot&7C2W`d${;%9e}0K=B%?AvLx5Rs7NFlIyx>gFsE?!OzcXr5QNc z_51C@;aB~`n1Hv^ch1xIK)$)N*i{LGfY(Ump+L^^*$Vk}#m6LLk5ko$JTg{QwCZ&t zz9DV$7oz(E9M#k(*zh;TY|aUwN}_Zl@x#S)3)Jp#?-dvLtg=g<5aVl~dk#r;2D<>_zWT_MCI^RWrsH3t*qD_SOTG zSJnjR6?y&utLd;wyBc*1ibyw%FMF79FO-R@-h%hw`p?|*@{VuPElyDoYsFxC9ws;+ z4HZ#vJLauqhIm9f02;;q$$P3zwqKh#^XrF_`{$B4YK+awwSG`+>gsI{xcc1lMy|Dh zt+_14AzQkTsJ;7c^s@DP%`Sto08OBaxtz*+xAj_8QIq{-dWcGiWpCkw`jq_%@cBHe z-u_3Bfa5d5tq-r%Fu|DGJj!J#o{2p59S$_bM}s!;N#B>*^7RPykNU#2nhfw|N+p5? zKiWv$Sl&I5+O5|lqMydASY0aqn->AD5bbc^Nl~jbHEII@Y;m`poe zXEklv8--Wryem_D^8nd7cn>TDo_m=Vbkx*6Ez7%hsC@+w=VqcVe@=MH=c^N0A4EUd zH_3zUElqMS41%*ZfzI#7= zL6u9K!D>yxY^haBGID@!EUuU^6RHG!j!nadMHKlZQj5yVnKvNEeHYqR0I87@XN8%EQlh^?-(e^pT0RZ#hgI_!(e>KKtDmNP z)QKbax%Eo5e?~w<3Bop|MpU2pJx}J^F917>?Kh#!Qciqxz}JxlAB+9<)NVD!3JCwu zfYE4xC92ogA`YA&s0C??lD{4=v^JE(%HCgdW6Kj`EA&psF=i7scSYGAJRfjHAjmN^ z*lCZ4Feet?^G47qMa9*?qt9DJP8GYk!+^!^?ROm3e!=D?Q`T9XT37k7g@)i2hoSop z3i~It`B<>O{bC^1b~~szlAvx$J9VH+IQ%lHbHJQD&x@9gIY#n{1K`)i6v&)dBBO*z5bMeq!>Xd3lc=ML9c`zImWDN z@jCt$^+^-OzySOWrl5)q8+EThp2vTOS|>!M%PtVyFp#Du&wuRwr>50S>f zj@PX?GY7s>vD=)Hh^z364%c@&$GD~6j+-r%sC%xMOqeq&w2Bk2tv@SRK1j*y)EApo zyi8?bn`9!Z6(a7X$P$bwHE%)`?qkgrS|7jZeZ`C3zw)Szqtm^uxh=WVyDQsXXz`Cd zGBFJuat(Q@6|Qnx@o_)>yo++_2SD2uoZ}XaBj*_a%!q2vpmz%;;FC^k%|VGKV3;B+ z^VYOb^0~Y{^=F~831N~mrhcDQO@?~pHYQrmm18Zs=hbPO7;e*SQquaTCgC6MT?gVq zT#yTh`gEzj_LjI!V7o82*50Cy)u;>L{dibX3C3A!a5%$)4sr*;I){wHKY&S1Rmf2% z3RWF8nDY@Hz$X!F<%pPak1JS~7Q+4@X1-v21XC!}!ZW?Qa$%&tM?>R=Xp77FDqV%j z%zXaakt@}FVQ6F~eNnTkZ7n~tUPk+Ma)^+Q`K&$j$f9C+k@q}s5r~-1X%Xy2!Y&Dd zVYZsa9wkOc?2_H~{2)Rtn);jMwxEhj=spGEDBKDMK~J;ZHu9sjo@g)tO-eEd`f=-b znj!8$d?#-mo7v(F#-1^X#rVbsuEqhX%^&UROwGyjEtw*iX->@k1;VHGw5iiVg<%AZ z8}eb+TxpH1!)bLKUQ0Xg6(<60$_53#e6vLpp`7M5*w`2;i_%Ia9c!#WV6*&HN99(0x0a%j0K{%IaKRyO?um}tbzNVx7L#$V3W*p_V11 z^w5Cy$xv9Ij7=f4Bz33r;vKA$Fb?P=rUqi@kmWw`Ss65+u|p(rM*wTWxRisw%&YgK zozMS+-D0CYWNvt`->H+2fw$9wr5>b!L3xYFhNzMShKNCzJ7f8i3aqzj;2{w;_Y5EG z4aYFP&LGB-nrZx?L;)pN1n5@mnkRfbSt$m1!q~gSp0NjB*;wK+K_(JpRX$UWQ?4BNAyD_2Qo1Y*RrYZV4FEt zZ)?edrxG57nt59_@5q zac5RH1M9qV^_72!Vv7jA3WRv-a9k+YuKmmI2Rrd64;smKGK&Y-EE*j|nCeur;Yo97 zPChmi^UY0%kTwdYk+ltT`QM!hmWRhB^KyX)7VyxmHV%;%xMXsOxd;KHFMg_}z;_P|6) zaSSOADT{0+)A8$mkdX#VZM;c$q3r}@@OHs)L*~fj_GeA@>PilxdeZ20Pz{0JiS|a8_Pu$VP5-0T8DYKXr2DVAQR_F!dqXNbu!5;y0n2JB^ z_Nkn3$3|)V2JWo&yqY+y+omMrSWmU|Fy~28tyJhp*kHDxenKQBjs8RnDUavp%;7~F z1V3Sekst@y&J{Fz1Iyg}Be>rSeM^i!&O6N6WvL9~ShK`agC_lrwsv@EaYPA2xkEP_ zE8E?rrOljAOqsh-+05nVt2xzNoRaS#BdSS5V9axD(wLN<3}HNTfimWuEMhWF)J@6# z@eHimVK4r5q$}<5$3Kb-+l(TgPKe)#;HXikk@}ss4wTAuE5ot^7n*%aSh6eriSr;A zO$TFOhh*Gsbe@(WnC)uZV6=JmR}rf_Tl4SfIfdTQu0@I`d~!J(@c2*%81}|IY#16A zenH%Sx#gkH)-x324rT&P7t*sCJ^u^Zc$pL?Nw%%D>jw!3H9yn0zs5uG`on|a=k1XIWSP< zVcx*kdcaIe!j;XElNCE5^wXR>`$qLLwIm;mE{)GZyFwVBE~S5nj1eGLby#BJQu zpyxbdg?XRL{wN3UPweL^i}x$(O<-rfP>}AnvmG-#xzG$CyrJIn{iX-W!7ZMk zjNSBsYk%@1Du|$qLe-cken#jy$TJ>8z(%;@;%?`&?$_;WiM=G;S)NusXmLCV@9Rr- zfCk4bPS50jw6NmVm+D8BM;;kP@6&=YJ@6+=FD0Qy3h7i5=zHe7BYaRPUv3Cy|k-O``) zlbPL|C3HtEDo|ef5fr{4!S}}vU=00cjX*dQQLP_A98i&jQN|h)RFXm`t1hj{!F3d; z``n|I)xB+&6!>cr!6K;X%dEpkl%SwIs>v)e7w>KSN*-ZRt=Tkz%i!m#TiE?^Iseb( zOYGvI!C}bSObIOFMSO$nsWs^a0~nwGZMT54LxtmLg`ti@3G_c}=VJ)o2iiBEa+a%> zVRP6mr6g$vgB@lqJG~*HXPE>Frwc10{Eu;=x0ZfwL{$!tIXTXoMOn8auFvb=BZZuT z3LESTG|}IExO|goYxR`4>@m)n;#wVqJITEWrln| zAG;5eSGOTEoP!(17{FK>`&i>Y8+**p@Dw5qXA;s-VJmxt|3B^tv`7aTz?mAlX{dIg z%|D{tjY@QOqCiYdIMAp&ObNo^tj2Q%{zm1G&sXDi=M!I%_p zBL+rvI00X|nXzQ|&gOL+9oH`PsM_#Z-^mSZCWl%&obQ4c2}agxqW5T3`e{P{9RN0l zVh$t%4k(}UaFLL<2UNJ&`7@lzd7P;$HGc-t$Y+Vi5_8l%DXChozDp{wxA1s^60akoNW*5Th@0u#U*EgXj$92YGubv4nZw>+H)QWSxHcn{&# zQq0ZYMh^KarG}9Hue$nwSa*={t$4@f&$N?8u9DU+1Yr@?@>#1-o9~9sxwK)_&S6SI zPpG@7(an?)j<7FH5U3a5{jazF49Y# z7oLjyPpAp`ZiN>jjc#%qD<+NnuQk)aK+Jqps3g<>;L(45;zqZ>lC|R;Ssv{FS{s0Z zD4vO+s0aV+X&sM2Ai%*KPr5Vpf2}1zL*$yQPzUBT`!^Q_`Im`11jOEK*{Q$&<%9pr z71s?GZri9nXCWf91Lp_P%Ua7gOKJ(oV4$NFu_2Z4)B6nL4rQlD&HPY&NA4YSY0xHz zB?4D!m`ItDk|6AgmS^Mk!RvCTVC$WX@+j{O9XEG~va<5QRBv<~im8(fq&nyND1)oi z=Ew4(tuiGUk1w69_Q=_>Y}>GNY9_z2FCH`Vj6`vE``%gam z0Dbnn{=z2QuKBy$N}ZaT2h`&~GxdB0LI>MNyRr{S&i?Xdngs-`JHz{8yF=+E#Pvt# zJlDl87UO&O7+C8kE`Rp-6$Sa7wuYD>RQ8R)*MXC!N;eA{8a(6CA)s31PId!*iqjvz zh@wg2;nn~T98RkRj)_B2urXzDR1;&av`8j3u9`T}3dn-F*Rwbgg*D3u+u6V6G& zq;C|e;}`-ysUzb|JCqzYlV1K-lB$)G?}pL}MqT!K-wAmxu03r~9YG^wo8q>Jm-xS- z*{%PYZOlI38Xsq38d$8A=Ct}_kNZJ0V&ab(jV(m#KDULI&0Yja9h9BAe`%UnQe&vF zTGQ?{+_*skmfkAS>WdoqUgtKHdo<^MW7NSJ>)(}4x9qDEqGPY1+kA&%1@YEiUav5; z1n&V9sOK1;?Y^Cx_NFpu%<#U}TdhkQseRxNqQAPqs})$vaj=fuNV_U{#ZEtusV2f z@Oujp$Kz-$ss;8>KtlOkX<51cFVBMd$PxW)k2Sx%rggW_vlhXuEydi4?8CImCAWMC zyu?9FS2_ou^s+!Q-zbG!V? zM5?e7Lwv^x8G2aWHk$c>F`CCVyzqiL&!AQ&b3?+R^q`Q-E%J1CI$AB~J~Yv21)v({4_m@LncP2+bKmakXH>r)^k+y+mUldC+ z*ZCxES+|{DY_rwC`6T;gY{M*5X}(0QMRI2^TFVEi*Z`^7tD_7j&f;HoYo>ma_S)@z zG^08svDq9AJoc9Q>_4y6Nixg!ugg4TWa>s5$yb0Dy;N*&=Bl@2(0AJ7jQU?CBiGC) zg+2U)2pP_2XCJw0bQxNsYCRMFS1hk*Jj4dYFMQ9TO?1L=B|Q}P#hwy z#=3Q8y;b9j_M@oe_^o?nLx(gfY~Km-6*WvIiXo_tt~GKNgmTFYbDqXza~|IbT+`h& zwmR@$2FrQ2{W_k>%q6s?sL0K+Svh7ac`IHD!ILVn7qDI8atL%Kii~(5D!ek;5={o4 z3`Ze-T%D_|alQF+K$ll*@l+X`yZbLQ`i z`S7^Cy8_EO?VjpIVdFL5qk+!o%k$`ujh2KG?6%_RQK2eFfAm~4M``G1Y=rBn7?iux zMj?~enp{6|Y!T6+;!}7!jeg+>zCDSeNXSw@$aC;`Hl6#kHef)wH4-`@&}I-5PYii|vl zTjoLWo6L{i`>S`_$IR9rS$*t8x1%Fzi)QR5B3>Wu%AL}+!?kP~VYRf|&GGCso3-UV zJLT%7uhQs&x!Y#L5>rZTQv5vg-_x0ja{d0)VV1{zv0AIhwze-o;jYEWp|jkJL2cnu-Hn0x10VmtL-L|Ec}dCG=DF`RAV3K5$ZW} zR=4W`BZ;VIO_#65M$_i5ug_jfoe#;_jGPM(m%BwWN@`_ti=U9U{fkJ=;bPf>nGNXr zVAUBP{H}21I;vO(yKF%x>ytD)3q~J-7B*{8eEZfM)@53+(C>K(s69r&GIsu5#wi}z#DpkI4vx4wjI-C_nuoVR?$mT(^>5L`r zr-q}_^vl~^_Dexg=^v!S(N7@5P`Q}x5ACjF-3-a7Ie%f-vwM(o94)rzg%kdaVS z_AOVBQV-!pxc821gR~Mxr`>d zxm!~Z%MpFY9iFPbnUdfk6AOxK=&W1g;>K3$c{*nGQl7)EXXs8VQZ#Q?26z7Gp) zWwwCPqn!?!MX6SZAhoiS* z(lNK@)!T{@gsEPa(S&inf)Y=su&W7++F2hh@|CKSBeVwdesRMS1hH5;5X^YgCB#4P z7_hPSfk2C5l?^k)vhxZs?#S5KknFWpDz*<%n;yMfH2)Cboj>1>j9rvgD_7I#*ZlHw zIxd$F$9)qVlW8GmyOFwsiucOWY@&tZ8X0xlo;-9BSUEtOY$-Ti zrAO!~v>O>!$aVtdZ~g{NKVSvj>^|+3OEf+lSEuo?>ox#p0@%*hFSuCd@n4|e5kh;N zPgyQjwO+zbnpK}n6*VlibouoJ7Ev#=3ti6C@`GB8h{HR{0KrL2g8l{qGd|acHkBk+ z)dpwXV>y^DBeJO*Z!?8zH1f5Z@&VJdTxyC*Cyfdx+?#oLh ztPm=9{To5Vn#wrFPnPaUww67Ulj%46E-2g}0tbv-El%XB66rj@6noH*D??#8QF}ZU zQh3xk!K`x{ypN<6H5)CKox&$hwu5#*1i#fK8~l-U!rS)0Tlryr>V%Pr z^f^7Zb!G$a#+uTqCtrL}Icfw%<_8DOn&$$kd)G&y!E^i}{KRn+epa!MHa`%No;$rb zgMFu^T2E~4w-&%QjaF#K+T6H_9(QxUb{62rT=9K=zON$S+hn1a%ffoGbl5l^8%-m8 z%-s%{=1CO_Y8C#^&oSQsIZu;{(bnggE2c8&-w?6`SBVxBckpzRClo+cq!>T;J^ki) zyY_8$n4GM6mHZ6YWNIIIzUx}ZzgQ$*sJOiUYLFi(WPb>aWfd`}+VPJqjVHddJ54gN zDQcfcAPDVY(a0CS>`PdHC%jcx$SU``BuvPi0#+_yGAI%=qWLcIqk}GSUNhp}bd#S{ z_P)f^a#On|ToLA-B7zFeq_>;Z_x(0D`|*(aZxI~MaA3ZI6N^C| zh=h_Gooj8nOb-k3sCR?k{gi)`^m*qEU_PD~AiCh)i|K(7UlA-7NTIY9F*4XM(u^KAo z(6Hv0vfa9d6sv$b9<&+W`R8HgivKu3i}w3FefI?qFoFT$SEIm!K@9kiK4?1lp*sw3 z)zo0gZe4<37qwhA-$}?IDi6+`eoX}P34Nl6tWhY9bT%du_O{LS8v7giIseLfbF04E z<2ZmF;b8n2LTze^f#;(AG9r0kXQEaX3(_=`wo6v6-N-A+V0>bWF(w>L)S?$;hNs8s zUH(mPIm_HlFnd9pY&ughAF!0*0SmP=(eQRn&Oc@!qkrMI6jO8W=ng{W#M@Jq0o5(C zhzT@yIb54C;dKXCfA}YrRKT$A|#B~)BJ|d)u z*b7oBp~v`q3c_mPD*zb2w^XgSEh;QBC{>^N)D=Mr)fIuCdBFR$a|UTiol(zcZ7i$6 znn+N?)n7_>C7Dn-3vQg^UceGko$bYjGGudU0x=k9u|fDnOgSa<->Oh*pBi5&GOX5n ziBeqn824PJ z^CQhJ;SQxRfX>o5RmaX2i@&z*)cIp~&rf|1}`}#!o?}Qr1VA0;U}DmT%-=bdLrRuDZfT z%T=oVb_Meqw2E86K9^nl-AzewzARmA1n(eB7Xo=;2*Z)(c^qTLDzs&xt=LL&zkf@w z+K>4B-m7$P(NjjVKI)gl(vC9_|EB>43}~Y>I-Cps=-x=!En_rS{fFidjl{86wVTB3 zZ^u6Y{NL|^u{#F>=e2<`BrG%5H6dE>#IwNp&$MT4#rhkbrGl>~DAw)%9sW0i2y*zB zlR7~EZ@1m-mOI1a-`%9%3^@^S0F23kPnx4ET~hEj-MWBNv2AF(6spdAz42R-RScCn z4u*6ra|DVEzi!*#RGq>Wls4}TA7R3Gec%PZo(G#3nJv51Unc$jV9sM?9U^kniXm7r z0!~0+dx(>Z8F4ct*+07FJFB5#%(%*%A_nDrc*d@a6xaDR8$JiGFrkfq{ySU1q-hE8 z&@oJ=9FCyK{6zA&GVRI*lwEzaWgUb$O%ZSrPW60Q_X{TfnIyQuaxopBajpNE@JI{N zg}c{bH>p=WHt}OTSfGyM+#%?&fJU5oGf=wFsk&m=kSBdSb`F1QcjYS1|0vuB5w<>c z7{6p1wEA{#GUsnBiO2RG(=rfJm2wks2a7SO^CQ-g#6&GI{EfNe3-7KDo)Qz&I>s&F z4sML0iUhIn%;LiqP054->TpbYQ zk79!Jr&{$&q%3obaXh{7+IMxsf2CfmKc|hriS1i%Yzn$6-s)se1(`WFd0OsGl!rIyDA`GQw zH*Tl#YqxvYrshNQ22QxsjH~#Jm?nR1H2OC79pe&`kxEN=o@ZbAyW@a$*z4N`rM?RLO0lb) z$=VlN{K9IR@LsXn2)|s@Yn}EVG57ALN@7#vdc?1_KmKO)~!YyUv^vg8tl!IcA7S_ zq4Qeq+?&8yx-CO@&fvKefC^An4u3dc+F}qgFF2b zWD!Lzj$H}|F>c3SJmB$VF!?)FCjC`AAc67>98CE*#xE?+l?u#nMcL^gkb4( z`~+30LWF7UtAZ;qDtKZ$o5f@;$IylBz~9(iBN>>|?e?|XtotkCLR0il`}O2^V;D3< z`63+T?R;*~e2jgF#%RQ=ge```r)W+HQhsQKdiNBEKFD_~vg7%#1lvDtP%D zVEeOarLvICkVdKLYWNfE4*4DGr%ewWp@z(x26NYH<-oxd{93C_+IgBIQK8LlK&M-! z-|xAK7M8^6LV2CksyC75*RjUQ!?r~Dq@b%1hn)>U$FJa7$bj^gfm0F3cuQTfRJeyg zU~HNssS{3+^W&N%xd%;vt6tSd5hxMDN%Rp<6HT3RI6(tU0gCV&Cc)PZ8E0YQ^GY_x za|5>Mhqcj>CyZo5W`y2aO!1Ri3>wXBvFhlGwEFL9I@!z$x-%6j>rKENIdO%YDT#qs4(f9W!>uV!LL6Te?RZLt?VB>!@cVonW+{ zyE+FZGEYPy_?gjAXE~kwx+jvPbDa==b1f+~Fi~JSRSNKr_#iw*xhsW2#<5gOz|ni8C35r3cZ|R z+bMXh6n(J>KAxiUwC_D#HYw8M{FXf*JI-oJHo7%dUsjLY7`z54n0(uhBkhgcR2f4zs)o; zE1~06n?E6!=Ts5TS9G7RIv{VdU}ooX(g$r(0}6*;{})@hxIPE*wXiG`HVUla*q&$#@Ei zf!h4m7-}AiLlTOCVEDsG@CjEaIJrT>2KF4LenrF$*e#cd;1SL!< zd2$wRoBnSB)i2>2{3a6z!_cBJ#-s~`cP0XLmMpBdvv@J1ZjH5e*NHAAIXq|H=m8ZR z*`RwwS|#iK z-(szO1rl!q-e4aZ?4;9?;U*HP!VjN2#c&6-@rC?1pDr4}A053k02n@Y(Xr4?le$Q- z$l|s1`i0a_b#)rERwdpRZd6A}7jpUe>{ ziL7BlN~0wiL%D*08-)1<(_6@K1JV0YbIjdRh4fELAXOFstO=l{k!amo6ql9ka445Y z<&bq(HBa{e0j8LPf*W1{^LA$m03CGOchB!Qhj2e+1p_EVu>5Td0IaH6%FROevV`bI|E}mIol0bfFUWrc|X~G z;wE(}yW1g7ByGMH@a`dZ!k?>&tmr)#4c)LgD`8O8{3P}`(y4)V{L8iD59^CLHt~5{ zS&CW8*vu$7UEt9En1UIL0#jqgE;VTuE6Yt~LCu^wC4!k%(|s=a>tZe_v-kB*FrSl! zkl7zcZ2#~1S3eGSpjE=oCMJYKzj=HY3;nL`i&2`pt+Fv{(nLY+J5QL)PWP1$gry@H zx8bZ}BE)TqCZy+(QWsumR!Nhna&& zq?LRp6@ZHdyBs7r_G?t8Dp*w8`ZP>U5-J;_r_+kDn5n2x0*x%`oo<#Tk~+dKbs~=& z`_MS=b;CvAg75itt0Vd0*myHOiuyF!PWs|~61k(IikTD);xPoFiqw5P)d=e>qcLt0 zbog*8PYs3gvPzgBC?DwP;Bc9ARnyG9Ma+ADV8*89W9(bC zAnV})6g()0+si=Ys+7;jYOuHA;FsWzyVnn*TWAd+u)qC+syVYkw)xdoQzxI z>NcF)1Pk+pTwx^l+qc^9KP_XAqVB8{f}p)%(P#qKm)M= znRu*4QVkiD1H*uExr_m7kIydU4_AtH7WZ^Z4>N{C8a3Qs6cq~C{gpU(D>d1-Z_=(GZ!*#Z2Xn*kVWP61_ziEx8~E3uk8Sjav}MAr zlLi?KcEUQ*vnF5kB3S6uZb)#3ATgLvGIRHH3AnaSq=0i8=?Mo6tAn8l$EIsZ%MkC2 z(6|MTy&G(`e~?-$aaH$Xtk*BLIDLr{E}^Q+T;^yy_^XTW%I&g%^<2b3HD%BA&OxxM zHGi(Gf^C`Lc<7S#W6JLK6x&cN9z;C?3f{`!xcOKHF%PenlP%SwBC9peBea3WBd*~{ zbAh}$-(GH`i6>@k7Cvo;wLyRH^~GomW*IVaSAPO_R-k-E*rWc^eD_P=VIZBTQ;M-Z z(6Y+{u%m#{mKatVd;bls%E`BbFo@3hkFG&^Lh|1T5T+uJf^dRjiL8q1rILgl)_|Ka zE|)kac_(SCj*nnz;vtYDditfv7yz?V*@LR4RLau%`8rtOLx3>oyUU{g; zAPdUp70?6>#p8DQt}N2H7GmL*5mYoH7|}Nb zhf;gEaJXnBsyKQYua)R7@wXBHG)cTGmFJ)K`n+p_7YMVDM=>KJNYMv{yvKX}tNBbw z4_)?tm6DWej3Vgg#^U$hQm@%3el7EB+kUTJHn_dy#|N-`UEgFfXK@V3@%!JFEwUE( zl97jO`IY6`O4!|e(I zuIMWTIzj#16O-an^JVE7^>cA)mCJ6_&yuarK?=XLw)iN80^S(I8OXoh&Krvc=P8~4 z6uv@$b@N8aJ)DK1G*ry5p8~*UsD4+PrpdyBp9K*i?nXm?3tHpq!-uI0V`!EW<41Dz zqpbVG@IHE7ZK?cV3b_atNDDV%I_o0Cj-Q^d{PifEl;!i~m2(#_C@(LdIy=R4JtAKX zgdnYZaJ-<^3ubxiv&zB;96uzJbs|hwJJEuxt(Jg`NgsQ(ELSZb*%_|wGoebOYOJ3a zwQ0AeeFgyuf@5c1>SWZouxP0IHwZMbyUh2K538MoJ@`AwFqBc4JKCS~XjZ-RXotHI zFtlk=J_8Xy)ImWM(Uz6yuy~lDqK@B-*<0vwE^pZdRRSwa8J0x1OZTpNonNEzA-LfS zEt{;kfv?*LiF!NXDKOXtKA$qCi0tYo+*vUUaJJN+k+GFEo86E%B2A}c8$8YEJ?tV~ugI2zKzeaWY+oNpu z*Td&x*O2F#V2LlKZEkEYOxZ*hJK%?Omd{Wac&=DCmBb04TEZt2-TvY0hP-cdF2HSn zamlXXliEAljPJ_JgzQI)1}Ds6+#CeVNg0p~{UWu=1QLG?4U(sq-D*qX;35~N*A09G zjk$R&3~Ts#v-j;nhPlJ4X9eBUdmwFB2FW<|oXD$T8r&5-Vps6CF41r>NdEDJ%7(2^ zCH|9ih8`z*9!HUp1Y{=2NVr41#-2E{(PWUTrN{=r;TgF_K||K0yQORUYXNdxn$^PVpv45P2~7jl2o@DiRjC6vW}#zPfjkPvA$Nr#VlB3-2%z*>3UrnfKl5*GnPfxB#vF{3*;Ogz4M$R!BzN`0u#%B^s_nlth)JKYhFWiP5l&ZV;ker`1H!Q_OR~6?ODW$`w}dPdWSg1 z)&t4JK_n6{<;9ZOeqn-5m$nGdTw8$AA};poBdDD`kRu9Z0&R^9<94g<9cFaRsUY=h z4@>i5=Bid3c6eD#?4T{jVxccN`Ex3Nx;WaDa;b8zuWA%Rg-H63&-&<*r@^1(_=kNH zsp9p_T#|}NKi=xOi~Y5vvm^H# zJ+e#TPhsG%7vPgplcuWg6}`^aHJs@ZL<>Ds$^?ZVv(!NT)|bisa_<)E%^9@L5r#rp zBC-oLm^ZNPfj?_F387%%`kEBSj7iQJ4S51!x2Q!o-ej5HhqEd^nGAR~< z%kmNu*SmK-s~c-M8V*IMC&TgNJSS6L^Sk_dTf}twH7Qdeo7&xSm5U7>`m6VzAI;aC zK3+q0>kGDyD`X0D31@L^h(Y zhcVX8e({v->h)sz1zUmA5W6-{NDnQ*t@}~aW8BgqnL13jXTckf^T6m{&d2M%W}sGZ z=tfa;V_Ht+g~k252#0w*qbGln84f?FS-Ydqw* zwgqeEKgvZ@-FszqBs*tzj<4S3{Xtp6KtmfoC!c%}(Bt*~RkS{lw3Q>q3^vdCdR`~+ zo)!_(6Ey-UCw=_?wD;CgRkhI@ARS5x0@6q$-CY9GAt?<4m+q2IK|}=UEzx&<$+0WkRJv$s|incZSkEBmdKKtkP zsKg)+W?fJcwUJyNt>dkFG=3)j0GQ_2Fz&4TU>2#DJ|gafeBC zcloNJ^KnZAPvYkJ$KE#%w|IPy7L&%q@HPrIiUnXmdx(-bY<@bYTg!qt+8 z=uyHrkU@_lWEr&O+m59kf-yOHikhGWS3lhPN`D4_pnM)au3&P-rhTIoh|!CZ+P$Yy z99o=|=QxRYHH4n(?*swDEJbsfVA1C?FP^8}rf2e?<`5iCa&^HmcT0X)#z5`9 zO7(Kd)%AUI`?F7Bx*%wj$c7Y3S$4PU-KDv}+mSv2m?X4H~3^Ch5QE!wDRi0$jc_tLQ zboGyFC25DRBIgp{xol2li{aVqunl`$95A?hCP=dSVpK`=-tH4ubb%N~1~!8$fWlXL zxUYybCdo{jh5s!+g@G<@?S*@zq;l`^<6lLf_BcSTsQtu6#KQeY6Mvn;Oa(c81o`AH+ifak;E}>;BWH5j4!tE25hIcNl5?X(lv@(^v*M(rW*y&?N=lu7p)X52Kd% z-=XaU0c*MABA+So-`qf^Dj(74(QZu$3iI%aw8+7oc68QgJTJR@Y-x!H&`JI-dFeZqTw;M? zT{?Qgo9IUx>6e8{!DB5-1!q4;8;SN1hKCrM#kcQgwjvtju%3TZ@Rw$5180bb=SxZn z{&zutLKgJ@{l8lB-knE`Q|*{;`RT%^HPwj|v*3;;CM*W`_;G7Q+6%*r9Tt3mgewT9 zd?EMk2^Lm;seug*8B&fTMtIqA9sR63crAHVx2iO>+_ul#<8;A6A)alWi@%I%zh4^; zLl_GB*QG(%2daC!J{%FaN)03?*F^#8K$SHUz#n%Sn z8GzFW_*Qrc>ZrRO0ln+tkU|}eE&VuUhRJuo;jUQ?DHh5>%;obbYgVFfNA0?jm+MX%F~ z#Wxp=oHfJf7GAov%T)3a;lqm611+r*Jw3__)$wsx4cY_&rZ1keA)BOlrWEMazqmPS zb2z;^CF1K*ot&rGG;?3+5fU;g=2^cA$rR0&SJG8uBv790qq}tzdGPSzuE3t>IZIFf z6g6L!O{9qE#|WVMMMhr!;|K0jZrA<7NlIR-7xF3g358lgn*!(O%7<5D-Yo4kHwv$p zf2`^a36K+T6;yW(@$SRm@gJLBTzy72+S{?2+dZoaB{Mwg>|+`?cTT;5UAYQjip7?} z?b9m0Q6G$R{zxcr_$vPTB-Xw^XPJVEQ;l8m@=a&Gb)>H6WzXi=VAXYaax`!lh?jcd zLW0wR?X1oy6-y7kd=kI-^Y-V)$stybuz8gKXa48}|^dQf6f zD@0f3tM~NXUP@G6Uid)4Af4AiIrw-q2Du8tVI0u$cTw$TF%sn z=w5b}v+md1?6RQpGS(bF0Qc=xF(guQQ>eTMBQo*6(6#c*Dk)*!vx*B}*{06aHVI3bn-s1RjrHa=6Tgi7NZ58_3+FDFQ zKjQh~$@K(%8YZrxs;q(vmD8;K=pR4G5{X6~J`%I^5|81cdO0rUMfc5vJ9uX4K^Lmsj#}?V|y^Wn(#wXQv8|R3Kno|SbWt^${rbc##M7B=b zd?HsQY9bd}{^iS08_YevRLsdnd+Fjqn>vT}`BusJId2n$UAN-Lb~sAy?261?CGNJJ z4@&r=BM16>D3~VFgXYN_y2*L_AhAkoh6I6;)PjE53+J`iJ(S)|Wd-16jfJUnQ0sTG=>8%CKb_x7BF%YJ%z zfTbX#?a{ESjB3uoJa18E7ba+1j2dp;a7`>_w%7#1t`zh>9YKjd8OP<+Z@k*F$Z9^_ z-XW;$Ddrqns%)Fr|`h~SU2rdj3wB0>6 z4h$_zK7$YK9gNmL?v55pD7Y8gwzQsVHVU?)6pxO6?tNfG+0n7L)J1IhH3ane!QoMs zlVgRLL{~SngEvEnm-g_xe1Y32+sHzm1FV-e{_2ccufr^2s6B0r53;X^OC5|C%{Udn zYBGjF2z5A#!{0+S+1)d#4njF-MDY} zf);eyOA@_iLqokjyv7o)lh)A4wNQR8`$AGC82N*?cn~`0m#8R}iCoXU2PwyOug79F z+cYc7_MP3mZC4gr5g;a00x+3g-=_JW0i&-LR#Xh)yUMmToT9(^JO7G45sEE0h1M*>T&+VSt$r)yHw+6DY=Um3LC?`pdWN z{PivVf;|EEJ`A>I^VTzm9YZt%!NYK37sD-tk+)b>ar|qR#-j5t#upLdr`PUm9@6S|_2=*Njna{gUK=j& zFtzYP-=r9GO*tILS`<=u(CZXB*gCetGK6?*>IaRQg=0R#GxjThsh{#=^f{RFKb!7A z*$GB%uw-p^v>0JBAHSg4Z}^#j>g>p4sxvLSpT8=}Fl%MA=gSo0eJLUz$2{VdIy&GY zA8XHsGH5(Lw>B8hq1+iKtiB$)nM%OGd;HN4Vpa12t9n(r?rII_k+d)F%}vy`H6GER zo1`{C$_%Tr&}OOJyGQo+d< z)#^?4DPaB3;vAYq@0?L%p`liJ+~nnxy~N^R&?)=Tm;7Bb@0qe&Q0126yumGlxmrZTLA_(q8#@y*9j4?dD<77R3jl%<20yqy1(lm>G5yT6I1{OFAv z05kQQp+ZOxB%pso&O7jV^#a&3HgySz;=p?Sfuk^_Hz=eKH~;(MvxtNNbs?vIl=jaZ z$alg}UsLb>2vAu9U?|O-=ERTh-$wE|XS>%H6pR;n%h^AzElI)5yPf{bTzliBRdT$w z_xUH#LyG|}DHQL{${YsJ4u+IYH39-69Q%3eD0DaZD|qOgM_<<`kj`^~<+-X@cD4LF zZn&$Lz;sC5lT9G%_j@`m3h+oi|JVItnxHSKgQ7RhFUg!IKrOqb)Iu#D|r0~NB6!1aak0W<4LVHd#0|GcNS}(8+n4;QFq9+3w_0joOtx|G8GbOUH)uLW+S}a7)->~D-Bp{zwFEO&k#vzW zy?mQyht&dnnLe)1L%%JvLzc^zoU-Mat%P(6m<*Uv(95Nt^7E^irt5yGd2(S$C{Yiw zB3GG`>s99mIDbu=m{u5S<S7FztdA&3b;7fe`c{H0#g^EHF49D zU8FjX&$}lQ_FVawVwo!XpeXu_0WWX=HI}Adm4u1?lj)HtLT5n^8e z!7AY92oAQ6X~}@^W}ZM8an(26?Gb|7Q%kkyyE z`Htjc?;#u71#!+82jYNr(A!Z>K?XkLJZ0vh);f)@nj=h}r=&a-C5Bc+br!s9=S>=5 z77?8v$UO&smV`sYLRZ_^Tzv76ko{W<*Vz}TTn+d;Zwa`K?1vaou5RcfKola}^3<2> zbeFSFWm0!k^OkG_10UqQbt#jczFc=X%ZF!%RvBUbd*w8I17qRLr@_j6kfm!ez#KL( z_nxoS*|S_MogvanR9zI@7D$_E$|J$&z4`jlstt2WwF5Y@8!`(c-@2R9p~zX8*}KNj zM3xvLbM5Sl2GMJI>}eK>9FfA>vVMu1UB(A0N5fJ(01(cbY~kAYY=`zW)I%AA)~7-( z6F4_$o ztla3eA25G~#mMWrwaI#u8QFn-t`fI&kUu2IDU@1cVHO!qgR5s3O;IUlml_+H%s?{q zMjhw&*dN@0NbIS^nPnaBEpW?q*5q#mAtJn-PHXKKiK-=2deS&lsN_3Th9G}1!g)X8-i#J`%B?< z*yLufX#V-EY!uViYNBjH-cuDK$Maf!!=J-GA!8|g($MpK>d<`MDcD&P9BGt+%sG0x z6O$E!BW*9uS9=q~m-&sJjErCLHoMaLV!mik@sQ|D!)L9~bt4#}q>Bhi!sBH;$%go}=w zAE?dUBz%rBJ*7WG>wE`E>RcW2CYjuZ%N6v%4SF7j=~3|?;$qMjE>bP0D|+CB-FMa_ z)!i$@>I#Z zsxJunUSw!i$IK-W#{V4DD)Z+i~TZbI#tGs*(fVw5?zdJ_cK@ZP#n) z%^LcD#HY%RGqH#a*Jo9!Ej#GCIPCdwwo@9Jox~^+_Jp!8mNDif=vB(4CG{UDa;Pyr+`r6ANo{q;o` z$vcqsAV8aJj^tO*yR-#kt%_mQ>`pf-v)9mZTsyZ?#?JD{Hy7MYS7|9E8J6iTdR){t zzDOnK&#<>vHo@{q27+bG$B$_=n>9_B97k!DcWQZ67y%|FkXS$)~tYJ-v$G4m4Uh$p?90_p()5D0T0t92ssdEZM6=U^HowT^_bie+iGm|p}~tfckhQ> z*&X?lAG!%6f0j6S$Of(|cwg6RyKEe$m~%v4`dSj*$vC-G&@Cot<$jUrmW%zepe6fIc^NKE$1 zg^*jLL&$eH@Zj_qNSe;7dLle1@J&%T+nd-U?WXr{NpG*$k2tx9^>)a~KW}+>5b1uQ z2B4AZWoE0GJd3wWb~vrVLTr|A z`tQQoO~CV}EQnU11E!lB2BwMdTxIneln5^CaB9F;v0AH3*o;2;ZKiAYex}nN&<2qjyR4N9!Kck3M~}zZjpKd5hke#H_nlcWc12t8OwqOV7F}mnnKt(THE8 zZNED1eDjepFwMBDsu!NvF^l^eW-38^ds6%nWAi01ABlOH21k*?EwuA^b;9}~9>fW& z0UXQ1j6($h@Ig3j8m10L(^9+P8dFh6O*3S$b!2=*dvW)3AFq&MOmNeWgzc57Wrgq& z!!FhO#l7V5pk_+S>PosYRe{ax+s3CyYyCxaeT|LYy+b19lF@8_bJ??@*nKfm5FDsj;mJ?P->6KEwU^A_x-Ca#D ziJY6a#e;4<0TL@i#%J4u2G9%%o5oAMN!rQ<9fw$RB7H=N^wVLWb==YOwr@+v6B13E z&gEnhG}Ou|rK?jsDV*jLVsa9AAq09D*3zx(pi@t}<`zb2l=JTHmUDgoGqWNCJr1p$ zbtm?|*V_TNXdqg1qUY61V4g!DS|8^h|2cFfa2N+XQP5trqgH9JgU`2!BI7VHlIteB z4!?Ogec34PgssDzp3#u8u)jBQ>0n=mj-NKJYU6N9WKP1lo}%p!1#`n7jL_W-PR+if zGc|=_Q+8*oI8D>mtvLInEJiGQMaTBpeMR~dZkpFyg=Byv0vn>4ZXxGHHB2(d7!Bvj zRNM((j>AS#@0w$1l?^g!IS42JO{)SMvUDxvaE{Oc?Jw2nbu8Bw=~>z*CWt@I+Mz?f zVgelTRYsz#B=7++w~ylh-?lJiIr9O6rYfNFTU;H_hPm&){C%-i0-`@Dxh)88yi;h% zB@B{&*w{vAUkmniU;JbCr!pS7<8-^DQJSwUY>i zZp5S{W%IU~e}QI|YUE#I-<9Hh*m@1xcd073ygs)Vo))CN+TgA6e8 z7A*Li{r8J9Qg)?RU=r`@0RjQ%qz^)yMrK4r4B*i*ATN`8mo_O%EOy}1E0@64wyzZv zdm#mS5!i50-Q2rSA+Wc6=coaJn?X?GKQWyQ65KmD1O&BPpAZp*3$HP8rLka@38(JTdZ6gK{1OOkUq^U$!-gNogx@MQrY%<-jlD8@O z;w?b%qSP~yu__^;;FCc^Ln{HV1K8yk{JlD~5UV|kRRIZQO+}!IVov7^iu326ve0S( zcBE-Wa54zk2S&3K44mh7yIQp#8ii1%*E5wx?Gbg>$tZ*#QE-Te0Oy(TPY9R+EI0M( z11pGT5aLYLn}qeJvej!A);*YOg-L5`BQqO+)-ZGN=+mQd!R?^3GNrSovP0H0PJ&-b z^CnOD1bQiDMtTOKFr>Dx;H#{rDXiphay+}_Pn!Vv#_F-M(LRG<9SHf}M_2}6wat-L zw;+kQ25tRLJ{zfKX#bT+s995Zt748BL9_TAoX~f=|>b`1txT7wpeGF|n}dTo&yc zyTaZ4v%2(MO+`0E(RZIDy!AnU2oUq%2UkZRE4%h!XR1kVu(2d{?xcnMG(>KefO( zP_sCG{fHf)Y;uD2lRg5HI}Z_70|k1pE(>_OYNue`SqKHVR|vBTya`=9EqWq81fV zK=doqqr?Q!5DedMP8MkP0rS5mNjf|V>_Q7OgDr?5{WFXEw&hN7AQ#|I;e;6&WUqh! z^saLtK@TTPJci8cbd+hXiamGiaE!7@RL&_ir9N0U%7+<^y~PZ~3QT1_oiMZ=-GB!tUQBCI@84 zq9Y>uXPQ7mX;}aXr>Plt32|uuG~8kcn0Wp#bf!r6+C-|TfXMNove5mTZ$1F3)#V6} zdPgPvZo@YQuhQK?N45gtdA zeSJw7Y(5VhmOM{(jert?97!eP<<(>-XA@4daGol-O9+I%p9-}&x!!omBw;*$Okcfl zB(XVb<3q0tREXIC5LTjg^P@Y(@V9Ea_Dj%Y`)`s4BHbohjGe?Vr#Gp27S+UMER`3{ zmU>R}azI*ZNHdi28GTf}O>NV}O#&Y#X5?MworP8k$3sZs677kpQ1<>jdG7Y)1b^ei zIwx}Q>D5Zq<9IF;=fdS6Ly7GTQ-bb}jxLT%=U}NG)~y=g0HU?fGRKkU?mF2;^J1{4 z(EbR0TzXy;8+F`|{w|deuvCN_>%@)V?sp?yJ+Y}?^x)CN)Sj7At9%H^n9l&xnP*kS zHb$VGNQu3AEx?)JU*{0oRoQ^k?mB=bQf*uc~b5GWfD?dgOT1!4VFg)0d_Wz(C8 zo%<#6cs&A8{XkwfQsw63JALR!YZG;+r|u*b?X!DL7rgHD%*={=-p4@tXfQ%(QK)g^ z0(Ey|JUbQd(7CGT38jp)S`2+0Sf^0tc#3CTj{@jF;;_s<@w?lq9+PBxkF*(&_0Aif zpDW4~WURe#3>}9@hgpXc`M1$PQG>h3p_xfS!Kma&zq~KrdoG*7>cb9dl4(OAh>oq0 zl8u%{{}E{u?eajbh7ZwK3qb;8AN9$s{@ zS(Z3JLeUl4?CHxo=l!SXf;Un8x5s(~V;8u3jC3)KRl6ftRPrg$x<24r1)Z-Nne=6l ztoLP;43ZvjFg1v&0hvfvMXAwJ2i%_C{_x`F^Mb*q65OAEx8hPI487ly{vqXyqNv3#CwwE@5DQToHsN07_a_h!x)yP(fJ~xLrG23+`pODM7~_r^nh(I zQ;PF^L{|2VSO9X2JT|Ik#n-Q$GwUNQVj&2G&{R2NChr$+Wk>cLzDRzEPt0tG2HZxs zE3VG7-G2U5fUfB28z`ULzUDakGX44B;9alV>({%b!I9bBQrSu7{v=i*gOT_yqdgf` z-+u7w`Bysc@<|3Gul@Kj+YJOqu|VmDI~vnpYt%$8jF1C=$=cfAF{1ZP2QR%ak&9!C zQQ6xm2086nIlfzKLA+jfl7=4F)=XzgW<16K>8{+YAsYiWHn#op?wO=C_;l}CU>NTN z!V4g1rn+_g&QpI|wRtw1M%w|041`(bV6|dx+Tx~T1-^CA`MZ}@@&e3j0Y6XA7jF-9 zEEg(X^15t3Q`hm1M8RiO0bov+z!xT7?cK)PMgt+lpn#e)_4#3xaR4)y#Angn+WH>@ zNzsoaE*X%}LP<>xl*Gj1;KSMDpdettWU-j8Jl?ko7iln>(dG0KZs5Sw7C3zfnd;$j z6IdIyMN z!?}K|Z^s6tcKvF-3W2o9z-cl5hy!YCxYRItePS+mnt0&HV{GhN^?)&bm7qDZQ|WSp zqKy1SGhhtYGkTU#nIag!>1V)Qv{VD;N3%r8#Ons&VYGc;h*rA+#WdT=E*bFzs0c7H zXmC=f;~Gab2pXE&%{$x918)(Zi_!(nnk|Kw+N7qCwYENuNJ*i>1C{#85pZ=2rMQlw zFeH*C%f84m*>5^s4|4S!n2T4~y(miS@Z#>4dHHhHBg3Dts@^FsB|j?a@$3NUSWM^R z$#S)w)Yz4}F9ikPtOM2XeyHsVf}RlG8z>jV&!y?b(qBq7vC_3=?N0AX?(%+<@m`(m zxgnS+)}8Gzhz6oo%YZDz+XKT2)Kbx~$7K6nM^@USzLb$SGbz)6B*;}A z`Iwm{Z@@$A11_km)9?uF{_N*D28V+L#WSRG>(?7+4>#us2Z*m1SDPb=W~*y)sdAj# z-2_qad1XO+=y{GQA7hfgq~xvY$Frg?uuqLxhUGIPoQxQkaR`s`h$QzP@I#1z-+15_ zzymx}le`Vmv2D8L=2`xg?{^j|#~3ATfr#gmlf|SYQ>2}lwZ_#Ly0fmV3tQCg8eg_d zEgnMb=w8beNukS6g@^sPxhZ6yJ3mzBH(=x7Op!|93cuND1ses#OJw#bY`-_>^^o_c zWZ-kLtlsB+EWZw(djp;?16~_FlJ0|#k!AhLB#diSeAXE#H|yVWfCp`8tzM;&0B4Kl zPes+WHf?7h#p-z$A~)>Df{4_ZgKSXH+oEFaf)>dcEMrRlLw)+V>9}SpvfhkjSip zIpy5i&=*`~AS~#>121jS743Zvo2xat+tQ;~j)F1(I5+Ajqa2sF(^+?OAu6CLPFh~R zEZ7HL!W8SW=rK^_{3SjKs5~k=2)c;Q-buyEq-$@V?rD z$?f*d?6iVYr7AkTR)gZ}f%mrfSEig2vDp)K6-GNUxH>r^Aw^2KxFj}f9MQ8wWYI%K zR-;Gb)(69%Df|2LHS0l@4Oc&ePE)&n2a~{p`UoMzIqnMNoZ9qoz+n!Ec`=yPyG(HZ z=KbS!=HZ%yqnQ&anIsmme%nJ)3iLglA;1PUE>UuYp8+TvnciH*Nl))ad?t z4|`YMV7lG-XFPJEn=g9yGjTj3Mcc>MZGA;izW!lltup}sAD30WykkGDI%H?H?dd3) zVqqO-;XUpmAQ9ATre%)sUUkUujmJB2+3b92U4XEN|5}1NB@7YEHQv(S4QSVm;YK&!0t!^u$P)6 z_u(HP1dN>@K;7M+>w`L<{@ONo+U64p0CahCCEP!|3Ahc=6hJ`af*uOVi2Z4o8ZZ$_ z-!d8h-T@dbQwYA^BgTj1|Ne|g{sFKbbEN)cHV?=^|U4M~}1QaSx=@Dh+b+W!ol@@J_3cMH@pttdPk1491;1$Mi_ zR%Ab|Fju&6wduP);%!TMa?nANB3jMLyM-D;seiF2hOH9mR8Q|!Wl_<*TX*NTlc3{s z+TGbc@mL*7pssc9WXqo6!)4| z-SAxJepU^XH{U4PJJ_2icR>eq=3r>W%{@VBa8u`AA8HA*rxHGt%Q}i87<_3ZZ$8I$*TZh9RMw zl9`J|Pc~&BtwPb!(cygiwMY4`;20=_o-TKfMb+<2b}Zw;(f3O`qvT}NWo+ES$D)Um z4zB$Iss3bbRURL$bVsjU8l~GQveM#|QJQ^>2M}`CbBY)$l_~yKdYVtqTpxM^emMJs2#|edkf`Ty+xH&9zUAtDKMLAue zQ2rYJ!j&p#%OYrH-gT@J;LPkxs7mgI^}haqDIkjaa)F2$5wX$`!suiY!2XWs)rfva zrB4fxO3P1HQ&Xebp1k?7ko^$N)O9bH+7d?$Hq^qVN#`SpP%DCP0^aB)`!*z4nGxRX zoZWwvthe$kQeHrgU2%-QAE5VQ-*rpYo_+7?*G^$M0r`Hp*`mjqBSQKD8n}AC)_*yp zTIe}>@nVJwRerA-%t`Py$+7qGNQ<1euGdcz`_2l7OyyYX(<|b}%PCHCcem3`@>Szi zXKx^}ajH}PO7rG=ZjpkTS_?w>AqPv1_8P_5Bl{Gf-UIM*SU@SQ> zk;JE)Kiq1lYG}|tmVm__2wYi@op4P-kb0V)uB4)}LJaf8HyR|(KK6M!6@p_e)&U%g zN`KrwH@(=cv97aJR4$s`>%bldgnT{D%?nx-ia_`v+1ccHR;$Y8=u}7QuDhy>`rI6c z==6&?Zosg!S-g--6{^=vLchGTbIbr-N3|Jw>lZJylA?WdYh)#rSSRf5C0fkVFzGCCVZagwg5s}ND8rA)05J0QIG(| zac@RW?G`w)GYP4y~Iv$yvd>=#8WLbLFUtW0U=%$k~}SYHa#d9=wg{F_lFW>W6@{{SsiNzt_X#!{XPhK74X|H&bN`F#Jt1(W2$_q z0F~o-RKSwWq;VYSakAMJQDx#{C|`Z#!A_77pAhtA@hR`IT;C?BW@?1|#WXxd4E@!} z4pZec@wGJxsy_QR7Qmk%u<}xy=EskXHJaGe54Qj)VTv~pmBegOhp8?i5v1C5xr3!q z4~m|jFO*;&a(ofy405#gYs-Doz_Dupsv$x=L8|BQ$R+)r(>eX5Xqxy6v!V|MI zYd1TG7HE}g0s))a>;5*hI$M8G7<=4Ui|OX2Eyf$cc)7%->7 z{pPWl8k*~&?t2R&s6yNG;N=WpP+#Uy5zG|KT@dI)4j2nAortxZ- zG3%QR=Gvd9^}7PV`!#LO>dRh0syiK16wgu`SMH!NGPC1L-@H|KHvYY&Bc_Oufi3fg z10@YpQ{0=mviMifqB`SuI}rnR?fz}o*%XLZa#0U-}ocUx~&adOf=m#ysq_} z#Qx#DKV#;fx!Q*_3ndxUQ3y5;6)56ioAg5i>bY%#S}GTAS4)b7`%=39DjO7x9L8`D z$zwz~LFPV5At0NZKzOxL`0&BuYHk-XOY=(hbk=7u>Jy_iw93jOPe+ZNZzs_qFb$`v zxW)rRbi3N5^?nJ+WD^NH!HkS)#_OlMkX+I<_Ed!O%ry2l_BSQQx6J(41r8DHU{?F% zCj?if6XHRM;~XkOl|v`G8q>b&lU}G*j^G|40aO2IAiR0II0Jsk{Hu=0C=VjSOd4i4`V$K8=^`{-9?~70 zy+MAqwj##%Nl#{GFZpzSGxm2SsrQ9TowZHALOE$NuS;|z=sbxLUr~KTbM&IQX2v37=0h&PmlE2K^Y$}wbH8&H3Zj>S z|BJeS1WJhzY{G>khv?E49sV()WhLjN6XL@Z?XHvg;H6A+Pt|ItrU>Pe^?2dmrAfa) zAr`>;Iz0cx``7&gKKg!z$sb(D4OGsp1duuXflm+&uMXj7#kod)rNDmgOxx!GfIt@C zy65(Ra%V_2!h7qCPk#puq<$cLJl6Yff8!ybJ6%Xe*z;oK_aKmP3o-=fKK@lZ_zzNP zfOJGx7yRNr3GRah!MQX_kObzR!M}M6bfoTx75XoZo*FQHNs5{G!4Jm41E8bg4J!QL zf8kt6+?g&(bgxO$C2XK0-4Qu<%zxorV4n8>Ul6EpiF(E8L;UGN6A~s znk?kWL?nfEl=RSsq(lF#!~zAdxN?o+TK5-sDI8b`wBWFi`!`z>fg;BhMH`~6S7Jd4 zBEOR{zZy~ugThO5v*m`=t^H}b2@+6gUH6RrxdVJBEC4Lh$&xM7{WbCc%HF!GFC(-6 z#nrn3gV<{Qj&ZL^r1Ka+Z){Ge6@XOp-=0nYZ5a1&fBMH00gWFp0D7~yrI3Pfzo#uA zH=BnTB>MNafYNILLuwjNspZCj3{rc@Y!Xh=n&RX7_taBL-3`|Bn@D)sk}@6ckE} zl$eOhJxTl@5iW-I5X*0g>BG0RYe~J*4u^w#7iAQ@vbLrg8T|fz)Y681ZVm?RU;$9g z-)7!*_Y@f**=&f3lU5jpScw)<__nt8%G- zkH}2<6ya!IAx2pdoAeDcmj)|%iwcvaO!D;0T6cntcT8H`#Aua-!gLd_oV1M0c44YN zB3#?dN$k75F6quBZ{n#Q9Ee8wECc%WF;eL%@L`D$=IQrz%xOm1w%AOWAitEd{Uep& z#>`YBsxMLo8u2Poh>~_hw%3~v`LqnqmadM*X>DPM~zAkPy%%bG?-6n=S4CH*7! zta}1?FlMwMdGumth?1GU4CnP_f3xIi#F@peO)ybUvzH24U1*-FQ)?%D*>@cX1_|V&3@>K}eV%Io~S^(c>US{V!n2S7LDi0l1R; z&UR%sR`10224g<#){atDg$5*~+flBHD^dA^xU~btR&k}(^a~tq#$NRLA7-f<#XUB{ zm3(_qypVwvB8!Z~UBaj^GB}QChgwg|k>hLmQQBbCW*f*?Y*A=XqLz{t{Lp zx_e<6;2#PNP0;}+1W1mCOE@8hLTm!Rgm8O|Ujt0=J89O3q+fg28o`-{j&xW#a59!k z6<;O9r0m2~0Kg?VQiKs~j>WjmT9)PBY}*qi6M(RVrMPwwj=pPj)WoKhSnQ!(x zsVbkkO-*A8t=WG{!=PO#ALQ?vr;4naok%|+-XXTi7GV6Y6PPH;s#rI7P-(>ErG7f# zRW)d02q}kO8iGN*sU1kge&Y<;WWJg(!28HYv%S%K&}gD_T6c}FjDs<`X++AL8SD!4nD4bs0fC3Z&8ivic={A(Iq@7+9+d9 zQ|Q%<&Vd55)mVp-pl)o#xSq7wj9*vt%s9vuFlPOzStSD*t zCp_hqInArmGcqM-Qm)n6f=nt_3gc-tgc``6+9gx0Ru9SO=bLIdeV)3@d@0*Th z7-LNTdz2n)Tsr7R*%xHhvTdv~lsOf$59l7q1!k+X_4-kel{~k{(hROZk4(D4K<0=~ z%PAuBlyU3secQ}F&EC+*GP;=ud*s?e7UCJCRSaBOH!`6#a$#)06TdhfU#MhsyTKT6`Zzm_p zflT}xGtCLu+rQ;q3-@RrysuR-ZgjP1jy%P^o;6CKlJwfTdQtuKI-eRyOmNZ4FVZ7p z*>J|^H)V)IZPy14hCSmv%6?&xnT;Dj*?EC&Jf(nMB4z17PDA zFg|M3ae`Y20Q5wR8*h>#C+-btYjWa=sC*_NJr+X2C@7}%F*s^sq+_6rZmv|xd8lT4X)fUK*dE5799(nmQ7|_{*Kj>|3y^s)h`b zKVWun?LA`K-RrDK&$w#ob#-fufjS~Yop1jg2>t6>i&U7Wn=ePnDWAX2nC&jo;4>Zr z6Hu;KVg_4~P?r9DH2RFb8}1RdlD76!S2Lc7MjnZ_*JLX>SiI6_r9_lmJPOhiRYh-c zU9O^?7Y3VbZmq-KQl6FV8-x7=G;!HWKHGvH1n;nk_L zS|$RbpTof$E-ps7)*(R#Q_Aq}(8L-=N(D2E{*WaWxA%vo6qvbkd>Hdyq*RFzhZGN# z^Qxmx_pqlgy7^qakc*-!StHN2A!=v#wYpgdKDTOb$YCBTQ@)#*=q&Ff)lEQt*1Sz> zIWCbY+jm~tfoXEe_}Sgn%SLXNt|YqTV({~?Mg=f!8U3$qqo<<-w`}@sY4(u=WCyN?c!Ml&- z;S*65Vh1B^U{XTY>fPC4ALA1mHDgp(R6K8!9sV(wKL3#P;-C0nb_(}I;kX& z>c;$u^oLA9f;B7MeWl<^_H}=3ZfCr4h3F4n$r%&$+3jCulbaM{xbiFwp($OS0;uQG z{Z!???n_5Bw>427mRXb!1``uDpsL#Za>9;+ zZ7p1aFwL-$FH9e7RtB>qXW_%}+C}R~k~PauyR&r7^UknytS0N84dMto z)>x;2hkKh)5EIY6$|z^ypL}E(I8+#1ll zUKQiztY9iCBSd~zES16t0I5v@vEOB!zoPCI7U(9VaTe)k|HA$Xz+;Pt$HW<)_oIZR zI6!L+qg4JCO#N>)3PajOll!k=ieCr7v}5k?PX85;7(y`UOQlB;K>APU^rjBzDEka! z_g~4TE+EDs{G3U4H{0Kr14kg3QrLew^RHynMzA?!h1rA{jb5_e`xC;t^vbV7MSP%8G#<$wy_!fXmWXb R0tNh&5| literal 0 HcmV?d00001 diff --git a/images/pr-vuln-contextual-analysis.png b/images/pr-vuln-contextual-analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..e170ff02126e8b3b224002f43d89fcf56d97dda0 GIT binary patch literal 73664 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⪫C zUOVUarrsC~e1fC(e%+Ug*jWMt9$+lK7L6OC*QCa*_#P}rI9Ibzd;sA>!B#mV036($ zQZvJ-gi(S&hFq+HLh9GH(SSsM95&mV+$RkK6y#(T`XDSQj=^>FF|<|H?-9o8YDS;X z>R~VV1g?7*sGbR{P$X`G%y!fH3IZZO{EWwqNJ@-9I>YsRoaPC(pN`!&QxD$CvCKM~ zh)DgYwjGt}!puUv(BpZ*FNxEmy!qQy(^u;SNkfqE{Iv{^$&sRv=;=Vgl6C!>DEB)= z^N*AC5>M1x7Oe1z`)nd)oc(g5675FDTT&L<)ue|K3EwQTCdzya&F#GnB|;?Q53G?z z31>KM!!)j)oSs^?HRY8p&oexPozTqXC53+YA)w5Binty^Ak=IM%#UNEN>6f zXjP9q!~0JYkLC3!7joIG+({G)`+G3cNP?H=;$J%|NZ;?v)pl&Ul+$Yn@jFP1Y@9VT zBw%GO1_T&Bzn;c1vpDvP@p7sd=*Czv57;!$e+OOQSgN@`H{ zSID+2G#~*)_&&s>?YYFF1&vwBNhlu-g~${+`9|{l8aE$F&}ux0YoIyg^z^d{KJ@v} zByAuY6uuE~$d2eU{# z!h=9m`PPv+zs5m9q37?w`oKV;Q@j-*^>CMRwlmv8%FbTizYD}x=A!R_8%bjmqyef& zx1(}yH5^0}l|8wT=u{qq)UuQw6J1p2`Z&k+f))u#C%?SMKWfrdkgNTmMln`#4yVP{ z?xciC@p-{T1_g$7KuYeVVZ%nw?Pvm*HIB)7h(K{C+jOLG_e}^RVZMG|cyz0MzVhUV zpQYKtr7w0ksm-?QWCX+Sjlr1Yr5R^O@sk3rR`81`6Vg5yF}^G-wC;D!Y4jS$z6wtD zw<6~R$qy1CCwFH)d^7DFNAg^CKNfayI^1KLXDgGUox0R>T52nGhvpW`yV|2Ak~X75 z?@6;(?JaKQVfv<%CU(L*^@6~lg4;qh;}%u>F#)ai6W$`I!3Cc|_ImOOOs{ zA83KBd-N~;9DJI#mLFQFWDC?+giH6%PT`a*Qt5eXwC1<?76GO^0|Zq(eDQ)sxjDul*UXd-HoK?m68yJ;P#W&#NcpGEROA^8cpE!w`PQAxYv_ zeohx=RK!KOZ)MNfjNp40h!1Qbj^!r0j>&+I4$oxYt-5#do)V$(@v67>M|zXglHG*ZP0H zo5H@p-z^FIjQ{!7?;qj;ia;gLgES54uhssa8g^7?vM`{2k#k~*pOD{!eh`plQg7_ML)Co+d`XDPzAqQn_y0flKhwSd literal 0 HcmV?d00001 From cfa83a33b2ed32953084da5e6152f149944bc82a Mon Sep 17 00:00:00 2001 From: Eyal Ben Moshe Date: Mon, 9 Oct 2023 19:59:51 +0300 Subject: [PATCH 6/9] Documentation - Replace images format from svg to png (#535) --- README.md | 16 ++++++++-------- images/azure-devops-icon.png | Bin 0 -> 585 bytes images/azure-pipelines-icon.png | Bin 0 -> 607 bytes images/bitbucket-icon.png | Bin 0 -> 438 bytes images/dotnet-icon.png | Bin 0 -> 486 bytes images/github-actions-icon.png | Bin 0 -> 708 bytes images/github-icon.png | Bin 0 -> 841 bytes images/gitlab-icon.png | Bin 0 -> 520 bytes images/go-icon.png | Bin 0 -> 598 bytes images/gradle-icon.png | Bin 0 -> 685 bytes images/jenkins-icon.png | Bin 0 -> 1089 bytes images/jfrog-pipelines-icon.png | Bin 0 -> 886 bytes images/maven-icon.png | Bin 0 -> 805 bytes images/npm-icon.png | Bin 0 -> 318 bytes images/nuget-icon.png | Bin 0 -> 626 bytes images/pip-icon.png | Bin 0 -> 637 bytes images/poetry-icon.png | Bin 0 -> 597 bytes images/yarn-icon.png | Bin 0 -> 800 bytes 18 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 images/azure-devops-icon.png create mode 100644 images/azure-pipelines-icon.png create mode 100644 images/bitbucket-icon.png create mode 100644 images/dotnet-icon.png create mode 100644 images/github-actions-icon.png create mode 100644 images/github-icon.png create mode 100644 images/gitlab-icon.png create mode 100644 images/go-icon.png create mode 100644 images/gradle-icon.png create mode 100644 images/jenkins-icon.png create mode 100644 images/jfrog-pipelines-icon.png create mode 100644 images/maven-icon.png create mode 100644 images/npm-icon.png create mode 100644 images/nuget-icon.png create mode 100644 images/pip-icon.png create mode 100644 images/poetry-icon.png create mode 100644 images/yarn-icon.png diff --git a/README.md b/README.md index f760abfe0..246a6d761 100644 --- a/README.md +++ b/README.md @@ -25,15 +25,15 @@ JFrog Frogbot is a Git bot that scans your Git repositories for security vulnera #### It supports the following Git providers: -| GitHub GitHub | GitLab GitLab | Azure Azure Repos | Bitbucket Bitbucket Server | +| GitHub GitHub | GitLab GitLab | Azure Azure Repos | Bitbucket Bitbucket Server | |----------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------| #### It supports the following package managers are: -|Go Go|Gradle Gradle|Maven Maven|npm npm|Yarn Yarn| +|Go Go|Gradle Gradle|Maven Maven|npm npm|Yarn Yarn| |:----|:----|:----|:----|:----| -|.NET .NET|NuGet NuGet|Pip Pip|Pipenv Pipenv|Poetry Poetry| +|.NET .NET|NuGet NuGet|Pip Pip|Pipenv Pipenv|Poetry Poetry| ### Why use JFrog Frogbot? @@ -51,15 +51,15 @@ JFrog Frogbot is a Git bot that scans your Git repositories for security vulnera Set up Frogbot on your preferred CI server: -GitHubActions [GitHub Actions](docs/install-github.md) +GitHubActions [GitHub Actions](docs/install-github.md) -Jenkins [Jenkins](docs/templates/jenkins/README.md) +Jenkins [Jenkins](docs/templates/jenkins/README.md) -jfrogpipelines [JFrog Pipelines](docs/templates/jfrog-pipelines/README.md) +jfrogpipelines [JFrog Pipelines](docs/templates/jfrog-pipelines/README.md) -Gitlab [GitLab CI](docs/install-gitlab.md) +Gitlab [GitLab CI](docs/install-gitlab.md) -AzurePipelines [Azure Pipelines](docs/install-azure-pipelines.md) +AzurePipelines [Azure Pipelines](docs/install-azure-pipelines.md)

Optional - set up a FREE JFrog Environment in the Cloud diff --git a/images/azure-devops-icon.png b/images/azure-devops-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6e1d2c40a9783a308bfdf784a83ed14acb91f1 GIT binary patch literal 585 zcmV-P0=E5$P)nO%yH4NO~WMKmbwspVPNK- zbKd9PJNIzGR3rIbh6{bh`H?K+Ol2#gW4MJ!c)^y91>6XBfF6rT{rs>daDyWzrP4C$ z=8pn{Kp(KVAzA^wOPlimPeOBmH`UJf+GRwq0cnFtjw4(l<9q>Na3aaJ_73c@6Ahge zz@6YQp>-X&1eoseN02wbc(jFSU_Y>F^$LcHU0C7E`aq1zKn}>EDC6HU zZ?yk_e;V-aZvvJ&`S#R4?Al3`GNSWf&(K!=fY-Tb?9`-_r6K7Q@B*--kvX6gJ!Q~Y zuu7mMLMf9?&8`gqFr0T0GKTY>2WEixKo2qhH0C}~VI=Vl@%qbG3S{(o; z>k@U1<`s~Be8-DFrlW_xVe1*-Gq6CI*aKVzo&!HyS_@why75zwmp)s`EgVPm85w8i z^4QJdE)umKM9u@R*t=+ zkZ@l!=7D>$Yv*vH#$q!$(h?K6ClX&0BZw-hc4;`O8_;_St#~)sqf)!Oozl+XH1J=w9)W7 z&A}=y_w&-vHGvBP70zWv)}#gU%AYxw)ZBab@KS~4|0b+EeN2tFNUMF5yC08_`Wf>F z4XydlF7~oqZK+>rbw|EU!0Z0P`oP-FC*-Ep=2&;xb9Jjf?^`+V{p?-$dlNJO)VuwUNmStIt@K*8`ib0PyAMkLYi#-WdF6+j!V{G$|1#cl dnxOi9e_vKq<(Am%>Ok)@c)I$ztaD0e0swSM6Y&55 literal 0 HcmV?d00001 diff --git a/images/bitbucket-icon.png b/images/bitbucket-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c5c23fa3839c59f2d6ab8cf22fa90c895b3ffdfe GIT binary patch literal 438 zcmV;n0ZIOeP)Sa}wP5CyI5(wfwEzJZNp8ec)M zu<-?=Z(u84C*B1MA!4m45)hLcizHr5b`K=CTiwn-_kX*y%Pe>vLjCR>k%||0l_&tI zqbz#?peqI?@na4si9sax1`vr2svZHF7>q|isp|#0~q55sFp!xD&ABBy5VN)*baLAyb>+Yh}Nd!_t7da?*^n}JGidC0PoIZEa#x) zl!q?ib_XCBE>j_D13T7q<%ol5eImG*18CEfbPNE4nHwbw*njcXeVPU!3NriaCOmSp-y2PXKcc3mh@2pl gW@P)ugK~zYI?UFr9TtO6upEJ9OMYi!*sBun9!`2k8{N0ShH=okoy#cSpex{6M<|(!?O%J12#!?rv@*TP4Ll-8*N_`_7pe z=+Wc9M_NVEHpYQm-r2=@#9yt4LH(6c`LybSt?=P)D8}D!vAFQCVbEu30ohie@EUkf zwYxEnrE3e7IfXK?CC0x1o`CE(yMBtw9wMct&I8{-PJat%awzDVQlT2H>VaF35LLsfbDiWaqYkv^N0Y%=o!nk}Y1KWkF)loAbkQ-bzw2ftf=j|1JJZc+X zu2h^!hSzF^gVX?2CJh{4N}2H{Y5SUzWTr9x1KwQTwefFBGRtjy&ilUJ2tVmXkGdMO cM~{EYFWJtH)ix?J;s5{u07*qoM6N<$g65OuTL1t6 literal 0 HcmV?d00001 diff --git a/images/github-actions-icon.png b/images/github-actions-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..76e750fc656676732839dd5b154996c5cd4c1003 GIT binary patch literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA{R!|1aRt&04gZa2{ul55uifxp zz4O0H!+)iY|1y35rQ80?0=b?46+8bcw}MEZxI+7X`Og1xKz2JwL=nhs`!C<|U#aWA zVh2b>0jQ?)zdTSJrT`=YWJAQkrU6BOhJX}n@uBy&qH(0<>*pU3 z7#tEB5g8Ysl~Yk&Ti?{u+Sb>t$X($Jbd){+4GN| zK7aZ7Yqo(28_;ydByV?@;Hq?4Acs-H)5S4F<9z8v?%*Z|kyig>Qa4YxXegYV_icf? z6j$WTz=#*m{{5G~{7y$??d7>Ut)IW!UjA%OBtu#Mr2_Wi(y3J~ChhyG@|XX5_>t+$ z#$A^`f4Ev1<^DR3F_@{XnSZ@iAcJT^{+|6)G!=4^#BA~pyw+M^cctG?>w^2Vtk)*F zp{wt`NV4k?-LxkApzH;9_cObhrEUKNSseNR&%A3;7LgpK4lHD2vuBXK_ zS!H^m(RB}Y$JKbLh*2~7Z=9adHV literal 0 HcmV?d00001 diff --git a/images/github-icon.png b/images/github-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5a48ed78a58dea6850d7cadf76c724481ee204df GIT binary patch literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbQ|PfiX3}C&U%VMFZN}+A1n43JMA` zGBQ$9Qlg@wA|fI}LPCOqf2-F1;M^*`812qDr;B1IWWYgeUK+3=>Aju|6j=cay>AVOG|?Mf*BZ@m|0la*f}`4czF5vMWmz^ z6qS^t;^LE%)6z3CvvTwD3yX?ND=O<7n%XUZZtaxF(Drb;l1s{a-*5M#H+{c1TgABQ z-~RQB^`7s@Un;`eW@hfp+**{iQ|aZV$ofC(H)O;$R@yW-=_QZ*$+`r#i z7wUXmyG?n=M-M6XswKPby;}5W);_OH9*L=Y-aBm1X=^lJf6Krv#kf`Q0^5fN(|Xl; z*1Tq$G0jn(cKDTn!h*^F4O(2~^N%SA7tfexP<&j?tk5E1wy*0d*NJ*XmjC z**~c$ZNH(`67Dpq#e4GDQ%c^|PAbq_X?HHbnP*lC%Z8fkry`yl4!64ablSt?n-;Kq zXKerZYpVC5b>7p?m?o9?>q%BhXy+~6V(;9>BX6_yl-lleOW(Hat;)gEzopr0GN{TdjJ3c literal 0 HcmV?d00001 diff --git a/images/gitlab-icon.png b/images/gitlab-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e24535a0f81d7621d5ee1ddfad4c805853e3ce10 GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA?F#S-aRt)?1ypFH(HxvGD1fu!2sT=l;> zYJYRo{{q>0svriC3lawks{PJU|DCG_(*o3}2GsH=2TX#rgG>M$q6Sh1LO^37vdAP< z8C>fB|NlK}Hm(P{-linTFPMRmiJg~UKu}svK}lEN(AeDBKPWmbGb_Kiq^zQ46xfnB!$|HrD`m@4}8t?v2W+g>|1US995H^t() zm-bC-f3GPuIT|mRcXyR#z0f|X6ymg)BvWxzVd0%^1UJ_sCe>Zv8Wx-|6D-ReaNwn!NI-aB%NXtm3Glma1?QiF+ZAQ2v||jN~$R(`HsW)QIesyV~4!c<=pq2 z_rB-lLK|&td&rhpiOfEXbrI1$C{;RSo~yxXE9Y~V4!aK}vL<4sn0aYQD9l%JFptp#~BNd$+SVvx;rfNaH==0ewcpcaylkMk;p!l^_jW z#9{^*0{Mb5!;Bs;lF0b5thc}*LSC57Mlj+9s@U3v5rf(l)VhS|ec%r}Rt~VXD+p$K zeXWXxaLO?!QDT7?>*kZ$>mbuW&BIt|&Izf~iM29;DyS(V>UZhChz$KDnY-h>)Oy{2wHWJy`W&L=S?NsQVU)`)e(nRQ4=t22fSR kye8IP+H`IkZEPR>15iz_2|;D;Gynhq07*qoM6N<$f;}h+l>h($ literal 0 HcmV?d00001 diff --git a/images/gradle-icon.png b/images/gradle-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fdcd8ba3373d902eea876a4eb835cca5f460e00a GIT binary patch literal 685 zcmV;e0#f~nP)ig}b=# zx$pa&?_3W2R~ku1TB@qD)a5jr(Ex~GPn|c@%D}*EMgUq-a~-4^7y}A`Jb^d9o8GIL z0Jt1?$(feA;b4XHA_Zph*kG4x?)lUcRMwZOMH|heT7?3@bMRSUP#rI#qrvBZOPVdO z+pX&QfDcOnm32EkT$>s7X*NCq*6v)mozc=Uvve}%2v@}9|1n6jEY&!ZC|A0)JRf~q}hJr`*-ldfd|0HVwtQ#KGqc!$|mkd*)! zZ3{oSytYK$%pj&B*z1I%2*?Fsa*=CtO~j7I-U1jq;>v$J^RLcLP*#(tS-b@)0=}rY zCTIEtP+(k5PWsqs5e_DqVhUK5Xo_*%9|?8@05n@#Fp6Spo1A$^L^xn(`KmVI9Crk^ zr8uS~<-lcsB-jBUR8$u#`Vj~ud^8FC1d3A>CzB6$)(!XG`fCIfJ)EQ*V14Xat|B6G z$R7%J$D3-f?;lE1%ed$dz3NW1RiGpT_1~OL-%Pfkz?uvI9xS=daexI0A%t@Rr;^-- zUtlc)$3X4^HXk#4nTi|$z5<27l$#CIGS(9UVEg_q&Hd2_RLrrh$sg{$7t3{OWzBa? z&H#wor&It1c_=V|aC^QSVEj=;gew9AhCK6&^Y6z8ozN=KFVG(~#!~_QE3N(jS~J(` TyT1ka00000NkvXXu0mjf`2{V- literal 0 HcmV?d00001 diff --git a/images/jenkins-icon.png b/images/jenkins-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..81fd5a908250ace1e52f706c2e732f9caa3454ca GIT binary patch literal 1089 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbQ|Pf$>U!Plzj!`yYrJ7*>Ub?ssrF zV{CjiRQtB4=Y1gC*Z88F-fd6wGcLyG0~{`S+gx?GyzXoU6hG%_d)d$Yn!D{eSL=(O z=GVNeAhPFu%rAJEUG%WN;3@8g^cv@ca zumGt68t!Fr5iAR|3#1Ha0!Rv|1uP3R8Egnp%_X2Nka{Z!1E>tF25c0Gs1dP{NB|(0{42(?7EUawo99-Od z`~reP!Xl#Ll2S7AN-C;q>Kd9_x`sxkX69DbHg*nwir zNhz6G*}3_JMa3nhE_r(oNTip?XUnS?Ns- zwXE4SIk1!MrcwRc?+hBR=SKehQCqi!i$P=ljM&`%pvrf}^&AZaH5(S%%X9GeGa6JW zR7o|s&t(YJKKR){^{nNF|7YhXEhyQlY;@+FxGn1j!>Z-nJ8By3^wu(-sO9hpxyJ}onw zZxhDm@YLAz!PT}!0teK(E>Ak}Gi8b70=tXXLoeQ7Y+mz=i+dOR!d%N#&2MPj3ocB08?Dw=g=;pH9#c8h>h_MIA@O0Sk z4wQ1-=i#^ysM5{upbHQ=?RB@`0~B#{*zW>H9zbRGd)yrNx!CUolCD6-a4q(GL0q6- z7y@!ZYIJISR5*d#{U2Rf3WBo zFJLUxmjw9*GcYo-u(EM*ar5#C3WOP8-)yME{1gGY~_zk2=V?YobkK7afE^Vjb`fB!B2^x^~1DU3l#EVx|~*GdgU_o2gSLu5l{8w_oqv%b@A| zcIMZG-Z**0q*kT>mbB>-?V{6-z!^54-J2}dv0Q$Ht?6huJ3>HEkHK8|ruc)?8p>#j^Jh&(D3vBKMeu(w_W1{9~ER z*%NP#xT5!TwfKDxa~GS{?SHY$N%(`O%GteBUV3gi@;uOUp==P(sW{sk)4t_N`Pp-M zT$JltvwiTTOO#HgrtCY%}k;e4Ew3ldn!4;IeRK^V`R;K;I>5K}Lo=C72*RQ!$XKBy3vIz7ntC} zoiVPBTQ|l;-5C>OjM0QdjgLRTl_)`Kv5<&jj1g1<^${tGKoi=|anV5@Ew!R&GdI6; z=J(AxbMJ+D5vpi98?qY5x+@!xv5W{;G}gaZQx}-884D^z4*{!0xz=6PydhuXh-DW( zvl?$Z!t*J!;MURrr~sw`AC8k(7ZJ-YOQ@$qp%q98?9T-#asdc5=VgxZ2+_>~lYl8O zlnY>jrqWBT&Sl;a+_y4;`4D6iFs@Jxpl~M_U`CLi?%E%*?82;HZrfhJclrUa3wQ;r zbyIKEFfZo-=%j+%0fD4?j%NcTKAD#k4gz7I&Xwa}w6%swsEctlYZ2>=sm9vc^!TXwA|SAZ#C94L2FqbbjdC)v7P08n&L zl=Z-%D+N2tcLo9O(Q1mA?LYt|1T@XQrpSf8!(HQl1W3AV1DJ88Iya{U9c)F)^fl_h@(|U-Kma0Nqv1m4@TAiRjIy(Vnrt zF`XY7|6n$}iKGu0oAwq?E!R9JASqfi99`G$PsDfpcR-KTuvQIye}wxfG;<^TGr+;9 jZi)830Z^4?&mZ6yo=y8RHy`0(00000NkvXXu0mjfO0Q;F literal 0 HcmV?d00001 diff --git a/images/npm-icon.png b/images/npm-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ba53670244881a0208fe4ed30988f167d2d377c6 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAB?S0{xB}^8mX>FXjW6oyowK$+ zWomlH#`v6-)o}}p)0UQJ&CSnPngP*iAPE#PHwU6qmgc7|%uWNj77zxI1c`&WDCGbD z{~PY^-4C=wt|Z7Wn1PdvTS`_=Uct~fG%7hIExWG1;mo;9Pv3v|_~q;0rpY=!K$VP1 z-tI2)th@qyft(~y7sn8d^II?8Ii@Rt8mz~4Gh?@2{O{^R18!xa1G0SqUwpL+_YIq?p@$_b!g{S2Y hxuq{-8P#2{S|^`0WPL5RpcQBvgQu&X%Q~loCID*YcNqWx literal 0 HcmV?d00001 diff --git a/images/nuget-icon.png b/images/nuget-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..876cde6232a60e2d2fc7b46c2c98befa9535d27e GIT binary patch literal 626 zcmV-&0*(ENP)dl%WR1fx05fPzMut_}_#hV~_ zP(efxs)8a;8!TuKQZFjli|9cGFN!ho>n2_VL2LyJ-m11*L=j9w_Ib!A8lC+R^M_@3 z-W&eEnR#zmVc=|%*77kF#bunLnWKq{5ij3H*#dw=AF#EV00&rKA1S@fG_L_B>m%W6 zvjGA?dUO-wDtYtVI%{BTIf=z}xRUgDk~w1TYwns)e*^rK$)(WBd0+?75@Ep=;2z2_ z1v3*27#iJ(>)r?2BN#VI`GT^YqIqTqWX&>uFb#A9uMqMmtAO29>lQBIBTk|xW=)nj z;+a2Ue&rA^4weDPjO;=6dc<8MaZ5+-t5LE5xJ=Z|0rF>V0JD(*RqgcK?rH!W%W+7g zVppZ4`~XY5_b~mYtsc#o11SEjYVolbIc-Wnt2defiYQ$OX~J6j57~>{sBWM;z;?=e zI)KeU{9gfn`UV{0f%(-{+j3nvm7BnZS}0mi+aw%rFb61}en*8Yu<(BX;VpS{&6;~? zW`QeVfJz`hc@vzM>6(up;6tDRA+0KOdSCDTZt~L*Kpz>i)|$y&OrW~Y^Lb(i2onS! zlY?@LOfJ;|S-1wgG$xCPAhUI#AsUtnpTVih>yn`QeQ0 zM|B)n8Up%VUr|m_Fqa|9wI4L?z%GPdU`4>pc|=~a7{9~glb>tBpQ;C!*F(FE#{d8T M07*qoM6N<$f(`Qzx&QzG literal 0 HcmV?d00001 diff --git a/images/pip-icon.png b/images/pip-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..47a622608076ef29b85d4c3d2f54a58399fb0f13 GIT binary patch literal 637 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAy$$dQaRt&04Gp28s~j5UTbFG# z&s}0$xyq_!oq5$VtKzj570XRZ)>)RXGA&(YS+T~Vbgg;WDznlx7G>02KhW02xRm z&>S!qL|QrG6BQGeSJ2Tl zFf(=kwy>I`aBgc-PIeYH>#Y>m3T)lDo z&hr;9U%!3#@za-YzyJLGS9D|hOQ6AwN#5=*ev*lW_ko?}w$#uNEgY6B^qaCUmy7658=C3t4yjIT5bW-2(iEHkHOLw`LU;GN;Tm4VEq*t;y o^N1YJ?70ucXV%!sgiQF&-W`;&iD9Ce5YWR6p00i_>zopr0I13vm;e9( literal 0 HcmV?d00001 diff --git a/images/poetry-icon.png b/images/poetry-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e11406f6461a7a3e6e9a0ac12bd28bd78b7a0c32 GIT binary patch literal 597 zcmV-b0;>IqP)H;RIwC=P-_5Tr;W2x1rg101b{zELZp z;^5f5wu4)6aB7RSwMj)BMHH=esScSORIr0fv527fT9ez{$0dPqo16D%I_EhLzt27Q z!WHEj%N3_FuF!=txHCVTxB=ioXMce|9SgEwm1P*%1r&jA9p$6-C;(tD;Dc?n3pmrq zdH}#dkPoc2kza~?@q8ly;4lye-n9tir_=h;3;=MXjI1`BE_hhIZv+4wld%u6(!}h) zn7mx80491c4jA^h{vh+SL;BJ(P_E-bNi!B}XY<>|{K;^?6#$@DB88aQ9;BOh2X}w& z6aYwJoCY$LhTv6lEuN`09B%^vNXhWPCQTaNDtQAF6AHQsV4_EGs#Nk$+#gls|Erx> z1b~bWCAq0s%%8oQv;Ex$ayVUgW=p_8(fs8oq*dS(SU*PI%$@c#CPpiRHlTsNfm|eG&7UG8?@&vg1+sK$XSi>}E1> z@k6#n!YJ)=E|xOvEN}+c8Fe*7>n73*L*AQO=c?X}Weev)4*)MJusT~XQ#5ZpJEEUa zLkc%8Efy}Alxu*j2GV%cQ`ZFmF6IjTGA)IWz_2IIxm$CC-s?uebpa^f#JSs;y~OOP j5{c(?X?<-rxKjTC!^EzJEoe8000000NkvXXu0mjf>-6r_?Afc`ze~4omv-+S-Tpl~J$tk#?AGoBviIut?$YVst<$?lyKkp9oDEV8 z6x^i?65j*XyBnme4lBNL(-*S%EIdZDgYV|NpN%u6_>~aH%Che!&c)l2Xz# zvhvpUjxMh59-dy_KE8fI;gL}>=~>x1x%ovUW#yIC^-V2pT|K=MCQg|-YxbN)i*EN?Go?bM2 zVYcu7_y0w2&AfSh^S$Xd3tf)B`})Q!MtOh2xyE+!V;Kh$J|tRI`t&K@Q91b_VBT`$ z2|N7ODKvjFxNUH)USR`+;8Vp~9rg1cHw8D9c!<1mu9&@}`E{E3q{V?uLH|S!UA3EH z5jjDtTELGh;MA3tkY1-5=>bwl6t*bOFNj_8An}MoiVnwC)(QzzMV&fFuXyLo39RDM z?Lq#J45L{CmRZEy6cQ1Oi_-Ml%Vc=z7ekP)#@nmQzn?u}F4Oyh!@-a@uKB>WbUn)n z%8MA7{~g-SZua4JRQH^NS0z=aA8h<}EX>5pa{7+;1ErI|KIlL9;Bx1s10L5J+vWQw l%@^DLChxl5ag(5bj2cH~pBK9^haVV#44$rjF6*2UngD-Zb58&O literal 0 HcmV?d00001 From ecc39f6c1e7358bc97ee1f229c2e5b90022a214e Mon Sep 17 00:00:00 2001 From: Assaf Attias <49212512+attiasas@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:03:00 +0300 Subject: [PATCH 7/9] Avoid the deletion of existing PR comments (#537) --- .../workflows/frogbot-scan-pull-request.yml | 4 + docs/install-azure-pipelines.md | 4 + docs/install-gitlab.md | 4 + .../frogbot-scan-pull-request.yml | 4 + .../jenkins/scan-pull-request.jenkinsfile | 4 + .../jfrog-pipelines/pipelines-dotnet.yml | 4 + .../jfrog-pipelines/pipelines-go.yml | 4 + .../jfrog-pipelines/pipelines-gradle.yml | 4 + .../jfrog-pipelines/pipelines-maven.yml | 4 + .../jfrog-pipelines/pipelines-npm.yml | 16 +- .../jfrog-pipelines/pipelines-pip.yml | 4 + .../jfrog-pipelines/pipelines-pipenv.yml | 4 + .../jfrog-pipelines/pipelines-poetry.yml | 4 + .../jfrog-pipelines/pipelines-yarn2.yml | 4 + scanpullrequest/scanpullrequest.go | 63 +----- scanpullrequest/scanpullrequest_test.go | 202 +++++++----------- schema/frogbot-schema.json | 5 + .../config/frogbot-config-test-unmarshal.yml | 1 + utils/consts.go | 27 +-- utils/params.go | 25 ++- utils/params_test.go | 48 +++-- utils/reviewcomment.go | 96 ++++++--- utils/reviewcomment_test.go | 111 ++++++++++ 23 files changed, 381 insertions(+), 265 deletions(-) diff --git a/.github/workflows/frogbot-scan-pull-request.yml b/.github/workflows/frogbot-scan-pull-request.yml index 998c8c91f..af70ce92c 100644 --- a/.github/workflows/frogbot-scan-pull-request.yml +++ b/.github/workflows/frogbot-scan-pull-request.yml @@ -94,6 +94,10 @@ jobs: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" diff --git a/docs/install-azure-pipelines.md b/docs/install-azure-pipelines.md index 49e10504e..e102ee880 100644 --- a/docs/install-azure-pipelines.md +++ b/docs/install-azure-pipelines.md @@ -288,6 +288,10 @@ jobs: # [Optional, default: "FALSE"] # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. diff --git a/docs/install-gitlab.md b/docs/install-gitlab.md index 99b95a540..b6fed70aa 100644 --- a/docs/install-gitlab.md +++ b/docs/install-gitlab.md @@ -110,6 +110,10 @@ frogbot-scan: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" diff --git a/docs/templates/github-actions/frogbot-scan-pull-request.yml b/docs/templates/github-actions/frogbot-scan-pull-request.yml index c69d2dd72..be29c480e 100644 --- a/docs/templates/github-actions/frogbot-scan-pull-request.yml +++ b/docs/templates/github-actions/frogbot-scan-pull-request.yml @@ -95,6 +95,10 @@ jobs: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" diff --git a/docs/templates/jenkins/scan-pull-request.jenkinsfile b/docs/templates/jenkins/scan-pull-request.jenkinsfile index 754a31d80..f925ee8ed 100644 --- a/docs/templates/jenkins/scan-pull-request.jenkinsfile +++ b/docs/templates/jenkins/scan-pull-request.jenkinsfile @@ -107,6 +107,10 @@ pipeline { // Displays all existing vulnerabilities, including the ones that were added by the pull request. // JF_INCLUDE_ALL_VULNERABILITIES= "TRUE" + // [Optional, default: "FALSE"] + // When adding new comments on pull requests, keep old comments that were added by previous scans. + // JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION= "TRUE" + // [Optional, default: "TRUE"] // Fails the Frogbot task if any security issue is found. // JF_FAIL= "FALSE" diff --git a/docs/templates/jfrog-pipelines/pipelines-dotnet.yml b/docs/templates/jfrog-pipelines/pipelines-dotnet.yml index 353cc239d..426b726f0 100644 --- a/docs/templates/jfrog-pipelines/pipelines-dotnet.yml +++ b/docs/templates/jfrog-pipelines/pipelines-dotnet.yml @@ -126,6 +126,10 @@ pipelines: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" diff --git a/docs/templates/jfrog-pipelines/pipelines-go.yml b/docs/templates/jfrog-pipelines/pipelines-go.yml index f8f5954d7..b5593a463 100644 --- a/docs/templates/jfrog-pipelines/pipelines-go.yml +++ b/docs/templates/jfrog-pipelines/pipelines-go.yml @@ -119,6 +119,10 @@ pipelines: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" diff --git a/docs/templates/jfrog-pipelines/pipelines-gradle.yml b/docs/templates/jfrog-pipelines/pipelines-gradle.yml index 8915bfc69..c71776c29 100644 --- a/docs/templates/jfrog-pipelines/pipelines-gradle.yml +++ b/docs/templates/jfrog-pipelines/pipelines-gradle.yml @@ -119,6 +119,10 @@ pipelines: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional] # Frogbot will download the project dependencies if they're not cached locally. To download the # dependencies from a virtual repository in Artifactory, set the name of the repository. There's no diff --git a/docs/templates/jfrog-pipelines/pipelines-maven.yml b/docs/templates/jfrog-pipelines/pipelines-maven.yml index baf0c8d89..a68a7fc24 100644 --- a/docs/templates/jfrog-pipelines/pipelines-maven.yml +++ b/docs/templates/jfrog-pipelines/pipelines-maven.yml @@ -129,6 +129,10 @@ pipelines: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional] # Template for the branch name generated by Frogbot when creating pull requests with fixes. # The template must include {BRANCH_NAME_HASH}, to ensure that the generated branch name is unique. diff --git a/docs/templates/jfrog-pipelines/pipelines-npm.yml b/docs/templates/jfrog-pipelines/pipelines-npm.yml index b6d0171c3..99b8ecf4b 100644 --- a/docs/templates/jfrog-pipelines/pipelines-npm.yml +++ b/docs/templates/jfrog-pipelines/pipelines-npm.yml @@ -126,6 +126,10 @@ pipelines: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" @@ -140,18 +144,6 @@ pipelines: # Relative path to the project in the git repository # JF_WORKING_DIR: path/to/project/dir - # [Optional] - # Xray Watches. Learn more about them here: https://www.jfrog.com/confluence/display/JFROG/Configuring+Xray+Watches - # JF_WATCHES: ,... - - # [Optional, default: "FALSE"] - # Displays all existing vulnerabilities, including the ones that were added by the pull request. - # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" - - # [Optional, default: "TRUE"] - # Fails the Frogbot task if any security issue is found. - # JF_FAIL: "FALSE" - # [Optional] # Template for the branch name generated by Frogbot when creating pull requests with fixes. # The template must include {BRANCH_NAME_HASH}, to ensure that the generated branch name is unique. diff --git a/docs/templates/jfrog-pipelines/pipelines-pip.yml b/docs/templates/jfrog-pipelines/pipelines-pip.yml index a58ad8b61..b6d0e5099 100644 --- a/docs/templates/jfrog-pipelines/pipelines-pip.yml +++ b/docs/templates/jfrog-pipelines/pipelines-pip.yml @@ -132,6 +132,10 @@ pipelines: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" diff --git a/docs/templates/jfrog-pipelines/pipelines-pipenv.yml b/docs/templates/jfrog-pipelines/pipelines-pipenv.yml index ae7075137..9ba8c68ed 100644 --- a/docs/templates/jfrog-pipelines/pipelines-pipenv.yml +++ b/docs/templates/jfrog-pipelines/pipelines-pipenv.yml @@ -125,6 +125,10 @@ pipelines: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" diff --git a/docs/templates/jfrog-pipelines/pipelines-poetry.yml b/docs/templates/jfrog-pipelines/pipelines-poetry.yml index 23c206359..22862732f 100644 --- a/docs/templates/jfrog-pipelines/pipelines-poetry.yml +++ b/docs/templates/jfrog-pipelines/pipelines-poetry.yml @@ -125,6 +125,10 @@ pipelines: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" diff --git a/docs/templates/jfrog-pipelines/pipelines-yarn2.yml b/docs/templates/jfrog-pipelines/pipelines-yarn2.yml index 75afde306..980b7861d 100644 --- a/docs/templates/jfrog-pipelines/pipelines-yarn2.yml +++ b/docs/templates/jfrog-pipelines/pipelines-yarn2.yml @@ -132,6 +132,10 @@ pipelines: # Displays all existing vulnerabilities, including the ones that were added by the pull request. # JF_INCLUDE_ALL_VULNERABILITIES: "TRUE" + # [Optional, default: "FALSE"] + # When adding new comments on pull requests, keep old comments that were added by previous scans. + # JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION: "TRUE" + # [Optional, default: "TRUE"] # Fails the Frogbot task if any security issue is found. # JF_FAIL: "FALSE" diff --git a/scanpullrequest/scanpullrequest.go b/scanpullrequest/scanpullrequest.go index 9beb54582..98d19c5f6 100644 --- a/scanpullrequest/scanpullrequest.go +++ b/scanpullrequest/scanpullrequest.go @@ -6,10 +6,8 @@ import ( "fmt" "golang.org/x/exp/slices" "os" - "strings" "github.com/jfrog/frogbot/utils" - "github.com/jfrog/frogbot/utils/outputwriter" "github.com/jfrog/froggit-go/vcsclient" "github.com/jfrog/froggit-go/vcsutils" "github.com/jfrog/gofrog/datastructures" @@ -24,7 +22,6 @@ const ( securityIssueFoundErr = "issues were detected by Frogbot\n You can avoid marking the Frogbot scan as failed by setting failOnSecurityIssues to false in the " + utils.FrogbotConfigFile + " file" noGitHubEnvErr = "frogbot did not scan this PR, because a GitHub Environment named 'frogbot' does not exist. Please refer to the Frogbot documentation for instructions on how to create the Environment" noGitHubEnvReviewersErr = "frogbot did not scan this PR, because the existing GitHub Environment named 'frogbot' doesn't have reviewers selected. Please refer to the Frogbot documentation for instructions on how to create the Environment" - frogbotCommentNotFound = -1 ) type ScanPullRequestCmd struct{} @@ -99,6 +96,7 @@ func scanPullRequest(repo *utils.Repository, client vcsclient.VcsClient) (err er return } + // Output results shouldSendExposedSecretsEmail := issues.SecretsExists() && repo.SmtpServer != "" if shouldSendExposedSecretsEmail { secretsEmailDetails := utils.NewSecretsEmailDetails(client, repo, issues.Secrets) @@ -106,24 +104,7 @@ func scanPullRequest(repo *utils.Repository, client vcsclient.VcsClient) (err er return } } - - // Delete previous Frogbot pull request message if exists - if err = deleteExistingPullRequestComment(repo, client); err != nil { - return - } - - // Create a pull request message - message := createPullRequestComment(issues, repo.OutputWriter) - - // Add SCA scan comment - if err = client.AddPullRequestComment(context.Background(), repo.RepoOwner, repo.RepoName, message, int(pullRequestDetails.ID)); err != nil { - err = errors.New("couldn't add pull request comment: " + err.Error()) - return - } - - // Handle review comments at the pull request - if err = utils.AddReviewComments(repo, int(pullRequestDetails.ID), client, issues); err != nil { - err = errors.New("couldn't add review comments: " + err.Error()) + if err = utils.HandlePullRequestCommentsAfterScan(issues, repo, client, int(pullRequestDetails.ID)); err != nil { return } @@ -438,43 +419,3 @@ func getViolatedLicenses(allowedLicenses []string, licenses []formats.LicenseRow } return violatedLicenses } - -func createPullRequestComment(issues *utils.IssuesCollection, writer outputwriter.OutputWriter) string { - if !issues.IssuesExists() { - return writer.NoVulnerabilitiesTitle() + writer.UntitledForJasMsg() + writer.Footer() - } - comment := strings.Builder{} - comment.WriteString(writer.VulnerabilitiesTitle(true)) - comment.WriteString(writer.VulnerabilitiesContent(issues.Vulnerabilities)) - comment.WriteString(writer.LicensesContent(issues.Licenses)) - comment.WriteString(writer.UntitledForJasMsg()) - comment.WriteString(writer.Footer()) - - return comment.String() -} - -func deleteExistingPullRequestComment(repository *utils.Repository, client vcsclient.VcsClient) error { - log.Debug("Looking for an existing Frogbot pull request comment. Deleting it if it exists...") - prDetails := repository.PullRequestDetails - comments, err := utils.GetSortedPullRequestComments(client, prDetails.Target.Owner, prDetails.Target.Repository, int(prDetails.ID)) - if err != nil { - return fmt.Errorf( - "failed to get comments. the following details were used in order to fetch the comments: <%s/%s> pull request #%d. the error received: %s", - repository.RepoOwner, repository.RepoName, int(repository.PullRequestDetails.ID), err.Error()) - } - - commentID := frogbotCommentNotFound - for _, comment := range comments { - if repository.OutputWriter.IsFrogbotResultComment(comment.Content) { - log.Debug("Found previous Frogbot comment with the id:", comment.ID) - commentID = int(comment.ID) - break - } - } - - if commentID != frogbotCommentNotFound { - err = client.DeletePullRequestComment(context.Background(), prDetails.Target.Owner, prDetails.Target.Repository, int(prDetails.ID), commentID) - } - - return err -} diff --git a/scanpullrequest/scanpullrequest_test.go b/scanpullrequest/scanpullrequest_test.go index e7beeb9fe..6cf837db6 100644 --- a/scanpullrequest/scanpullrequest_test.go +++ b/scanpullrequest/scanpullrequest_test.go @@ -461,25 +461,6 @@ func TestGetNewVulnerabilitiesCaseNoNewVulnerabilities(t *testing.T) { assert.Len(t, licenses, 0) } -func TestCreatePullRequestMessageNoVulnerabilities(t *testing.T) { - vulnerabilities := []formats.VulnerabilityOrViolationRow{} - message := createPullRequestComment(&utils.IssuesCollection{Vulnerabilities: vulnerabilities}, &outputwriter.StandardOutput{}) - - expectedMessageByte, err := os.ReadFile(filepath.Join("..", "testdata", "messages", "novulnerabilities.md")) - assert.NoError(t, err) - expectedMessage := strings.ReplaceAll(string(expectedMessageByte), "\r\n", "\n") - assert.Equal(t, expectedMessage, message) - - outputWriter := &outputwriter.StandardOutput{} - outputWriter.SetVcsProvider(vcsutils.GitLab) - message = createPullRequestComment(&utils.IssuesCollection{Vulnerabilities: vulnerabilities}, outputWriter) - - expectedMessageByte, err = os.ReadFile(filepath.Join("..", "testdata", "messages", "novulnerabilitiesMR.md")) - assert.NoError(t, err) - expectedMessage = strings.ReplaceAll(string(expectedMessageByte), "\r\n", "\n") - assert.Equal(t, expectedMessage, message) -} - func TestGetAllIssues(t *testing.T) { allowedLicenses := []string{"MIT"} auditResults := &audit.Results{ @@ -615,94 +596,6 @@ func TestGetAllIssues(t *testing.T) { } } -func TestCreatePullRequestComment(t *testing.T) { - vulnerabilities := []formats.VulnerabilityOrViolationRow{ - { - Summary: "Summary XRAY-122345", - ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ - SeverityDetails: formats.SeverityDetails{Severity: "High"}, - ImpactedDependencyName: "github.com/nats-io/nats-streaming-server", - ImpactedDependencyVersion: "v0.21.0", - Components: []formats.ComponentRow{ - { - Name: "github.com/nats-io/nats-streaming-server", - Version: "v0.21.0", - }, - }, - }, - Applicable: "Undetermined", - FixedVersions: []string{"[0.24.1]"}, - IssueId: "XRAY-122345", - Cves: []formats.CveRow{{}}, - }, - { - Summary: "Summary", - ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ - SeverityDetails: formats.SeverityDetails{Severity: "High"}, - ImpactedDependencyName: "github.com/mholt/archiver/v3", - ImpactedDependencyVersion: "v3.5.1", - Components: []formats.ComponentRow{ - { - Name: "github.com/mholt/archiver/v3", - Version: "v3.5.1", - }, - }, - }, - Applicable: "Undetermined", - Cves: []formats.CveRow{}, - }, - { - Summary: "Summary CVE-2022-26652", - ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ - SeverityDetails: formats.SeverityDetails{Severity: "Medium"}, - ImpactedDependencyName: "github.com/nats-io/nats-streaming-server", - ImpactedDependencyVersion: "v0.21.0", - Components: []formats.ComponentRow{ - { - Name: "github.com/nats-io/nats-streaming-server", - Version: "v0.21.0", - }, - }, - }, - Applicable: "Undetermined", - FixedVersions: []string{"[0.24.3]"}, - Cves: []formats.CveRow{{Id: "CVE-2022-26652"}}, - }, - } - licenses := []formats.LicenseRow{ - { - LicenseKey: "Apache-2.0", - ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ - SeverityDetails: formats.SeverityDetails{Severity: "High", SeverityNumValue: 13}, - ImpactedDependencyName: "minimatch", - ImpactedDependencyVersion: "1.2.3", - Components: []formats.ComponentRow{ - { - Name: "root", - Version: "1.0.0", - }, - { - Name: "minimatch", - Version: "1.2.3", - }, - }, - }, - }, - } - - writerOutput := &outputwriter.StandardOutput{} - writerOutput.SetJasOutputFlags(true, true) - message := createPullRequestComment(&utils.IssuesCollection{Vulnerabilities: vulnerabilities, Licenses: licenses}, writerOutput) - - expectedMessage := "
\n\n[![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/vulnerabilitiesBannerPR.png)](https://github.com/jfrog/frogbot#readme)\n\n
\n\n\n## 📦 Vulnerable Dependencies\n\n### ✍️ Summary\n\n
\n\n| SEVERITY | CONTEXTUAL ANALYSIS | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | FIXED VERSIONS | CVES |\n| :---------------------: | :----------------------------------: | :----------------------------------: | :-----------------------------------: | :---------------------------------: | :---------------------------------: | \n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)
High | Undetermined | github.com/nats-io/nats-streaming-server:v0.21.0 | github.com/nats-io/nats-streaming-server:v0.21.0 | [0.24.1] | - |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)
High | Undetermined | github.com/mholt/archiver/v3:v3.5.1 | github.com/mholt/archiver/v3:v3.5.1 | - | - |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableMediumSeverity.png)
Medium | Undetermined | github.com/nats-io/nats-streaming-server:v0.21.0 | github.com/nats-io/nats-streaming-server:v0.21.0 | [0.24.3] | CVE-2022-26652 |\n\n
\n\n## 🔬 Research Details\n\n
\n [ XRAY-122345 ] github.com/nats-io/nats-streaming-server v0.21.0 \n
\n\n**Description:**\nSummary XRAY-122345\n\n\n
\n\n\n
\n github.com/mholt/archiver/v3 v3.5.1 \n
\n\n**Description:**\nSummary\n\n\n
\n\n\n
\n [ CVE-2022-26652 ] github.com/nats-io/nats-streaming-server v0.21.0 \n
\n\n**Description:**\nSummary CVE-2022-26652\n\n\n
\n\n\n## ⚖️ Violated Licenses \n\n
\n\n\n| LICENSE | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | \n| :---------------------: | :----------------------------------: | :-----------------------------------: | \n| Apache-2.0 | root 1.0.0
minimatch 1.2.3 | minimatch 1.2.3 |\n\n
\n\n\n---\n
\n\n[🐸 JFrog Frogbot](https://github.com/jfrog/frogbot#readme)\n\n
" - assert.Equal(t, expectedMessage, message) - - writerOutput.SetVcsProvider(vcsutils.GitLab) - message = createPullRequestComment(&utils.IssuesCollection{Vulnerabilities: vulnerabilities}, writerOutput) - expectedMessage = "
\n\n[![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/vulnerabilitiesBannerMR.png)](https://github.com/jfrog/frogbot#readme)\n\n
\n\n\n## 📦 Vulnerable Dependencies\n\n### ✍️ Summary\n\n
\n\n| SEVERITY | CONTEXTUAL ANALYSIS | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | FIXED VERSIONS | CVES |\n| :---------------------: | :----------------------------------: | :----------------------------------: | :-----------------------------------: | :---------------------------------: | :---------------------------------: | \n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)
High | Undetermined | github.com/nats-io/nats-streaming-server:v0.21.0 | github.com/nats-io/nats-streaming-server:v0.21.0 | [0.24.1] | - |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)
High | Undetermined | github.com/mholt/archiver/v3:v3.5.1 | github.com/mholt/archiver/v3:v3.5.1 | - | - |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableMediumSeverity.png)
Medium | Undetermined | github.com/nats-io/nats-streaming-server:v0.21.0 | github.com/nats-io/nats-streaming-server:v0.21.0 | [0.24.3] | CVE-2022-26652 |\n\n
\n\n## 🔬 Research Details\n\n
\n [ XRAY-122345 ] github.com/nats-io/nats-streaming-server v0.21.0 \n
\n\n**Description:**\nSummary XRAY-122345\n\n\n
\n\n\n
\n github.com/mholt/archiver/v3 v3.5.1 \n
\n\n**Description:**\nSummary\n\n\n
\n\n\n
\n [ CVE-2022-26652 ] github.com/nats-io/nats-streaming-server v0.21.0 \n
\n\n**Description:**\nSummary CVE-2022-26652\n\n\n
\n\n\n---\n
\n\n[🐸 JFrog Frogbot](https://github.com/jfrog/frogbot#readme)\n\n
" - assert.Equal(t, expectedMessage, message) -} - func TestScanPullRequest(t *testing.T) { tests := []struct { testName string @@ -1218,23 +1111,88 @@ func TestDeletePreviousPullRequestMessages(t *testing.T) { } client := CreateMockVcsClient(t) - // Test with comment returned - client.EXPECT().ListPullRequestComments(context.Background(), "owner", "repo", 17).Return([]vcsclient.CommentInfo{ - {ID: 20, Content: outputwriter.GetBanner(outputwriter.NoVulnerabilityPrBannerSource) + "text \n table\n text text text", Created: time.Unix(3, 0)}, - }, nil) - client.EXPECT().DeletePullRequestComment(context.Background(), "owner", "repo", 17, 20).Return(nil).AnyTimes() - err := deleteExistingPullRequestComment(repository, client) - assert.NoError(t, err) + testCases := []struct { + name string + commentsOnPR []vcsclient.CommentInfo + err error + }{ + { + name: "Test with comment returned", + commentsOnPR: []vcsclient.CommentInfo{ + {ID: 20, Content: outputwriter.GetBanner(outputwriter.NoVulnerabilityPrBannerSource) + "text \n table\n text text text", Created: time.Unix(3, 0)}, + }, + }, + { + name: "Test with no comment returned", + }, + { + name: "Test with error returned", + err: errors.New("error"), + }, + } - // Test with no comment returned - client.EXPECT().ListPullRequestComments(context.Background(), "owner", "repo", 17).Return([]vcsclient.CommentInfo{}, nil) - err = deleteExistingPullRequestComment(repository, client) - assert.NoError(t, err) + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Test with comment returned + client.EXPECT().ListPullRequestComments(context.Background(), "owner", "repo", 17).Return(tc.commentsOnPR, tc.err) + client.EXPECT().DeletePullRequestComment(context.Background(), "owner", "repo", 17, 20).Return(nil).AnyTimes() + err := utils.DeleteExistingPullRequestComments(repository, client) + if tc.err == nil { + assert.NoError(t, err) + } else { + assert.Error(t, err) + } + }) + } +} - // Test with error returned - client.EXPECT().ListPullRequestComments(context.Background(), "owner", "repo", 17).Return(nil, errors.New("error")) - err = deleteExistingPullRequestComment(repository, client) - assert.Error(t, err) +func TestDeletePreviousPullRequestReviewMessages(t *testing.T) { + repository := &utils.Repository{ + Params: utils.Params{ + Git: utils.Git{ + PullRequestDetails: vcsclient.PullRequestInfo{Target: vcsclient.BranchInfo{ + Repository: "repo", + Owner: "owner", + }, ID: 17}, + }, + }, + OutputWriter: &outputwriter.StandardOutput{}, + } + client := CreateMockVcsClient(t) + + testCases := []struct { + name string + commentsOnPR []vcsclient.CommentInfo + err error + }{ + { + name: "Test with comment returned", + commentsOnPR: []vcsclient.CommentInfo{ + {ID: 20, Content: outputwriter.MarkdownComment(outputwriter.ReviewCommentId) + "text \n table\n text text text", Created: time.Unix(3, 0)}, + }, + }, + { + name: "Test with no comment returned", + }, + { + name: "Test with error returned", + err: errors.New("error"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Test with comment returned + client.EXPECT().ListPullRequestReviewComments(context.Background(), "", "", 17).Return(tc.commentsOnPR, tc.err) + client.EXPECT().DeletePullRequestReviewComments(context.Background(), "", "", 17, tc.commentsOnPR).Return(nil).AnyTimes() + err := utils.DeleteExistingPullRequestReviewComments(repository, 17, client) + if tc.err == nil { + assert.NoError(t, err) + } else { + assert.Error(t, err) + } + }) + } } // Set new logger with output redirection to a null logger. This is useful for negative tests. diff --git a/schema/frogbot-schema.json b/schema/frogbot-schema.json index 874598c34..51c046796 100644 --- a/schema/frogbot-schema.json +++ b/schema/frogbot-schema.json @@ -99,6 +99,11 @@ "description": "Set to true to display all existing vulnerabilities, including the ones that were not added by the pull request.", "title": "Include All Vulnerabilities" }, + "avoidPreviousPrCommentsDeletion": { + "type": "boolean", + "description": "When adding new comments on pull requests, keep old comments that were added by previous scans.", + "title": "Keep Previous Frogbot Comments" + }, "failOnSecurityIssues": { "type": "boolean", "description": "Set to true to fail the job if security issues were found.", diff --git a/testdata/config/frogbot-config-test-unmarshal.yml b/testdata/config/frogbot-config-test-unmarshal.yml index cc0d6cc79..0882935a5 100755 --- a/testdata/config/frogbot-config-test-unmarshal.yml +++ b/testdata/config/frogbot-config-test-unmarshal.yml @@ -29,6 +29,7 @@ - b/c failOnSecurityIssues: true includeAllVulnerabilities: false + avoidPreviousPrCommentsDeletion: true jfrogPlatform: watches: - watch-1 diff --git a/utils/consts.go b/utils/consts.go index 7cd1cffca..18b55be01 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -41,19 +41,20 @@ const ( PullRequestTitleTemplateEnv = "JF_PULL_REQUEST_TITLE_TEMPLATE" // Repository environment variables - Ignored if the frogbot-config.yml file is used - InstallCommandEnv = "JF_INSTALL_DEPS_CMD" - RequirementsFileEnv = "JF_REQUIREMENTS_FILE" - WorkingDirectoryEnv = "JF_WORKING_DIR" - jfrogWatchesEnv = "JF_WATCHES" - jfrogProjectEnv = "JF_PROJECT" - IncludeAllVulnerabilitiesEnv = "JF_INCLUDE_ALL_VULNERABILITIES" - FailOnSecurityIssuesEnv = "JF_FAIL" - UseWrapperEnv = "JF_USE_WRAPPER" - DepsRepoEnv = "JF_DEPS_REPO" - MinSeverityEnv = "JF_MIN_SEVERITY" - FixableOnlyEnv = "JF_FIXABLE_ONLY" - AllowedLicensesEnv = "JF_ALLOWED_LICENSES" - WatchesDelimiter = "," + InstallCommandEnv = "JF_INSTALL_DEPS_CMD" + RequirementsFileEnv = "JF_REQUIREMENTS_FILE" + WorkingDirectoryEnv = "JF_WORKING_DIR" + jfrogWatchesEnv = "JF_WATCHES" + jfrogProjectEnv = "JF_PROJECT" + IncludeAllVulnerabilitiesEnv = "JF_INCLUDE_ALL_VULNERABILITIES" + AvoidPreviousPrCommentsDeletionEnv = "JF_AVOID_PREVIOUS_PR_COMMENTS_DELETION" + FailOnSecurityIssuesEnv = "JF_FAIL" + UseWrapperEnv = "JF_USE_WRAPPER" + DepsRepoEnv = "JF_DEPS_REPO" + MinSeverityEnv = "JF_MIN_SEVERITY" + FixableOnlyEnv = "JF_FIXABLE_ONLY" + AllowedLicensesEnv = "JF_ALLOWED_LICENSES" + WatchesDelimiter = "," // Email related environment variables //#nosec G101 -- False positive - no hardcoded credentials. diff --git a/utils/params.go b/utils/params.go index 172c80df5..f828454b9 100644 --- a/utils/params.go +++ b/utils/params.go @@ -4,8 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/jfrog/frogbot/utils/outputwriter" - xrutils "github.com/jfrog/jfrog-cli-core/v2/xray/utils" "net/http" "net/url" "os" @@ -13,6 +11,9 @@ import ( "strconv" "strings" + "github.com/jfrog/frogbot/utils/outputwriter" + xrutils "github.com/jfrog/jfrog-cli-core/v2/xray/utils" + "github.com/jfrog/build-info-go/utils" "github.com/jfrog/froggit-go/vcsclient" "github.com/jfrog/froggit-go/vcsutils" @@ -109,13 +110,14 @@ func (p *Project) setDefaultsIfNeeded() error { } type Scan struct { - IncludeAllVulnerabilities bool `yaml:"includeAllVulnerabilities,omitempty"` - FixableOnly bool `yaml:"fixableOnly,omitempty"` - FailOnSecurityIssues *bool `yaml:"failOnSecurityIssues,omitempty"` - MinSeverity string `yaml:"minSeverity,omitempty"` - AllowedLicenses []string `yaml:"allowedLicenses,omitempty"` - Projects []Project `yaml:"projects,omitempty"` - EmailDetails `yaml:",inline"` + IncludeAllVulnerabilities bool `yaml:"includeAllVulnerabilities,omitempty"` + FixableOnly bool `yaml:"fixableOnly,omitempty"` + FailOnSecurityIssues *bool `yaml:"failOnSecurityIssues,omitempty"` + AvoidPreviousPrCommentsDeletion bool `yaml:"avoidPreviousPrCommentsDeletion,omitempty"` + MinSeverity string `yaml:"minSeverity,omitempty"` + AllowedLicenses []string `yaml:"allowedLicenses,omitempty"` + Projects []Project `yaml:"projects,omitempty"` + EmailDetails `yaml:",inline"` } type EmailDetails struct { @@ -160,6 +162,11 @@ func (s *Scan) setDefaultsIfNeeded() (err error) { return } } + if !s.AvoidPreviousPrCommentsDeletion { + if s.AvoidPreviousPrCommentsDeletion, err = getBoolEnv(AvoidPreviousPrCommentsDeletionEnv, false); err != nil { + return + } + } if !s.FixableOnly { if s.FixableOnly, err = getBoolEnv(FixableOnlyEnv, false); err != nil { return diff --git a/utils/params_test.go b/utils/params_test.go index 84a89f1a8..ccf1c1acc 100644 --- a/utils/params_test.go +++ b/utils/params_test.go @@ -3,12 +3,13 @@ package utils import ( "errors" "fmt" - "github.com/jfrog/froggit-go/vcsclient" - "github.com/jfrog/jfrog-cli-core/v2/utils/config" "os" "path/filepath" "testing" + "github.com/jfrog/froggit-go/vcsclient" + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + "github.com/jfrog/froggit-go/vcsutils" "github.com/stretchr/testify/assert" ) @@ -320,26 +321,27 @@ func TestExtractInstallationCommandFromEnv(t *testing.T) { func TestGenerateConfigAggregatorFromEnv(t *testing.T) { SetEnvAndAssert(t, map[string]string{ - JFrogUrlEnv: "", - jfrogArtifactoryUrlEnv: "http://127.0.0.1:8081/artifactory", - jfrogXrayUrlEnv: "http://127.0.0.1:8081/xray", - JFrogUserEnv: "admin", - JFrogPasswordEnv: "password", - BranchNameTemplateEnv: "branch-${BRANCH_NAME_HASH}", - CommitMessageTemplateEnv: "commit", - PullRequestTitleTemplateEnv: "pr-title", - InstallCommandEnv: "nuget restore", - UseWrapperEnv: "false", - RequirementsFileEnv: "requirements.txt", - WorkingDirectoryEnv: "a/b", - jfrogProjectEnv: "projectKey", - jfrogWatchesEnv: "watch-1, watch-2, watch-3", - DepsRepoEnv: "deps-remote", - IncludeAllVulnerabilitiesEnv: "true", - FailOnSecurityIssuesEnv: "false", - MinSeverityEnv: "medium", - FixableOnlyEnv: "true", - AllowedLicensesEnv: "MIT, Apache-2.0", + JFrogUrlEnv: "", + jfrogArtifactoryUrlEnv: "http://127.0.0.1:8081/artifactory", + jfrogXrayUrlEnv: "http://127.0.0.1:8081/xray", + JFrogUserEnv: "admin", + JFrogPasswordEnv: "password", + BranchNameTemplateEnv: "branch-${BRANCH_NAME_HASH}", + CommitMessageTemplateEnv: "commit", + PullRequestTitleTemplateEnv: "pr-title", + InstallCommandEnv: "nuget restore", + UseWrapperEnv: "false", + RequirementsFileEnv: "requirements.txt", + WorkingDirectoryEnv: "a/b", + jfrogProjectEnv: "projectKey", + jfrogWatchesEnv: "watch-1, watch-2, watch-3", + DepsRepoEnv: "deps-remote", + IncludeAllVulnerabilitiesEnv: "true", + AvoidPreviousPrCommentsDeletionEnv: "true", + FailOnSecurityIssuesEnv: "false", + MinSeverityEnv: "medium", + FixableOnlyEnv: "true", + AllowedLicensesEnv: "MIT, Apache-2.0", }) defer func() { assert.NoError(t, SanitizeEnv()) @@ -446,11 +448,13 @@ func TestFrogbotConfigAggregator_unmarshalFrogbotConfigYaml(t *testing.T) { secondRepo := configAggregator[1] assert.Equal(t, "mvn-repo", secondRepo.RepoName) assert.Equal(t, []string{"dev"}, secondRepo.Branches) + assert.False(t, secondRepo.AvoidPreviousPrCommentsDeletion) thirdRepo := configAggregator[2] assert.Equal(t, "pip-repo", thirdRepo.RepoName) assert.Equal(t, []string{"test"}, thirdRepo.Branches) assert.True(t, *thirdRepo.FailOnSecurityIssues) assert.False(t, thirdRepo.IncludeAllVulnerabilities) + assert.True(t, thirdRepo.AvoidPreviousPrCommentsDeletion) thirdRepoProject := thirdRepo.Projects[0] assert.Equal(t, "requirements.txt", thirdRepoProject.PipRequirementsFile) assert.ElementsMatch(t, []string{"a/b", "b/c"}, thirdRepoProject.WorkingDirs) diff --git a/utils/reviewcomment.go b/utils/reviewcomment.go index 8eb8d22ea..a306934d2 100644 --- a/utils/reviewcomment.go +++ b/utils/reviewcomment.go @@ -26,15 +26,77 @@ const ( SastComment ReviewCommentType = "Sast" ) -func AddReviewComments(repo *Repository, pullRequestID int, client vcsclient.VcsClient, issues *IssuesCollection) (err error) { - if err = deleteOldReviewComments(repo, pullRequestID, client); err != nil { - err = errors.New("couldn't delete pull request review comment: " + err.Error()) +func HandlePullRequestCommentsAfterScan(issues *IssuesCollection, repo *Repository, client vcsclient.VcsClient, pullRequestID int) (err error) { + if !repo.Params.AvoidPreviousPrCommentsDeletion { + log.Debug("Looking for an existing Frogbot pull request comment. Deleting it if it exists...") + // Delete previous PR regular comments, if exists (not related to location of a change) + if err = DeleteExistingPullRequestComments(repo, client); err != nil { + err = errors.New("couldn't delete pull request comment: " + err.Error()) + return + } + // Delete previous PR review comments, if exists (related to location of a change) + if err = DeleteExistingPullRequestReviewComments(repo, pullRequestID, client); err != nil { + err = errors.New("couldn't delete pull request review comment: " + err.Error()) + return + } + } + + // Add summary (SCA, license) scan comment + if err = client.AddPullRequestComment(context.Background(), repo.RepoOwner, repo.RepoName, createPullRequestComment(issues, repo.OutputWriter), pullRequestID); err != nil { + err = errors.New("couldn't add pull request comment: " + err.Error()) return } - if err = deleteOldFallbackComments(repo, pullRequestID, client); err != nil { - err = errors.New("couldn't delete pull request comment: " + err.Error()) + // Handle review comments at the pull request + if err = addReviewComments(repo, pullRequestID, client, issues); err != nil { + err = errors.New("couldn't add review comments: " + err.Error()) return } + return +} + +// Delete existing pull request regular comments (Summary, Fallback review comments) +func DeleteExistingPullRequestComments(repository *Repository, client vcsclient.VcsClient) error { + prDetails := repository.PullRequestDetails + comments, err := GetSortedPullRequestComments(client, prDetails.Target.Owner, prDetails.Target.Repository, int(prDetails.ID)) + if err != nil { + return fmt.Errorf( + "failed to get comments. the following details were used in order to fetch the comments: <%s/%s> pull request #%d. the error received: %s", + repository.RepoOwner, repository.RepoName, int(repository.PullRequestDetails.ID), err.Error()) + } + // Previous Fallback review comments + commentsToDelete := getFrogbotReviewComments(comments) + // Previous Summary comments + for _, comment := range comments { + if repository.OutputWriter.IsFrogbotResultComment(comment.Content) { + commentsToDelete = append(commentsToDelete, comment) + } + } + // Delete + if len(commentsToDelete) > 0 { + for _, commentToDelete := range commentsToDelete { + if err = client.DeletePullRequestComment(context.Background(), prDetails.Target.Owner, prDetails.Target.Repository, int(prDetails.ID), int(commentToDelete.ID)); err != nil { + return err + } + } + } + return err +} + +func createPullRequestComment(issues *IssuesCollection, writer outputwriter.OutputWriter) string { + if !issues.IssuesExists() { + return writer.NoVulnerabilitiesTitle() + writer.UntitledForJasMsg() + writer.Footer() + } + comment := strings.Builder{} + comment.WriteString(writer.VulnerabilitiesTitle(true)) + comment.WriteString(writer.VulnerabilitiesContent(issues.Vulnerabilities)) + comment.WriteString(writer.LicensesContent(issues.Licenses)) + comment.WriteString(writer.UntitledForJasMsg()) + comment.WriteString(writer.Footer()) + + return comment.String() +} + +func addReviewComments(repo *Repository, pullRequestID int, client vcsclient.VcsClient, issues *IssuesCollection) (err error) { commentsToAdd := getNewReviewComments(repo, issues) if len(commentsToAdd) == 0 { return @@ -53,8 +115,9 @@ func AddReviewComments(repo *Repository, pullRequestID int, client vcsclient.Vcs return } -func deleteOldReviewComments(repo *Repository, pullRequestID int, client vcsclient.VcsClient) (err error) { - // Get all comments in PR +// Delete existing pull request review comments (Applicable, Sast, Iac) +func DeleteExistingPullRequestReviewComments(repo *Repository, pullRequestID int, client vcsclient.VcsClient) (err error) { + // Get all review comments in PR var existingComments []vcsclient.CommentInfo if existingComments, err = client.ListPullRequestReviewComments(context.Background(), repo.RepoOwner, repo.RepoName, pullRequestID); err != nil { err = errors.New("couldn't list existing review comments: " + err.Error()) @@ -70,25 +133,6 @@ func deleteOldReviewComments(repo *Repository, pullRequestID int, client vcsclie return } -func deleteOldFallbackComments(repo *Repository, pullRequestID int, client vcsclient.VcsClient) (err error) { - // Get all comments in PR - existingComments, err := GetSortedPullRequestComments(client, repo.RepoOwner, repo.RepoName, pullRequestID) - if err != nil { - err = errors.New("couldn't list existing regular comments: " + err.Error()) - return - } - // Delete old review comments - if len(existingComments) > 0 { - for _, commentToDelete := range getFrogbotReviewComments(existingComments) { - if err = client.DeletePullRequestComment(context.Background(), repo.RepoOwner, repo.RepoName, pullRequestID, int(commentToDelete.ID)); err != nil { - err = errors.New("couldn't delete pull request regular comment: " + err.Error()) - return - } - } - } - return -} - func getFrogbotReviewComments(existingComments []vcsclient.CommentInfo) (reviewComments []vcsclient.CommentInfo) { for _, comment := range existingComments { if strings.Contains(comment.Content, outputwriter.ReviewCommentId) { diff --git a/utils/reviewcomment_test.go b/utils/reviewcomment_test.go index b92548edd..abc637d40 100644 --- a/utils/reviewcomment_test.go +++ b/utils/reviewcomment_test.go @@ -1,15 +1,126 @@ package utils import ( + "os" + "path/filepath" + "strings" "testing" "github.com/jfrog/frogbot/utils/outputwriter" "github.com/jfrog/froggit-go/vcsclient" + "github.com/jfrog/froggit-go/vcsutils" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-cli-core/v2/xray/formats" "github.com/stretchr/testify/assert" ) +func TestCreatePullRequestMessageNoVulnerabilities(t *testing.T) { + vulnerabilities := []formats.VulnerabilityOrViolationRow{} + message := createPullRequestComment(&IssuesCollection{Vulnerabilities: vulnerabilities}, &outputwriter.StandardOutput{}) + + expectedMessageByte, err := os.ReadFile(filepath.Join("..", "testdata", "messages", "novulnerabilities.md")) + assert.NoError(t, err) + expectedMessage := strings.ReplaceAll(string(expectedMessageByte), "\r\n", "\n") + assert.Equal(t, expectedMessage, message) + + outputWriter := &outputwriter.StandardOutput{} + outputWriter.SetVcsProvider(vcsutils.GitLab) + message = createPullRequestComment(&IssuesCollection{Vulnerabilities: vulnerabilities}, outputWriter) + + expectedMessageByte, err = os.ReadFile(filepath.Join("..", "testdata", "messages", "novulnerabilitiesMR.md")) + assert.NoError(t, err) + expectedMessage = strings.ReplaceAll(string(expectedMessageByte), "\r\n", "\n") + assert.Equal(t, expectedMessage, message) +} + +func TestCreatePullRequestComment(t *testing.T) { + vulnerabilities := []formats.VulnerabilityOrViolationRow{ + { + Summary: "Summary XRAY-122345", + ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ + SeverityDetails: formats.SeverityDetails{Severity: "High"}, + ImpactedDependencyName: "github.com/nats-io/nats-streaming-server", + ImpactedDependencyVersion: "v0.21.0", + Components: []formats.ComponentRow{ + { + Name: "github.com/nats-io/nats-streaming-server", + Version: "v0.21.0", + }, + }, + }, + Applicable: "Undetermined", + FixedVersions: []string{"[0.24.1]"}, + IssueId: "XRAY-122345", + Cves: []formats.CveRow{{}}, + }, + { + Summary: "Summary", + ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ + SeverityDetails: formats.SeverityDetails{Severity: "High"}, + ImpactedDependencyName: "github.com/mholt/archiver/v3", + ImpactedDependencyVersion: "v3.5.1", + Components: []formats.ComponentRow{ + { + Name: "github.com/mholt/archiver/v3", + Version: "v3.5.1", + }, + }, + }, + Applicable: "Undetermined", + Cves: []formats.CveRow{}, + }, + { + Summary: "Summary CVE-2022-26652", + ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ + SeverityDetails: formats.SeverityDetails{Severity: "Medium"}, + ImpactedDependencyName: "github.com/nats-io/nats-streaming-server", + ImpactedDependencyVersion: "v0.21.0", + Components: []formats.ComponentRow{ + { + Name: "github.com/nats-io/nats-streaming-server", + Version: "v0.21.0", + }, + }, + }, + Applicable: "Undetermined", + FixedVersions: []string{"[0.24.3]"}, + Cves: []formats.CveRow{{Id: "CVE-2022-26652"}}, + }, + } + licenses := []formats.LicenseRow{ + { + LicenseKey: "Apache-2.0", + ImpactedDependencyDetails: formats.ImpactedDependencyDetails{ + SeverityDetails: formats.SeverityDetails{Severity: "High", SeverityNumValue: 13}, + ImpactedDependencyName: "minimatch", + ImpactedDependencyVersion: "1.2.3", + Components: []formats.ComponentRow{ + { + Name: "root", + Version: "1.0.0", + }, + { + Name: "minimatch", + Version: "1.2.3", + }, + }, + }, + }, + } + + writerOutput := &outputwriter.StandardOutput{} + writerOutput.SetJasOutputFlags(true, true) + message := createPullRequestComment(&IssuesCollection{Vulnerabilities: vulnerabilities, Licenses: licenses}, writerOutput) + + expectedMessage := "
\n\n[![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/vulnerabilitiesBannerPR.png)](https://github.com/jfrog/frogbot#readme)\n\n
\n\n\n## 📦 Vulnerable Dependencies\n\n### ✍️ Summary\n\n
\n\n| SEVERITY | CONTEXTUAL ANALYSIS | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | FIXED VERSIONS | CVES |\n| :---------------------: | :----------------------------------: | :----------------------------------: | :-----------------------------------: | :---------------------------------: | :---------------------------------: | \n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)
High | Undetermined | github.com/nats-io/nats-streaming-server:v0.21.0 | github.com/nats-io/nats-streaming-server:v0.21.0 | [0.24.1] | - |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)
High | Undetermined | github.com/mholt/archiver/v3:v3.5.1 | github.com/mholt/archiver/v3:v3.5.1 | - | - |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableMediumSeverity.png)
Medium | Undetermined | github.com/nats-io/nats-streaming-server:v0.21.0 | github.com/nats-io/nats-streaming-server:v0.21.0 | [0.24.3] | CVE-2022-26652 |\n\n
\n\n## 🔬 Research Details\n\n
\n [ XRAY-122345 ] github.com/nats-io/nats-streaming-server v0.21.0 \n
\n\n**Description:**\nSummary XRAY-122345\n\n\n
\n\n\n
\n github.com/mholt/archiver/v3 v3.5.1 \n
\n\n**Description:**\nSummary\n\n\n
\n\n\n
\n [ CVE-2022-26652 ] github.com/nats-io/nats-streaming-server v0.21.0 \n
\n\n**Description:**\nSummary CVE-2022-26652\n\n\n
\n\n\n## ⚖️ Violated Licenses \n\n
\n\n\n| LICENSE | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | \n| :---------------------: | :----------------------------------: | :-----------------------------------: | \n| Apache-2.0 | root 1.0.0
minimatch 1.2.3 | minimatch 1.2.3 |\n\n
\n\n\n---\n
\n\n[🐸 JFrog Frogbot](https://github.com/jfrog/frogbot#readme)\n\n
" + assert.Equal(t, expectedMessage, message) + + writerOutput.SetVcsProvider(vcsutils.GitLab) + message = createPullRequestComment(&IssuesCollection{Vulnerabilities: vulnerabilities}, writerOutput) + expectedMessage = "
\n\n[![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/vulnerabilitiesBannerMR.png)](https://github.com/jfrog/frogbot#readme)\n\n
\n\n\n## 📦 Vulnerable Dependencies\n\n### ✍️ Summary\n\n
\n\n| SEVERITY | CONTEXTUAL ANALYSIS | DIRECT DEPENDENCIES | IMPACTED DEPENDENCY | FIXED VERSIONS | CVES |\n| :---------------------: | :----------------------------------: | :----------------------------------: | :-----------------------------------: | :---------------------------------: | :---------------------------------: | \n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)
High | Undetermined | github.com/nats-io/nats-streaming-server:v0.21.0 | github.com/nats-io/nats-streaming-server:v0.21.0 | [0.24.1] | - |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableHighSeverity.png)
High | Undetermined | github.com/mholt/archiver/v3:v3.5.1 | github.com/mholt/archiver/v3:v3.5.1 | - | - |\n| ![](https://raw.githubusercontent.com/jfrog/frogbot/master/resources/v2/applicableMediumSeverity.png)
Medium | Undetermined | github.com/nats-io/nats-streaming-server:v0.21.0 | github.com/nats-io/nats-streaming-server:v0.21.0 | [0.24.3] | CVE-2022-26652 |\n\n
\n\n## 🔬 Research Details\n\n
\n [ XRAY-122345 ] github.com/nats-io/nats-streaming-server v0.21.0 \n
\n\n**Description:**\nSummary XRAY-122345\n\n\n
\n\n\n
\n github.com/mholt/archiver/v3 v3.5.1 \n
\n\n**Description:**\nSummary\n\n\n
\n\n\n
\n [ CVE-2022-26652 ] github.com/nats-io/nats-streaming-server v0.21.0 \n
\n\n**Description:**\nSummary CVE-2022-26652\n\n\n
\n\n\n---\n
\n\n[🐸 JFrog Frogbot](https://github.com/jfrog/frogbot#readme)\n\n
" + assert.Equal(t, expectedMessage, message) +} + func TestGetFrogbotReviewComments(t *testing.T) { testCases := []struct { name string From c3daa70b469737f7b925ec5ca294308773a623a8 Mon Sep 17 00:00:00 2001 From: Assaf Attias <49212512+attiasas@users.noreply.github.com> Date: Thu, 12 Oct 2023 10:49:03 +0300 Subject: [PATCH 8/9] Retry download schema for tests (#538) --- schema/schemas_test.go | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/schema/schemas_test.go b/schema/schemas_test.go index 1e7cb1440..d03c12afa 100644 --- a/schema/schemas_test.go +++ b/schema/schemas_test.go @@ -8,12 +8,19 @@ import ( "path/filepath" "strings" "testing" + "time" + clientutils "github.com/jfrog/jfrog-client-go/utils" "github.com/stretchr/testify/assert" "github.com/xeipuuv/gojsonschema" "gopkg.in/yaml.v3" ) +const ( + maxRetriesToDownloadSchema = 5 + durationBetweenSchemaDownloadRetries = 10 * time.Second +) + func TestFrogbotSchema(t *testing.T) { // Load frogbot schema schema, err := os.ReadFile("frogbot-schema.json") @@ -63,16 +70,31 @@ func TestGitHubActionsTemplates(t *testing.T) { // t - Testing object // schema - The schema file to download func downloadFromSchemaStore(t *testing.T, schema string) gojsonschema.JSONLoader { - response, err := http.Get("https://json.schemastore.org/" + schema) - assert.NoError(t, err) + var response *http.Response + var err error + retryExecutor := clientutils.RetryExecutor{ + MaxRetries: maxRetriesToDownloadSchema, + RetriesIntervalMilliSecs: int(durationBetweenSchemaDownloadRetries.Milliseconds()), + ErrorMessage: "Failed to download schema.", + ExecutionHandler: func() (bool, error) { + response, err = http.Get("https://json.schemastore.org/" + schema) + if err != nil { + return false, err + } + if response.StatusCode != http.StatusOK { + return false, fmt.Errorf("failed to download schema. Response status: %s", response.Status) + } + return true, nil + }, + } + assert.NoError(t, retryExecutor.Execute()) + assert.Equal(t, http.StatusOK, response.StatusCode, response.Status) + // Check server response and read schema bytes defer func() { assert.NoError(t, response.Body.Close()) }() - // Check server response - assert.Equal(t, http.StatusOK, response.StatusCode, response.Status) schemaBytes, err := io.ReadAll(response.Body) assert.NoError(t, err) - return gojsonschema.NewBytesLoader(schemaBytes) } From 83e4b94f8618cc8576d42b79f2c7ccdaf8e76923 Mon Sep 17 00:00:00 2001 From: Assaf Attias <49212512+attiasas@users.noreply.github.com> Date: Thu, 12 Oct 2023 12:10:24 +0300 Subject: [PATCH 9/9] Fix download handler on schema tests (#540) --- schema/schemas_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/schema/schemas_test.go b/schema/schemas_test.go index d03c12afa..83b4c91a9 100644 --- a/schema/schemas_test.go +++ b/schema/schemas_test.go @@ -79,12 +79,12 @@ func downloadFromSchemaStore(t *testing.T, schema string) gojsonschema.JSONLoade ExecutionHandler: func() (bool, error) { response, err = http.Get("https://json.schemastore.org/" + schema) if err != nil { - return false, err + return true, err } if response.StatusCode != http.StatusOK { - return false, fmt.Errorf("failed to download schema. Response status: %s", response.Status) + return true, fmt.Errorf("failed to download schema. Response status: %s", response.Status) } - return true, nil + return false, nil }, } assert.NoError(t, retryExecutor.Execute())