From f94e8828ae025a1552c422975c571bcfbe715f1d Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Sat, 17 Apr 2021 00:14:55 +0300 Subject: [PATCH] Fix: don't draw segments out of bounds (#8911) --- src/elements/element.line.js | 12 ++++---- test/fixtures/controller.line/issue-8902.js | 30 +++++++++++++++++++ test/fixtures/controller.line/issue-8902.png | Bin 0 -> 19005 bytes 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/controller.line/issue-8902.js create mode 100644 test/fixtures/controller.line/issue-8902.png diff --git a/src/elements/element.line.js b/src/elements/element.line.js index e6265a128..985fa0b24 100644 --- a/src/elements/element.line.js +++ b/src/elements/element.line.js @@ -34,17 +34,19 @@ function getLineMethod(options) { return lineTo; } -function pathVars(points, segment, params) { - params = params || {}; +function pathVars(points, segment, params = {}) { const count = points.length; - const start = Math.max(params.start || 0, segment.start); - const end = Math.min(params.end || count - 1, segment.end); + const {start: paramsStart = 0, end: paramsEnd = count - 1} = params; + const {start: segmentStart, end: segmentEnd} = segment; + const start = Math.max(paramsStart, segmentStart); + const end = Math.min(paramsEnd, segmentEnd); + const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd; return { count, start, loop: segment.loop, - ilen: end < start ? count + end - start : end - start + ilen: end < start && !outside ? count + end - start : end - start }; } diff --git a/test/fixtures/controller.line/issue-8902.js b/test/fixtures/controller.line/issue-8902.js new file mode 100644 index 000000000..cb9863807 --- /dev/null +++ b/test/fixtures/controller.line/issue-8902.js @@ -0,0 +1,30 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/8902', + config: { + type: 'line', + data: { + labels: [1, 2, 3, 4, 5, 6, 7, 8], + datasets: [{ + data: [65, 59, NaN, 48, 56, 57, 40], + borderColor: 'rgb(75, 192, 192)', + }] + }, + options: { + plugins: false, + scales: { + x: { + type: 'linear', + min: 1, + max: 3 + } + } + } + }, + options: { + spriteText: true, + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.line/issue-8902.png b/test/fixtures/controller.line/issue-8902.png new file mode 100644 index 0000000000000000000000000000000000000000..c132c5793816f3ab935d23e07c922064eff84e82 GIT binary patch literal 19005 zc-n=$XFyX+)Tq4!fzX2>qI5+-MG&RepooHWQHn^HB1o4aH3(9arl^2Y1*P|Hr1!2= z2`v;sfdmk#p?rHsJ?DJ)zV}}LC<(J?X3d(lo>jKt+M3ttY1n800H9Y@xq1@-$iRQX z04hrGua=lz8vx(|RIgsXPZSrrzTL;DM=pHvm6 zQuTBg$DTfRT5j3}_A1MTke7ANo}pl&Xwc_*diueYZ_&H@!B4*pow628NIhKUhQe^D7U_|ty8*?Onkc{?>XO{)K-j^Nwf!^}D_Jiz_0~ zPiSfp7(bv&jb^;kE>e8{88h_>=kXBeL-6;}T5u`YDz%(v*PpTVT4ag9wrUE|`p-xl zb08aa{d~{c>GBbi(!=V#pIzq7VMk(OW66nIE1`{zjck{ApHr<00V&s_F;;&@@u>2g zg>A0{915l7EmvCUCV-usQcrZ$a+HOGN2$&Vk8}PH-Ka34R}K6PLTO*5uPkBKQO3vnPrIU`!$t@`9IYSKqi5_3d?z1L6oP6ZQy08$Ck`>pJ z@XwLsR>uZ{SVetnwYiZocAu#`{v!F$ z^>tNh#lC7cR`Cae-}5M?rHLhM;@)1WQhTo-@0+py-E=$TeG_!qdl5~2yRgpVD&hL|qgs|UT~d<|!9 zJ>WpC^J3;TGBiDsOOC48fbNZigB^;z$h;|p?O=5bC3L3@ZH)1Ft_RQ@6E0i1AZ9no zvBK#K%fC}DbY<+@FZgfb;AvmzKV* zaGXE@nvpBTK$hIgB)`k5TLkXhcc~pn>H>cH5=TSKd1+6)`g|`n8dK~!fSs!{$2(q| zG&W))f_k+@n6UUc*P(su7Ce$&GGwyGXKaehcC>`gceMerxql#TKdcxhY`m;b?)32o zKT)z1v?dQ>Cx?%|jw@uk@=!yCEQ+J2v(xy^TVfPue+2smuAj^F(QR1M=EJ)u9pln4 z?ISQ(1@$QQVPVPnb9bJ99oc5W^(M(q&qhZZho$%ssyC^*Dw{%)O;Mb(%Ltf@I}TLu zC!kt>IfzUIfV@_ZC(qlL$WnLLA72T}VxgfoPK>Kmp`fN$P;nOjwbIIG@2R9!n-5JD z!|hoqqybJv@c8v@EcPo=hc=b=79UU*z0dnx8W1@zd=&^|tZ#qkynW&kCHBq>oSp8; zh4}I=7q_v_dxS)wiqmgrlfRALJ`Q@4>aw2};OvBW`C60ZwfKkKG$jC*_IX0hdoywQ zb;!)->8hthkEN(`4BwfNNoaU`Wc5=$Xt+MKXO(4LQ}UNfFNV+Er{I|^3wX4X#Q033 z40xciJs-%|T-LI)Q~71wzMQ{dC?}YZSU!-DZEJqXQxmv#6`hEToee4Pf}VGJGf)+9 z?xW>>euT`79|&GPjXNGyt=2fbbUQ`|7X;V89B|IK$m5k*67f=ktN_s4W?25d!=(v( z`+AUD066*v;LJ^Y{rXt&`6Z36k`kuPN24>&Rh4d(*z>B+<=HWA-Pmtc)ectB)ZqcLNz!NF>P^9nJ~;7k5xv5$>pw(*LV`!kh+)V{ z@OuMlHoAK@x2qA-u#fLfm6|dU75PEwQ{?I;y)`xrpMpyXo2OKAF}_pE&@b%l<|s3W z!P)8Xth_AmDs>y^Cmq3wN1hI(Gjv>@DB~|iJ|HtIgy$I!lr$vEFA1R&rH;UgW^FY! zGv6o4t~^vyEfJzFxX1nRO|ggZy`@ciXcv3oC+2&{t*B$7Bm*^p7{xk`w{HwtSlETo zvCLu1sN<0yzta2x>Vjn|JG(Zlcwi51_#VOc)K3BHcv-hNK1G>HxB^U(X8K!K>DxQU z{N;<38gHPvH^^0-t*&e9$_^J$pBDfQ(C(iF+dh%2u&KvmD6<%hUwmbM4m5jyD#}}) z7~F*w8{|!~@9gj~Ojn8XHn@)^%xvZvU(^mIfHzV99RtEJC;>Vpad@y&-0970d;k?s zxjz6j*O!EN-9n+^Bh%`nQBOm%jM>QN)WC}$tl<%*!CpMY{%9axn}Y#$My>a{^sKN-d)(~suJF;Y)<Nw3ZM@pQ4I3`~)Syt9)skdc;Y2@woDecCu3$PlR0t>Sz(O1{Vn&!wn209t~b z8-xFu#+MBJvVRC!bbhJk-KS5_?wuX(kAmyFOgT;zdsM=|VL>ygb=B3f;N2^dDnmDd ziRk?t;K|I{g&m>gkqvyi2rbTaHZz~aek7zqvyIpX!+}It}eSqoi z=#jy}sB(Lph0*M{N)^u+Z4417_u-X zVUn9@Mhn_mK<-KTGS75K^MNcV_h#7p_qxhw#Q1BQ$P^XNJluMbEHA*!6N_Wo^EU6q z)}-DoMaEXUk>UQc$LGMUTes>vUkOg*E2lyrUt0w%fQ zC7rk;IAw>w!-1Bu4e~2#7PP769C<;IZZjad1x1GmEI;P_NjBr4na<6IPy$zJdz%5r z<(2j_WhQ%{liOQuT3yU7Y}5+a)%`w{t6v`TV<59BI$+Q8`uPK5Gse_^J5Y_~Z}|DG%e>_&%W6As^jCqsBw5eKvik$e zxdET#(MCd*fVQIXSO-wlG~H_}X^*m2U#bYAe0Asbkl3W*`D0_{9@sLqb0+?e0-mB3 z?+Y}V`$9P`2nyzCz`KfxJuD-;o z%k0ZL<bRo)4w~(4O#E>1*z8ehw-3 zp^{A#jIEw^jL%Ccck9-rj^_}a+j;X6_(hm7`m`}@6t2HHB(R$-@6&j~CJ`o(>~%_R z_j~&0)S9`XFU#kbBf!$r;MJesMm2=&{p|M9oy*IPd=r>}yFY({o(s0uwq%UEr31N$m})FXHBWxb`o3dE=mk<3}Lu1vn8ePk?sNS5fDhMkH_S zXsL(zMa2z^OP)V{HEsYE4rBaaG@>BoyDcK-fIS+;Ax*Y@xRB_k$<(~-LCYh4g@*U} z2!*1#JJYJeJ~{w~o+SznwhugTay2XU=xNXi^|4+-`as%F6*KdpH4cz`@D*rjY4K>= z-`&V{`Po+2RtJRXA65;88UfiE14GE|5ASA@zm1rv?K~{%1{Up~Nv2yB;?hNim`;_{ z9g9sdlbpN+%()k0D9C)HC5997iE(jL)Wu(~vTl%H@|=l$(h=B$tqFhrutvlu;HxNj z`IXQ|C9?}*oexzUn5#wrQ9Qb97nU&Yvmtv{q1x#d0h7d>@+<; zznf;Em6uJsFfQ|+uaVF+q6~!+|oQ#=}!<_Hzy<;Q8aHYve9W-p2#c_4LTy9rGJBbSU`n7XkY%C&l<0)bigUnt*MX zmY_lTVzAf-c?Co}LL20^^50AODMA!Z+)Osa9F^dUjIUvexF^t^6rrw49$U=|yzmFd zU9@cKxp4M=Y|^W8ELnTFBr70$HCGS+Y^;3jy4#Ng@v|awy5I76hY1m}41(5$L3Y+D z-SVQmoW~&PDPF&NdOMFH%Kxo|ce^imcI(0r z-XU7IOeS4RCy18@n-%j-UOZ0E@vpZ7zQ+_XX+Jt6OMD!>3wy&S?LpF)wx+!Cm{Gy& zi|r@fJcCuMpOes@i=l&IfbzPz;V8y^5c&ChN3l;V`P*_?F6(b0-6qmEuQMcIc-1>2 zNnYirvvUlPs`_ykrgui{p^M4nsh&59A0;7O7|_vkYFi!>b)R`&Et{4x*$RtMQJV!su0-z?@jdb@$`V137k}(zClbop0VGt7%F&-ppnD}b*0Dndb z0+QhP3MtfKMTGo!QRfU})2#xzQV;#@yW-ZH1*@u()`b4=cg4jZ&MpX1aI^QMyv1NCsB69r=W@q z+;^ipcNk0ZB$<~GKz&KeG#G05WlNmAuRl?(7LYf=r^woqP($k_{N|D;>*`%GacEXy z%1KpSSLa`b#qW%QY#%CvHwrMQle(}X7Y(}oa#`5Sb9(zNs)uhJ|ErM)M@8r_Qag^j zLyo{&U$2%NXybdh;Jy!>#f!;d^9(T(WhXdAi4kFC$3;Aa3`AwX$qIpc944NW{S9Ai zdfvRI-&{6Kxr4&}L*4>iI`;SRQJT72Ox=m=_E?w)M5WjL3LAoV&?Mae1**L(ZQEJCKbMsTa z7Qd>y54^`F@#i4V z5(}Q=Gw?dsBe;wwfzEz7 zFA(I4PE7`j;^T>ao1@Mn#-5kQDjdN0n!fy{$N$FqG#^EvJNy`kdDyVb*HHbSb=;Wj zU?T;Ki70#6^Pl+Ou7@RLh2nx%-bt5w!uphT=LuxV&pwbg6TvR2DYuOa+I$sY zJjQD3Yc2qIv72oy4uR2RSj9t)+(pFI^XTQ^sfl4EX{j^Ed8;fp;RZAs379MKaDCEK z?s`o>u^1^ZUL7`aYPinr2j`UaD2v->mh`2>L7BwDy|vds0mG^&5WMPY`{sWNER-a} zt@#lW_HoCZl{MmPPQ_f6>`tOme_q`&KEVeVR2-Ca2?wz|R>7=$-cV$w_{-p)D(;!1 zejUukYBhd(w4Ms0)@H!0(^+bOEYDu{1mJOo?R?>cSI$17ZqMqOTS4tdv7~!W`+AJ zDNZL4wx(H*(DT188~wSW?6vDsvjP|Bi>{SfbDMT+x@!CA zbVI}G_tn(~)?YiUp_3Ef&1(x8U7CK=A?Vh3Ri$r*By;tIOUmOeZJev$;!Ll2ct}7T zBm8Ogiq}fbmf8Az&!!s;WRW0p1cTzUV?t)XzJC#Mz=~-Czu*@1g@3}HZRGE;hvU!T zUcdPI1N(o-hX2R0`ZwbC&F#;5%~x>^pFcfvt9K$(egHyCu(u=Pzvp#a)+0}7 zF{s;Fd7xe-d>58cAM-LZ_k{h3vP7w=bxOi>2HN=o$orBc zf=(f8MFJX$QeRphZcTWO2?UJS?k)<3T|Kqw39M#BYaPzkxy%{?3F$Z9D}(o+k!GSM z!=|sp{TE5AU%{@fw=6@+K~c}!r|*NXPf&oR7Ry-oP^0O@Jsm)T0=A5RO$$IF^W=GZ zUrz9J7#<80gzt`*S#LUi@2IpQ{9GO{Be^BVYm=A96e+HopT2a8QY2S~It$~km|7-l zmSo$A4X;1?M%3qt2z5ccEbR3aT_|8n6=CeJrn&3PxQKvj%9`gHfZtf?S{EMAQu6Gc zIC-YUnsiiWC=K6Ygn=S#dhIPw=5|~Wc>k}o98+xCX2{IuW>mp5Ai~OJ;qMzFM!`s@ zp3lt_Pz@qQ$)6b+ubo$B&Aa37INRB|rMraSV0@>Rpe!`SZsZ<_GB*@#xvAK>!l0t|?;PXsN z74A&LRTEa=$&f0L|9i}Al|ZTpG~v4o@C>=P-O1%@^wmq({%&;5;+}IxF1HzM{MJzh zl+u{rR9@tqiE`IH{2cjHrz0@-$TPcF6gx%RB9BUpM8;$6gZmj&mO+uY@Hf1#9(MG*bNKUT zF3+*IDp}mA#xI)~BIX@em*NruDLQR>YmRlcR2k>{zvWSX`ReKTcn*$=&4(N0fEnS1 z^R_n|jaGi-0^zJsdD2Cna=9dLOM<3qcDX2|$99%!A(F8{>33v@k&MM(eY;9ZW_)a6 zM_HaUk&Ca#x|?38>LPsV!-JSZUO%3Ip@ZEVU!?&+%n|M>_gFfO_tVS!KFq^rtds7q z*q1!fP-1}{`Ye+rIes6*No8-n(kCMFCzb%E%@~X8ziVGvkjA-$xJTln?F8I*#Ri&@ zGiMQD%lfS-$h&1?S^?1#F-jC=`s3N@1pu+;(^X<4*!%&zl~QYsE=r%xyu$bX^$Pf$ zM0f3#D%ml-qQOO4aKx>y_lR2n0B$$B!M1dnaRmxsfT- z9%s7y#vVT$RmS@IRSkRnE-b3dUf|3~U? zhG_$z|4=%cu+?x>x!{sc5^rod81XI^on5;JMZBls?VA6nYttN#=e|}xHxF=?$}B@` zgIooBUnyq-OVT}$H)Ra!)_qX&sS^t+9~g*JoeZW^7CZ=iWD|)2fJu7^7g1@cb}aEX zyHhFd10|aPMI5x!mw<~6{(wHDlf_^FS$P{<;s{TRz|uGhaL? zKO(a_>ERi09=6D*uLSiQ_jcB&R{{=Y?>_qWO2oVoZab92@?hd43zyIG#rTVsA@b*A z`86J!H-(I<0s_Fn)pN!A`hgRbWo10~44rmwq3U0GoDvwC=eHN&*1px`_M`9KX5Pd% zoSKAWg6yMOem>x>q|-5nv5F_2Q+}+ya_j20BL$pL{=&J5Ub5cUbAmz(wJ-JnTh=j; zEwNIImv-Zi;E;a740NchS0yaf7vyj=76T=-SfMWOLY07hU<4~~ZERX_1r!>$bmr2V z+13=8IpM&Wv@6_N8#im^q_^Nb?_-Qkh4;Rr~!?G#;~SB>Y2F@jjtfP_>?M@DDr3Ve#A|d_wU~qd9Ijb<>i&F9L}P$ z$66!VrxV?J0~>-6O^+#PrC_Ou1a6_16dn#6Q zl|*)Sb*0&l6lDKHTHB%(1wK~z+f+uzE-fxe*Q15YOG@svWYe5vcwka?CSbPgeo8fe z(lWYQkn)Ce+cI_0Q7|rpT&emz*HjN)bE^_6LRLDAS)=gLeGuAEIM(fZj7@z>zdo%M zu*(c$Dg(b(GF|%h=!(N$Buu6SpPRJXt@k?#%r%JAE}X!mLFWBwqikN3H>A0qV$GeA zf3ix7v#pU7$=kDiz^wq_8Wqv0>$OnO!9KAm^>Prdh1E2VzYh$uc?PGojm$E0xf!3e z?AAO_F@0xyz3jezMxn4INuA_ysy`Y*bxOL_zxY7oPrm9WFiiEg7eEOqf11nt`$=Mh zg6|eL_phd{eI$nzfbqaTj@6Xus9iz%?LH*d&9Vysi|@431@Z$UK?DY#P{UZryV%}k z`J?slYzeUf8P-CV2njWG;#&^!7@v?!T;MhoCQtJLR#sN;OzZqtI|U2t&t@i)O<+7j zrQPPgPLbCK%r2qT;)Kgrh;5b3no@yIu=e1DEr&A1Cc3{r`_xf3X5_gi8{}p7BT^is z-H5rqba4P}k+A3tVJsdpVfMb%&eM%gHZl8EJ#WOj6n17kdc;Q*U0ht~KbiV%um}Kz zpk7*JGQ7eV1>pQ?>!XC!$>8C>4bu$j`5E5 zSN5>ak6Y$&tLn1;GE$Txf+wi~!DDW^sCrR+nX~gf2WVK!ks~V+kg=HjmZ2vO3&TWZG2fX@XJge__r-mx(yI0-PCsF>K5V7~qw!v+eRU41KO+kE^x4 zU{Jm|-umj*ioh@uKyN%-|Jh64^;CNNq-mM#;OmZV&`1kDRTq&vn1EI>YnHv(`wt?h zGcZh*jp(6xhI4Lb&UoNArH_+MmC1g7-O&u$_8a`ixegt{BOtgGIg{b&olRh?A#QdT zYPqyQ&zV;atm?kq+pZ5iXNjIZU=yJ_0R4?Sp|b2gPNnX7-$L-w}evL-k=W^nVuUIXVbc8if&4%5F?P zApc~jI^QoSH$o`+2>nx1snw-@VrCo1ek!)yjf@8>K_@^(9%Xp@4o~p{98H<<+Z(5r zA;YdtlA+aReT0I;T7#?dUhl#J`!zYvLIV{!9z2;RRd$b4UDZFm37+Wp7bLIDkhpp9 zyqyC$KA-BZh$~~h2GUj{z({$gI2$Urupr1AIK$-y0C)+oryxVGZ*7n9M_WZ^7s!S8 zQHEUcyzpbx&Gm}?O>G;(kS;AW7w&%6X?JU={Gv1y!VF*)UCai&q)P~p}|qYnk2hyr+aHK}RI846e?ieGW%ewn?`^PL?mPM3n&9 z%QOuE{4k`@*d|^F#6NUw?dl9S`IoYs4VsIukSQxquNDGkvJP2fmYiOM4XMD3pgG#I zp&|7z^jx%bbv~X})Ay8Rg6(R$Akz{eEd4s_uIrEY+px3DlDt(Tuwkf$BIQKW`2I9_ zTGj-PuWw-KMC{@}^p8B9wcI!te-dg~#cTK5c44E2 zhPguM#BE0E-~7)2BI-50lyaT%0W%Rpl>G?ni2EaJ&|59Q6-7N69`vA@C$`4QvJ-CW z6zhOKJM_lVawln`$7D4(LjQ~DEWn+Z1aKNVaGI%SEfPkChWSh(b^%r%9+fW$6Q~dL zDHn#XxoYuPmG}=6)Y{j#ZtgWWZrynL2$USJ@?$l({0Zz`e9zlTVc(r^%2&b)s4K}y z4H5b2{%DU>23e6fVlk%}xJu9C8BcrSF&3$CPe^|l+kZC1P^zVsa}NIQZzv*#YUoCS zarG$;6@B?1_aA_B76|ZPdSpdNp!z{fYEFivSJ5@kVSywIhxRvFPho~RA@bt?A~`I^a3fIy2_EFvdW>zrf6<4G4nNm1&d zD%6QWb#isqey-;!cX(2HGxB4ehc%m&Ak#QHyHFp?If$g9@h1&5Jqit*h=GV!LYw0& zl*k`&ZG)0q^Tih^xrq-&fNo*E0%Oh3`@^^Q)tgsJ+hzvQuQv5|VN=O=`^gGgKik1Ud0Z8+QOl!NSW`EK__Q5`0{SB}g+b^}SrKvNYcVe!m)vm>R%{MY0zk0&+SJRV z#}B$RZsJsYQpD}=NPI1|@vC1%NcD4xOoqEc^|O8I^Ya9xr)y*KOW>{#zI>*7Avsr} zIFrx>aUjG#1DZ{1U;tKk@%7@4?8USHi8{_H_Zst(%2)*LvrdpBEs*2jkQVy`YM=vU z_S^jx7)Xx5R>D?;1NJwj6trvH7Bry-p~>|Hc)iYfiq7`AdVc7hY6#JqisKo%VK7qt zfQ)+)5mSaZXAu>C5!C-Jfz)^m3iP7l8%l~~aYQvWHFJ<)oV$c7>j$%Sr$HQ0$0pHH z*B5^a#8$?_%t8Zv?{0Ksji+NB&$rYZmRLQ@r=;)IQXz|4HmKQsy0!9Ypld~2<$fIh z``R?9D{R-x`FH)G&l;mUBF+Rn@cRDwWLS&E=L}V5+li0jzPmp%U&48Gr}j>!st5nt zJ4ov8EcREVOBLbz{-53=QIf93fYp6jgFZ7L?P1{Y^6G0S(FU1W_A) zg>jp7jeSKP&=s@0a6J;0E;7E)t$j!4cJLL;oLB%jLU#Oz&OV@zm46!f@#Ak1pdk@V z@BxLNem>nE?enLEvaJwS`F~xB4%p+}o0qJcWFq<#FTgU{LM3KH{YD zUL+ANWM#0RL5imKT{#4mCj`6=jYZ~7IQ_a^mbtk(XR>-~bim2{Gix{WQT0p~*qOb( zF)>172SN#?8s6(CMj$6}iI-3t2~kaXYaFn(JW6g<$>n2|qw!WkT=QUiYnv75Lmhry zzrA;oXG>=x5D`mml&}f2vI z09t35@<~aS0!aL~uL2XH9VFEeSCkRzr}haQ53Xm$uFET!ETDTK~&6!^zfp;B9ag6UZFs?@jXTZ{*D{2j@W? zrTBE~qX-l^o}ljaOZXicJ98bsN5T^gh6njrP;au{SqLd?y%C`yBCn-$vJ4_W=NS78 zp7ADcB2W538oni93sLWN7cdkjZFod{_)0M4%UAgW+NgSPDdaQ`GWRQ?WOV%K0d=w0OpzAx@1RWD61HVZc!QjiyIlLb6XR73 z9L@4fXA!ae!T1OwcB9lo`Lg1}rg11q8T%Eqp1fLrHludR!w?deFRkJw>!V_#(7K>< z!)1#;Y9R6wDdS^5Odu;ZM)4dyR{^l`R~c4FaS)OkNNs`6M?{6+LajYu2#vATBn=Y# zJBZ2UpXP{Se*nlcO^ow2fikR6d8sSj<;ysUF)1glbV-a^_M0(FJt)FJ)nT+B%F%Vf zco6#^lDx^$=7|4;i?hZ*Wz-)+8rZ`UIXut)=HZwR{%BGi^{6P5BdJC5BJSy%7-;Y5 znt%2#c$MQ13wx4OCJ{IjapIjIGzT-nC`}qVLb0E}x!Dk7*L)?IrmIVz`s7FcJoqiH zo=%zzJw1Mzi%z7{mwUI=mJM|J3$uCH7bHCJ|BVNE#>_K~Ds%2IZG$8@)saYQ7sK1X zomlEwYmO?CDg=Q{cLkE3!%>w#LWm4o%Hl4f0V?d5?^N1Hu}=gK5N!zE#v#C2M=*px z`8!S6gB9nkSV9;KAMcWp$X^|3cxCE)vG!qmOsJS={(yX2q~^zRqV@kUteltf`@h(G z9!}N8rUhEWz?*Hx&f`+o-Ver93%30Dn$R)sBA~h(%LJS(8m9Iuor#m{ed7T`5A~{( z+bBO~7um?0NQdcw^5cCU^>Mn&C0Mokh?{=Y;BzGs%h-l}i-gR9Fp4nu`k&r_#@2Yl z(BCDldo~9WxT>{K)Snb}li)vzKSPX1a|h>t>#=_TquuhXN79uDN{U#OaSDwt|mYAx~EbMg@)*=vTHSa&^=jbh@Xd+Fg@Cs2N z^>ChH6EzwYcmqE)R}WHf?ji!mF2cz~>GUtOGh|)g+<07bJ@1xB)A;TFhlDQDiih)! zo_XN04Ny+#!lzZTyM7x(n?F&GL)?Lg)iUI-**HW7m_ljZ*QW0x8wxx z!W2SOBMX*Th&+KksZXkjq6Vb02yX1gLZTZ3R7=$>xJymTDjZz5_w52BL+I}!UK3M} z?A{5Zk(v^Z5vunbgR%s_DX-ZT!_m>W*85Z^-(g1bi90!8(hpB6tC*&Hx0!ICd!L+u zxtSQ1l+Z0-8ykg^Pu}HIBq}MI2JDMpP1li{4rWfh9?j)(sa_C}Fp4cz8YXNXPaQ1M zBm7uI7yyziPn!D9+{X2uXp5BfFUe2%)BO#4AwE8U9Kmq3u_z(?PRHbx7sV&`GTjX zd!m2WV(Dx_)zsG0v*zvU>MGSbSaX6=hyx!{5B4T{M(F@qBpY zIW!uOQ6~EzM-TA>6_O{fkau^zfmfj=r59GS{DHQ}aF^NWd9Oka(StPsh#Mrd z|233sOz3lQ3d2ZT)kP`Cz308A>Koy*9%^r(4B54(q(qFk{YaF7DH%GMmiPIHCGccT z_1Ok_p0@4xnNOdT**qg>uknt{+!g)bsw38T?2#o6;4|@0rcgHt4)yx0L~f8vIWArv z_xeQ3A<9Lr^*!o$82$X;QCdI|B6>6ZmybNOeo8MAz#d8jInyWVA; zGm@PZ({pi_EV=6giS}&&)kcIUO!4+#PVS`zP6GT#Lz|G+^^M@TDE1EHh4|<2%+wPk zf}8pGk~C-l+J?W&_rDX&UAIu^*?CzmNhVC+MP8VO4l{{F2UY*koS-BiRR%Nx7R5WS zt*mb6!*O-s(T5fmQXt#t+vr~bZFH~VWqhC)eiW(hvSc{Dw$fn=7Y2&nOsetRiNR4` zS*tu{fI*QnNfG|mO`jW}0N}L{L#R*Y<)c#j!RGhye>-OW{~1uyUIQq23PgTlANx%+uM35}T!xrdn5sTXk;+Ads#wP3dkmGh zo!FMynO~JEg(la>Q+ebvA*{4JSjW0v%c^wO)0c-KnoQq;9j-bNSkKa z7FF?i+s%J%0ls!v_;K-^*Yp!sDcEQ6mv;Lv$dnvL3Tlc$v=EhIJoTrK_;#}eqrC6& zccBcNJKkdz;cY2?o6?4n?A+&t&s6DE(zP5&J02x>{~lFMYS(C10JjNB=NzGWfopq~ z`;badFAu#Ea7f$?NO2!FbY5#=Z8|(yImGH88X6jII#ropsjmdY=+eF8GU~ObY6PS6 zCRh{}B8keU1oLgn+R_SZWhCm-zmUII3awZ%y;;(4H+Uw%#gPz@=(9fYVzxEqq#5DB zxy^*66*Dsyf%?CoZu$$g+l?mkhbf0U+}jf?{)p!)@YX0!T78p8?~~~Ee#X@W)3Zxt zs6oxfew|6~SzM^Dot|N$z!*jg0 zGGOi5BlRe1k-&PUuP|UNDJOSbT=DKa>TquzBx1`#eBD|r`{s+oA$?N^6l2x>0sd`} zEwTlH47!#dQC|1ju<~R{{q$~IVMMEM-%t#k3VYp>W0e8Uzm^I|YWl_Un@M-eQ9`8Rl&V!4&bIsRPd7#0CGY! z3%PHaeSdXjvlrXZKF9t`@a&_lRl-D)#8H?P)Pt|eXsdzwLIpM($m4%C3X0I7k zyIS=-DJv_BnAHQIZ$H*h-hPteTD?bjxsMbNXrQ%hnV#*B(mbJjW^f)3tRq9NY+du- zkl8dtOS88{qAXjW9M2!#dwEvZ>}!!Zlq3a@?bO~hG63y3@o}{4&~w}cG49$W1oc@N z6qyC?S3s>>P@=Txto(XL#^;+h_N3$vrvzUzl-zk042*`8k~{Y)%vL6A$O?b1DWE2a zeO+Ba!p5ru`v3@pL2;)3C%~|Yp~icoez*Uz;=Zdxzv=~i z6_l3pm$bwmL;z54&}QfIzIorD)|1nGz@-`&_J3Y!u9qWA1mY#F^Wy)$xNJ{$gBchN zrPAGcysZ~#PxT#L9y>L!-Iz4W-PC?ji&h}H@SvHlZ)8{8R2r5gLs*49L7pko{d^G& zs{>|2s)u|K;m)Rm!5MockhIgFLsARkP896G4hcqha$N{Vzm@bXo8?_`?V--Mc);{z=7^V9dbmW z4!op(WW+AYWlkT*e=TmRXbRY?qS25`y``szRd;z7V0p?N5wkyH8bF`5-~ODp!ZCt9 zPy0vcfme6B@cGmyQ(aPEG}P~kdib4jd9r5AI;yxo=e8gw=YuI0$*pi6jJ~XvRFi^! zc<`vKZ-5VYS0NoQZ2efwG@48PoJh#U;kuo9c3J8b>hM6aJ4u%HwXm_>*cM@e-SOiOe%q;9dCFHeKe%%p$?A=n}9F01VQcsjRQUn*n?ly34D5vYVtl}K zRUM_;bC}nflc=!16Q3THW;rlexW1~Q zaH!S0b&F~*3oBUo$wFX>)x;~!Zx8eR-7`B4GEn@cUegqTE)i~P%caWlA0Gn%^)l28 z&=&%_YNZqfzkYrgD0MJoV)p7aEVYj0TmW^TX8#fKp{nBN`K8uKc6_{PneB5wla|g; zP=f<%H07goQsE6PJ+D*egoMhGb9DzBg$^3!e86`3WjWPpMci<;n+*{c_KI>}>iD}& zq{22Z`DlR?az%FBpVx9je=q?Y!P0K?^-cjqBcCU;pwfrB^~tkBeI2tmLT-N0WCrrO z!vtCqL~XE#$#Rcelc?+4xC0)VFP;y=ZCvRGNwL2fS z$EFUfQ^eMIqSlMvy(8oD!oj{{%k8mexifaW2Q(z9_c-KQg}F-Cf@S>oyfDJ*i^s}# zy!+(0!i0<}>LX5w;!+OxGW{5?M0y>0{t-OH+F$)@WEXN=YG;%Y1)s(rEhKF!>n_ee ztUV`hIIVg#PW)o(MbT_Q*mlbWfAf^Q8EP^;*5+K>#N+-P?K-k1k^49Vsz}sLE^YWV zaJsRTC0gx5&7h|D>b=2I8?E>1N&EnK4yk^!6o=tgPr360Svyec^OBrdKeN`cJy4!o zGtVwOwMl-|S{wOuxwLOM0Wf4FW}^19d*OioS?6q4 zW>$6I3)OQ>vL3I`8_pPYx6RTPim*#MJ}{-89#UF7*1W?u5-)>rb91v#lDM2u=n`19 z=rv;OIoc+#ZdW{f0}={b9sWsfl$4XsI%qZUEE9u5w(H^r^2eSv5LfDuPzwo{ymvk7 zU@e*r8zg7Cc8sZa2%EDZLsCI1)>7BIdJW9p#?*?7E8&MLZGjx+prv`c3F8PlR=AjW z8dw@B47D$;88&&`s-6du>Wu^$4PZ6nai5^v#-Q%zD_dhhz+m)9oU%(}?ZNI+tpM;= z!hy+)n=MwjyLssjtbVN__w-$dhS+1S(HEw6j!2sN@4Pogkqev}?#Z&J0NN-P+M1B4 z2ZbWjutTUd3`gCC#E17So9*G4#JJioUeua+EM+>&rn_L~&}WwFr#)|fmssI2wk-HV zOJS$E*6Jy>IY|)F?7sf@ux0l*&jAG?A23fDu)dM@Z8jHHCFt}pEdi@!=iF%*eOqjR zr_Y|@X&vMyXV1M@_Py<0azidPJ|1X3Ia5*>3kOo%x4TRaED-&ETN4NrakOtWO_-zr zF0!BEO!djo`pi|0f%;#nXwV3sI(=ZqB}jiGfe9_zCpR!3v9UjBA%h>wmn8+w>=NiG8!_r=qGiY`or=N`;ljCExA z;N#3nq{I5Q=9$FijAPt4)F9D3KP!AVs|=5V z{d5{BFs8>}PAc^3BD=sLQtkb-LtsFG>bsb^zIVy4FnDj9WrWA3gB~h{&=n(7{pG`6 zx6A8-JL0JNHB{kX6fbVCce4c7rkZ8Hu^J@bO0OX0eYn3hR*cqntMZO>bn{l!adGvWAuk`1 zKn#>4!A%Y2Zm&yn$~;6DTedYK1Gbyk`h%oQ*XSc|=jt`^M$1`DJ!{B_Liqd z-xqgWe@eu>;r4}bgl~-01nEwMw;|O5XTm$pSv_F&UU*k+cpre<|8jV+RaeVNms9}Y zYA*PGr!CyQ*wo_lW1A9i^yh4cJ|03T2%z;Jd2N7v+c)L}8~0hM@#4!7JNeL+CzBu8 z{!$6_K z)fS*H+J`DY^|wWBQ6~RTK=PQ=(c07A~$gW=6V@;X=ARyiT>i)@IG( zv*ag)fV&mS`Ci{5wxa!a2U5rssEMDIkfTmy&8G4{jeI_`0KSdKr~FzFVrv=U2*2^w z6)$dN3V(~>m!$%X=6$&=6=1dI(I=WK!`lxfO*C*sj8wP_$~geE%htpmdems98sMDp zuqlKdDi0IKfc6t{UTcfgajXG9V^g+w8FAq4gI{VP9!MRuOS#bg^qnZS3&wow#tvLgDP$JVJX-ZDLLfk$gW0JX?pJ$^m6i6BLs+iU_9i|5 znKhyB>nxUBby{wqqZ{o*o!n|(czib(=_|EHC`8RxJZrexXhRW%feSEE>7)B1zO*Msnm3~F|*XBJS$wm z!H#mrG=`e{|4QfHVUzs9gdVIj?|-a@_iBl}7@T_{o@(}IHurL-R*LXyt!OW%nFtz9 zPl`viwLd!rH&w+ZIGV{VV-}V`TZ#-+tISOH&e`u)+p9(Kf8RFGP3;?j+Exqur*q8r zY6IjhBX@oG@lFBuh2GN?N`F5|61RWNDY-pPrGP;f0y9R(y?XQR_*EQ6<}PaX6=Ipt z+m}zTC4C>P6S`aV+5abtr0WXCPMw^tj#su8KOYzJ&MGTguzP?*(tM) zW?sP$jvXHI^o(TdW*6#MW?%rH9k=M=tws-y9iW~8e4jp?hQ-U3( zc_o}0&5rjM0P-e;V0U~JhPU1Frgyy0Ywk