From e452f65575663800b6603e6074694b587039062b Mon Sep 17 00:00:00 2001 From: sunsets <845944018@qq.com> Date: Fri, 25 Aug 2023 09:36:16 +0800 Subject: [PATCH] Calibratioon --- .../PressureAdvance/pressure_advance_test.stl | Bin 0 -> 126684 bytes .../calib/PressureAdvance/tower_with_seam.stl | Bin 0 -> 30284 bytes .../filament_flow/flowrate-test-pass1.3mf | Bin 0 -> 142970 bytes .../filament_flow/flowrate-test-pass2.3mf | Bin 0 -> 123202 bytes resources/icons/check_half.svg | 4 + resources/icons/check_half_disabled.svg | 4 + resources/icons/check_half_focused.svg | 4 + resources/icons/check_off.svg | 3 + resources/icons/check_off_disabled.svg | 3 + resources/icons/check_off_focused.svg | 3 + resources/icons/check_on.svg | 4 + resources/icons/check_on_disabled.svg | 4 + resources/icons/check_on_focused.svg | 4 + resources/icons/checked.svg | 4 + src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/GCodeWriter.cpp | 19 + src/libslic3r/GCodeWriter.hpp | 2 + src/libslic3r/calib.cpp | 919 ++++++++++++++++++ src/libslic3r/calib.hpp | 280 ++++++ src/slic3r/CMakeLists.txt | 19 + src/slic3r/GUI/GUI_Preview.cpp | 3 +- src/slic3r/GUI/MainFrame.cpp | 42 + src/slic3r/GUI/MainFrame.hpp | 5 +- src/slic3r/GUI/Plater.cpp | 75 ++ src/slic3r/GUI/Plater.hpp | 9 + src/slic3r/GUI/Widgets/Button.cpp | 327 +++++++ src/slic3r/GUI/Widgets/Button.hpp | 84 ++ src/slic3r/GUI/Widgets/CheckBoxInWT.cpp | 125 +++ src/slic3r/GUI/Widgets/CheckBoxInWT.hpp | 55 ++ src/slic3r/GUI/Widgets/ComboBox.cpp | 309 ++++++ src/slic3r/GUI/Widgets/ComboBox.hpp | 95 ++ src/slic3r/GUI/Widgets/DropDown.cpp | 492 ++++++++++ src/slic3r/GUI/Widgets/DropDown.hpp | 112 +++ src/slic3r/GUI/Widgets/PopupWindow.cpp | 37 + src/slic3r/GUI/Widgets/PopupWindow.hpp | 24 + src/slic3r/GUI/Widgets/RadioBox.cpp | 42 + src/slic3r/GUI/Widgets/RadioBox.hpp | 39 + src/slic3r/GUI/Widgets/RoundedRectangle.cpp | 35 + src/slic3r/GUI/Widgets/RoundedRectangle.hpp | 21 + src/slic3r/GUI/Widgets/TextCtrl.h | 10 + src/slic3r/GUI/Widgets/TextInput.cpp | 240 +++++ src/slic3r/GUI/Widgets/TextInput.hpp | 77 ++ src/slic3r/GUI/calib_dlg.cpp | 242 +++++ src/slic3r/GUI/calib_dlg.hpp | 52 + src/slic3r/GUI/wxExtensions.cpp | 50 + src/slic3r/GUI/wxExtensions.hpp | 6 + 46 files changed, 3884 insertions(+), 2 deletions(-) create mode 100644 resources/calib/PressureAdvance/pressure_advance_test.stl create mode 100644 resources/calib/PressureAdvance/tower_with_seam.stl create mode 100644 resources/calib/filament_flow/flowrate-test-pass1.3mf create mode 100644 resources/calib/filament_flow/flowrate-test-pass2.3mf create mode 100644 resources/icons/check_half.svg create mode 100644 resources/icons/check_half_disabled.svg create mode 100644 resources/icons/check_half_focused.svg create mode 100644 resources/icons/check_off.svg create mode 100644 resources/icons/check_off_disabled.svg create mode 100644 resources/icons/check_off_focused.svg create mode 100644 resources/icons/check_on.svg create mode 100644 resources/icons/check_on_disabled.svg create mode 100644 resources/icons/check_on_focused.svg create mode 100644 resources/icons/checked.svg create mode 100644 src/libslic3r/calib.cpp create mode 100644 src/libslic3r/calib.hpp create mode 100644 src/slic3r/GUI/Widgets/Button.cpp create mode 100644 src/slic3r/GUI/Widgets/Button.hpp create mode 100644 src/slic3r/GUI/Widgets/CheckBoxInWT.cpp create mode 100644 src/slic3r/GUI/Widgets/CheckBoxInWT.hpp create mode 100644 src/slic3r/GUI/Widgets/ComboBox.cpp create mode 100644 src/slic3r/GUI/Widgets/ComboBox.hpp create mode 100644 src/slic3r/GUI/Widgets/DropDown.cpp create mode 100644 src/slic3r/GUI/Widgets/DropDown.hpp create mode 100644 src/slic3r/GUI/Widgets/PopupWindow.cpp create mode 100644 src/slic3r/GUI/Widgets/PopupWindow.hpp create mode 100644 src/slic3r/GUI/Widgets/RadioBox.cpp create mode 100644 src/slic3r/GUI/Widgets/RadioBox.hpp create mode 100644 src/slic3r/GUI/Widgets/RoundedRectangle.cpp create mode 100644 src/slic3r/GUI/Widgets/RoundedRectangle.hpp create mode 100644 src/slic3r/GUI/Widgets/TextCtrl.h create mode 100644 src/slic3r/GUI/Widgets/TextInput.cpp create mode 100644 src/slic3r/GUI/Widgets/TextInput.hpp create mode 100644 src/slic3r/GUI/calib_dlg.cpp create mode 100644 src/slic3r/GUI/calib_dlg.hpp diff --git a/resources/calib/PressureAdvance/pressure_advance_test.stl b/resources/calib/PressureAdvance/pressure_advance_test.stl new file mode 100644 index 0000000000000000000000000000000000000000..0df26de76a59b0bd97fa4103495cd67c5329d14b GIT binary patch literal 126684 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 VEN-9ckHnf}t)jxKHuqt%{QozVyIcSO literal 0 HcmV?d00001 diff --git a/resources/calib/PressureAdvance/tower_with_seam.stl b/resources/calib/PressureAdvance/tower_with_seam.stl new file mode 100644 index 0000000000000000000000000000000000000000..325ffb1d70bfb844b501de354404901a2ddc6272 GIT binary patch literal 30284 zcmb8239wyNnS~#L1c*#Qh$Mt0#KZv25TG0&@XmWT3Jrvz0lNzXTCk;&Au>p=3V~Cg z)rx3oqtX%u#Z1_sSW*sM+;`r)2zJ|wIN*TNU}H<0V3{-oP>l4y_J7vCYu~fqOSn~` z{&&~^?X}Nv_i)ZWhcnJx+L}9j=5ccmKm5?c-+1VvLl1w`8|N-Lb?K?6AN&0C&%QkO zm442dG=NVT{yR_>^G>;K^sl}?rS<*qEgk&BqMJsq*sxuQ2L?tCT)Wx7@3cJ||1Aqu zl$dwz`J=nv{?af?8lTWCi-+=rDoPyrwmCynPuraFP^FI;-8x}(%sS%ttBS|Y+LZB7 zrH`n#P8c1tu3K^Mf`NgJsYi*ut6Oe+cjy%#k4V^&9paHqkH_c!e8=b^Bd@BDGmh#m zA^yTkw~g-e;vOLmgw+V2vQWjptBJvnj6VH~y?caQ)!5A^1rH?{ zBTIktDWOV^aF0V~JutHA%a;ZZB^V=1TZvAa#P-YfS*S{maE~8Nn>=#DPgYbv-*D>d zlwgdkwDsu`KX{!gN}RTF=e20BqQ{_n{9ug|nq{=KqUKQ(r>;>YN4SS=`5^X{ZTVUy z7$eK}g7gL?E?)nJwW{O@_poDL;F#Zc^CuF5G_veyN*_gH;~w3$s^kdwuyeP-xqJRz zTM~javh1vkt#&wf1M&SMRvn;9j&KkA4HozfRzrs-1ZiZYy#a~uZ1*1vRml# ztG;*Mv&Vk>@!9Lxe?Vc3UZ1^0O5iV5a)gf=-hSm})x2}7!G3~t@Q{9`(;k>fM6 z=fRPyj<_^uJ#5Pd>wQ(K!ni&jv8N9EibO0IW!c`1S&ZGoj$lzA^HLSY z@UY__M;zgplZfS_EX`u<9(E=c^|@QB!WbTD?<_0WUZyf1I{YPI1DM|@EgB{;uI3DjMc9Ff)v z`Rc(KSz6mrtNU$Vh2J?S&Ih!m=J&Byf!O00cg6p+D_pbETe=BjT0^;)>PVuVzh9I}(WbeMbzc-{QAs2vwfnVRpCsv#GD3R!ZFUjXB-RFZ$bJ;_c9^ zho6|!{orZ4SCJ^WuT)v`{@LAMu756MZQH(5;!k((+dbg}$B#yjOO6)yn*Y3xwJ9-}3T4~l-Z{D%H%a)ZXVKplYRn9qM zQg`9bH@|{fDRJ~SUK(3;+y$wJ)vPS+m(!i~)7yry7ZLw-<>YXj|9<+U?%Wq{3g4$^ zqAE%(`2I^{J8ZrnL#U#}9_Mc!TYmi9455k=i_6VpXFt3DX!DpWp;;GRylHIB*t*`C z7>~y;)`oxc_V)cKYxwLiYEM-ICCU7=S~f-$nRl}HIya)f*Q<-i5ibGI%D9!fAqmbNjSwi2r32=_Sr zmuFUw9kpBVP=YbCv?c1al~5%|xW}HqyQ=!&H7mo+O9{rv(zdJ9Rzj5=;T~`L?e*1? zvHv-yzbw-DUR%CSTM1QignM-UyIo!M;Pv5ZloE`QrR`&hj&P5io;a*}*Oa4!hZ2mDrR{O2t%NE$!aeSOdHu-2SG*&5D8U$6 z+G=;&N~n?}+@t&8@gpO9T@yT%V2mtn=R0jBRLK$U@#T4UA3Jj&AL%Q>7+Km&blOU& zk|W$>#;so;+<4Htu^mZSr18D>C7ress^kdJo%V)5%qX7y$kO1U1Y=~SeUuWa`-#OhL$iX15{!|>9>+bDP$fsW$9XqiTI~IY2hb*#N-#zidpP${LX{lh9+yA4 zqIm4H+XoLN7$b{)uzM(>N{(=kGw(K!YG<^G14=MP7JF^?P(qa);T~(&Us5doZnz6D zpaf%Nam3*sN~n?}+yf&qu=wbBN6$ol?=vqD|M=wl7EC_*8-(Gp^OA8Q4oR02vr!8u&sLkY&c8NC&scu=7S3G=Z1iR&dbfl67; z!VEGf{RC$+O+q~o(?hr1w;5hGe~nj)IPZsQ^WAWl95FojDJxZ!;B^LMj!$S7uVqD| zM1)$Y(no~*wa7|6l(0Bv@hV;$`oZ4(fzj zsq&8PCUw6yx+!F-ce>@OD4}iF_=INRH_vt~B~(!YF-JHP6U<_}f~}22i7i(}%hh>8 zB*MN@LbG)C5{clU<#Oy}Ma5YW;z(FrR$8tS9Mw!rXcosP2~omB6^=5HrQYM$N(qi1 z5)b<$-44y-Xdn_LA`q(R_+i^>r36RLD0lqr&@7#|rGzR<=qxNHR8d0bR4Ji~5<2Q1 zpU^CwQ>BC|O6crmd_uEyP8Ep~M^KLeu2L;?&TB%|!+%T?-B1=n3300J^)^!-y zcR`O&XqL6w!?=drBvi59poMGG$Wrg|J(RGXsKq{Ud_uFVx3dw(=YwA$N;qThs?tv+ z{dpOHnxLWtV$OHcTERmJX4&YYHSTCBDq60MQCb|;q#jz9X4#l%I2kSZX4rP9V&kh} zj>5F0@jaB_eKiz4KA~AQejLW#*Mul>JXBGF_w*uR+4!V{X4zaMtSLlRS}RqQ(AiQT zO0e+gBjRjJXELdWmZcuHhAFIKM!6}WN*@u{UrkITYoqG5&P~ErX@ynLQ2L0lj%;E= z*Lc~Qvalw(NvP6Cg!OO}6S`K-*2aZ3$xT9)J|e8^o0!lwce=(eJsx@{e)z6U!#{g^ z_i(;$+wVh(m%cK)b@dt3dS`oy`r*7%MTr%QpC9gQ*sDi4&_`(26+6vptzS63N0g3~ zl`2X+e(sjxW9H205z#{l%{uzPeOk}GdS;J^9;zs@rL}!)?V?#dB6=vHS)V=k)vdSw zrx4LY6(!b}JGIXKO>XY2gl7F<(r&Hc8M8CB(qp@L^_@lZmuepAhCt-Rom!`MZshbmP$y|vRh{}-~fq?AxaiDg$$Yc1N~SMdUYy=(t$ z#`585Ev$O5zj5EOg*6O_QBu-#`jRtRiRL@ z^r1_3>?VZ$QC6z-5kn0kcqn0U%sS~OcZ@E72G?c#kB2IK#L(6Wqhr=x_uV?W&)fFQ zc&O4x3~ik-I%fU$Cp>p8p9 z*T$04?NARTtk)jrsmiIr9W!D_S-Q_%iJJL{;;JufL3C-d?orEauH(02`dqv2~)+!Ke8IXmT_fpyN zH9b^Of~{SXP(=y0c1=PRCD`&c300I}Yu6-HQG#t(By2z7Qx>Wy!Ir2=sGwQGzW)Bz(hd%T-Z=ZA_C;MG3ZJO+pnV*t#|eRg_?x-y~E~f_+z$ zP(=y$k4}7dQFrk4C&Ck;VGRpg2K?@L%~F5!owgFHP&j4W+qI&CFX$r0}H_>5)6jeFl8)-5T)7+KnOb=pd( zk|W&XE7Nx!+5E8;VLNctIKE;^uLNUcu?2Sz5;r|Quuzp8;T}g_`@ZVw zo8CG2$nxFSDZv<7Z1dfN1pZPbN4Up5XT81p=4YO_-Z&*lBa6KRayo4#RLK$U@#{n0 zQ0@EJkp*}q7$b}QihC%bN{(=k;;cW9>|dQ1Jd|LJEcQh1p@b?q!aXiK`^u5M{_VZN zLkY&nV&CN+N~n?}+~eX~W*ocWhv6x@QVGV$VsGajB;N93wMLa3;T})Tx_z*F?N!CB zRc~3R1Y=~ee{>HLe>`NL169cp?(wS|b}RnwOJ^3#*YA)Jq>;rQ)jdeed*I#!RLK$U zv2p&A;zwUyP@I3tK?y+`S?q(|LkU%KgnN8&^F_s{{`x0_=Z`(SMhV8qVz2EUB(D0* zC)TNwBi!SLy;l@p+i&LJ6^GoO5TudC5rBJ;u)j)Ga)f(;^G{juejOC+)xsS`#5NiT z&kr^URg|!PH{7+Hn9wX64TL+RktkU!Rp2M1nzUAtuq_XFCsCI5oGs2KY%henKur%- zl(1tH?&CBGRg|zZCft>25~?U+=W)2l(j-(-!hT)hj!BbHMG5=OhdU;b@SW>p>ZmAT zEm63S({L)R3WW|A9L%YD)egLm0*l4wtViPgep10J*=;-&^v=yf-$n#R=S50s^kdwurWi0 zQ3iM=7$b|Vt9vM+N{(<38~co4v;irO>>f&}k|W&1#&Df_)Hk36V`Q;ycMm00 z$r0{hW6{BS^oo&XytB?2S#0y&LkU%KgnQVSdaxdamr5{37JCWzP(qa);T|?ODC*fn zsRUzWv0rfyB~-}~?qPGBqMj9%N-#zidm{HxLX{lh9yV7iFuOCpRDvy5~}0~ z_pmuN{(<3yNWZ&t2jz9MizT*_fSHW98r5r-*u2zqm*Eb zERFzb4+6MI?}Jdr13qJVC)`NbcJ&8(Rq}P2KasBd9_GD=_itB z``}Tk2MK0@#ycnS9#oLkPvp0QSDH!CoAWl@uMJxsYel7>pkHzqxzM{|T%CfN@D3eo z1z&v1LKP*r?qp&@v$*ag5@oP34^_BwWZP?{1lNQ_54Y&s4$a~Uk4VH?slqiH+g>Xr zxcVY`WNW2a7Ke2i31KxW3stz1;}z8^tQG;mwI+#&)hs>cn#C0`2@z_g3fJOnd##k< zYN6<1<>QmqO0&3zDH0ACp$b=1ZF{Yhu-{F1VkCN$Zes7Pt)Gv9V$Wi%KI4fUx`_Fl zMw3uQ2|mpciMSoAD8VO5nuID!@W~D*etF{3YRPf_#zk!z7^4FEoA0!hP$frz?zGFV zFRT9bxo?J9krIrNrL9CtsFEW zXH$YPvb5#vw3SdLN4Q7p+f%AX*PazTlwgc3Z67;rB~-}~?(wnxZXS94(aVE}5{!|h zEo!H&gep10J@8*U-0(=sB3*yqXsNx2)|NU)fDW}9thWOmu`I^OvKq!#J0(=f5$<7o zx2TUtQWj}s*`5w-6}@FpLX{lh9(I-#^?8+)MH*Rl#)LJO?xBP#Il?{c_fgcpkEATp z$g(p(tQ~a^B~-}~?qR?4qW+yHWsydf{er_9Socsul^o$7)?O8CuasbnENh9vT3+{1 zLX{lh9@g#_YE_fSHW91%SRYmZV1#&xaanNjnI zgq0hW9N`|euLkRVRVu+4SsVexeH95+a)f)>y1oMcj4y4@5#PAS7&9R}zl*({67Rj| zovTz)f@2h)N73WTgU^|-gl6f{466-Ut9X{cT?xi%t*{*|3;TqAi1~ekNE9U)Cq(E! zbRMN=KEF@4y!x-BTJu#=!qz~BCosnMKv|lF`MGWVy42%@Tc5g9m40IC$s5)+Jy;X$ z9}VswlzdbP}Sp zpE=%08lLTeq6D8FY7(j_k)FHu&dkC3otfs-duEI=%H~$r0{hZ@?_-cV?DKFh&-C1@57QDmlVE>&Al^o$7_6E$NerG1$zZsts zWQ;7f81A8jDmlVE>}JgA!B5*jd2epRLK$UVQ;`3tlyc5_ix503mGGe zt&)2vp-PT$4|@YE9xFfsFEYx!`^^7Qol1ZT+`<@Z@m`IcV{#SRdPgKtI7LT^*b{M zlwgc3zTKnVav@a75$<7cz^v+bW+r8kMi$>Q;vPzvp4vs8jHviPPL_fSHW9N`}J2F$8{ zXJ)AcV`SM#KfD*mJ(N%-N4N+6>!0u>QoKLJvjpYhtmGTb)B8B8D8b|JwW0&YK1yg7 zk7guF){4gf3bzAsgQ#uFLKP)+kEGk7gl1`NQ$lOSBiLWV`1D!0YM}Ez#+V7&>@K`R z%D23JUah$D;9uRTiV|AG)I$l);`i7^c>;2EK_cCb{&JOI>;%pZWZS32 z_>(I>8N&l{Z*^NgL8YIt8rO49AyZDWw(jYCZNOvQRG)OlCNOue^jdXW+4T5wGGt$!C%@EQ#(jfhf&-0%1 zKWCkfwKlWvn0;S+UwQBS8`V$9FIbU~kWdi~2`L_|?ECbezt>0vNZeBF+~y8Ia|?U6 zfBrv1dX3b%kMhsG>srtL`K)X+9Jk&6c1DHHJ1;7F=W`sEdrjvVxQxk>v42=# zz*b7}2gAd?^!)KwFB-4Jk7<-v`-_nHQv7%kpL8ODwAz%;(;>Uq_1+6x;+Pq1zew=KJHR=7_>i}uBZgu{$9C@54a_)^1XT7H4^g` z5G#cb@7`aH=KJ41Zq5S(?jOUc+MiCl`*AwjEwVeF)+xlU*Gt(SPo9^Hs*$L_kgj_Dd-yWb7J zrc$yhh0ap9->vUH-4e3xtgXL|*2|C$(Yt@d3HSpI2vuuc>o6>RxZk+(eOe(tJU3|n zW2v_q!0B+_0&Lgoc=!!7d)fTv`QvpdQ0#vD5bEbCc7G+S;a7Yfn%hAIRzQXbS&G~OYaJLEI^kbkqG)-FVq`6(NbI^IxaQh%Eh65F{HgkFtqdsf@iOE!^D zZ%|^c8O-H+MI_l3A}F5y_%0c&fVI3 zr2s7m_N*jf;;VYh&{uWqE<{^HwEM5>x|twf(Xrk0oTo6|X@)QJ`aRI|*4-j!bw`KU zz>M4FyrvA&l=J%|&dWMS`MVdiMAFr#yPIe&gQHgkJv0l9^omOY`6s>xDvC=ECEP$K zHb!RTZFK8Pzg@FVJer45*A|A+`Xc1bL0&wU=m`9sK6o9QzM~->Bg#_v0_%o{6v-!R zDU$eqr1~!%BJ?*DmNGt2-=C7mpO}K7-Q+Wz?Yo+Fz4QyOe3dey?>hF;Uif??TM=E8 zIhd+>E_g1hsK@>ow=Xcmz0WNl6w>dK?p_^WvON z9tZMsEi5JYlwcW~p+;BY{g9`oOiCSH41*b*Og)TLtUzkY@p93`X9U)~Gq?C={Blvd zn(QKtaT0``doItin+gw{%xzd}rDGYaNQKAKON=fXyt?ZN*>8eUq=`^84P>OX>GMc9 zUib4I?^os)kjF&*`e&r#UVX(}MKQc4;*4OR_>DPrLmwUUg@*)$uGDYXb@e-te4J2k z!EXG3b)GM;TQ^Z!ua0lT4}bs9qS@%Bv+y-|e)(#5tW|ma%HZ`T&0W(tY-h2Oki>CI zJ6ZIzDz=QYlTZNx9;s@S8i`t87DoZW5mifY}!9u&=`8ii;zw^_Mv#6`{^E1Ec5D}(%*sgDG69vYRw@J;=d=Rtm zeOUF*E!wBg&8eN;HBAOsT+5u>#=|vN zl1UrKJM0r|w!|*JJNL?(vRnt~p7kt?vt-6|5dKwN&RU#N z#zLHt=U;s=^7xB0R@zIE=tDp${{)YPuj-zo&uFiOMA{#6S_jVqv7#WZ&D}t=Pa?cl z!7j&oy4AzAZqid$2aZGLY!WYYQuy9LFL^cxJ8@!#Kt}cS8)v0sqQDCXu6bID?se%5JMzLmufM$^B*?sWk84 z5lVZc+_)dr4k3$Ry+5k++JV6Lhd|Oc?)3Q{@0WpfckL8-T^qCl80ZS${r0Rz;1OJD z6Msei8x#@Z-n~kZ*pyAFOO;osd}%gJsfrGyW;AkDAF!jg9@y@y3NmwUdr6Ca?BX5m zjsK0h+#)zh!;|S%Hz}IYse7h{NllK*PbQZ&HAy)0#e-K~lZacj82zwOs^SZ3dyX8# z^R8NbF&rA~{qerf_^Gn^cxSnIZ6ne#y0C_r+DrV)(EU?_6!mZ#gc-k>ObmIIV){=! zz+?!$!eR*R!(mV}A=JwRrKE`zwCeok;v1Z6tD8FazIq@WdC=esXvvpDUE%RpnVYRG zy0pCuS}^)30$`(*a3t5ub+ot(>eU{?;jD-&rsAapBwBU-_OX@bZ+Nx4fBITv!Ll*Z zEdML|HrC4sUV7;oG+@#_ovm*?*>+A9m8pokoWR68M5g^hsTFyO|9}$CVy5;h{Ksa67;-~e!qV}sGJOTH7c;fa)2gNb^uPz_q z0s8wnaw)qTFH}XZwXH@{vFjN!!u!)4N=u2Z>B#&fxNt1#A%Mo|um}5@t5Q>Zq4_#b z%s#EH#;tk}L_(4LU_|6BR3w}xCxNWM$%N1$KEm9tVj0Y0snq(k`3ic*6D>X|Y`yt% zZYYs-7z|l6kgs)HH2KmPE?c)>Splwy|a&Clv9p|9&XKa1h2roFn`|V+9&6XKQFd z5&r$Fh2}%%E1~h7@GE*g@L@A1J*~DTM~Uzy{^9t_SSX=m9WbjhL(-Al#%;X7aN(T{ zh3b?jZt&uuwm*JpJk(cN;eW?cRdl5{s_5|K6n5rj3QE(k$C5sLlJwo*sS6-qOXjzk z{2xC`T%Hm$4JJhWG}iE>t)} zH@YrrOfJBMT^AL*vm&7_Z4lrTxN^pz?EYvKmU9#JjvQ<`j+m&Na4k z51%8{ik5}}rI`8$g(^B47DI0t!pQ0V8oK<@OIJS4vKttQhS(En{O)t5pP8vLkuGuO z7RYl~FzoO{$n(bDLdY_|GnGsv!sM=((Dct*^{Cl1rn3kZ9m@3{agVq(5j%EIk4q&QrGFOI zl+jG$#2^u9eKY+8k&g=%mcB(A0c}<_S-45Qm)rE|v3{4h=?sq-RAS4H zROe4;JLAb{XXD&8NWSO0FLiF$1MXB?k#43bZn&P;$lbfi_93>{PKgbA7rjK-Yt#_l$T#%1cw%*fQRK*xr7XSu zi$qzKa+A5}<~0kT*SJ10bj<3gZO<8f_!wU$Z3ZEZ%4A-uOD@o8(j?I~q9_S+%^CAa z&^X$$#G*HpO*9=$;<*mxFW3h6xd0a6WGT#T1v*#?lM+augbVHm0aX(M+DWfUuxn>^ z&;KMh0t#K91KfeQn6L8O$6yY=i(+BvO9^D6B<7Pp^; zT4;I_xSYSTwkLFr7STy`%iG!N+RsXbGgHKZ4D2%YytB^T6aPx$K8Gg8tpTLtm% zaoJX3pYSyHqBx>x?p?8+IN*rWMZ5VsPJQ7QSOAJw!z9m}&gktLB{G#r#nB24;&qK~ z@b%sI^1dd8RH45rZ?ET-`0{reC>G32PU$yi3r}D3So1nMGQ8^AP?;;2G;_C^I6%2t zFhfcgQ_`eNswn&7!kIdOY#| z87-Qph}pl-$LXw)9OTxI-5&a9WG?Ou(4UpFp2jM1cw0*abq>7Nyl)&eUmy?va~U#Q zFl#)vU|ek*rsF{P1v`v<0cc(rZ05Cy74n7S%kQ9ScYBLJQL^b`dJWiwey-MyC(LtF z2(=0FP=>#%BJ%H5__rg$>4Mp=rg=iSXfeGCLIrM0@zE(8^g4q?FzcxDI1{o#F$JG} zM`9!yAO>gz@`5eD#LVb}L&xM(VLWIhTfk6!SurzC{ZB6qOZc7F-?*q(AxFCUzIZOR z4tO<+%LPvQGOKJ?Utp#rA>DqRBxvE#zhwV~C*`v?SL4U`OxPsf;**+yf4{EH=P z3{KrrwmtkRis-E2auXvfl@k|60iPnWGdGAi@)h#NoBC~?4$+<61fT(7lZv{bzWhAf z%3j=quZwIr=A%rLVs4{1`3|Kn(FG^%2{XwgBkhQ&(s#Lpuno*B`b z{-C|&0hZHQo?tuH(nStnb`S#4=sK~t7O%`lYcaQEIVNyJjqFk{$CK6Ej=Z` z`dQlo-|I|G;vXz_dsvk!ZJpd_ORY0EJ$OF$>J+x%uI24~R8y0VWzF2qz_l5zpd*!j8k>OAQQoDnz-S+T68Lvis^f_0Syo#z=@v#Vy@4aHDp`*K1&4MS2=B1 zCt73*F7awto!sc#z$QoHq>85}@+3O99iGD}iwegH5Z74agvEk{{!BiLyN}EZ@ol+& zS5`2&f(n=CMVMUgo*USXh1dX(GIF9>Pl>MSt zal-~O$Ymy8Vbk9Ukw>b`f{54!1;>ZR>alPh@#7oG_IJnGfh%e$Vl@)iCzdB>M^3OK z#WjvUB&2;Q`Xl8s0$|#+wQP_BE&yw+i9Wq#nw=;kuD~-_r zh}rq<%*fV)M)UW_nICzj*WFu~@KtUL$^>?LpjD^##@qTVh0a6=(-7&Y-LUGy_sStX zISZtDW`lG}LDc(Ztc!cE&8>0qM)E?$N6VqC_U*+hJJL&-P}wF$a@Hh-&S0$!hd(9R zRy`y!vVqnrn*}5K12Fg6;?O+LBnOBA?xjA>;t@YtZX6NcF{6O6!KN8w<-)Wjmcx93 z%xeGSD<%LT)WJet^JB$b!Cf5fM&?mi@1s?Od+mbCfQPMFKa1uxy(G7abagR*++jD#BZa$x|Q8or{@IV71kN^`+ zvPHVXh}W6usm0tRTjmK!_{b|O%xqq==afi&J`D4yVdS#+r0qjQh&FK^K`e*rt`Cv) zzZV-?e_S;TNu|_}v{SbizRQWgH`?+5qaO(^ZI6b!E$}Ut_}_6ETLNriJkX+CQWv9D zD+i0}-UQYtCGS{hT|Rg|n}9i57t&+Fo9KnN-+AwI%S%Sv ze{a;ZUu|nU6V2=HoHTR$N?L*U^0SPqWc1`|RyrAA094pkgmj(S%Tclxb_&8#-Vp+LZpC?cMYqC_y!2a=3Y@5S!s4!)GMW|#ND=zLC}3K<;E)72y&ID9 zq-yaA0fcs6mpBNw5ked~{DR_SDWL{MgXxgo>L)D2?Y4-Jq7 zl^)_dQ@igch9Xe7Q9SIM24Ch|4%A6ZQboErB4@$slnQH%g+)k2D{zk#ru3bHAEUDh zzR&{r)CYCY$Io42w70JFs7q6T%{raj+OvGr&rk~zwX)-B>%suQ^On?yC#tpT(=|1V z{Hm<)eohYfR8CIX0$U12S_=8FkN7u1g}qq_o1-AO8IOZVG02EEil`4Al+iOi*=)C` z6y$2wL(IM`^VyOv+5UR&wKjo?8I!CD(?W3=X0&hVBP~%KTZ-d_IDAf>;+HhDB!e23 zcFYhNGWs<@3R6vBzfoBA(0KCR;#psd#zD#SsekwVAbk`p>SN;&5|D( z$8jDHWA@MWk}ZW?grcHsedk}ZG5R6b^S$40W*b;3Ng)TG+I_+0Hw zJYGwJeNc_$zPsfB4FG_#TZa4K;{rilLNZ=^vNyajFFL<_eNR+?>6uH}$C_pcV@R*V zo8yU{4PoCQ_T*BXjWP>PxiFD!MoXi7WilQWVTvepUkn?B7% zjUVb?sc2|7sa*FYg-*T2lueG!{p6{h7U)g+^<us1*C@+3D+EKdd8qq$+Cmjf}a$M2Mj9-nWHLTML`GMwiwy6Q~VyS8-^>Qp>7~ z`+#Zu*cbFqZIq%8CEQ)sQYSOO(tY)m{pnABm+Tc|49&Q*q$30Pm`kCd1YLO$`%r1{( zT&S?n(wB)!Fr5Unm50X;j|oc7$O z?NnbTmkXM)lw|{N-hTNU$GSCi`dP6ZI$|+_VB%>BwABwLC=B?C)U|)lAJPhZ-;+OD zS^nV6Ow=N`y+IMzn%_9?ykRXgL1nGA+jDqx>F|<=!)4>tG7euB*1~S4Y(PiNlXJh^ zzxB=laY|*wUM4+K);Brg&k=ueBx}hOWYfB(+?)Yl|4GfPcca0etZTB4_V6pd(6B`N zse)2nn5OvR#Feeez?WHk1U(P)D^bMnGs+el$X~3O4$g%wgWeN67oQd!G%?tV%B$vmliD{Pe^~?=Ua$w z9HOd|-5{fnUR$+3#+LEr&MW3+@qe<2N{-V`{oU@Se~ef*4ZktOd=DUV;UbwqT*mJPqn8?i))t%jpVhakid2?Ot1`5?KNWMmwUgZQ22?oM^ z?h^S9C&AKE^U^lQIoyE0N&zD_$~~)UY@$rEm-h`8pkv&^_-A?5>qXnpC=3qLly3CT zy*BP*=q5UrNKDo3))NOrx^UtX#462PuL-6Y`})g`N|hKu6~LA@W{YH_+(Uz#SQx2*EQ_#c(@+SWVIe>Brv5vJ7K*Tz3Uu5 zXy1fkS$)GBw^<_m(D^6r(D|o}oflDEs zSdNw1t!?H3k$`gR3+%ONYVU~c*9f-dE zWSfr1uBC{+`g<@01G%OxhSm8@_#@RPtePFnypf-;nD?Z%Q&vVa|6EN3x+={;MkU!Dq8sm*C*7Yz?H-CC4j+3UcU5Z6 z;=0vm-qQWJ^H^|g77tBJBll4VxHx{hp7U1=3*_hE)Vvxey+!1CRGf&EtdFtPr>TTw z(&sD`6fg_D56Q`KaqxPUP%J~%QBPOp_S>m7&j+~C<4wN*b<3LHR0^J1IFWYJc1!v4~GK% zZyu-~Pk>Lim$2(|e)_0FD7&crTAop5|J`{saFyb?{m<3?PIJ4@6YHax_brBgD5n3- z<6k@>v}Ru0l9b)}D4E!47(rsB^ZztEzj78?ub-4|P4g9@B0eht->wTy$aqtzSiVQ! z_y71bsTy?QDLg)V@B@9n*@3w@nSe1)l=aB>oiyJDXmMNal;RsN1|!=zc#%ogJIKhl zG(nWzob&A;0!BLd<3lfzx7-!ugNf9s(wQ3-Z$+G16NjtF_nY;P5xwPG0lGd=)pLcb z%B^?LffUGb4CsCcb?1vP5)^dC-YcT`);fpQD4+twFxW8l4gaPWmQDfWA2d`xs}LXfkL2 zLbrMp8w`?D3kQ<%Y*!4Q8YDY9phVAiUMkZX&WWgalVk9IVP;(YxnaZ@HpveoU;#0B z^37*aucXhSKQJ@40;W2TP6Bt6r4K?0P$Khfrtniye?OG=;}bj38vc2F4SMf@hZ!#y znjr%+b&>(uRpLob>EgCZgfM^sj`O<8r##^1I*Z z)c3NhFMk;csK0o@^LqpLv_@~ZQ|G!=pk4wUv5Cp{cHfkR$S1ULmqhgX(D;{{+`92m zU9_gr%kPvr7rd69a-`8Va-=w82|U`7oHk_&7mqLVJ7n#t}xNdrX z#t7b(Xm%YMlwK#FuQz1{4OA{-TOU-+i?(2Q&*Y;j3iR*FsVq}Xw!WzL<%k_i{7jZc zUQ)Ab)*U%v{z8%+H!1GbZWIY+QlBYlQeQAPwa8yn-Sa^7{7a{+r-wiqZ&74mqTwu^xp|%spNuf&-Fdx*)&60Vz0T6!m02fK z%N~b%Fp3LS(;Hl)Sb5pt_y0%xwo?y*Az!^d#~ogM;N%%mr}3SB6u);Ie30-qnP$#) zG#qaWeFsDKK^mB*?P%WAd$U%CwC}ug9?`GOg)1G7yAI%@pVfKG`lKdbCzf>esAAxE zkjvG_kwu&ZZvc=p_J7S&riDf(o0vc5HJ=g zl4)S{F^aMD`m)IpqWHKM}u=yMEzQ=ZQ z>z%fN!oxvScZeS6JAMnclB5lCbM@?B$7bqPk1$CNVQNBC(!{7vl0@`>^^w$fAVy6n z!%t24ty;b$7;zrTM@=~9CUx7RxtuPSuhvxSLbxkbs5=cGhS0vBz6{JZ)la&Xx_#wN zEa3B!@oXY5Sb%C8V)2PpJW8&aPPERp@3-7sXs}!ViWl#>>)Y?2=cv%E(A7bb!iBLJ z_seR>iBWTND8GqT{l)|+Q7f;vxTrw7nUg3}RTMa&s0K#|zk*jsdi<~q16}N4V$f}~ zaqjphn_->0y+Q6)R{e_h&M|H#>7>9_^v)2_`%7X>L}>iS_5Y2S2pju5CYsn-M>*2$ z+XNmDj`!;8bA6yf?paU-F7Sp<8>tY&4E-i)9%b&y@4mbgSGAiG{EU&$O?XSf(Y#-s zOLizTju+^70E^smi8D!{-d)ILRPe8t4t?8uTQm2$i$7O)^c#H~zEAK&#r)8$w}PUs zvnt1Irs-H`y#PEM_dP^lSLzB4Bd{`LoX{@yN^2%(X~%L12SdFoV!0XXe|QBU6DLh9 zp|c!mMF(A~3_ne*lAjb4c?_N3sEY~W)nwOg9eYT@ai7fojX5(i6y*wIsgJrn3RBkG z1VWWe$j*gXM+1bk;$U#kh`0!~CKQGB`^t3f{qUF8^Sq1@+E_RHL`3Kq@7|&vpPd0{ zXW`AbJqR)|UfGZ|!nxqd#E=d9x_4mw+NCpLY7-Hj_zKgQEj^`}dU&V_5ia{5;iQ;m z0;HH?l#>-Ss1jF|HN|n&deW5EYR4|bkJe?vSIX>1aR?~qL4O=YXQ_lfPV9wjXM{pT zVDE8+ZNdu z5q3+R9J~HYYCQ*v&N5NL{{;6Xnt$9IOMde|R%==wLE!u!sT`%46b+M?G6{#9RkM{x z-0UEz8KCVEjdzB);Z8<8g%OIT;tmzTCP)F6pGZF58Z6yMfpD4NNlho4f!xd<#qUXW zOt)*#RT;yavvX=g4EHba2~d&Q&TS(@AP7;KOeJKr(wQR?^Y*$u~~!y&_OU^42Xcta-alJ+I@jr?VDE7bC zb8M;!SH7RVp(E&8>MolxA@9|%vrE+KaabF%Ay#)>{?-xYIn}NqmoHaEiy^H2su801 zNu8Wwsi0R+gBVoYiTi(|9Pj?H%So2A$7^>a0hHj2(J<;ZJeNd*JfyDYUFQg3t=-jeZ)R&_b| zcg4T+_dm^?nlP$NzK$xwrgbN~0FS|RI4qsv!w07ZU)S}+Ag(ZjH_z2Ivu_3=XsLnv zk6)iZC(15}x|XHY;Y05)CkZdL4MXyi_DZwp!xxOv;y$}{e=X_G%@uAk1*_;{&!~))p&h;#t22+4y$N%XHlyIs~`FCt{?H}Djx3wT`Sx- z#D!zr#a;HJm#8%*FHv_Qi{l3$$mIo-YK{N#Rhn27D=8*TiR6u|7_)Qpw<6Sz;quk{ z1uquvjvV0vCdqWfpQ)b$gCd(%`f2gnvoK4XIXrh$Y=xNL_VR`HZlPTUn3_QT&?;&^ zxkJ^#h{9Jz|HL2`JF`<$;CHB9(d)zO?in)kl(Uj7^?0TvDbAMn>hD0f-``~6epih^ zG)X0<)Bvd{hbTVIfH^_DXGmwyppArc1@Zx?>MZYD#Fo`m@-D&$nhLratc-sKQ=F{jucAr~hBs{J#SF42YXAXsA)!%{ITJJL!VEJt|gz z6{SDNR07wi{g(0jBhw7kFc-Vb63YF+Ew)^mS<@s; zJ9Wlyh_RAO-;&}u$-XLePqx7L@%S>G+cWZ&TwRcIzy62m<*QcDeG6}H6y!+5_eKt8 z*ZVB4Iue;Q-;?l|KG)h1aQ)4?>L71>8rrcOO%ypZcmP(YTX)deJ?4z`^pEvXCHx>M8V-iULD2(5_dv>oLofV#d1(Pi8 zQCye2(nVrdk>1NPqQ7BSA$9E!mkMXI>G=jZ_p|i;qMNoBPwc=);Yrj0I{x_SD5jj-({7~yj^`;R-t2WXe2gD$y_jL^5V@S;?FDocuGh8)_j|3 zkt`u~#EC#pP+1O?U#f%b)iG)MUn*&XRAUicWrajZQI%d5$jkPTj(7&j`2eGQ5x9w} zPdcTlb7Y4I##e1Jp0wnZs(@gw3>@#-0s>Z&2$Y$8#QsJ|)NTbSxSWCi^8KqaxvfSC zFO>&WfV)cDymsn1u#Fgp_h#4;j?4Xy;R^9oJ1eV@#2DDSRKaJL;s)zk=9$2Na^#e6lyu3x2kTB#X4)m^KVAhlACJdu}*x8lNZ8C}(f;6~`?(Y1h1 z0$|d0qIl-NIEQ8%@y>*84YMX^0uthwg0!U&!J-UQ^_FP?2xN!hyp+!&5)4$g#Rj48 zEnjjJK2~4i9x?}b2lgTRIHfpNMWwfqf(2vV&*}WdXUaT-D?V0q|FY#t_^0<2A#G%a zcPWQ|zhYW}O{fyh%OJl{Zd|}r*pbJ!%4f#hCq5e}g81^q^Vsl$j}=tLq90xp{Ub=l zr(o^Po$h6|iW&c**}}T^rSsJg?M(1$c)uFs)pC=D{Sdw_oJ zu$l#u6Z*~0!a8p23EOqwVwPV&^VrSC$w}iSgVhIAmzcEykLIm{Jad@{LS-x$8ZloE z)(M@8K~ZgRBh_V@AN+8l5hv_$>H+uG7HAw*kNlf>$ulFvHi-XJORwU{BD)I*>!~n z4mt=R1rHiLN~k;B^>U%&O z+L-B$H zo{}xsxQoOFPdmOsS@MIm=~(bp+15&to9U%wG5#q1Us5o~^E5kN5!}`ObL~0v(=}T+ z-&M$dltYDH)F3q(#V|E4Ydz)_jNZC4vJ}S&j6`JuQ~WA@_S?EV-I>~yLxoy5xx|6N zY=MuYKwIzg_>xSAq+4?2AwM^#8Q88;PUM$olIw=G<(Do98G`wsd3&Os4n@#4u%<%8 z4rx-;v#sZBY*oeYxr7n;i4Zl3N$9nO8!13Hn4YH6cTwguh{g$7H#L&phb|G`ROm;C z8;O>)c?lr{SZm2@w3P)b`b)hBM&jDCOv}Awtt>2FnaT)8gMACsLqIWi7@jL-MXVPb z%rak!AtE)VH3ejA2IbP$`hAJ`<5dLGE9auPE#2=yYRg^PZ7p_sjxg+HU3h5^L>x*W= zo5nC2q8YH}L&fGQdTBafRBFAumFRx{S<9(DN}E6|KEpgtC?hdWjW0G}pD&QYbxT^?Q$0aO3rt5opz)D#W5aD8A7g54`l& zHWd}^2&w~?yG5WkQO;i~f5F@nl(PDw5I1Q4-4d~&_^~@LTUyw=#{({PwoEi{Sc^&i z3#-UO7G0$2fF@XZd@Y5cvcLBPaW`qw6Zl6Hy*J3FlI1$|KS`05#V9XBQfce<(}W^v zH>%rBoRR1)m!JrK!Q7&f_OQsx;wZ&w%NX{`PcphPrcrarL$;S(bpgW6pUra`S&4Z7 zKAh0qew`{cBfbC(P2MRh_>I_4Mps;ULrqGfg&X2!Xi-FS#*Z-~1dP`(D zx^$wvwKwXGY_c7@5a42pXc7D;jHp-chZYRxAxrCm&Klx9nJ5}b2wDA4wY5(a{gFkZ7qS{1(>%Za zMqt~rAzjfu%9qKR&mQ26qSoqCDC-%aM^T^mekg6jK<(csn`njb!PS4D7A&BqP8Hq_ z0)T7#Hc-31iji(CDd}2NcVvB?Mco}Hq}Ym3sb4`HpUy{^8fDix#PfB*P)NmU1kea~ zZDP+cqM8&o$y9qydwLZ3FoKs{>rnsc!O{9#YM*s_0fSDb9m-#5?%P4wm4FgK)kxY5 zM>_>8mlne1)v3dS@ejrj0|c&3(Gj^HBos_|+n3{@muVn(;zk?w+grz9VaBf`57Bx!Yf$#qy#OQC|WwyyVIz{C2i zQ6fMgecR~|floL-`)NCbG7SS~OF(HlhgDoxPJJfrqlStT(GP<96F=xHL$4eZVG$xMCLps`yJt7I}rf( z(C4>m{K8h-=nOOq6M5TOzY9waMSiPIy1@j#a1?(tek%kSTI#w-T24bE3j0WIn+0xr zF1HlqZtUQI$7kRG4K}0ax=R}9Ec(`A=J#!|^47jrJgvz(M)&GvN$@OJp~<0QLDyqg zFVtaG>$J8e!=VZ(&SGRd-b|b&3%ZI%;`93Wm*P(#k2y62cP*W5IQ1FiK&pGGoc0a& znm0Rh_Q&Jp-SD6BU{j2CgNQ%~>>BJf|tnz1WDd7WlB49Q+K zS0*!Jn7kVcO&vaQ=^~Yxs)^En z9>;q9o3%o^I$zY<&Y+H4=x%7LlZhX$JFI2~lHNA8n|B$TLC0-f0v_cCYcWlyFMc-q zre2PPv1Yc)il6I~nLUK;W50^ml8GP~q~+I-hU3#(wDpPF>-T>x5HFd=a(UD$jNiG8 zG@RRJ7nt}d=wxrThg~Q=Z-h?P^6q?M_4TuoOc?|S(M3WwA}Czqdnw4X1NyZCa`eT2 zoNHsh-Er_h?#J={1`ReE0 zEJ-LPv@5tV@ZTf*lYy(ldXDyNWZ0=*AGW=!!j?0a@w2>Gq2c7bHP}_H%W#-DDC<$& z#ZRg+Ych`y=@p3fR@L9G_kK|&s-Rig=+b~rC|~r-9fei`xjzldh9Nxz;yY)n+i11Y z>5fh;Ae$dKG{&15QF564se38S?d=+NwFjMgEi1B}{<5(I-2RJ`VK*#s@N2Y3PW@51 z{&Zc{%EauFx|R4aHnfp7?KI6S#4%08PEzudWczpVFb^#v`4*3Xsv|vpSl!OrMD+yq z;zArOmBJC6D@eC6VQU5hFtt@)B?+$Tdi;pRpZruKWpCYxwTcZ$OJcRtkBPe>j*BDo zR9mg=i|VT{w(CNw`PyrZK~U+S!XDAgW;aN)5a(tQ*OdC4{fzaX`RJ#CP0MZK%xSCo zF9gio;3Sl%qX1z5&M`{k9q}s8X6nM{-oPm(G;JF<6H3TO{t!_X>DX%Fm=Mc`=e+Kz z17qv5Z`P93H2DT;rveZ}FshpDd|W<4ma8NH$(a&oG7zzpQ~f2zBcMw#6&2o}uJFCq znfh;CA{il(>2Xv}@C1NG;q%$FxwR0y6ovoLWqh=N4cS4SQ!($pT*595G z_+lJSV-N6v2P9!%KEbMk>(jN&=+};*!N9^+ftN7d<{CVVH2;vXxi?283m$v@=cIrm z|BK)t1d(md5AJ_WEwC0Zc?&tBIor6(9z>99OlM&p<8)Vjbg-tPR){f(tPu=A zWfFo1^bo-0Y-HIko-Yg`Y2ZA0Ylx=$gQJyhp;eLwvc95w^ zDj0_Xr)87$$-JbF8iYetCQcPyB-#2mL^l(Q3t;bvqlLaS^epI3w7QK6p(;}X^-_L3xer_`?7B=O? zU{VTZ#kWh>ccWKDpFLXaMYXN%C8zf@{F%q+c0OgJk52u18J5EX&Uz+9PdN(O;Sm~5 z+3hKo3~+Lcg> z8E5?v+>3+EYT9evK`6H1o0+%iKuqE38pM9D5jK&8ZVD?K zZeit+!fUV8Q(PStFgKqfGAv4{a-G8b_#INkFetB&S86^rVW1wqqa5$xaHp%@M(xI3 z4>4D@*3bm6C|hn2{`%n{OE$ox{c?It-sr%5SyOg;Jglvf&8e=t3H-`~U#jJW5J0}R z@L9dFWKKQn;k!6x3=`L!Kf2`;u&@LNAN2+5tFrXZPRr?-jLJ(cQiCw)k1D?ToOo6I zFTvPE;pb^#Re?O?doL-#n?4DzR4A5e%?;{;dpQUCg4gD0GR?dbqLRANU_Ck};@uZPpMB=sXySApDVExwVKMpq4u zdOpUPrum~G*%B*ewL$tsVc-?&cm5wo;aNgl1xFlIrt2e`wY`r{=a~|!u85_I*G7y4 zk#0^pF5FRK^M<%KcuOhm@RQ-dDPtd_aB{w@usO74N=(h&+BVac=#Vq5QqYpg?V4^K zXa(tK;h^-E&_?wFUacVW%$v;Qgz$lac~=3xCWYqsYf(&;x3CJ@?jCLR!eAV=jIOn8 zOs^bAA6TzLYHVHw5@y9JFH74u^&TD}oo8!`tC3SJBZURGFGi&UBD)gmN{G>qd0~eO zH$vmK`&DnZ_$G)qPJG05)hB!tabh7V1>dJBs(xlRQ03CqGtr($<6L8^(4cmPHGRgL zuPLF5(TGMsdMbHmY zxoXm1bm-Qju~e zOfyzrjc~iU$gDer-I@T6TF|EA>oWCb7zWo1;)bvA%FgqEW2@B)iOLX#h)pTac%@6E zRQK7iRW4;xuCDPKR{dpmk~FGFU@vNbtya|wR31oq5mtk%+zxNM=g2u81(@~rf^SJg z+^RxJtc<(`yr@ORu!fCl5|WxKD^UDNgB&q{Zh;~&dj5<_mf)D%NwN|g&jPjl03*bX zOJqM2ydNJWLnC^xJbCpsU@ezCcMN*>x~UoLwiSBt^PBB~X3{9y&2)9>SYVsJ9jG=w=LmqZI1WI;U175)4XF|K6 zQm{%PUWx{MkY`q|D{(J8uR209$K9L-&eryP@O|;xeh0&B7b*~T^n?(GJwDkUY0Cpay|2&qn`2E@Y@S*)l^AFwApS^oK z*7z=;^Y3lsAG{y0+Q@zXR2yvgJpBHp_T~TW<%;Njdc6GM>F0Akz~*y)66vzG;deUT z_A7>EopizN-er?bShBOLM*V&xr}Oc5O7(`&#y?K3XVlQmqt|}@pHK`x57>uJ!5DCT zvGh|0@n|ecRZRTOlZa02<%r+OjD>2Fqb~_!46mruQywJMblXnW_CqAL>!4RXEQIHCH=dE~pKsMTjK=sg{{-*++ zGZq}QG2?FcTFLp@VUirzToFnMM`2_0r@`v71aQR{sJpH9XPYRGKYmdEzQ}GJlYFYoUx9+J3Y}BuTq(|HsN{X@F;t;OJGcV3abMqO9d0%v6lD z0_$SI2rW~xRVv9$0%M4OTNoF*zRbsqEAn9ytUZN2vD)wxWfdPCc*y$VIU)0`WH9@pmCO9Wq-(1?dqGamz~o7 z(XRXguJFn2Kbz+Kn&7y7C_`D1k!!er_(XGu}Zekx#SWO>?jqjYx@p% z_pW_)bYkeVUxE?fcqBp z`8e#t+Zn&tb^+yKOoii06rC;YISVF2RfP+yWWYI-Z>^;MrPKUxh6Qy|Lmifx%@U<- z)r&u00TK*gl~LAFwYY!u$KC7q;3;Yj+kVWr-{!d%Ji>|b+0fl~a}OJvpfc_Bu+>ao z;JtVMNY`CJ`%&5Woe7-yy#QwX4`7`1OKfIvfiYKLlB4-xNdiNsGhA2HF&b_Iv1IJZ zy@H?Q?V#nVq7`{n8gQ4ftD}ZhAT90_l!Mz2RlmjQ zAW@~TP-5jlfE@E0Kp(9BORz{8av@V(5c<}KPqPjgtj1sp2kli`nne*+MV}68ZZ8Z) zG{X9TidM5HGr2`b01xs?@nOE;c)~4>z=lgf`vk3zT*%p?@;i`^0289Yw_BZx1J~EI z>Nzh)VNXrYGQvJHNfriOA+iZ+#+tX7k;KYr5;ZTv*HtXGH4>D;zW(K7ynicwAsD$t%V#>e20SkRm5y~NhcDb>Pgu?~u`%#zuYiRK23{41$ z<7}4}YN<8i7f*+>wmU=7F+#-c-}Q}q?A9f&U5E{Lye(I-9>3AC@$H>LZvK`F9T9xd zpN?5Iof;zGmR%ufUkqtI+=dN3Pf? zU#S~!B2de`2pZ%6LUkr|)jVvS-2zi(R)0l{oiSp!HOOz1a@Stxzofew%Ea^~iL3+M zqROsg7oeB9ZJx7uGkoi=1~UMGmH+P&`0wF?|9^=%RMc$w!*1@r2f~9`@YSWS0$XQy z4;e|t?GXRS3?Su-GmCAoth{e;<-|Ul9df*Tw|A;pGnZ1Ys3eN6KNsx&sVJ(KD*XO zMe(SG`tg7T6TVuMxF`aT_I{0nT=6nCZa<1IgKCn0keer6g55^kab)O+5?Nh_|HG&G zFOt$f%#!?hq*vsM0vTq>?DINR$<1^1Kc{rmtl9WRm5j5DTJOtF7e5Y(674~|7Q)cIH`l&ic~sy1sJJ=fdVi$6&Yez#N1Dbhz@aS^$0GK~iYk}74>_2Lg6 zq~yco?z(Vmu6;YuwzVeWBkqNHosi2Oy#w4b*T-&xqP0+XvL#zZgi2dKs*avQ{#Pp+ zmXQE(UPS9fU>st_3nA@|ow4@h%AEka&6oTTEAnA2CZA+oL%a^-*K zvAmlWjGd9!>LcQfW3-{{q;j)2N|C$6tsG+*i;x0fmJExjhSq~vjiq@BaQ{IK{mWwm zP(wNSt2q^FB5aNBKPRVjsCNI%N43a#Z|bl*Eg#6ChHJuljQZ6>4AD5f7e zB3Lh3pPf2o+8SRhs`)Oj6NinGA09DAfg$$}TS2u@YcNtX@vWc7`Thv%gl#e7wZhg} zQ3Ce^s;B@d)DHCGW$o0_`ns($R{^U@yvBH{*QbzPPN zyN4y{OdRenJrsAak}STGgGf$S?Cc3k47f(*5boKnf?mEB^HJXf&5)4`P91(HP_A0Z zfw_K-eE4l{;M?lc?j~YnQlj!mu}6JNhgQIx&`iYPstJHt@Yuqq&2ptln>djJxpCDjf{xsOMcAPcuq!uG#q2 z^jhQvi)zZiW>u$EN)9MKZG&ygct?XT0d9*)u4t<+kw`f>e2DW=#HPvIFskORq`}wDWulz?os2rC^O^`(??~iOnYSeK& zWl5yLHnTq4Y3N5HjwWUrxe{2wi9vY)dfuU;>5br!O*G$|69Ky^KD%(aeCV>unRecm zd^tiT0%f+z*@`Z7PWg;zQU^^NEySZ(So2|IM?3E$cPxN(=?~<3=G-U=F^~Z?8NgGM zChG^C&ZY~6yUBE)Wk7r_X2=qQL$s3oVPWkr6ecUG#S5QR2`vO8GsBHg46L%%J&1af z!Sg3~jEXF*Zi6lmJqA3;b$()Kn+>mbv}nb7)o<~tswxsq1#>Ge>q@O;tq-F@@FfwK zF7>gYez-tCh+Rxp{WGsAL(MqI!N}&5r{my2B zD)TeQWP5i;MoD1|<+iVfgQs;$Kh zRPkD5SXG?0y8O7x!fkmhc5LRwCTwO=UVG_%Ctd5l+ne{tCO1_E%4~R5-i6LIZjK_<}Sk44)%L;D}v#(c9dX>R+$52sMu*NVDDb90q4CYTK43u6) zgMNb7C1;tkwLq)X55B^W9X+3##s1PRs<6tS!ysD7TtS`4EkYv_FC-=pN|KR6DL=ME z$GOFm;kd7~pP3RZ7l;Ru{c38GxYdkI}$8V!%MbQ*{di|Hv*?g7a#DbAt6UM&nVJx^|a(%pX5XKSHv9Gu6Du)veAzrQ&p>ne41~tl! zm8E728;K(EEwh^?4*M-lGj6Zw)0wR3GD?D1_!6||rj2*N%=ZC!MtifZH&!JVJyvxB`GD5nOF72QS~F8bCp73{W8OKsFc&IxK*W#57^bn}**otnAuQ zOjZ>;>Z*k*Du z?RZUTHv(t9A|+MWQo-|8da6TEl_I`K>udk>mqwGMzM;xrfAThI?`>Mq&k!3fWceJn|807J1-~^T1BN8>L zL(GEhv>jNgjbi2~*7gC*gTSk?s$p%aH$o7fT`ND(lcJ9G*)DL4Lyg0SP%oFBdFV#+ zqmdiv6r+W=Bi58?u83DU^S1T3k~ex~q|Rl_yIpM$mdCW(+3bMV%_Pj&z1+^1>8?F? z!!noZEizTo_P&F)&;FTGeJ8wIOrX&`zAiBNgqi4enchMvEFGt?56@hu4mji%lHQG4 zZ#UfnEDda4UF&d5SY^Z_i}QX_zd7aOtL^mZQ5ml}<%&NRI)kb-0KAuQjzJ~5Z^nNQ|?OAgD2lUT1Ps2m-6zBoiH`Q?K!?~T>zIlt{Cytg>% zlxD_7T7xpj?%O%2$*4@ zme<1+erFo`c(}Y%F-6NeAu*MywyD^)iZ!vd7eW%qWS;2joZ@@-+U7L{ z@I$0}g5kTpfvnBH>O!fFV#u_)7)09&0j$bN_5vIJM3Yn6FFuQX9#-zLreHT{X6kl> z{vh5`y&D>H`w^NRCx1!-2e-BN(A5fida^rLr%7Z(dwH~(SoyK@Sf%!q5ty<8St{EI z|FSSo!j!EsvnJ)|=-N^YK!^&C5KMs%3^=;Y9}$fWGJ2(r)_B0DuV#U7d1AW~?klS{ z=oJKL#?45HwZ+#3r9Nd8(BQD1F+VL$q5h&21jN4(wd4g2)MVu}V>8Qs(f+zLbO0a-uXqB1?5_;c_Q?b5Yfw6t#&0YL{d*hpMgzF&Xci64ZVu(K|<`LC(X? zc6Ow$509*P&*~ zXVk&a=l4u!RHAbBWwu88X7$6;tktLEIJ6Ii8}OMiM0EP88zvHK(TQGaWI}MLG=?TU)^* zdapG&!&*(FUXd{>I1KwEI$rT0#KQIKdX}!Bkq+tC7n|^Di(7F!M_-)UXKe=Qv3HVI zQb@A6^r0=hDY%NbcxJ@e9=OZQO_P0{*a|CpGzYsiOd0X(kLY{K6m}$F-!kxT-A3T? zZA_~%B+67M))#l#Z-68ssp+%DssN!&G$1?wC%Al9R*HYaSTCY@7jTz?I&3V7FwH2E zzg%TR7gg8UZ+KPI`l8PZ13k#bM!C_ZA@wrkMD&;NT@_g@mAX=|2mhEzK2Zp`!N6ARIkRm?L9aEQZHxQ7rJoR}w ztFKqgMOG~Sys1b5oSpp)=V4cDe7Y^f&Ct?(V!$Y1QDJNOLy>QpS-x<|T(N#!KR=Ye z5`IHX?Wky_NP6tYk6Fd(vY^sDaOy{sfdlt!6uW_x+Wz2^w;NYFKLE!YhLIhscR);s zx!88L#6DH>oAq)Qw${9D4**}bPPWh%q3_tu$`@JOZlN4t#hj%7b(}H!vK-HRl53kf zJ`U#|7={(RCE_LQ@-5ThL|=REI;uHwMKG& z3RulQn(x}+)da!yno*zNACF)br{19d^?jP~!{Stw4dv6?LvC=_pv)j8cSD3{##7Vh zWN!uI`zO9HtwtRsxs{V8@l#gYDz{Ez?Qc}Bohv*J4Ro0L z?Tc;BDcG-fldm#Pp@?59Y2&jsi2^cj=3FAB^A_!j0NH5-DXXXvIvAMuxRl4ySciWW zCtk8)qXO`j&Tmp4-j2ANyU6g*B%}AVsM#3k*%woFC#MTsR22-kuyH%jsR^j!0~9W0 zJg|$A#Ss8dXua3qKwuYl$~BmFXoyVN5|W7Q9Vtx$-AnMe{uJ2iw<?<+kB+6U<7=RZlxm-l;!!*De=cqAay<*G+6^hqrAduTIf@X$Q z4mj=)$*uJ2BT`efSnoV=q-_XQ@K6UaCJx z+p@T%{*H9`2TK2rG@E~Hr0_S+!3)%>(*?qBb>r?7r`1jgZ`iWcbU4)WP8ZtTn4<@M zssozk1-$i+x%lb^%Z<}NA;wx^vi+?_5kDrNeV7&J$d zd+XUyEj?n~e1!_aFm&p3E+Mb@ef|AvW=>0&z%%AHD`p-B<66f6sG8d^63**v ziq&v?3$@(@eYK(2_3YV?+{?;s=z9u%05lX6e+OoM{wHR7b-Ahlk7h+r28lP)JJ9As zc-5TU$hT9a@u;z-T)V7LzF`Vl^XBk`P^%BTWDJ@+rou5O8mp);Q|$B}ReyG%Hy6Fx1KWvm-Uw z@5y9iLd!7lUczTtM`qUfid-K{s|C4|PfsQOPTsZ0+wE}z$E6Yh=&l1aWhqzQUmKx}h9>luZ8dV8#OdW* ztjkiNV?SPj<;<+xMsyb2t3@kiLn-ZC_?1^;YzG8EBCm7hT;d&6Om+%ClF0W+ft%4J zSgM<|23|o|NX?#RJqgDOkCg*{4Y-PjLlf0!qs_()w3r+s#Q4Sr8Q$8x%ECoz6~Nd7R|)ph$vr~Kv9;aV&?kbSd;@!@Hq z`j?RJjT_(X|BpxxOwRV(e*I2;#9#5PFsS(T1iXKN~|*scuh>g4JEZf90BE$sBzy4{fs57cdXHLA1)qqm~_ zZo^yufE&Uj(Yi@}OYydS#fx;3cV!a1fxl;PDz8MwvogdSI?EkJ1JxOUdsJo5iv;_}m@_aSN?Psg;>z^L`)x{>6sAob`Ngp#5XHU!p8*?Fi4FYgL z3X1Qmzr^$Zmb{Pwv^p{)u@drFGUU6-N=oAp%~WwD@Tz%GG1f;<15}0^?MD_$jl>Qa z@)r6u7K|PKJ(`R{%wvm)_9O|!sPoB!cN8T_mpkV-kdwj#gVAKtSK#O5|JiXPlbjCG zYyF=z7TbNq6MgTxy7mjF)~Z0HU$sGid~$r!iEPXhE98LYSCN4422i5ZM0(7q_7w!PjCC9)&)l)fUm6rZB~yulCT zleFzG1;is9{i>ddwJ#*relS2yo2x30T20W6Fb}o)Me=MGG+eDjBAZ@*aUoGhD;Qhr{R-Dd zW&L}VZFkKpoILYoA*|?yMp!zBi-Tc_!G>d}eJ-|EL2}}g&EWyyI^Hw<7Qg~DCZ=7= z|9+nT2B@SU_T~gSph}sAuA2`zc^vP5_1bfjDs+UlhB<2UmRk%Ei<2oD~SNCmn}0w+zy3S}qxtdRVsn_jN*kLJQ+3Wna-S73agMVeB5i_Qor3HsP!AKfFHtv zxU;?8@1fci-u@?O=Gk}gf43Q+qPC9doMulzDupO^g>q6sO1+w*7kCXY+ZHRBVO;%3j#FEB-b+*Mn?%ER|pzG0J zL$Uz9&~fGUyB8Nk6!`QB9fXfO5ay6>y>1%VMGe6(2kosCG?Ac+l<^$+5b?=w@-&cX` zn^R^v)pW!@^2Lpbfpp9`^%=Df&c?L#jS>9{E6Qx%!PsV;Kzxf5MYR6)*nyog$s|!i zt>O!6+sU%V#9VRI)Nj6q&~7uyOR-dq-x?Ev4lIt~^U?4$G+bnvr7ifp;``2X2Z35= zg)3Dh^ae%yXa4|4?(2WjjGjgA=Qyb_wx&9mqMBo%;?pFYanc62(|{nl*3p&U7${++kuw9hzT^j5(km3NW^ak@=PchKqLn|A}FAd4*{a7l)WT)ajvbf z@dK8Pl>>9dJHMOuXIrl_(&Zst6aSHg|1$f`d0Eq{!-F{l^nmMs6*tH~3WCdnd7Nn(*bojSCj$K)SMXxrqu&LY zUco|I2nwp5L7B+I9yt8eO|w?M<{nB45S?k@Swu&&1p;`2Bq66IKpXle3+vg@^j|%B zQ=#}5dx-&aKr`<>L3DLjxdQ4`MAmOMi$H93JDF$;ysNXdH}e}5!y_IzN?SXTLp1nj zNCJT=X&xfsw=))AYKKPT0v1bvk6=)PuY|rmPFBA1#XrLSbDqn;ZQ#GmB4RxFgTzFb ztXmha%ilS5VzkZB&SDRTwtmMF7XjE)Gs6nxr4>ObAuv#$J)#;>T-xnuRNLejxZ z{@ppsvBwGLy~wCVlW~j(4hbLF(~A{1{>*UoRLVnj?roFmS;4k+1fCX%PQp%c=apkQ zqv@PRp+~w8g{NHAf#Fz-bacv5vK<9DRREu!e%D?0pZqr)D!&u7VfH)`9| z)YkP?BX%O6-)*_ZtiGd}H)~-p22~rm3PYvpC=k=a2o?7@plz7Kdp5zhL9Pkm8~uY) zwvwVkFtk$l?T&A?5(V3uKUfUcSPBfj;tiGLmHFp&&phqVbDJnd9Vi`lR? z@nD$WXU#7^Cl0*6t*iD~p2&F(f+%cqxS3 zwCEgcIq2Uiy-U3%qMrH4Yu9Tx2vNEJ=kEV&3IxV@{|O}g*G5N0eMJ|Sa3(+ida>l) z8zhLFSzS6;q?__1Hj|vs9s$_^d`_Ft?Nvtea-*Mm9J&Wz6~Bqi#?C@Vt82Pm?>cNq zWq~+bbEeWd!F*yf>}l2idiZV2FERAVx_Lsyah;$RY)1X_oepjp^4Jy(_7YVxDKb4HCoN!iy4w;fvFdTm?1#6`lLOEk*f(>4}R(BiTh7n3D@)@xcwT1^Tmrtx#x zSl`3dA5EEl_An_r{_jM)zoxmrKFin1%=ATo$M1v=blrxPgYh~kt9231tG8uieBUPf zS_JgQj1j*~PzeLHZ*!byK&LXUk`MQ--c_@D6HoRo*&)c^ZfnkH(%vLGXe>*$^%M!R zdFh%$7IEdsN?^M$YF;yc)}0}Mp+AwZjpvoBUkU_1ijC6BwB~}E=jT3SBfd+pUPmd; zR&rhv-~{D7y&CnuLi%4F`u~}T^*UKFKdNKoGq#bx;H>{rcC+YP+youH9w7&W0XtNq zXp|F-kvq6ml`YQv798StZieBuMBkox{0yIhF(%Z%i%GGg7Ya(N$xeKYVLk7xcm)oW96L1n><0SGHh0 zLtkA$D+!Qa^eeX^~qLH!7;a_}de_ZN|b3|rtq{ zXE{r7<3Uw{s!^EzM^PxB~_w6!Z>%(8l0913oUX zg$|9EM|HvDX^7o0d-J3Xf_oum=X>k|Qp!^B`|*4w}Du(2OiT=-C7*SkdX2rb_5&Vy{M+Lyyy3I524T<=seUcq>JxWt#Q`A$QJ zxFOC3<5qgl-Rh8@p}_@eJocU_wU2DHWQ##;rnTMs)D%!C?%0SbtNUg^Z~jc43}IYi zJK;YE1sqoqh5aY|Wlgsb0_uK3q?IL^5B(X(tJg+&{fU{a?KG~e4%;WQzzpsp0kSw5 z@@attVbarRE^DmiGqy#_jk)7A+`NK0y_Ub~bv-ZtrfbwH19saCYY_?V$nzX3t`PFi zPz?y4R8(=?hiG6!P6eP`@t#O^}w-8dM3udrI6K$eDIAa*ga(_HVj%Pn?jMhVJCKUJks<@o=&27w;vIg1lGh&MU9fLG>c zZJ1RQh>iqBpWE+T>r=7CQ>j}I+u#_^+o#FpHm0>?;-MZBhTdP@2fQCn?gyr4hjBi9 z9z@qq=OS%~AIL3wI(+&Dhpl-ZmLwecQzpj=1cGV@i!#4aeu2qe?~3i^d~F*dY|zt6 z*Q_<|*>S4jc85#=cf5LjM|+QqUb6nvjG(B_)$xiAufy(-d0bQ_cBP&)0tPdcSUD4w z7?t=4fe(tzM?Unn210_%@~T1{C-abJEt!WVJCb3 z&9ceUq4^`G`B;m%S@ydBuHTIr?N-4~Z*$Lbk|{JV$#jhYWdsvRIe{CQi!I$m{zTQ< zPp5f5bmvG)TK_4M$}g(%lpBRYDDC!I0y8nQ&F9XTJOWGg`p@LkZP(*>#hZ=m^RjcD zn*9$fNQny{t`U_q*IoQE^ei-RVeocVw@%$QqB>y;6*}2cDcksPFBLCCa zJb&%?IQGl;cIfHx{uJW_;nUgot}MS((x|7EUHlDyou`#c{0+U|Pluk7$iq@nJE81C z@f!yf>aK5ut{)uUUB3P>0W8Ihfn)4?@$zlbO}d)2K>lb5j zN};^LR0*%u4(_KcJ09kYbH8JI;BgT#lL}cl6z;@TN5DUg&a0yg{LUZOSv)!wXM@KxkiTATku1##pv8$wBAjDS$WJi6Jqj9Gc!!-qx$*pldppHp(~%wk?Qr+m4i zFFJV}UFj^A87*VGtx3zhsVYf5kys5aF+}l@K?po`sFmAE+LkXyjBXoa7OWMwLlBBc zft4nTunU|w=iIWnTEATC&!!O@Y#Bj|Qtg66Aj{xS_9{G;v2=Fy@gYday6f+eH9?u=d8X)*3q(`d@3UPn z&*B?g>5h;YDnqVdrTMzQ+(P zZy5FbP(;xH+Wn7}lk3g;E;zq|TXDsBJ4OllXkv8qSp}}C)2i$Fgbvsjt?0mC=9jDg z?$(zR5(zt_&3znM3D<>gxz>!(;6{Llp*CSGu3VnyvXPG`;uY#KM;e04mREtjZJp)u zAY<4U$T7ExgOr6AD-&@_#AQ^qt8nO5 zRwBpI9@$N=rFtOO+S-7{JWjHuWEB%@IxSn}^qQB20*Rb+tQ-mYyif0FDQ7x!;RNJi ztpKO_j8IPsd*b7T4%?T)wit8W$qTgfwRW}@!=jg;6xP2a9)j!e>L|ZmO{BN^#Y7!_v}vB+--L!YHTPBM?;~;L5R9({7p?UL+ECqPP>F?`hsG;L zDa>XZAm!ee44hU$`=S6T>Je~m_mOu+zKdrLejlfV|$JPh<3UMdU}2kc5r zYS|3CyhLkH$dfS&Y=!kcZ`H80)Xsm6rlHpw+!W@&kK<;TKKZo8iyL^5Yu(`GkUDqJ zu&`%WKshx2y6D?pvZ4Wff`n+Keg2xi*;KvV)J^S1`bt zehQhikZ+zgm6DZ<;tCGX*@8{?mu*8#Cy^=j%DqKwGD{~(Bk!5UBpv^Gpwe8AAu^L? zzDhIaY~(2xI-h3Am+hJ;RL;cO7y^Zr3@u5wM2K>xbe3D2pxsIfLO%uXoiJ6&9sH(d z9p{=ltT(CYqCBhz!VX0!zQCIs8YtgJcwV7>wRHtA{t@2ZYtCKiVWyEup8XM#mpqb z9b6tGtXbey+)tm>b3(SNvb4_DkHpEDb7AX>1Q(y}6IjK+3$w<*OO2`HIq%$tf~aqw z>mu98=Y1ot$1|I3n<$j>-eC@S0N$2y;G3(Vt@&THesm_c+**(L%FG#>Vp{-vNGU&V z%f+zGkBW40j6*7&1N-%QOD;9;KWTBO#>OS8fMrRGaB1{^*1r`D^>IBd)CAFZCVTcArzqyp0=dkCZcmSi(mW2m;FP zg_R^2+Pd;2`0R@?Ked^K!{4T&;_i2y37e&wKhlw?W)!(YC41g&Z1K*`oY zm|qZ%3yIcS>smO}lx<2sV~~E-gp*a!=)0y{d2LIj!`152@Q6?Ev<_?ZPN0Fp~B4d$(^s zR79aoZjB@5aR&Y+{*0`3gCN1Ey7QAg@XH#Op;%0>ib8P%=xEjH0e+uBTE|)qK(oiU@+*a5{TJw3CVe8Bwv$8EAS6 zEZ>c3uAZ_z5+|D{P0mN>-?>Mo_F7+{=srV*lQ5(Yg43ulw^SFT=S}#^8KRU=DP+!y zPQlZ`t2W{02^N{C9PHn)D>=mFM6X&Cw(@L``RwdG&{VMn?-BHx+Z6<##6#7eV87lI zBSMnwN-gBCg%|z^<=&?d7x%%hb^OxRyAPtIbepoFxw$8LMJ;IUis4MEj>rKk`Ss|g zv&>lk5@9_2DPK*g4R;=?3fg9`*(zpzVf6AEn$eNCfJ)qY#>h95xtC{ zAUnV;gWUHP!VHnaP&H)G{ASXyv-w^*ChulB9PTQH;QOjMWHG@XeOzezkV=~5qBtZ5Ty0u7xPTu~PbX<~p!(!|-uBdWAY-!mJfxg!sQ}jn zJr$2XKvYc8-p+DKKlK<*n`pSMNKAR8X0g2BQxISG$s5nfVBB{ZOGF^W_n9hmWZPbW zIQ-kOo4Go@QuZI&QE8r3iFzh+0xa#t`Poa6s=D}j#xGQz(s$4+?m51Dd}8Y&<7f@U z;f78ISP@`}hFg)mwunAI4Fx+!kvnO@n^-XGG=R>Ng%;e5i@+z;FKQY^#y z*7Z}?xGHiWj)!2)V}UOcKf(o&9QN2%mp>6~B5H1*zb{BiDJhokxhQaX)sw7XTADxZ zBwfWX&C2%;du7O52gd*mXRa2c_CuylLz5%mT?IkG5lmIvQ~#BBJGa06nL@;)15w0L z?n0EbK^;t0F|3K`?f~ETI)g!!I!lHwhUOsCly!*C_i3amSPxV)w3xvA6CSh`LOlKg zm%!#4!Fo#~<-2H8)VorI8{~;io=JUF1*gycyVkM}ukw}KHhPRid_PWxbKgP%L?HZwBAJQFlH+C>r_}l2>dTi=_8tGJaNpH#oIn|_zSmgrU z`cLh?S|ZqG#AvFg2u+e*b5bJdd>9uy3^7=fl>m;HG~P`J0 zxD$dUxVvj`NN@-)gAOvd2loKMeFzfVA-EIVoxx>rcl$c`^S#e|&N^$IS<^qJyQfQf z%e8A?RkdRjsF8~5N!Q?7)6RESJgre?DVag@NJ%_b(;(E*vi}NYh9ar18=Y!m;Of=2 zPyS&-5JT_GU|lEEG@Q)3rfF=1d<^&jyX5gbAhflf5uc?vLtMxq{nS+1Us|dy@A}9j zl1(<|Z$r9xxPZa~0o&q`!fPs+6z>l1(4tEZqiln869elnqzC<#23JjT%^2q6j>h=q zr2f<(mRgn27tuD35{&rcOmW*jv`Ix88YsI!!=p}ihuUD_VufW6l^f&)AMGjr9f zu}TAj-{#SvS$nA5zu!I1unj^iT`2v`BVsjii1wDgw%6s41_o`DL~wF~j*tYr>T&}6 zo2l&c$a?<#Do(1WWHE8^l+f4+R!+2?jfm}QeXqe2hfI*KllrW#PA8gj)3C91#OELl z^uf2Kaxkt&UsVS#y~7UG54oR>TFiv3e&n0i-`197JHCiXUzn398Y7krQck9EL}-j)KNiewk$OcT36yf86{;jfFxQmO>2+xC*- z!&V8`Y)1^xPLWC=M?FH=^tf*D@zxyYrj*_i>X&Qd>18-m#{7g!YS$e6rUo`7Y^sX`h&N{LOkeSFd6SURy8_LiTz%hZE-%dOwn^X> zcWgW;7?9-eWMkwKuNO{}YX;ycKL-F2T9?(W_Tj=FS)BT?;*_!e8x}Wxw>MKOFfX)aj6LK@T-ABG7 z-WEWHJnJuO$>?@x15oX$F<2Xh0K4B}`hmNzJ$a}<^vlHZO;>8^#_bkUi5GkxnYfBF4~ z?!vxdo!@t9ejcx1Pi10a}=miAO$=3j8Mkqq?XJWCgWO49yko};S$NA{ATm74<+ z$m7;bLU#&D zeqARuYT7S}?CW_5-|o!O)jFT3&TqQE$KOsuhKvR@43rHC|BGKo_L4zP`+L8nW}0{P zKGfxDQiF4>ltxo&>;@}Zp7OC9lwmnc$O}tDOr)sU7FDKD3Ed*|=){{(1Gi9H18|{-7DD^yh1GM|~I$N~muS+SRUJY($I)!ZT|m=7a6p#x!dgu)jZl zHW{5iYLk1EDt*HI%WK|ol&{+zxRv^pO_rw-@OC_SiXiVerLmMq1rsuVWGonG_#+F` z8=DBAok+w{I+w=NME%(HUWQ@zc;3(XDgKQ?9YVJO8)iK!iNrj}5?R3|--&=)X-_dBfnz!{Jl^ zOF;5K)cQ*#;~QbN4c9dI7(dQo3DJ$1p7p%RSRc#sOL@+5E85HTF_NMCCE(l1s582G z9EL$fGa6BF)PBE2yTF&I`=_Wi_t5M>z&y;(|N6IL%?7oNe3Lt#Jbi-q%VUmlb4U9u z=L(X)5{%)n4s=aQx~`$)-)gA6#)m+q?8`h-=M&RDkU=L8{yeNAMEz8+&AaVD3#mJS+aF;V6?b|O(wN|svD+xHL+@!6$c z2vcev{i{(#{C1|tr-upqy6fJw3y;l4Tnsi16q&k$GdvCJk#ydf z4|~qBmRr!bmP~#V9(nZH?M0rRS$dgs=$7Z?Q`5IpiTH;$$0Ur{JM>ldBPy=)rgZ)qypB{zQtH0wI0tV%RN zdC0C-jj~BXnj6viI)BVl>+8(lLO@dk*ymVZT$7zv=oZM)7{_72m*c{-u!=AHu%rDW z>?;w|Uw8bGY|LBF88aP-JTZyMc=He!432=S!yjQSVRz&=b73wm$^%%XS}~_W8Uhko zZAItg)vyWVJHHu!c_O*SEw#G`4vrVo_i4nL6TEi(y1W zvkUx1c1B9wFK#E?$?0KbxqI!R=<<829sV$O59=!t#`$$hTK+j9!q_kj7tA^{=)S|j zrZ+8rO&$XW@#7Hhd}?qf{R8y_R2ufC|%NUEV0CK&N3j-TpSw;{`f`@-!I#BVKdPVZp_tC8*7S)qh zKl@|2+q0vN1gx{k!9aX1TaqD}+&A(57`d1I!=Nx_a@Mng(ZF#JmOq~OT0fHfSl)E7#CgR=s*t8G77-T^mQ}!8!~zYUP!@j*0I{t)VrgpagdK+bYP`lAEi7kixEdW&CjY3ZqfFiQu?`sT51EF`mYbteo=~MpKPx z_8PBQT?KT4G@MQP|Z$=3a%o{8FNR#+>npj%7XL8*iB{SsOC+Gk<(#O>N`e zV?PXAOKyj3^^mW7<^hA)F({o4Ru$R61HeR9__V3->hfIPCnTQWD9Ecti)IC~ovoT9 z=?KKq1M8bDxX|okyxlL#_n%Sv`MKURHJsq5KuvT?b=_}SVcEn6XFW{H%(5C&x9_yF zu78BLkr!QP=E>O8e)sv$wB}933D<$s(m=9WSrpCYi)GaEomyYa)FW}qw+p_?1;p5r zd^eRPq*4apb-I!!_}8yG#$9;LF{nb)7L}PPM>(l+%k9oI1l3yCKCg+q8hyLOwkY8! z&_&H1Kf`4i1EbuwBjM;GF&f7ibv^@d#L>s!DKVN%QvTF45e=PSP%PH3yYKBY42o_KMERJ}FZF0u4go9?@# zx*`72-rktE#>W=MUqWv6FvQZcmI*r$6c$3)VB68j@ZNwKB|yz7zC8JQfJB+?k0DFC;z54&HqATA}0T#7ZvZHHbz zbj<==MxUNBg`D$__(K+A>WT?4f`JdZR3Ph+f~O^3ARKd{yUEl$7(H>JO`?EhsTG9cX_%v6=V9ZP@)tH_rQH2-9xrBGv^kU%et>n>m6fum zF%uh@x*TVxx8_Z9A2Vra2Wqc<=lPkpTZ7+2gud(#d42BdpN=5cEKO)%`IuG1DekKb zDQ)_?1d%l8nixSCW<${xW+WjSYa!@c%xQjjpP=X}#2K5v-9b*5q;ivQK>@FU-TAqw z1-)DiyV5w4PsZL)VPv}_MoGd1jZDm+89BK$;fCApcACLNG$juj((JNpLwurK%1~ba zLWU_g)Ce#_>QE0%U1bcqTs@(WYpsEuUPAG0QA#8Vn7~8^Ggl#8n_1Yn-E=?|Payjk z5L{)*U%dND2|Kbhl9fv(URW8dsJ-!XSuq;+o;@Ib@C+M!nUj#Am#Czh}w#uhxTUsZYCw0s25_c;6Vu3vZ?H% zP*=bc6^0{JhaX}*i`ZDd#n&B{SxX23!2F|RM0`-&XwKH9LSs~G(E1>vhg-$S)z0`? zrdc|$RGg4?VnacYcCVyoq65a_@`XYp9dQ}sVw|1E;I)3qaIf_RXwW0y^J?vr?K8Wl z#2QaScIGv1eSqo&uARQnn(5#?LDN)RDBz8G6DP88agJ(nvYI4iPX)10$b+@J4= zjWN6+x0crmDm0O8agdlr0EjKu>DdxtcU?V_Z1tAfP0@WIx6EnDD1UVXr8 zAxctz?`Wea;K<{^>1xdd83MOlh<~({g$t|;iHsRVvHN@jnp%xkXp@PPp0(bkZhY0Orpa{Xt0G|<0OhdsoH$9m8mT9stAZ194noV=hbthyU? zSil5PZW40Eo7B#xL$#{8LMR{iKJq~2U=jK<7_)V*QYFm9c86~cN3PKowtsCqO8PR%-~2CJ+bpYP8q%SnnMP>Mqr6ovtpK6ZWdR#vo(D?*vv{KJ7Bu%HACn zX5xUz&eHN=6StoD!WR73FRZ@8YRv*V{L3h=?&R@D&`*o}HNE1| zm+Q*kd)}6i4~=fEEff3uWXxq^c7|wX>D~-kAbhH`LESz_yh*QX@jTRhw_V{h_ovK4 z&D-VIaUvz6H%3rL7uicL`PJ@qn$aTUM4FL&ulSeVW3cfZwG%!sW9dUu?!f&NFR0ZV z>;)f*w^CYN2o1BDNC?yf&Y;lY{x*y_KEc@A#6;nu_f{6(+glskD(i`FQ;p)HvAi5ElO ziZar01tz#%SWx2^|I$4xk#VjV=W8~DFRtrY!06fMW20fU(K&wGb;hPxtO#LWo)ve| z5K2F#w@|yJw<}$D*_r)uVM@ZgSv5^Qk}e^I*v{|d1$iP9PvYNk`bswLACFvQ^92g{ zmR=Yh_Z&K3JIBWB|2~;r*-cboB`#O&nc(!eI~t2p zu>!qMMLTTE>ir49s&xVJW_9rOQTr5bpVCc?iLPRP2ta8yX7V2YjJPl! zf*G-Xh2Jg0H7xZ5WJaV7IvGVrLDvXh>u-XpW58q1agCsGrzvlYpJS3~c#VPXKL9bw z9rc$4f+m?QY;#~_1LAs-a`0sfOmuRa=&URlL4Ge9LiGs~p4l|wUp84i!;kp2eoOmR zHjs51OWb3ZY(g~Xr1bNkm5&q-G1&%^I4)iG2T+G(06;nMGOzo&=$nTFSIAxDhR^WUF5fr`E52E-OjgroNncl2PwufiW>ueKddpq z5{<8$5k_tx zrzFcD&-pd)D6EXCPO(~K+{jSK`C2u?rkZBu`JvqR7RK^?)8_l!)%JAmdtZ?Cut^7; z#}s+ke;&_jdj@tPzx4IJxinZbSjh6dYgz#zo%b0$t%VqPT`#TxM5M>9B;Ut1-?i)K zyJO$pwud$4w%fJqmB)+G=SPF5E#IdY;7;DG(KhertJ~^(7GLlC`NO;Y^U>utei7d* zpQo#*#^#FmS0sTqS-*Z5?1?-d#Q;xO@i~RD}=8J*rI_2D@eJtOwj1N z6rXd)JAQ+TbHrSS)}8(RK+h5)?)?>@NI#k|rG7d_x20beGH0iPEx!vVX^xMPRwvS0wa zd_}ByLFt^_hg;ABf-;`o^!J@VZ2xGKH`Yb!(-&w9lUS`0ouJ7Y?JKLDoz(Sw^)U?1 zMZD)yqc|PwO`d6_u$R8IH9=g51Zw}-zjQ8u(&eqnF8v_Reo+-<3ZF;q|E`E1*T-_a zv40_HwxZFU)pkPZUggSaM`1wl6NmYv^d5!UVS=BoND&*k#HwI8ar5?cow`j{_#{FX z(DVudaewzJSz!nMWxFF!AyzJ;w%g8jt8$AC9+qnYx|lLDoi#y zd;aDP%19OnA&T$$t+UT+-B{_8>r-cA8vcj0%}d9Hp;T4Jx85BKL8d2T;_Nj8a#hiR z38rKKz0J$7DAYi9rp1Ov`}!bZ(+KHAkz4x{^hT|Znf1=j0MpAnnX>LZ`G%Xu6jwh1 z_ww;o0^J`jI}_`;ecD=G4-AjMy28TZQfrj4@wlUM9$Q_?{0NOymxq;(RiMQ zx%uLp_IvaDTANGdp|TOePnYR0`gdM`$#1!qtecL_8eTZRZS1>tzz-`&U`S}(+<+>Y z>|by4lBX&4&LY$ayIKqu@X!@M4G*Huc7t2!w&%;wt>xCyvgm$2kXe_rCYpMBDwDE2 zE)1WFu}cArtc8DHgItwe!UrNMBT6DDn3Cwd4<(VuJRm>^L8gCb0RifWGaX4)J-fUV zZ6CGy<`g5`@;S{cE_xqaMU-ys&_sjV5n@QN6FD=KFn2 zzD}@vO8upk%H8){1pGG9pkvn3dI=d*$iX*8X5+i$*&?yEIY5X!E;l?B$Bxx;2hnKP z4~Vl%b^^x=aCrTQY_S0vaV5@f8XrU*YzJmeu1Mm&+Chj~1l|J#e zTER5m-FE9aKhP!y*C#^|?l_B?Ny}EIW z4zcRLNh3^awx_iieZx~R!%|vUPDQ?vvo9t1bx`6R=aqRZX@JphSaGu9*ocYWj*RH>*#rtdVPFwdRMHXHz*x``3ZgNMLeV%DxThw3cz*AOFKOEv4Sq2#aIG z#*d@C!;h0GLrS>|ro7rtzH=8c68p2lK33l->rD3MxE%TFCU(|x1&@)l_{mxZdscku z56vYDHU`&%aUyH0RC5#;nf(T@wU6rz!VyAunD4oJXMyjegqY(v{r{@{|9xEsaj()| z)9-eRpW(j&r(4wy;zA#5{EKBEDw}9F&$LmI$>uSRGbeJxS(FDRoPnUAV1VJZ8>i zxh@c|nDqHz5I%1^{`ftppo-GEzT($J$cKbGc|;b0Uv#B%NMgK zUc@-8Jl;<2!gT@btTi0qVDn9ie`vymTDfq=@bQ%=w+5~QVUK=yyn0`MrO9@z~VX8(sL9 z3mjw$N&p1#jVkv1&*;`5)6g60FbBcpjt+C7Hv82!=B>H@RIN=i0h)JV@Wlw->Col5 zazgL#-81cn<0ORD+ENkl$yj}X8RK+6Je_CSIx8DsI-{SkpoGOG@rR<}@kJaSjgbM^ zBq~*#uO53XUGM*xe{8xj4ZxO4*4pE}`Rlo4*#TpUeR_34co6oMNUpKEC&xQ{BU06}9s!>p@W!vM5sdGOu(|@ytt%a>D!>Ev`}> z`tRFRWv~0!qXC`R8nj7dmSZDUha$bP8d6u3f#og6{_iZY)CZVv~^ReVuiT8V?Ho_Zl7+8SR=kvWx80K^Xn8Q|G?^Sd2F1jKsqgM z;Qbyklhpq5_^e6c9cFT(#U7%7+j1{5F0^OSUe6=YQ3&+=&L71KKLpyw!&VtJjCaL?b5CVWc(FV~w)NxLEVyy`^aIwM{3jE?sA817@UfWsXxZ z2ua^3bP(AK(wnhg!HzEsnkW5Sl!Hv9dp}Z<5s%c9j2%tcPrae&pTVGU)|}(dzF=M= z#y~xlUEW})6utbb%G@2Op^auL=-8xYLC<&-*ioy9%? zRAT1fyU0fSv4pZ~DN}S%Mg_n(;T|zzuwctmu?}HpV$L2&hiKTo*fp`bw6t53B*@Tq z51c`=$99=Y#rVZhq9bHJvfh@^ZpnF@ih*XNjC7Hw`3IFqWku2Y6L3p^}D9s z8|{dY&_HAh0NEMMVkn{7gXQFM=wY2P`|d->%n94XtzX5o3`#Hqve($0-^|GSJh3+7 z0kf`7fDP--pjWfOFAtJ!WUe7)9 zPIYKlNR26U7Ts^<%5DKW7-*VVAL|Owr5L2YR->Q^mbdjQJM}9SB>L_%U5Xa8;9}B+ z+~8u{RI&DgmhB7u(V?h9^~>!at4I0)?xtJVi}!OW5y>~@$odioyb=_C3P8cCu z`$UM}P;Nb%2aD8(KE11Rr67B){>>AEBl*WJ_M#_Nj67onziccw1k^xk1kkHdELhHB zmxsn0tBLmZi8_Bp{L9YoyYssm>3y9zfN1m4imL{L#Om#j@qk|R>!|%@d*DR$8N%UX zoGv51uIJ7v8R>%_bM_sS9n0E+%+A??I+%};UMiJfJBrPSJT!x11^QdDi1iLg47zRW zRZCu9*yj%aY=H!CJs3cS* z3GceUEO>uakH#6r$psTq;sG}T(J6mG>FFa$<5_-{Cl)u(*XsZm_h`XCC*p1ex{&`Q zi81>P?S}du8U$Q#QkV>?=&-!QExA~tf3>d@-bClWR+-hwL#$LlqC}e=V8kl?%vl<4>^kXtHIG2H z?g>S(a+zI$kX_FnaHlS!6wOd_(QyI<;Z|QL`;==WhQezMAeL4n+SVV!kcOF~Lhjwo z>gO{MiO*>60Al~!{d>HTeDu1bM3HQX70Ne1>p9*1&V9bY>@vbIKF)Z>Ttyc%Ax1fI z$2f_Gv~r9eq5BVwt12EcMPUfeOQwDNvZ-ckS%+mdCuGd0Su)n@u;YipRQ{XM#2${( zHFPcsj3wWHw`bM^yJN~btn1odOD+cZ8?{?v%?OQAYAV(^sW(vVF|tbv1MJjd+P{=> z-nlf3rYH>3ElHfIbpbDuPwXF%dW2aQ3*P+NPV^cK!+8AsWeF3KZBU`xo;Vj^$u4q~ zk3}HSglNQBjzIZISQaht&#QS`NOr@*YkcwZ*P9(!mFpV9WBxz7l*I45&&xR7IDK;& zKAOsAzjf}`vv%*3O+`pmm{uoNbPX*EGj~l?78hpATPVwTmpWfO0Hnuo3lcF?6l-2T zDlUIZgfqvAU$14x`j;_@v8jN`_J!l!J~)%ux)>jGCxl^uEw^9qL^%5*A4$0y7jDt< zd$A0+!EGFB%?u48bkdWDHp=wSlYWH5NK!XKystbkM6$E`-^tZwJ7(#xxTOL1jYXDd zn^MgLopVSDpIx%$YzHgSWD7y6+IwSQJd??p4(Tux4(W;nH`{0q|A}jKW=;jkyI%Lx z3`ql{FI<)Jtv2oem6U|6cLiW_RPv%y!OiKu!=yv*qw;>`ct%ShSd76u*|-V$vfg>) zpE4;bx{g*7e3r-4sfj-zC*p&16PrcXQQ!Xb{kntBVO0AJCD{js6=L+tCO__{EIVdP zz=jcQn`8~tgo#`y!=6;Tkua5N&Rq-l#wgYPl8KnWb!JO9&TpJVh2rg|CHn(%oQIO@ z7{UTEyq6<)5y(6iB(EbQIq(A7Qgr6e^dr=-=ym%*EA*rsX&{_E?mquXV{7>vg+v7i zC_`0=bIe~P#T7N>?R?V~2pWJqoK?dRHkarxVo8A2PY1~x1M-!BPXSNwi~NHSWvW}d zB`H7^^6h7v)8N~|VtE+VJug+kfr$nN4-+ISaQ*ec;-LeO$LFaq6jS9I%ZZkjLE)@v z^ZQ9yRFC`EUI$@AkG`1~TU??3EC+i!YWTU0-SE=J^F()HCFg1LJ-sZz(gnoiihy-U znk6+5NT&G5WPmtI*d!XdUnBp+uN2p|YYr%?GmFd7xN=3-G}B})hN*Ep67umsVWcC5 zNOb&Kg5xc-p{OkDmQ~SL88>+-w#qynWKW@jw~~`l;5>IAL8@KnUHHqbE!(*`NuqfM-$=#_=rZI+!VOmIJA>JK?C~9VUd(TA?-N zomm#swr6%1DFO1xRi^ZJNPJY$0lC7oXvpu|W~qeie3CYeJ@Q0CGP}~Au(`TLZ;J?- zp9AJ^o>X+iv8qQ!3mS_$KpwqV5qY$!EbYq`J&SvdhS2^oAm!{(MUtK0L@uO&r2Ufu z5)$_d0iQ|6=2Hc2l~naE`rEp^VKmD*8++sRp@QNG*>H(#u1c^ybPcKQx?Hjtz2sj0 zWek4-28OdzfPdPizJ1!S_BR-1-%;Tk%azy+b|rTNUg=dG?fgrh)e8NM0zdzQ8$!P! zwo??GjGiGrsZiNr8DwZEpc=11k5pIS8@nMzh`FvO)#ugJct~3(qpP(&zK)T;O_L); z;=$o0Wo-!_4bip!NB=#l;F%VfHHtLcsdgqj>AVQoWELl~Qs&l$G>McmL@XIDZ_L#! zKIrg|Cj1hvWPR&rr<#S>+|@x$+6xQtpDq$XFLP=Rc{ZV~H3 z)0s13E3}R!hMZz-*x9cy*GywehX%y2j|ns@7}|euB93?k-Tz7W#PAYSVoNymaRp`H z(un$fOSiFovbY>3)v{A3)78`}tM3o;k1oAvIK>gNdZXlBn-0dFy=Ve2=<0kO>w(cV zB*~2+MZbV&mz<#KkbV_s9$N`%$?K8qvk3t`<6VQf2 zY1xl5c)wOt*{#RrKQ3hx7jJ_;&C6BF&oz^G5N)9BYj4r?RElGhb+57_CXn|w7yQtj zx_Lzx-?V~;;iT^HSk)=SV#Y{Ak-F4jw8xi-Czup@kT=VNhQVU-VI`KWQlbIFWaXA==A*(UsWlLF6d%FK<)$!>*UF0Y5w}!P^EX6#2JhZYdbwSZ%IqE_PPCe z0ZY_C({tHD<(x@HClwK;z>UT@Jvo|=`lHqGkLU63x3ze~ zlmcJC)}w|UW`bVH8M!XzoaO*KzpdN#fSsN4+9pcr{gh$O=Airc!sE`gy|0CzJK`Fd z7MFvR0Uq_5;K)27IhvWOiSDvZh6;SjWy4!5j(fqfZ;1|I;6%jc(-@sCxzu{YF}Cz< zvljlIEGR>k7uWST0+?cTq+3q8&f=6S^VLH+0`^DDFfuK4lyG?Fs_>t8iuy(}6~wx2 zS^JrNe$=>zX?2-eUN`h44{MjAbhz@VteGDBUKs_GqY#y%;hIRh)DK`q!bKmXc4p_vQ z^=>Wq>i1dG^eHP6N7phx`SuIwKKe!opBHOgG;-AIXdgpwsc{zRjQB${#m_;Hbrd00 zGzk%;wx0qT5w1SaPBH%WGK+K*M~`#)I3AiqFjA}^?eo|^6D5ce9=zNbEAwljeTG&P zRdMwXszf0xj*D$VtTUq<@ltG#o|qZ(`Ro^e^BBba?q}43RCdlPa_5G-sXvW7sf8R> zcAu*)rDxFh#ByVuof_$XQ+0vH1Ei?-xz9u^srEH_zOS%HSF({Zk&eos(NOJE@XUfu zGw212*s7Fp$;S!92#OCj1t<cF;nG3$3 znPD2(&?DA~X%21U8u~qk0{1aWMBF!Pl0WM9LtQXoMoT$|5?P6X3DB^s&#^AgYA&AH z-#7|9Upeu9hMp=UqCvDmtONpX67_XExm3hlm5p%7!mR+3>o*^2-;gCQQ4ZXBWs|pJ z#|Tbe96!X{-iJ;lK4_@8YAsAx&j3@ayr4bnm@xkh+a{JEX-%8NK)a*KBFL}EF(Xn} za?rVqgGpY}(kM<8wW?G?3}PCb^-fS3GD^2FtF?Dz^3T`xMX%30zv?1l$vFuK>xu43 zx%^X+C00)Dz3gI?r0~DgZwO3#6xv9*kSO}pp7j5*ajKqBiq3$y3q_I^?-TCEH}EOo z*;jbl2`*N58^p1)+cmushJ<`>Ky2I*Q{UGlC(Sh>sPBn;ViP8ZtDw*+4q@5)z7ryp z3AM3@s_(Q&UITM{c0G633a)SqnYyU6fBmE}iDHlJw%1mw_spJ*+Xn6^Z4p=BcT?c5 zH|tf)Oar}$*Ey7uF4?|ZXuZ;@o zQgF2Fx#>k0=V1=b1wL}om6fB^SSB*>+fW(5l8Hg`dr=}?pw4yaM|@Y zK5z5v%$8H$S?o%Ef4p_|eHg}k?ycT$66zwIyBe;%>x&?;r(KwpxZd3D3`b?w`7KC6 z%3N9w@`vNRz9kh~_dyR8Ue^ku)%3Ie)f~2b)SzXr3t1+OH0YV;WJz2&c-(W+ zlf+P+x`e+9WKvzSyI*Z+Bl7atn5c#s^jvyWX(18LzxaRfwbZyN)qr4Lm02gJg)a@V%1e~eK`;F`PPeD3Op%1x+eh)N5ZMY zGpt_LGPV*l{fI<6o$#5cYTQx@vFhBB{1Fs5ZlAsC;9QlNhYcNvQ}*LH|8|N z6FT_b>)2KG!NZWrb5tIwjpc<>LLZ+NeXw5jqF`j&=&~yewF&QuPJsZ%i`A1cwP=Zc zzXI8?;UIKPTDMwf3UC-7zjvUioRV@lps}4}zj5r7O^5$byg2)I>2}Vfs?Rx4?m{4B zLgsd@39hH(_mgrMDU3dW-AxPFd8W68qxLKheS9tiMduSRvoNFUhavHlN=j^$NJ@NS zl-d{73kyCOg;q`i=QKy5gdbt{^;(#|4~Nc^Dj=#<`&?FFU$@YPq{!+6Ce>y1eS8=e_gN z;)Hrh3QfIbo~rK4M;}LoV+y=s%G2(zX?YzCrQhlcW;PRMkB-&t@eDrvJDRn+a+AeY7-r~3flLVLFTRP!ls4gw;5%oRpyEh$Q zX)5%HTJt_oGz4O~8<$Ut;o?+&40mK^qb3nThW^RVN=duli)Mb?VPfu^w* zcnUi#o@w|7ePFiUNtM89$+BPDDTAYCnKQ?7kJH&@FQ-qgvG?mh@IpIQ^FW9Ht*-ny zKb9tx@*xT8T%a31^VM6TMvhe*cb42lGq3<%gq}wXcj>$5$Rp}x6wqhm1|P#C*_|fu zuS^@~vAqpNSB?IVkx>*39}M#@zi3nDC^eeW6>xzdXHY zWVa&1)(qTI?31=ZTHh5H{~gwc_#31wl-zZ#uJ=TQ>LN;BZU(2SfJg2Tq99dLVm zH2Ypu$8>@XT*pq+APm)#9~-UG4Nv4QRGTb6da#gKeAEf)mg9V7jNfy)cRfq^poi5J z+ST$F?dXMXW_ww!XtNiL{J3vha3|_F)m$y5hcC=duVy*i2<`Ah{z+Y{DNCU|X|~_} z=3B(pG59LC)S#u61swAHnv-8C8s_{3YdGrs2?eQKG9XO@n&Y4WrKGL`p>;E&j9i=s z#_N7cZ)^XyXWcYjR$e}d82M#X(SlJl<0vgYVV0l*GekrZoJ25qUhjj)IdH0(RgOdD zA&!O@3Jpz`UM?%KtshJo83cV0;izs~$L>3GGm17$4&WGzj~zXjXsNXCF8*2n$xK$439^ zO%rbQoxTH5d>!4eVAE8oV*?f&+4L_zDO7)pj`wLbws;Gbxh9C(T#$wuE9^fF@WB*! zu8zXKQ8`ODd#|ZYPHwvqwuQGIN=@w(XvhGQF+yAIhebz2HOI2&{2F=QNNu6oiC#1r zcRqRu0`z^!%Jt2T(M!~!GZUv&OjU)-;nJ^dDzwmthBYHr1y|FPOa(D!zuZMV8&5Bz zogFQkrge^QRck^#vAlf)BJ5xitY#&ijPF%u_E^Jf6#p77v++4zpkdU2?7u6Ml(=D$ z+E=Q_Ep58{T%*JaTqrG-8Uz}4nuoZu+2f#auBz6+$JPZ!(`ac(C>eL;#oKF5Nn*$FO6=21I*+S_or`6R47d+oyBG7Bvh zMMGkdvi{fH0;cx6R``s618!-TFAXt2OpX(BnE?94s(s;<8uR;ZH+*eW15ISyAS>iI zKR#O7(x;|a8ZC`)W(Ix&5`MBz=6uWySYpW0m9K(Tz@J-n+dQP!I)4^bXuV&zlD~NA zVH4Nv<`fC%@x^PZl5XjKO>}y>T!PlEN5-W-xk|VEqhvj}<7PYCu7m1J#YE`$;rDqT z8pHDewdQQFq#-7@pdl9jk0;{{d8KdF@IK%Jd)-_$-tF&)M{kI~fbf&1w8|oV^KV%?^_o{ViqHkg;O zCcqj_-Z%{Zb}!uUM!?uE&GelH32WNfD)M1?26|dsIRBUL{vmiAHr4CW^HHyGq%_BI z(f-F({o8k8!T-9d{|K|t5&KPkak*sW9cSwvPxNCgiwjk118gf;eTw^Cy9)8f_hA~u z(B;wGWs09~>7}@lUtvkXa@+Qjxw9wioH_`hbaB?1$t~?@c0Q?CYrN2%h49JV71^_Fr`a zyug1X5}&Eb1ON4Fce6{o2wIJ~y2j-wMg+UVGg34JZ7Hu$SJG?L?&D3K-*V8CZ4ZM) zer;`-%S@SD&Tb}lBy+|vC4Qjq{`O#Q*I90iQ=D|8^7^*-<=OHoUHEpdKgjmvbB)X7 z=Nh~81kgWWjKqizGy`!um@I5>dyNq>o9F&{!x$}6;W6Dsp?i9?805nEUdG*ev@7`^ zs(xFghH*`O9t9uWf-WmY4Zr$Z+9i87xm;eFo{53w7vyLU=nRuD0C9BRB2#T9=u(AD z^Zu{D`&%4vbTi)dKiFgYt1LwrNit1TxW5TC&RyiT3{>1U33$Yz0k3jiLEmg46PED> zN#NqpKH26@Qd(82tof4{FcaX~fWzKfmER0RDuwuG%DvgZZI@;JEroL1F3S-;ibx`mpUw?szH@^%dLmZ$ku0|J4`(d;Z&yKTs`d zHxp7}4~#m=+!IK#!=K+&$OzV5mF1|1+&-@c?BI z_jAo<@rMBk%Aa)R$|YPjN<%6IUgCL{zM2qzn@-rK!swD~UYcE6hoFujM~XCnNRa+t zj_1D+4!2fHFW^{cCoP8)-e^CB7f#@ya%SWbgkF(G6x$O~(s#+a=^uVJEDOgY>G>|? zd1J!Z@o`ySQwBzbnNF+??5@0|SJ0(1uwN7}PWY58vBAUBfB)e>VC4T{wP=W6I?#ke zn^pVosZ4l7pOOvCtZXyPsDeyt_Y6;Xpv4AKFDU}Dz>=DeTz{|jgdkGY53`Wn?RTt# zCC|&(?~9^5pC&T2L4oO&Yepq2CeJIRRL0Zmy#QD+R^XkP7Q6ixyF`5)Yp5c#6(se8 z(3r;c{GM1!)9!y!N)>#^@5La#Rs*c$ru&GBlzE39J+zh8Y=NxQX!v?#NuE*nIQW$o z^mMI#0Z|DR2IQ#PAAUgR73b8nNz$cq0jSgGzswUAFQxo}z$2!swt@)J+9l2I4!0-l zMe5@gVlq-5$RV z+1!%(lsWpW4i)KLekk^R{yBRS?Q5`^uzc7Tkuglg{7*Y8{onL6(dK z^Z1lmY*F|R(|R{DTRnS@l{}N$|;AUolLSTh2y_akQ&;ff$3r5LK*e1Gm79QBJZNZNs zaNYYRG$h@Xx^);>(yOYf^-NagkA#`bOu-1rKY?oBGRk~NV?bsyW&YihNo#$-Q0WEO zo0X8y^xqbtF|U&VcOn(IzVlX2$f2BPR+*2z{CMAb)Soo;PLke$-6MPAQ{e8)elh<8 zG#Hd&E6OZT-&+1Qv`r+tHp}hi^sU@TPKC4Rt`4yZPa#WD0k^pOp>|$^qO2|v;*^dI zIR#mco>fT=@xb#JYu0RJirW5}6P@6zla2h6zsr0X6ifVW0Me=dZ06PD)%4K=m$49o zuijDTs9QRl66y3Y)SlEfG`?$_Io%_XKtq>H+0CihN6SKr)014jtM}&_C1BZ--~GGP zSJ?}ST1OoqSNp?9R4+)r3z9)#dpKraKH_&(rnu0`?zd1_E5SFdD`v@ITe@hamo=BO zrj&|cW{^G8__gmcij4TEhX`2dt82@!)iQ1Y^nzvgqabT`3r?JVY4(BYMe)5g?A4Tb zVcD5K0_EH4{AiUG{sDnz6hyCf zk8?b$*0-6Fu6eb6#W{>BdZKS)OP!nd;#7e}zGBcp%0whdqn}C8-}R}_FW|hT{5BId z$8(DYg1!2?w3lWV3gS&Dda-=4r8OBdaOS!fuYD?iwrFFz{`Ea~qkRw-MZd<5KR*(h zI<(I^=#{cnlulMlUvLwpH`S%zj1LX6>lE=(Jc&v;Fp5@O=Zr{}y|&D^GElm|Q;1it z-TeZf4m`oO?~Y!|h1!&o%*;k%{@=yFK946LM1H85860Z_t408M?I4C(Z|?@XrNC+}uzU6GHh`wz^J*BoP*@#u?APtN06we7iJ6MJ5H`xRO;;_c7#z{gq{ z!OxOTOg~w5dQQ+`kHL30e&)VF=Is2b_w%)=>#@HaCY-#hP|PYSN+Qr@%!blAfAg69 z&*%9uXX>1Py211DTz2tAOl#HK@zF{Ix5OoC6>F08F7YhwYO{yN}?o!8)Z5p ztG|{FC6a>hO%ob-O>+(pS!H_1eOI9Whpw{@YinD({iaYT6e&$BTGzsy*xMf7oBP6MP|HOwh$oUlTdWN#Fu8fd2w5F$OD> zH6kEJAH{mGyW}f4_JR%p{ujS;s;r}{j6zPH%}8r80LW1oAJt#T1)SQMJe}o^9(zBn zE1*>RXVYaec?$5LF)W0dN5bvz^=c)M@cOrRyzl4%(|mm1;^?C4M%Ci35F+8&$fbU| z*A)t+9$etT9Qg$SxQ43-Utw>Vf%7*5tbz6$t|<%V8F<{6nlCfW>(#yA1lOW9yHr0b zJi@|!pphcjnF)KekQ;GDa9rA5W`|b(t29&=M7-N)hhI7x$BM55nUJfJZ0vnJ1u$SJ z8!MUUZ{uv(P|hhm?2RpJ$T-JP&P|-gZ3q0{^nB*x#o?#ciP#ka4dJgLB+JScdbp0E z%Xnvr^2&=I^#QC86WWR`0;Z2mBB_z7X13;ztIm!Q!Xmt_QXf^EQ?!J_+#ux4d^=!g zPXtzB31&_icu;dLA|f=HGy_ihl|+q8M&iM^@$r@>Du4ugLhbsI-fyEUF!vn;&;?sevJKYY6;1RmAmhf;F_;Nop0 zN&U1Ua20V?-7(TZgx6rD-QN?yPtXs#0Up+Wp}>4C$E9Y3Q-nVqdYxpR_Y1|4(LC~x zJ-}}8%7qU_q{=nzl5W3{z#@2}j@UOi3n}AJ0L&He_rFGIWn@d&CMYy9vMsV7p@=F3 z1Dqb3!KT>=QigHy$m~tkV{0-7;_|d$`3yq;M?$F#YYbW>8WsjcPef(p7j#iR$I_eY zFdG7OWzgpLqcn_bP57El)n-iShdvf_3+HP9;&l-KKpvzPuuyo$3f@|xfbVAU{=)%N zwvcf(2IIa>eKe90-j{Vej^*|vn}c>@B}8htKxuNpL|sJ6Is2;*4@F%xdIxhGCgqyR$Az30dIZ=_KGLcuJ} zmov-(kvt{6-yf6ku9>DGWRCcj_X2*>1n_#DV;<_rT9kxhI_va+Km4*A9mQjaTqpOG zQi&Ix_UA3+?->0)#EeZPJ!_IkjF(*5sfTbViZw@`mbyg$58n$@RWF9oB<33}iB7^W z5y1ayj39Dk*O-nhGK++Sp_YWQ*FqfK-&kRwezx1k`5O?{PYwXWSWW(+hdBe=Cc3Sn zQFm;g}MO5Dc!$-i-99@hSm0UpW%SP^CcOzR#h@9d$)bx;CrBt-O^yrMNE#2t0_ z1WbBQ*%Wy6Tir~?O5{b;(UizGDgOTQ_IEYG*p&LJ9{`ve#S5bg zpm>-L1N5+uquZZyl3owQn_8%LRry!x<{|6HfB3-T=$I&|%jYAI>5stQpSH_h@nW+d z8fIb?9B1Thp)k)Kpu)693$Vu`kelT<%iF_91Xw34HHtOBCu*Ou<9RoNgywvovK{0?G(M& zl%<4RK<>jO)oLG5HOzx{BfTot8ZKo3%8$~|`y?3|0H5O^G|LcCE!{dzsP>4qdt{rM z^jXs&_)R{@v8lh|JrMx+ak+*tme7pzFY3x|n3Z4Q4V(D2mHR4ARGah*ZICJLnOMZN z-6x15^v0S|-jZnq5|)g;qRIGyyw;T`QjdswJNL&`uUsF&FTLMvJkL=#QIL4dMl$;C zG+nT3rbxkOIZR5FS+MgYT>4fKE$$zp-LXi_!vJKlPYdkJFDSUk)$d2dx0b85004pW zg$ZUI&y^ckjUd47n{~^JlD{+2Fb=MmRYW?viVPN1W%syu(o5lgLsP00ySv;=3G!6m zu?P&fo=Te;=C8ASyIb|^scf&pf^%3jQ0Wl{$_AM!AA}t6lrq>4MuVExYmVZjC_$l< zR2m}R_E5==VUsD*TWZ(y#BBbQ_5PY5N3)31Y}_wTQbQLUH@DUlL9Pq8*fW-buI=De zw#|E3F2bg%DfBMX_2Rkl$2KT9UyJ5Ct>LLO_FJdc}BM7iO&p^cba!V)S#2A0(|K`pNFVmTdEUT z$BOpLG`v;lEpx%~-~Qx@vRxQ~1M%&6EHdviEi6xq;(`aG$Cz4}Ime1#F&*YLQ~@#y z)7x^acsBX$HvZ%&I%AhUE1kMnX=CCtw>W1HbaIbw*)mRs>brzws zqeuq(GT7EQXP1t9c~;e8&vQcBsr0M(<4MH^`+fA`*05Ckl`F@8S5e8>S@bMJwJl=J zc#qedc~k-U#*ASibJ=7v*P^Hu0sZ#SFRLg4OO`F%yZ8^Y2sQE^Pw{xkdk2ZIdL@18 zID^QaarVm#vV3#!#{`5o9o=$kn>fb^HE?rF3GuMu;cI-jVMhfs9|wC_(+6gj7qvKX za44`~$JK6>aY^*rY{L9vqOs1_leiUX_V}s!#(EWWzp!> zDl|vhRh0^g^k=4sdGAXL?ngHBL7aAym`h}=-@e7D?9YjQl>4S|MEWyiHbrk|ECigGVj0#vjmyV&Q#J5q^kJ@mKm_`e1#Z_D#VkR#XaeAU(wcm0V zf`69NK`L=CoELvU%_(GIXU!e_n&@7s(+4D~6%O)t88rkphrZX!$Gt^h!M11hQaEX%gtscP&M(ZhOrglr|Pa^LuI>_zwR@sR5w+z*~oEimxFQqboSLG=*wzLwAU0GT{MeY z%c=~%dqksHI_l6^UAmh!*L)62`MP+oEoZToS3P0EpTmW^%UpNjs-F$J74+8KN=jjH zRuSOf4rAoNegYOPw*4Go>wK(DMc;^sx^m0fsXF~ztjo-Ic>-ec^viuSWAm=!y^MZT zANo@ud)J1K>lf#;bJPTa^#cPL1+g@Cj3=nFF0=s36#`mg;seMre|$=G@kmkD+ll2? zHHUd24PFIv7`Xs~e0peLUuXsBRACQ)`qLpovOD)*_(zv6N8gX6Zt&hn|BWA;x)4pV z3dijb>BVL~)5H1ge&Q-Li+jF@zNRWD4Aqw`Fg;|DNQIN(Bd`=Cg=RVN^?))(_FZFh zdCT5Y5uB@c0kQHk@2q0Gqx84!&kuZ@q32Kt^j zy{twJ$BM;+ssR3(LW-G>R7c-g5qd5_Nv%Vdt>MD#4Z37qm=?pFy@)##=mN`^vUyaV zuj;h1gNB03b3V{@)1bloc$}{8#TZcNUal7|S|_!B$2_c5nEUt>a5ZJP`2NnLkOUpR z#X0M*`2qeZFu&K$_%3KAZG1nku-$hME-fd)Ty|%A8S4Av!3H51X|N9nPp5GYl3jSOS!vP2BSPH^7H6LJh15K3QW)%Hqz>he+L{Ns7p45jm$BqEx;Nd z@XqpPh{_PCE@NbS2n^2H0qe4NR157L+;$9mdC(CneGSj)2GWVcQ^e~46=%zpJ_OKk zF1$ttow#c9bXc%0iWwNyaTy>U!@hPCis1f~qh`xvpxCK<84#%;ZkxCpIX@IIWM@S% z%v~hfIUZdRb+iY%L0{I-7@t1k;y1L3%*g5H3zU8C5X?k|m1yV9i#H*TdvG z7g84|Ep8V0i!(qaM<(Dg(wh8o9DS}L4r=Ji_gT+EJg!0M`lCo)NY`|`qK3FZ>%!O2=*@nYBi9v=EjEON? z)0IKsoK0KAcS`I5o(9v_&;DbBN|Algz@TsdmC$q$>bkXZvDvFjBdZlo_GAeOPq|7sDSBd#!!Q+NbHd@#ve& zJ*W_XvzePMa_ZsgTmdaABRKhMb;fUIV zo?03m74Z~C@OAg${ceQETDt-_U8jUSqIf&w(IKvS8qqzO4ykiax_(ET{V_+&E{?yH z^j&z5B+YvJ(@f`kcCLvMKJHNrDFpOT2Wj>xL!zam-`arBTok9&;W8^{ zmYwJVJJ7A5E1iO$Y+ogGg39WBUASrbERL#91pr}ozW@s%KntC?yJ9K+`tugYxj;*G z@g7{p)}{KhHpA>!@Br0bxNyqwo5}9toe+DiYTg@BOhEMSl@89W=>ou2F$g@7@iu_8 z7R_DW6I#6~Q5&9`(;DNsj>F#4JUdB=hgf-*sQ}XytPx4^O&*-Lu?c8YrzVZQuXnAa z33bcrX!R!c0|Gw}LCj|)v$>yzj}*)uV->0{LLLTha@51V7S@WuM)79y?+U}D{@GkE zeWk$QjMugj<#dA6w+SQhGgx$d1Nb)9Y2Mej#Uckafr!5BsGzgxwQ4U(Rq)9^G;?DQ zuKQ&TsFij#r#v6v>~h=rCb@In|bZBG3WzmFWyeJ z=sTP~I*#G+mR>;?JqL}Bxlod6VeM5+1eMd8bb%=DSh{FOQA|RVN(3UTaQDFXD^cuV zT7;VG%L?{fM3l7YtgKXfAzZDR+VH>14_zxMamVh1zJkLjaTFc>i}dG3fUkG$>uUV2 zW|8;;i_M2L;TE!?oG@=48~hCDevot?2erWYP4j=kpO$?bHU;at9P`ScvXcoTX z69IJ*aancCl`53^!Bo=P^;p7BlHO9urL8p1Cwq-siceYuxu9SDUIyC$MK~>NLd|vV z>_qoMm0`r>HyP6>nm+Q+w8?R5QMipi7!|&b7@!#1y*PmN+Fp>)YWf!xAw?DEY34O+ z?$NRx8f0k7u)SKn6Ll9*V*ccXXK(yuSSF%>cVBUY zNbSVNCgt)hnK8+NRHXBv5#rhG{#&zmCl@n|{&*~eP*tDMFuR2{3wEOza&dGMva^^_ z(A3*6dakMbXU63X&{LQb+GHJ{zwb9jOJDc-FS}-0zL9o(ULqVBDVNYX6oy?m)bN*S z^wP6><$P;WwF%k=IS~DvWjJWP`?cL!^47KrkkRW-em+Y41gK8qt&>qQv=Bh2_{uKC z>wn~|uCE23_jSFm2L+#wSDsJGpC4A9{!j_t_5;s%qCMaFT?t`K`a&R!*4 z?PNS1aY?@EBl3CJ0$2szE^UvG8BZ&^-nX;FPqV~0@;;B(f*UJOC;2N6C-=wRcRSBd zOwVV6&j`QUx(iiDbp^bgefWKDs~5|c1s@K)p4K3OO^;XVJGxm~>rWlpy_NJwQ{?!6zp^zgn=$GZ7D_uYFD z+gWJ+yNlGgKId1L&4M-$Naw(&h{@abrxx$gm#3dD-7_w>Y};vl}C* z^Axr&4^F)c_p>NV@B9HA!lr8L<%sS2lHc1|iImO#Tfc06Df*>C7e}dIv)cWbe0@?H zF-G`ytQCgVky^MS#~MY29|)xOU#QmDM{-$lLL#{VBk8IX(6J!IuzXrJvf*!`Jt6Gu{#y33GgD zw#T~P4jg6|CNcjQZvMF5xX3)@ZNnuuyx?#B$MX5&YXyv$|KJ7w?eH}^_!ku6fry)G zsa3wfZW~5wf7ipC-&6cUhf@fHRBBUK>yr2RtpJV4f#mW^!B^sFri=5I)RTwC6@`Jl zL#`;ySQ2ONb7w*Rq-h$r=MKbtDjlp!GH}@PK!qHJ@rP096>@aQ?%Nqga{oZU1rEgi z5Id0rw%}b&sTuUPNY8(B5scCRpab{zu9QanxXZ2ksw=+y8Dt%M!*vwIs5?5l(O&*1 zeDlz$_oTn=wzb8{^)`I-5sZvezHN|!=`cmR># z=6>!#8$*BZTbf@jJC|?ovAA|56+)L6%ziy?ANnG`y*PN-#xF@xjqaMW#&TBAno8mr!IPQeT`?(~7q@ zCpKbyy$>$TbfpPt?Ita!C@bK_-dWrgmmLAgWft9)*sc>(*Ei7$vF^5C@Aa^Me>eJa z@2y|eW_oz|)9|)w^EH_`fpy!oAPbX67LyCwr!zz~3py%2#v4x{T}&4t)yJC(pPkAN&~?V&K|Ydqfh-&j~xB!z<*+gQptz!;`SEeWiSko!6`E+%zU~^c;Yh89r&V z9G0BLVGE{n-%6PBIrm&_0fL;tS~`CuxlT&uIDYE%ThrdOBb@xrkJI!U(ls4uiyiTe ztKu6Q1dd`SnYN>#>lvZiZ zkjP~nW`%q3*a4qgYGvPDf8mXD-J;-9dT`vlbMMtOj0`VmDOwj#P7F4h;Q!IU&-!X7 zmN$A1?9RoDD6lqER!s$F&{fzW32oOwBgAbxPx%B4`tYAY2S=NYHmU*x{^tw;Jn{bl zgSeC5Tdzi z&VT}bzhB>2twrs5hx*r2Fo_DTUX?qJf7(g1=Izy~lRJr0L{MAj9579|LlIDy6Qj9F zoyyDLok+RypoSJTJGe%B+o@cVJ(58);{Cf>|1O+=yVwC706>y4e%sGQ8?fy@e-D%H zV0rWxW1R9Vkrz%2|LKa!sJCI$)59?D$kn28z3#`9mf-$dDuFIdyL+LoHgVMtYVX^- zDnEKsQSlMmJ`_n5-h6DiHc>A@;0<$U4!u{5s@q@u*kCsL|Dj??DaPb1!y!+@nxa{W zuf&iUdP;HQwRw^JAa2q{VASU6HKg>7+d6Eu?-ahcksG4~d6`nJS7LBmOtZ-F9%|nA zSpO`swKxW2x>Ziq%?>WREX9ts%@|Gss!1s%J!2gYdpzCi`1<)7&IZGs@RJz*i zG94oXh7c5ms}k;+<%LGCf=Nv=xRK2qkb4GLOf81U(~sYd{#XFJT6IheFm7N+b1f~_ z%vam}+`K_DK=s>Q(I)AsxY=~WHD#J(uAf&w(!05VTF%(J^x34@MTQ>svpAXm@A^U_ z-SamALRT_fk~5;!UYw+Fxgen0c#8VkGo&p`BL*R%gpBA*sMwJInr#HHbH#zw`bezE zXh3wYjxG$QU1td-0%yLua?tRcOG$wtqb8`AMxY>Su9{PlQG?FG7InAhG!Hu1BQcV1DqF00xRc^^*lB9C1U|V27)HCHxXgvejm%#X>ZE zmU*A>5fhM}C$M?vFn<&06R-pYI`%FA$1(2zK91Dj>CDNJufqEVwN~W|G}1jQd|v#u z^s}w=bLdX(d3B}8&ZKC0^RFC;ujEoIT^#Aw6?C~@nTKN5lOer61E%l~^s#db#yE$a z>OI$4I}c&i4@Kg4R=8N^T;I%ibCU1z&kG?VvRfVoN1-Tin&(!M0`*DG50oF`>b6n8 zveuf`aY_kf2VzHO{e6i4A)Jr^X?RJ7!}$_DOed6(;ei~s-UmacW3a_**}v-UkN}>? z;?WB0j9-qTg)#Hu2~O!ymOkJs(lP7K06&UPl zK2bX^Iz$ce?>7GOelIl)Nbmy+Z>3E{)o%QTkJb`=Kk+G$=e^;>yFoJJpK}3eOFuj2PQqsBO_|<4Z{8hmE5DcT_zVxlp=Q8W zG}*ZrPkrf~C>9fF0;co$u~e&4-X=)AB;8kS<<5IOiedVEENa zv3i)1xDm8?P0}iz{fuI{X+6@Mp-iukY#vuX%81shk2-@au*p2_l!irr(QNgdyH#j5 zjeS6GyEWvyxJ_A+%v7@ ze##?tc#!3+H%9jWY{F=VJh6P|7Fh~3@eqJw$363#sXgI>X4A~>Lz8^8$T?QVtUE#&>3z>h08jcF)gOOPgzOLfFvcue z_(A=h3kyoNK+#XHOLQx~9h>z%*ol*`AHyxO$^}p>i8W^d9LAaDr=O-od4sU8_8m}q z_5A{bYfeZV9+c?z!D@;^W$1mbVcofJPo7WI2>TQKM?i}8iT$(JZczOEL(~@rh5=D+v?TSixlogG zr+Fx7C8`d9_`!Pu4=1%%`TuhK$nA+G|7vzTggx`R_*;IQ{AWI)$;aB3^Zi&0oZm=w z9bY}k+dluOn?YyJxV)#rm)X);VE|$MUMi}IQrao@!3(BHv-@3nb87L#fWj)eMqpjp4Qb6a zLs`0-h6fXK>_4=LIXnUJUq8%>6?D+9)At%D$!eUj5yNxT7`L(OP|c2+`Ft9`-Zc{}<2TMWe3mKcx>0e`BwDNKiUp>uMe z=xv9s=oO3eqZXzy2XQT1rvI<$=?VaZVSRv5f5dh;GY6Y!WM7!r@^fz4(lNyf@u+Z6 zFP*HVi@m%yQU`Fzu_@oWl2*cL0ro2aD(j_AGqQnfNP_bJhwbq6IWJ~y~C{S z_?qquMn%^ZQ5W0p+mi77d@>MwY5;#`3&QEHzcgL#OOl~!4z{pYjw*L*dW1lx6E8A# z3heSatBJ9tft#REwzLlYtQ1E???&yhi4hDRSFTVs)tKrG(2= zTaBtN!;8^LaBx5uzg;`6PgFoknanp%&%hKakco@UjGs>l&kp?v70&=@7U9qMgy$!O0U;u)~6VR8B4vTMI8~6nQ{QNve$wgnul{30||4 z?AX|4-4b4(ZQM!F?AmM4AKBrKypq#D1h-kP{`aTkWQ0cwsU?&Qugu$|(&P!f7ZAqr zY{~Cd7vwF(N5am7!xD3Rejv8QCmGE<6Lu%FbL27{u77duj{3kFpbPB&<|7z8iqo&j z5gACP5RYLg;M+~Qo3D8levf8$UH#uQjE$rNA{Eh0hF^tQ(9u_3Ge>TwnxAv&5fdt2 z{)eyVr18lx5N4%hOj-(s$Y;RO9)9C*zW?^I8VG+I5Gts}-`T><`5LZN8!lCQMe+;! z=U$>Nr~Bh`X1oMKsbh$Xq5?i3i0GG>gwT9j~B!C&zSG^P(x6H5JFcrp>+jI7?1>_6%{xY!sPI; zrAYRYfoKNGDi{NZj1^yf?hvL(fTqx3kqtJ{W^^=|_L z1!Vt+kkR7sUxWk-7^?@=~2>eKi`E4$kQS+HRRgMTyzJ%-{F?d{`lU5D|TAf!$Nb7Wcj5@;C5iv%k|L_m{Vosa*;BP`khVXs? zocM0KpLK)?TtMvYf9V@!hsLg z!0$`6j(t`+*iufM!hu0)W~Q6JGj_S>XF%czsE*m)wiD5@UPA*}R?YY1@0ql;qQ40R zE(@6m0S4l%aQK~A{6i)^J%(@D2aw(0y+mVIdU~3U?<8Lm46z8to?ZpqVJ__&16i7) z)1vopaZGX+6jy+7zLQE!>i`auH|JE`M{rEP3y@^PUlLjxkGgH79^p7<-HPsQKKi4? z_`5Vr^Gq@S!DX`s9^DSgl!4f3fPCF&BpC;Yu0rp+wo!+gHxctk91sEH{nyBOqaFfk=lolI_}i4P1bU3I1B*h&E#f5H~#RV>P7X6od!So*XhKk@iHJxU4Fh(^-Nj z%9ia!kGWW(&Uc!%RIK_$?Lu6iSmc9qXmfI6kj@Om&sG+4f z7R**Eg#;c*y4Bz-2nmBQ8c`H&Zc2&qZ9H5h7cx5+Zu$7rQN>4#FlU9ub!$~a3LhXN z>5I;1&qIc&XBn9XYi3ZaY?>TbNW4EGI23C+|2N$@@q1TLf7P8e;5yde&##bWo;SBzBg|aE&ps*L{rk#nk#s~=Y6w!iXcKwR zRgqvb_1Z(qY&0NUupwI&Zo4LHr?Zp;jw$Ljky{B@qBv@IgGQ2=!rA{YGQ93gzs)g_ z-bFut?WC*e=^=U-#sve-7C>+f^ylEVI>JFNv4AuCmR7=-NzB&3fbV`|g+4Kpx{EwH zp3PzQ?U7~Lwus{n;uvE0As?n2>|rSO5i7*saPg2H6Ng|RwTIMq7eo{AT=e^5A)r00 z$GpVKRinQ4Z$L))7S1RlWKP+?^Fhgd*YMQFQH(m8ki4uNoXp05Ft10Qob1li9EI-m zj6+|`3HyqG6Gpz|z84kUHk~y#A7#S3qWE8Q3_6s5(=pz8d^xFz5MfQHVnyjhtz}`l$geG@0TCtB1utmat{gR2C^K}Y+-W<06Twg0AX0ajJ8Zy z&9x+&H9i^*%jH|5d${rIQ3^7TKbI)}orAaoXdJwMP}e{eQcRy*xeQ(2?E0dh+md?f zb#e{8zyBRzmst4Zi_$-!>tMM5*VD`ih$UETo!r zuS(BLscI^V!cot&mrOVYRjuZv=ncWnAqfF9d)?x1;tqq`$K*p>r-NLD@og0=k*__} z8**&o-25#xsA^(F1xAUpmP{N~yw<7K3O>lA+=a{bRiS&vaUd1z5*mFfk4~cFDIDfSbS&=pKhYT9>Htu;0gvi{tJ2<)yhQi^UTY<49*unBPW?WfrEL;cjq=kuD6QoZ6!w-jWdzp2v?TJ_OfA zcfnya7Y>*=;4jpCvZdWzZ{oU%TD4Brzb)y5j^UIK8BFVpyQLtZ2pBS?)kJZrbw^`g zLdV2cN|al&&v!eS8qXM}yPA^fv;^*v4jn&NSDcYeK~C8@h%?4+4+eNsL&%*NYLlc% zGg`9cEGK3t3LCb8;4?!xS3t2fUed|4Ch!fe$1@xe6H%0!Pb4U1D7Wwdw zDft@MeIawK2Y>Ue=hwa{38HRzl7p*}xg=hTf{Y z^u62pCsL^ftTn8(2=2D?GpysKWbCiX30>^%@l9`Z$ieAXvNl&h3i0`+a0ARLR@(ht zhjom)qd@$Y>@ywc+AkMMU8pKJI%8^!8|bfdX&rtMn_{Fx&QgupHt>jL%N9Ste)lEW zdfnbyIZqw=Z1xOge-->nl|pdy*I7RAS7|l3xeXVi2Y*`qQ4h+&jaAI3Wm! zijGz`XbUud<~(10ZnEy(zWSYe{5|Y3J-5(?n7UNQ=aV?2d0Sdi^;2KZdM7@wQ@_gU;vmSKN}t(C!};`j(KUPP27Kz0~QDNgPI} z?G#APNmMt2B5%Lb@_t|?mJc`Zafx9(`!$7_6cNSReYbyG{Pv9~PSBw39)@t=LvP%| znz#h83QKfV{dIgJID zAE?D9k&?i7P%fGn&)cff^82)`Cxs$@7cK2)>M6say`Whh`zFn%Wx#aL-WZ+&kopU9 zP=6K$6(K^S$~l2o(p$|L{PhJVNsmM zH`kEIk*hh3akct?ab%^D64_~04zF)J;lv-MawL@TH0GGitlIF736+XCmC|gk<77`F4S5)E`~(6Q1>3pOhL+t4d0Uajm^eUa6)YqbJx z)UON0pD51Dly}s`d|6@Lw5I!JF-ly;8qy9B0uB0rdO^YM}7B4&G=y=3Tqt=RVZTz?$Quv&=X!xW*pT|f^(I%(G zf?J#9zvzd!8Wb((CSygLIT*2329E|GQwM(Y#!c1X3rj;vTC#{UyBcN;LWV-j_xjjW zjLc4tqO7+WctPS^8>O$Ll^!HlXxA7WeJ`3|>+?B8_vvKP=lM@3)A938Z=a&~?MlY!iuc2x^Lygf$L$@T zyT{|_LtXu0Nbl*>Ts-6&ZFFbxshQB0Sdi};f|g-BYxuRz^XUw?^?~iS!`u65Eh1y( znMz>b>z4VtP+fWJ2lpqxgGOB&$%74Kom5b&hUt)r|Eo&w(RB&)Mzs@y4V}< zOQOqITxrjhyNmvdNA4?bVivImL$3GI#l)H`;SzlUVs0ydwWT_^dDR-Tu$62YUm``It+4hd)W4NBO0|FLTih{kmx_%Imp)U+ZyaWrGuy}kQf(bp&JX( zk_{|jh{rZuqEHhzbVpD-FySk0r}JmBj~fY@lP2aaFRi~4ErK{Q0)6MMfEjHg%9NVoOaI4aIuf5{)56KB6@s}z`cJG|v)xc!+XVV`X; zh%L6>{g|8qqmrMr3wg^~Z^RZ)_^*vUs{s3zvz}#ba-uK z-yg)KEk*9TC3!R1@$eLrm2egDWN?(WXSg!iv2AHe6HutbOf?5CU(LFT0$_n%XE%W> z(-Qk$&Km8qijyzw zdr%!es+4e*w&R&I+5gwDA{PC*5`UmPCTlsge2;cBS0rugzQl2u=cYbh#GVsw5Deef zl1CYk=)zQ5zBZf?R4*B?ae6ey{Te0S^bD#ud&b3br1tvEY}d-fJOM=VYp>^{tT+Gmrl-;h5_*e$w;Si zn_H$HlniHJ$005kR_WYMncsKZC@q9C-kv!f=cnufx^dax(+yVI5D{=4-2qds8;zPp zSAd<@>cji?s|F{|lH)r)EdCN(e}U49*S z^!udOiai7Au+jHaZs@mbSdQvb!Pj8AKXePRI10U7+cWpRseITzox7fc&BzjM4Y05U zPxTd-^?jtu?H(EBVDzSGyPXR+b<`Vv*uLueb90qG$}3>Oai7AIONcd;*iZv2os$KV ziyH@%TL~v)UOM_YyUeZ0Rs)9qLo96+@o*?rHWURb8zPAzMiQeV&!6m z_+{}J5<_8Caow=Mt+qR75;mvh&4#q(P|cqW%3Gd`ql-0LF=_D-U+DEtCFKyck4Ufyq6s0&WK|xnN3IY0P%`SV{{GX(KZ3-BN*2 zU1cuB0nNpbuGD(M10I}vBOyb?3#p%CQB8MZ6|$t1*(Z4G-9Di0a{~qMM!YJ`&xsIY_00%-~!DUsSB4Ok%RN`a#Z z8?>(YLRloXeqWF9l}0x zL&Yukw0+nU-WrKrJidRG8kQ^}&r=~lb{NDuJNA7dbO0Fh4|HQ2FJQdu2(dkb@UcDB z2(gqv#hAqcmE1IvlqXecZnC_2q&0%{DbIPa)@hC;n(BVqa;xh=sq!!qnpThBH=0JRJ>3vutD~;W z+~mk$n^>PTw%)=Uhug1_Ldjwr)}A3fJQZS23Z|Tc{hcfc4MOJ_7v;T7=}S|r-EaC7 zH09BJdBe}J^*bQ+Ka~L3bAO+Tu+p1BNkFv=0~*#S|E;du)pv{?kUSwz--a8{@40|= z(Y`0eM{Mu#_l9NB#Ht0km%S34PeN>cp-?{z?H^}WDsE$~oDfamxb<|FcL*9z+hwG> zRWb#&l68}8s?NEj#9@cTd6c7(P*$XK=4jIIXh4)pcEfwM(!V>wxAqe9`fl-`l9c^X zVu^*tXPpSAb^z+*`Tw+2pfPxhCV9+9vR+!rfTc;C9gRe|9AUDUSvV51Py=!%?BK~u zjsx6qs=LW4Kmlb@!^EoDF}SLBdf!JT-m@lCrUL8K5*&3WS6iQr#pJ#BlAPE4+$D>y3Yr=Kc8K#8pHg%Lg;lPI7!uIzq z`FVz-J)SK+mCzcp0j>WoiD$KH=fB(3R$PEo+qhy9xXNPWD!qt%iWpxNc49DdviG)c_co--mn-J3w@Mdplj) zi7#~hb2krDCn_iC%upitZlE&LiVM>=N2WZZuHAOI(t}qD{BE>J>{0H$;_X+*+O>6}T;k5ZYt`ULV#$Wwx^;&UW{XS+pXmDD2P~dTCd?B>(Os0&k?WT(@h9mXf%-DJ&@m zBTUi}`Y_F5!55&z6zCh_RmD30r>~+=N4(C;*LXGKH;0`uSZJrS=ldD1M__#nWe0*v z@FuO2L^1ngk=HML13ooZ{tugwIg<3IsJ~*rbQJb(g}dP(Af3z@>Q=_W zLh=6YV`KxKDnO~hAlR~(=m{b~Kh62_stmlUogf1BV{N7{$@|R6a;p#;od0m23v~Nq zZkNxd%e>Ak<@YK+e80qe%b|xqE=`vZ*w_~RF*LbLNrP3%?e7Zj<%GbGNY0HvZCJ$Z zRNN_h{OvvB`GbYQ_a(0BdM141aKmgP#(d~sUE5CHQ_#v(4r7pAI!&La6>WM*2GARCEh5vu|vG_Bv z21>H-e(K}&9@6yuMSS^|uWN{9tGp!w!C6Mq>rdc)^|1$CdLlb~50J8@hvNF@0_St# zlBjnWdCkbNyQZoVmP1(7sj^}f2s3^K*G}ekrkz^9ygw@Z#%%^Ah@luh@o!+0bi*lT zd)Uwx`vz3JT9w5Zhf88HNh;)E%0@(*EG-KE3UA1JodT>BGUA+t%-Pv9*>hMk+5cI~ zzSIOE^JXg{bH2sT3uf!ovvd#VU{vpJxFrynYzz}9+>pMulmvY&u!?s$1{eF9&z+ps zmM@u`L+sq04fOqqLQSTelQO-6XgU=V?A>sIoqTEhCq(LSe(+htDlyxH9|nW_oAWS? zC|ipNRA6m+)q>$WWqou2Lv4rj7Z8ELl`$8Wj;o+(Gj|*@pe|ZbAeE)>M*CS)+SE&D z0Va3+?+yj5WjladM$V4}+z?_#JSKcayip>>WHSSr4|9umDhLQiT%R1~rjY)^>&QOH z1`d(>>>V_{cJ#^e+t={ zvCS677`-<(J-~*(w|)vG`rz0;Jk*Tdo?Tcm(p-;;Poi&;iy2$_Rf7##asAbDgN?qT zz<9j652nkXHQJH}vsX|ZyT*zq%A<*)U`ajjlxos`T zB1yf1tL7u4oVdl(AGZkYnIOpAt(brT^KK_NJvUZ4WYDjgM=t8okMpH-6^1S58cw;E!`zCzyL!xNJ*EZ-0gSHJ?Gwg z?jQSkX6?Oa#k=-;^Y^aB%UDt6h?X^*JwFh`bZ9mcHJyDxBsI~4laSuvDK0P>8~1;I zj3$gKXyPz7jqe-Gd+5Dqm8G4a*?aqWK|(svmt(cvs!zAg)G<|X9Te2#=>83R zV^ftR&X2%@W&Dc8YsCMbG#+`!K>I(yHDW~T0>Fd_<6r{aW=hkl>k#m9sbKi( z#!&Q^CR0QI21w3cX8>d{hC@kZ@Q<-|fz%uJ#iF8FoEbaW|3!+tF=_Kp;R6^Bl}s+A zBlIpSij%nBdVDLIf!erhyqPOWAvLcmU2%IXCid6)`TKQ`jwP%2w~sV)`gc*Cyh|mm zFBQj+Z}LlXR*oYe0Y?KZpQG2t82^W@1j5FC2P=ts=ORb)pX{i0iJ)y9Z{On`ApTKg z9mR>6_p*%A{`)7%A40?g%56ixI8{X7bp{mp`&eu$yE@6}EE9gS=r8@NJOBTtQElS9 zbZ)hjZTrRIk&~HA@g$HH#>MH14koGpbNx$HqGn1jtDuub z+;5HA8TX~)CazbE;2-#&Ic1baoq>v#71zd_H=$3ZegqHnBWOx)7t)eEKhha|=-$CY za)sWXx;=aSxp?+-PL$FOWC)1?yEY>F_<$6fbfl+*#7a7`B}6LmwgfOI=>TH=c1a8q z*ZNUMLv={hA^;8TPj|LfSJs>wK7KDveB|enI2uCmsxicW)nfZ84l(gS->G~%Q}*I< z=4Ni0@wF#u{6WpkX7>Bjk1L`6N@Y!o05~zg+5Jzqa;r*sYOLIU4iA+bfE)MsXJ`lH zUjn{`{;BFp%^K9SM<}%)!Bukdkn|h&RwWCQH}Bw{urE0g)o%xZUDaxIl?Q#%9}g+Z z#9i7>awPnEzPvhc*aUVP)(Gs(E>?6m#SS<*mmlzaD9ZhhC;Wf-z9pl|iTGkMrM)`O zh!YOqpf>ngu3u)RK17xT#%UW z40s$lI&8?#^b39&z$=;l9$if;U*+n^Em&5>$@Gw(p7aYJFi2v?e-aB^(U_4c99Wu-*CFB6Y!0PZMnp;X)KNE4;l8Zv z$4YNkl79vi`vo zqxd{cbL;p>61kz?up_r}V?E`*25M#{ZeEE{%ZCTb*CewvZ)QC&kzhkicUTjX^GCAk zh@9L|+_!JaJte9LTa`Wq(l&#h2k1g_#PUtK62Oz59qZ{aU}5SxjFo5u6zoUTIUl`$ zeTH0Sn%80IWI9e@3sJ_E=d^V3LEL)ZK^c(xX`GX~cEsO85;4SH(Bn!IOF4dEn)^~U z_peA&YXmA#K^ z6b(eK6LIbsq;amCY>NX=#tJm=ct=ZbGeN2}MNP%O>s|Q!_P-OY#!kQ22-FA-ubh(C zHdg5YnraHb%mq+{Eq(oLzMry_m_-y)WxFk_*YynBU+rK)eZ#g9f}*ZuobC2%7|+Kmy~2H?&XWl#?6W!wy0K8U z4;v_CaqOfK0nVw2)!xP>=Ec33-$TT%u4!f_9t{n4vp?te;+DnOrIsjI?J~e0($fZX z_ugq0I`g|?sqP6yU@;1khX~>=Car2!y%ih_ZjaXFdi0Yd@FrPyyAu*d+NxSJ)=J3j-P9D3(!hmIBTdrwv z_Sx(drcekNzy7ATC+#j7+irxAq2aQF%puHD(mq$gALRp|81rlfm|1D{^{QA#{3Lp% zmc#6VoG^2HFrQ=vfleGu9o4g{>6B#1f>f#WUCxGO>yni$1%eu+C{+A#?;G_cIR zrkU?i-L{8tpOn0Y8c* zsmaZk;*uIQS=s!2g$I~AZ^GkZ6o(RH z$I>wO!dQA@OS63eClw2ZuAhmIHaYFTT~96JvawvCxOZUDE=-#wu``mVv$x$Su-6C< z5<28y4CvK6>&VlyCuC8CTqINIuSC5WAKum&K+0}o*%=YvF?Ds5^@$(*Nx_-nurS%8 z77wf?{w+d>Qd$J6Q;nqauA+=$u!q|S;`NW4LlhWhpPEc>8?|r=R~RO*OD0DoPG-qo zAUCr>I`gEaE9HULy1z63YSEsH*xU@B=HRb*M{FgTAU?@A&P?$$R$q7-pZ^0zz;}a^ zCo<|5%IZjQm^6hrC9?^1L>v|c9XsS29j>i{iKT<->k~pWNG*9K`9$&+1sCVTBW#=3 zOF9b~>nfS*GAHS&JsR5QUoT908Mx(PTT!aYxv9dDIdRg{3Q!cTeLtCdqAHdq@T1{HhR<(9C>7cr36kR(CO({Pnh-8pv7BMH&=uNqp2zMDv)imHdr;i&n1+X=M8TP zCjt;9$O-Eb4cA3ZY*ep494bewuS^zgiYsncM#N<1sW%NMaN;rsmvNTPz@> zU}five70Oey-Elp>ru^A=Mm*RubLgYAe|Xj5ahgi?_*OdI|U~xl8=Yndi}CHAiTk7 znw-iht*I=lIm1{pS(93$VD-(wAcIQC;pZy&?geSg@DTF(94fSvfszxfYVrwr6@sIS zsUv|!`Y!g|eigS`C<3?ayy{RCv%$)IgBz&cb44DX)mg})ej_H5rwlb|eyf+iPbh?A zQ$}1`n=z>%w@`GtDj?=MqG_^7)lJMMnM;8g7|*|j4Q6PtU{vet2`1QFnH*FE=`=Fv zX_)hrU{&YlH>4ftLJ%KGja3_1l7sVVM5iVDEN6_Q14Xtfvxt4ZqK;5G~0xkk2p48aNuAaucW?i$| z3*!*y=~F)CgQFQ%uwO^Z!A5lLEo6EvIse6-&u`oZ=GtLZPw4tr(J%J)bn$CmV@5XQ!WUkUA`_L4)TCIkHxSA0+|`*no$)=~>)KH) z^s|4~qSF>VzgI@B?Y+zL4|)gFDtXW*E7@X&e)F!@YMmf-tumPzGJd^xdJ$WYyK-!` zgucsnaLU@Je4ET$0c0+c-TufYA60@vmzL}yVE*O7=h-UpA$&Gf1Uh_>gKP?zl)#>u z^_K#kjbK#$$AqKKTv6cAbPr1Cl9YmYJsKPQ4?0EobGo!meLF|%i!z>(I1drYMp*gO zofMD!+oZM~&cd{406&to!c9r#eJO|5a&+j)4Lt|g%kLH8oc`b8haHr8Ez=U2sc>U9!gexm z3+}>PuP1l<@E-;*F&x&Vlp-{ues!uxL06#Gd+F*5b_PirPO>Hss${0vFt$_mV@Ct) znn5l5#X^V|$fNcq*}}C!`zPOdp6FIehexY7=)^{rE*w3>dG5i?x-E%?bYYAu$F7OZ z?ta2mrzv_Z#GPW3qSE}^3if1(o4^eI9W+U%C;^(RXyMK|l1p^XcP8ePboL<8X zIEa4C0Q*(DqwAP;+tFcSAOn>QkG`28d|Xk$6N%?f+&`J6MR@=I=hA*bE}^NV`_zaw zudIp1r=xvd9;LiOXJ*UkDTp ztu7OXyd-mkT+4>6pQT16%!h8uy$pq~JUIlcJ*8gP(6XA-5?P)pr`!|}N%Bn1;swR( zm^v3vB*uY831a&Neimr-m)SS6xpc~OXS7iwDx2W+Xn)j7g5uH(en{qmyh0F#2-Ttrra*c^Hl;eoXhT<7(?DmdaSAcPyHF=3^Z92v3>icqL620P5q^^K?wHn*CU ziinydM}(~BM9hsoR?HPM%_3q2n{^6Gd#>>H23qf&(dO32^Bm8;DJpKq<;i;3rP9%T z_h2x0qH)m4$ zkK(9sgczEal{l3dJ54_zYoUg6#BxGkJ`W$R{*0B0)ib3lvL#)vV$5PoskLY>lfHRs zx2+cj(hg(9Cu0OP4{A=!%-DNu`VpW_?6Iy!c$ZVnHsGDb&XU@AM4OBuRWJ@;;x@L` z2k|Bmnd3#X^VcN!AFofoQ8ykDXTeZekKhe1p2aRmgCC`NI8q3yv6>oYPfULW_LwAZuV>pR`NIxmH%lk=^+zI5meGxx4v$!DmZsK!I{+1b6?aH<6P+BiD2 zW#@f1j}&wXM^QWF!)oeY64@?A_HeIwM|0nwiV@zjtSn9inF|@v2N${WZKz-%Pf|6b zYS&8_XZB82qYc^@J5HOwAp0Ho$)RX+$TGK;U~w#tX~mAoa#Id-pZQ#SqcW-|@y*S~ ziDrXvQrP8LI5Pbk;H$OG1x<)4n1Z#7 z2k4!HYK|gk@n8Sg6@>l{c6y%^E$W5Lz`tXNui2xTHBx&v2}TOMiK_P3z;<`767|bT zyd(1F&UnkEiGT%$0|LDxmI^d(>IU1=@t}R`D<-^}(cuwkt8D0Gr z)Y8{u;yP0Tb#NeQ5LVcOH3Y_~ZB*V)9kSXl(-+WUXU2@9vv#@i>L0(32gE#pbp}kJ zLk@eEHlRq>bqI95eAd||u00s4%~sn}nJYkuW6_-nc0XMOU#!8{2(kyXvL;(-ZwgcZ z;`1$?Gc-I*9gc4-*#NrY0+&GUuM~^laoNW#fVMqI)==DRb78@MU*;pVN?`|xj3Oca zAkO5QcrU?oU;s9qJYQiEX`LA%4(DLvnc?Kk+*JRI#4PQFYl)=q`pf^QNm_= z%)556%w3WJz-jW4P~rt3*B4)6g>+T?TVK&&G#hkCS|Pu zy0r}}@|2!tm0Hc|XvzE)`6+|u6!?EBZ~Mwj?>}|h9S#_q3Tl{3h`Pr50Wp0N( zNOXH?@J8SXqEkB}50y%FL>B@ks2n&52*{*R>sgw?xQPNCLQHEHRerZCK%-7N=9<)@ z?HSgX*@QACn+2JvB;^Wy`ry13_3)dD(`0bkh_>{!D`R*#crj!NA<~fnLId8kF4~rs z=1l(BTgwACXfygEE!2{fT{7q&L$b?P0vcL{E5~NFb#OZ<`=0hM zY1xX`j}d}+u0%!hX({YXDh>kMstlJEd}Ajt90s)1=nf!6-`<}CSpGi?;Nb-rQ~E>% z?Kx^a+iD}*al69GZjeS4FWQhh1^E*A&%*yKXK1y#*Zzz@>!0xz)JgijVmp0C$~zAq zRBR}3auMemoKklN#$xYovV%(GxMwxhbio7Gbx(E`!&iF)n0DcpcIlWN2sEYkXhXgR z=-f$>$WO~ez)KfvCq{H`Jyq0`(2B%Aw$Th)aspLyJ%|BKUu=Dl%;FR;(*4+H) z%u`{*8z_@NTlw~>@EYc#y6AA}4fOIzSOJl&@4FeQJ#j(m<>5+6g|pJ_xtV!yF8;>) z`^PctC?BHu?~^T^N_z)Zq1uQuZ2+End+-!g#XQ)ju5}BHbZ@y#agT#t0@mk)A3T9^ z60xd4k(Z0kv>H2c5ejXmC<`Osna2TCLMR_ib@IyilDaMwnvAOO;v%fMz_qm>)YQv4h$=GN0i$hz}ai+cc0iFZHAVJ}30k1IS1~^zz*D)!h zWmLYfyDR@^nz#b_A7$dMs}?X{F}c7ZS=W-TgGr1>4t+j`1|EpDY$(ppIJyt8nMB1s z!HG9TMg5kNfnpg|MFg!o;LuV=fPjFtI^@nHE*aGxj$5eB?jxP_9d;v}t%9E$QzCCh zR9+^zqwDAa}pX6Srt<}y1?shy>5T;)?>x#?3q zT$-m)9i6*mPL$B)102DBq%(jQ<*mT62m@cj%XJUv7GXaxv_Gpx#IAqP_Ak3#*J~`4 z;R65J2WIbDL+xO1xl;+jI{cyW&Y`{d0GGmU+nz8E%IDm)C@;NxVP1Xj>UuoTfrOY; zW4;XGTb0(ed~3tFneqS}6YJ#Zk21z*a*fhw!=RRKpydF;^{;1p#M} z{SjzlZ(tdT>O@%MDjmP+6Vivq9eYTV=A6dfh|-QV3bx(mTY)oHLbN}nAZckbC7Y`R zpbjUXj>s4gkKe+92sV(yFVtFfuyX*GKNrVuVy>!s6)=K99|QK)uORpGSn#eG5)fRb z45d{o|5}G7)2x&Qt2!8D%Glq|{N0A20xcfpW>20WZD&fuG(IwB>?baPS*d@8FM!Jh zo0wOO>$Zve!AufN^BjqUVBpnti3H-zP+ov z+DPJSjurB=V?n2nCGm1^j-D*Uh63!-dvt1EN+zlpUSZ6D4Z~>yoSs&|llDwnga;`7 zgALMHKg%|fW{*8bOP*WAmx#Qb zZIY!NN9+#3wn`DT0D|rpUw;0bjCj3`P?BzbekT33aSR;MS!^v^*eJ9*B0V zzt~ZD7(^D3n*gw3py&Wt+x1BncIV?X66G72lNKys1zX6qvE|({!8HX}U;u8Uiayj9SFFr2b!SjILmbzteDttxr>XP3h8k07#!a%+n*9E-E_aT$ zd4rCYz_J7oHUnES4<(flB*02G=O%^26AudZ0qsOF;K!n=z%t;D0ciXz|IQE`?f! zM`3)>elV@rMf)KMt3zt(2JkR($urQ}^Ov%n)}j1SZSKnOlExR7P-{jRk+!VyDXF*F z$r39eYFAp6&E{q)?qv=XIFjs8pz$Bcx{dXvYNXK$ecyrUoQ-m1UoXc||~t&}DQ| zwl|z#0$$~|{g<@Gy}D;YsJuzE^dhpVa9dUKye|y-Tlz;qnf}J~MaB^mVz~YaODcVJ zZ&3$}`rRQUO+SXss%Qk}iP0HB-rRQK6fn?xf zZ&6;xAg}mJ@4;A~(u%(Ah&D5XUW1rxeuhN<{M)7mu5^vI$g{)?9O3kI2 zaSMR&XX!*6m=ffx&nor`ycaE;YoHqVgRj(zoS8oWda;1+ZNIq|OIvFnnY{OyWuopL z>}DKYe|HpN&7m$T!?Z}T$xs}iA;C9?{(bVCA|b6R0{7_LAJ)*94HTzS*Wj&`UwESl zfc(SPi~6)qVw!6kD@19THN-TRm4Ubq+x8JS1DSB)!Vgk5r38=TG_FGGo#|36BA7Cu z^xb8(RbxttIrsuB#CR9>VeAxDt!$I~oXDI1UvoPAseFHde4A{%y?Re}2t`pV$cFa?q_esp0t7}Lhwf0oIV z6NUQUf*jA^0Zx}vY`;M44O2{^6d zS5lp?PFiT51qzj)BEq>?U-}9UJY)>ilhgvM&FGE&@i(xhH zDrDJW&PP+GW93T^Yq!Lj`4E{GFx{ayqkq`>*Aq zpvgAv!E8P{o@97f(q4fc8gBd^k-vaU(9U1QL0z_%-`ls#^s$rnTRG&t#mjMNVu5NI z_{CqIJ4b%7lU2v2q{qD=Ek<_xswm_9(l=FzEQ1z#K=)kPEAPa4UD!2``}AKPnUKvA z?Y^a5Up2Q(`osn9*PnLw$IPM2Z#{&rY?RtK_uBI=_B+TWzKCYf?gUlsGr!6xbkI(r zMq_{2(%oV775E_~W9=1<)-}|Q$0BfEBoD@E0b)!=%PwLx9I+k+U1_wk(Mp!aorXX2lLjI z79Yiy@D6BF7aQ^C4|jM-XUJ@;;-~oH(uKZbE#G1!7^KBZy-b7ah*uZwteVlkBRAqL znug;2)Gd$ZgF*by%-oY7-hyLr zeIQ{rlbsMp{{rEaky%fmL$y?JfyQsg=pmjV6C?11xp=rrxv0xtO?G{BSLM2W6XY%! z9>q($5fj^#Cj7cg5z=mtza9hR64xmJF^XbZtGf^aKxPM?0WRo$3BHm~C#-z41ltq~ z6!|eS(B?P=*N2yI3v0{peZnKxyi3*lYc&ckY3W^4ZGqoXY0YAc@J4%0d>&PQJaw)*F-9EMZV3sf|~}|Or#1aB(ulJxo;qW zqd#Kwit^yNd0ER;X4)91#uUp;xU zj5!Mj>t#s70-xN?7FV??$m(5+_{KGuMz0ofjDeHtoIecYd-`78wvt64SLRM#{wUS1 zBs_4|wVvc)`f1JP1epX8jnS^8cQMb9S6EM;#^b(idPXrn<%_QP?SN+4FM})qRgy&p zDW8uDg;${*TgPyeJbv<;#wLf#hOImA{v8oG#8%C>wlYK?MieUSpGp#%Rw}Xb!sc*~ zPH?N9<8082x6Rk*I)bn5Jw>HKAmR$d^XtrS)^ljmgxUiR+BOI>fH8fW5IZIi)3 z^M%MxVwZtqbp01oCf2V2E0!O~M#fZRPf*)w*Q7YH-y6`&_Y@mae|~SE zAUFtQqb9i%yZD}<>r4BE|5lH$Eg(ic0c%3WZhfS8{T6%;GVID1Y?+ai;{{2pMU#gs z#TG`)y&;q2<~#N0$(wc&TYzNk)~rwd*ikq*mFTXS2K82<(3kVTX=fJ|M6-1xidbntsb0~kW01CTK z`SbDdypKUf=c(`h$>+s`bB7_34=x>4_`zYDE@k(uU8-^CDPRHRPuBW`woH#)!9B_c z-6pN!$0xc0c^f|j#>4N=@NX>=B&nWr)nBiIfpZ)DT1>z29F~^s2fG#+iwoX?^)_6m zn^)PJZWyGzHue8RQeAa<>p5;G8OlX_`07=Sx}d*Ezd>vv4J_whP<=j0+1+xNFyNEK z5ZY-BNqTKTx-vjeaR1AzPv-1zc`7xHN*1+m#f`8Ejqh^J+{Zt_kvrF(Ra7Q;H-Fpf zwS5mXu}j~4e>6d+j05p{O>LQ=T1r^Un@Ct=!4p>5VgP_|&*$Wxo+jSoge~vDa>IR# zU>+Z1uGCewXNGNEtJP>&)+4wM#6Gd%*tNej-)Jt=iCFeEVX|R+1%)NOF7^UW4&RMw zzAP^Q&b1m#dpfEUb`m$3J|%b@OZba1^*hi*HpS3)GpyI_jDi0@hKlise(aT;KG$I7<>S(ec(4jx`4jhbLxI{#-~m1 zWX~$y#Vt0^ju%U0?8#jl&)DQVJ=NuycucV!y)t%FNKH71OB(R8XIz)_KkS%^eKQFv(FtC(?6>fDcyfD; zyt(?fq*R5mo60@hOuy9%=6**XjRw2wR@e7jLO&(PL$Tm5g{gV1LGe3*+_W%-e{wQsd>3jTIha7yUo$FL~XiyODOddxE_KqhtkW~DFq(tmpYA}f$c zqD64(cJ~ToQ(0=L?=+@>E_|-8cg~qs*@K9C=oh0x9-KmnGTG<4DksA+a-FKFR9+-! zta6EJR`w%YyV9qh#zmgqx>Y70(US~`Ni7=bau1qmY66)zOxM4Wo;W5P5&*Uj=mbD|Tlov$99S12d6G!-A1lCghI zB+>+2LQB2J4dawI#a7u)>ul@YBv{1GZaGj$)Ctf281c|?bRu_isieJsd+f^_IuZ{j2HS!F|8|UCgbVoe|*}}pJD4! zpQB}fiwgQV`Znfs^t6{M%Y}>Po4E96+|<0rb`sVBr3~gg*1RO1;}_$qPeHddY;U1f zZYWbwzOVdoq|8jS|+nvhnq_Z0r@k_Zf0CbWx#>-%Xvn zD%bSkqT1X_?0%bpMVeSg`Hs&J7m>OqB_u%B(& z%ys>Iyfn0m7DdT3WO;=133*Xjg`;WdZcrVP3a1i{PH6dB8LM zbs;YzV;$==8-r&263YGpqqNVa#q7RE$BHAbr{T^Tu>r~lJfk0@kKPWYJU`UqG^KsM zQxC|dB>lz5tCbld;7}_Fd#n`u_6^#2Xm%WPnwIdtKKHov9@6+7dQNJ|E>Vjx@u}s9 z(1Mof=+DvRuVgNsZOOzPSImE|zF;<)e&p2s(^Qae*zr6^6>R(Fd;T zRQ;g5$G5#IUo;b?suCh6KVKe4wezOtu{&|4JY!70)xpU#s9C-J5FGyQIW|o!qplD~ zG|NTwvk+IF_fqRrR#ioKrKI1ftnBe=R87OOE*sASaXa(Vtl2P!qP)e?i$K($9cp4) zZV6Fi&YR?^HIPbf#viR+3xsvsa5a!Ht&3c^DTFWm9NIp=9gsFCek81C=Id|V?B?NW z8weeK&u|rJit-=BR26y;w17`Dby0T9EPh!~s~ySyvY~xHTrL+_c&RhA72z^#8_HW7y|HcvC4kUhTd=ixXREV}YL@&8^ITqKHQId*?c6%K>XVjK{l>Ab}(fBu*X& zy7*I|)wMZOUdO9NfS)?N%`jVi12M-gg1-)VDPW1OwKFsZf4maZe=FWvZyYZ=$rc!h z!{x3d-y%30Q2B~p?~!k*5HG{-%kNSY#wv@nYfbS3G_OI%_uxNDNU8F z-`Lhe>7H4GWN$Zlx4WTP^y7wrN}rsJbfD?~p2;}Se=&y4k)tNRw&_D;4{-! zeJW>mzc}F^FjmjLM#<<_+j)|WK>q9R5IH80N%x42^ks^fCu+Is?sv7frre#4-<4+R z{*`7Ibz@g+&UDza=ca*dS$*wp)^M zUH&{|fpghQ27bpUxo6a!WzGk4zoSR;5(!*@jOH!sIj@FOb+2Ha-wrCircH4w$SP5&8GIyJq*GQ#w0uAtf=*0grj``eZ(i9~GM!`_vEtfUCM;MQfhOsoJ)wJ}EuShJrbUh{&R zRA`P*ey)foc2NE#_RPhBz`+LNIWi2fn!|bAL+CAsJc;&cb4pE&Q-cOVG2ZM$6FB=E zky*AAL2O`1P#vsN{ETEd%7&Lg6s8L{n~&suy;>e-I0ud*ATH&F*guP_3wr(%6xq6+ z32IATug5&2XG*MxGy)`W#be_BAx7n~m&U@DU*4I^X{pQOaoqt8 z>BP@jPabgWKtHVr1Mq7Nk3zFdJy)geG07wZ_KGx3?~Rx?qRD~{QK9U@VB4l%FDTD4 zf)60DF_d#_O~^#c`%+_W8c#SiAU=G8TRJPshRJ-{6x$3x#DTvp4^f$Xdj4xyinC@% zJp7K{BXFl^B?n<_@;tRe<0>Fu40hz)LuY1}^0gX2RH7tbjWtF53CW$aA}sW6^)G zbtvcsJGivV9nPw5WB&ut8;||kYbE>8tWw?Lzze*6;qSaMQ5D&+wR&;bSmv;wue9U* z#kaCU)MeTpAcl%G47miS@BV}boE_H~{EsgO~4q{>KD8F5jrx_z% zC?n@iB(=qZhcdVm#PcQ;6`Ro1$MpW~mr79Djeh;NopB<)cb~MBKDoGTYi^2bh#C*4 zJu|L(Ug>Am$vkn=mz}dSZY3&^9}>JfBKGxj+%xH*k;n~UH72&~;C6tU*r5F(mH@8v(WvX^DNZ@o zDz=@-p`;>;esr2gVS!+&lZlFGC~JqQYvXk3NkKfFc&(TLzM$NX+m1~LN&IH3Omz}l~M1sD6rpvju))Qfpj zTDPZsbetLp__?f_Y@ab13;F-o?k za*OH#QO`_8!Z}_n6WoUom}A@k$T9R#gOoMT|S^t2Dzv+%v(gfysQf zOdUz@rX#k7=>owfk`H!kAocRatGM8^+L?k+{kgrqsJ^~(95qISPpRq|rs{&FfjDb# zw?X4M0GBr*EXUliVp>~oPL7iRP}cMs`%7OUBi_INW#u{ANwzriZn#w9C9JCGp-m#r zAENQ5S8+KY(PnfK*bJ+srQcUH;~W#G_%pubm!?z)LrXaE36UDd!JA&=4`B{gQdtAY zBb90WiOnOH8evf4x4?i|QrdGARG@~8jQIpRlB@J}rG74V0TJQX6s$r{%%2F=ZaGP1 zO)#<_nHefPad5>sRfkd~V+x^9vK+ahm1#oxkwHv=a=Tg=#$T z=~KLKqtE1NAiWK-_>Iq-I+T#4Pxp@s@clgwsdGMq3J~Nrh!}|N3krS@gKS+KF8_;% zvzu>G!plVcq}V(G`cliCYDB-#q}ZjYz8gljlal@yyS_^J>&6O}*y+4L0N|{$?8F%7 zU`6@I0-u0LL3A*_os_{Z%yOcuq9D+V`R zQWVC?2eM?u0-j@yZ!b8e!Yw{cf32%almJ*wMOi-Yi*&@h80lmn5Hn*cq;sW3My39- zC)l`-z;vx_8-QC7OOxP4pEC3sT*Tdi_RC}{QQ0wTdB1Cr9ztlGq&2IJ-Gpix{@S-2 zGx~2~Ya5PCPPs~F{PZnTM=V5L9Yi%z^N$OpsC-W-$W?GXisx`VXLZ5cN3?}NQ&Wdo zzc86wpNHHR?4{edHiTDo-tth+7^=FRqrPww6XJ!j+18XARGJ0U0FylDz1HFJWWw&MWY-~Bb?i{{4IaOlEcxS zV8+57u26{yOH$fA#asw9m}8BrOeJl(QWY_2VYk{vL!Q$sG{Nf~T$u~=$WQ{XTT4Oq zNj*l|v^|CZJW3hJ-hf5qYVtIi7>UoMHd)}$3Cte+IIP7W<3Y3;G?^Q-O{!g4gBFha$7RbssJZ8LklEB={g+mTBgw z!G2QQos5PsbW)IK5h`=dJ~o6<>-a9T+p9)ZY;D#@jZ6I^jp=h_J+oyE^Q-)xI;oeo z$ywOtS10lVnS{6;e9Z4Pj{9h}0wZfP7U*&38w45^kl5~izK=PxYZ6=6IyYw<8T|0M z!aSE%;+*^!x@~f-osg7`*sL%&qxvht`HDBXM~QAt%E8)NXWCd{-4Gy$E}=#-?PWLuFv(f>UEk7-{ML%99pXwK=`!8b>E?jz{>1 zLKNz_+Eoa`8a^xH)r~J`zwYA;_pq{->dCX^^Q^!|-b(h{9;dC)NGh*4O{XQnwAIMj zCLk)H`=xHx9vBUHSCziQbdnnVWbtGi=8Gb=uta*A17K72cFYh~tMU}Al%D3+QZE6~ z=Zxn&qt_Z@c3MOHpKwLz(~w;IK#`hM?Zzy^qF`7OeQ8IGoMD>p2SgA zBpEaDvn@aKSCIFxE@SjChbAHJS((DsN1~+dWRZq4&ZA$6pCM_vh)l>@Z(xPAFbs9%4d|#20wvlmQh+xps z*s6CBa3FeC(gT8Ps9~&oC`WW=fYW|T{bT)=|LtH3Pul@oMp(6mqy7>obKe#zoqt;} zE!7v2>xg9>6pl>Cqe6_0U5Eu=c@s_C@Q%Gfs9(94mzJ^k_AS4NcDk%8FT<;vE#i&W zKFqU6JZf#vEAi$J$u&(i%3r232u5b3$UTQ$*TtUMbK16e%)IP&qXxFr1T&&Ufg#jI zu~f)z+0Z(ffio#+PQ{>H;VB+`lT@0()nzbn2~&QQW_3u5 z6E#X1wldfzqD!~=EpqZJoYe}$${W9t)&WnGmG!t`H>d$thh{Qz6R5H@*6>WbZ$h=r6v z^8rTLtQIN?WgV1wwdlK@{Hx-_OItqsHY`NUR;)a|cq7`eiqfcZV6`0KD8@S;y`D%L z^CTPGeo}<|V{>IaiIdQt2;FD#wikB_htqLi5`I|^<><3;Fv=*Toem$knzhm%nhwpM z&IX&2k49rDd$iG-DB?G+w8^J<*&$>5;Qts?9P=fR@it)Lnc#|n8;74I7nSHK>Z!%2 zdnw4~3B%0l8CrM+>GN54H^k$Ug9i?bZ<4W(_!bu9baK6HJ`DmW>Z~4@DfHIwxi~Fu zhi;ki1^H(*=qIYOUpDOO0zyQ1V|QGZ^K{HVcAHO?o;y>87a?V7%55L-xu1@azh-1e z8P<)19e&K(CK9x$laK$KT&Kmomc(sL6@LAem|OgUw4*s!;oL_|4nN`3KfJ?|ZQc#6 zU&v>b#d#E+O9!m~>pa%3NEAGLhv%zC$GmHA=$S!xiLRdlX^s(jBS%yNU}zIu;t8as z7ji#*E633Lcxvk{LUipNL>t{SOb?{f9C`iaMR*`noZAB-%ZRGq#nV)$!u*Vuro*}} z;%0fI4i=>nqb3R{{}%vpK#sre#Ji#MxwxF9ec^4QeK|n}G|#eePMe8U4b6a3b zcM|hvoV9;dZ^f?H~5X+lLS9_3d$ge!0JYzJB;{eEhb&<@aB4fgwwj?aRmK z=jGG>c3t1EZ~OM;_V&bwtKZ(2&o|^S_#!&a_5N)xFj;YV;DpEe`26wh;3KH#~T#1J)WOFe!3s` zPwxpAgcNbPJ?{9)`^PtI-fp1XKfQhUbbr2mJPusQ^ATU1`<&?|R{vu2>BD2)KP|`G zZGA3p`~BnN?Qy+BJD;GH`}>#u_9YW0HYmhq`*J-1{eq#se#9t!`T)&5-`|eUQ1$iw zczk+Kr8z11^Ot?cm*<{upFZ9{L&3N0?c=BS+uQB-{^85@{(S%N;gP5&qMfAKKRlQ1 zLm1xU3fP)h>@EdT%j z2mk;8004*8zZd`i|NsC0|Nj;M6aY1VOse6_5_nJBiXnl&XM8 zQF@VHLI*{fAiY1_o@Yp&XTOe{t(bD?wcue~d-<6A90P;O(XC7-<478M zqk7fS3T!$i=xKTyYPvgj_dU!wL$S`c$|-U&a!yK(C$_`lN@K&ew`^g)KKDDdhO6%m zc~VFAPXdrsvL`zO8l+%!5VSR}I41k&9TXKn7&rLGjQaBjf{5w=zA=M{{=PXS|MxEn zM)CKJ2n754h79rdZ_}U2gZKY!1p4oq{MSyP|DK)yx&r9Gt^oS4EBLP~`2T?lxCEI` z*_xTje>M}D2nA>ar9!|aF~7DCbqoyh+R(BbMI-#FJ@M(FE1}^DkwY) zp{-AA4mHusZ&aB`olN_9t02m7LvnLsP8vaIl)TtL?%_~1HGZ4q2H4*2$ext*H$Cv!h&4&oI$zsdyn^mk>WW; z$dlD_vfBxtR-P}?f_9leyUapIFI{h@5|1jZ6cx z5?j5nJJw^8g~J6XRgzlduRK2lKSRWYm->Ug2g{gn=*cZ^!L5LY{@6Wn+uy<}j-Jsq z9+k`aXrY*qRd=I@wLOd4Ha5BHA=A1u4Kn8o>T(KlwMM$H8+$A(M)+aC=KI_S3*g=yg$-i`Dv|?zC)#l4T6+~!5*}qsV*)st(kZE^VrPBNVssr zhh3U{T|@1+>$fg&#-~a_P}F%~vOk`xW41N)3U{lda#uJ;QV5?*bb+yl{%pr^dfRy$a`kK)SBFZ=%6ANTBYGZjh5S!Px( zgvd3_HrUrm%;W0ta2-R#7UJ%?)P}S9?l#t^8-mta z{iU}`ZtD@>4hWERrA?p%gD)dYj7-!_=*C#)dc7}}b>Fq*Q`GP$yEm4>U#NW|vu|R4 zaqMDb5S-|p={pQswqYAQ5LX}X1HNlrKa7mSVTa>14qvi=@crJ7%^6@ zjcHl$1>GFbjJGr+=fyAMtr_fPCzB3HmvDl~+Spva2s)N{2@argnID@-e9s!YXXgbE zo$yv=#^z@#rdE5$flWW6fX#PYpv|qej1}O&w(fnliyUmM=V>t8#NNdXKaa>-E0f^i z8=tysH?zR%fT<4x|5o)@zQ5eGD9pYZ*uj;J$8dKaC`#+I+5H(jZh!Z+(`33~!?B`F zgS+drAnQF%J&%IAx73z2q2==>4wAlmMpbWQ;a<{=k{)Y<)wuS|(o($Q^ta%ZDPMW3 zo&c^QPlf*dRhREEZQ37SZV4~-epHY-_@H6co%E4lk^<%+tInYJ#~rqHY{M8BB~BGr zW*I#D{M(R%htoy2srREkAt0orq`aBD0ajfS7?Sd{XU|}7t^X>Iu2yZCXw&}d__#B$)4$E$uz@d*m*iZH7!?}Igs zC3LSw?2lV;+46&YDa3~f2=}#GMQ4aOk#fZ;Un4P9}EX$sZP-@*UuPSpiO>r z?Fz9OI4j-@Z$p{zz-Q-IX7S~=i87La17g7rUeuy{7Gq~NQujP;+Tk4}us;2tS6gVQ z)@I8i>p{S(k({_<((uRyuo^R>6@Rg653~f?=|%~Tf01SJ)Ya)pXh-d#1y`{ zNbqwqgqM(%6!xK!5ir}k1-LAGI4!Gvnqt6?1HlJyxv$&DW{B$lP^#=xow2|@5Tx`l zM4cQ?*ZZfZ*4~#vsDK6g^fOw%$&uK4W0aAWH)}wsnc$DL!odqiaRI!aV1eHS-_Ln4 za(gD;-%zRv3=|y6 zp7MxTLWs*C1Ka$<;UwyOSS9K0nN|~MLVqY5d*LGzIMacfg?=W!~*}b9aKxBM!pS3|L4HAe(Zr)^Y}!kcKM;a z7zF^d*zJEC)2hCR4#j7t9kmGI(VwDd;XdA7ZCO_-o|bNmfe;W;=c5zOG?Q0TBe_5f zLG z5irhheEVz)W)Im>isnj^+Lv_q^c(FBs#V!(fzf=Z`pJLVEirgZ4U;?^GrHpsSXWsdTo)7nJbz6L$&+z zm2{NK$`1F2mgwsr7d#xv*^9sgHC`7H&(OoSQsZe)-OGo|fo&O5)ergWZV2IJ;cY%} z{2&754K<3ch9hmb5+2OlFIv}d>;tF+ct&mj2$%uLLy0bQy(_?CjI*64UC}AW3X4nh z<@YP;s1x4QC#(}9TzdFsM<9f*^_py3GbYY@JogP(Z&2o8@vRYf`UZdB@`jHlAbj&R zIxAGo$&HNLa|EJJu)ey$n*;xC4+qQgP=T7Tyt_UX2mI)z5SBtZfeq!xM@#Cs5Yg zk3x<_sqtQhbPHE}(Wsf!6Q@&@BoK2j@IBMvOwg!$@{znox%(2>IW~8(GYJ9|FK~Vi z_jJWcUhrN)JY`}E-nbQ$-h9RPH{R*lt(Xj}l(B+u-@dJ}1MGYLCU7_#z}u|iPn;S@ z@^txm>eoL93a^f(%4Q$l@XeBTW^2#txVuFh7&NY*Jc-Ku9Cea~`igb?DVYne_g8y+PrJ+Ro&gy|@g_OM90oSW*~iCcZXfIZeMsMCXr2F> zRrgvI+DaBmvgK2dmo0(s_xSGH+3Y@^dhnaH!qG>~(sJbL4jp864V<7mr4vNsp7tYY zB;!O}3&c&;Ni~+HSJJS@hHxL9Y`Nq5n%dg)d*qM^A)2O(!Xch__Ohs001NT~CVE+z zlwRRElX>fw($Y3LgrEWsS#wcr`qUpC%({;6OueS8Af+d13fn3WM9Cr{h=Bl?)7NZK zOeUj6`KpEeX^PZmsEDr1R;k1rxs(93H9y3tJ9i_S92V`5BdnYB(J>54I13uStx_rY zH}><3oEkAz{=w%2 z4e0mx2pcvoRnt5KRbP1Aw@3#y?Eu)?#1%7keRFK8XZgE%TSdd83J~M2xMei$%-I@3 z{P~_OtW5q znP#CJh#xU@QrUd3xuf#!AgXgo7T=v6kTw#Ta$i+7d}U?jiU%t=S!cjbDBlDLs=t4I z1iQcSzF6S^%?%^?{vHYJX`ULI^gf0Tl0PDh_8Qk!_>Ztk+GN?2kLEmu#9Bvzs3jMq z=kK?K1pp~(Zf&hp<_t9iX@fZ5bd9iODs7d|>{rPl`6mRJ{!#>dv4|M`q6GL zS}Fqo06GWOErWR*X7)xTT=IX7;ez5NH zAp{6Q2EgCpNx<&z`Uo4ks25nmuj!OZNc`cP9|RHxFuFg3ApetEkOnGv*PHks|CVq# z!n6jB6HyTTxb0Dm^ldBLtPI#WB!;4l35nOE4to}_l|l0HgC9J`E*&i(O}JwSv2tFa z$jQ&w_Vn}wJ{|-;&_6RL^C>>&Q~j~;VIT>M9o>e>9{jj;U)>(6{px^ZjtI(=4gKJ0%)Q64<#R{``pw|xjsAg~^HFHxI^7YV_mCt&Z&?*9I^ zk`LL=&QANr{%T@=QGecqez5~$D~^q%Zj+9j@&f4XL%9F(FzKs#(8R8f`-%HVPQL4V z07fX*ulXa z6lhJ?MEwORBrmB6gP7ZeB;*2)zXuhvx>g8ngWN8be1Qq<;zV#N3C2W1@uXovw+VB#B!$CZEcUC=R~MY}C@olg(E0}NDw6pAA6A6iTm7$_Xh zEM0kA;{aQis}D^ZIr2n^p{EJOm(n_=Jj9WfF#25a{=-C*=T^CM$ zZ}d*ND~so~^)1!LA9NyPtV|RQ;4D#8e=>GwK&jCZ2o`X{aL4e$in8w|C*$h%2JzIo zOyKyd35^+xfk+R)Y1Hgm3Wmwl?_$y2vezw(Unfrj$*Xr(1Y1eYZ4K2JO&DJ^C?)RwCm`Qj)-|ZGRlKEe-#{AAZiZbv}MI%wb*9`IiH5$M0i%DCsYQT>n20 zxyTttNS?N1m%wXH=&!nb1T-O7ARZ7PAZP%1MTw>k>K?cD*2-sx{f>YVLp0cv12W0t zj36W*chBFj@%bxO{p({BWZenQ)rpDhy>>a2sL^ReLDxB!!@R^2bWvG1;05#Z?vlT(eRZ@^w%P0CU9w{Op{ z#My%Y@<$7>urQfKf=KKXQw6+Ez{y>C{FX32Z)?ki4+N@K1R%I9%*^CXiu5i)=n-vnMO#)ebMIHOgu{ zCNUfZPB|lcyyzv1C1b#xsMlJI{H3qrjeVkz_ST(`b@5?b*vYqV-n1`nFPkDyUM`sI zTNz9gE7W?*G40y{Q1ap4%v8?1t3o3nKe63dQtwNLw9-K~0Wypg38JglnOhEaYO~R*jF_IMgwc-V>{8+{jchgr0vkGgttrO%zQz1le2@ z5&6*HueClilMj-W{^HGJ9nOpLbNH_Nz)2P+JJhW8hl3Dj9#=^YBEO&PluKv4oAKBX zAp6^@3K-Mxp#{wV%aZ6jm1;8^_@2jsI^n8SCC1La7iqL!W*}VclDsXxKP$N|0qI_M;r>RBcl^w^#FHBb9ewe+DjeB0t z%*kPmxLy95oh`Zk@emqGug!T%CpoKb`vQZCn=@65jwhI|^9#g?0;0fB-Fml76L0Ph zi+Eh9iturIVDr!}GFNJ&?iPUUfN{>1dkQ)YIuFTHWoGxto$d<{xH>cJQRIXW0UVFA zvDCyRDUJJp0khp0&E!^X$cu}M3tA*Tb?Q`3Lxagb-tsSCmvdhsmZ`-`)O)X05eUTz z*sJzWUjDd}Q*@zVC%Ef(!cCWxJ*O#=lZ)FO8~b)3)HyFYbyDSeZoujRnAqJdLi&$4 zD+5SD_5^}1$27>|Z!_LLK|d6P^(+4&DvgBVy90KjyHie-9X&-2`?(Qg4#cW=@0Qz- zT}hV1&s11;>Lp{Xw;YHUXQVZ_Q}JgiWX5ul$MbTpaa{-JAFVJfZ$}P;xU{?8=%9OV z-9-j}ydA?Z5jQlS$PF+XHIv`NP+FS2lHZ1xrxMRXD76nnPy&zd&7`P<($sVL#5o{B?j2lE?2RJb6V}j5?-*jKWUWBoM>%KAN+atK- zj_LnEn&3#OtsW<@6#}}`;tX)v8D=7v8fS_KUb{{8-FHX2;!jcIQXZE@#NW)yWlzSg z#f96myl|sB#jfYt$-`(Yq4b?@Qf`?M|MO>*0o+FoBs%^F?n!wbg5yLnR%kkvU)98@ zQyd`3(idr5yP+5YJ!zO(N(rZr{}1ziu%R`+IoE+G_7_KC5c^njCQB{Q8pX`~__56Y~X0b%OFSwCsKldvH4v-y6r$0crG_%1$KZ zWE|_g5iq4!FaFVmkXU>w1jz+3u}!<7hF{XYdyD<&h^3I(K)rpgTBcRQfmQdDKzv}&Eor+;mmjwc1&ka>!H+G-a9|B zw|Uf{+(M|=AR^WrR^x?&py)Mz^*FJ$A7)m!=Y|3d=N`|P0K#^S3h5{r`R))>&UW_4 zDJnYO5IfIKo4cKxy0n|lJJ{c!R#Q{+DYemtTDf86%LUp#z+2ed1WB9O8e{lSI{Z5t zt@^1kXM0^#z1xJ@cR^P?Z%*1rQ`q>y&O|e_r|v!~WOB}1W17{D8HGl z=PY6$`qhHYD=dsSgc8n4wI89IE*2R3$2;bmxcrPgLjoCVoIFU@oX1sP%WnCKKku6LSHa`R?JOOKlvb3}!j6#;j8jQf4E9%mxqSSozZ&qkEhfi6Fy5 zGFX_=IvOoiE_be8Ji^f%upO`Ms1qFNdjVOYWa7_h6p~D_K%5|m`C@tjeW0;e8SpNu z2sBw(Q#?TwlMCR3kvs&=zQ#8@yC)egZchYzpp>hx!4ZE+!w@{%)P!lho8`f57^|II z=dHQ6EEl;mDtorZf2(k9@YI2<4M(*cK@_5?y47J-|FpSbZgBHk_zq|b9M)#dYj z4utXr03-bIc6xCUZJA9!qJUo;o;AGDxh@n3!g^aoBcmg!xbI$i-%2nssC!HX6)l#Q z+RYajU9uC;5R7z))d5w&T|lM|m&`gXkCveCplJmN`HTwds(?2?(@Ly{Y+oSV5dg*S zg1#kFQ&U#}Pv*aHHMK8J(9j)|9yv=(nFLZI$Eu$`{=c(Wb_3UqeLVJi<_e4wDpF4~ zm_NKIbJE2wv$b@_pvtVFQhH6>`IDmg*X8W(T=?n)aw0EreBK9lxTyQ^;rZ#f-TM82 zbP&n5e3&dS3Tm-n5+DGd6FMlR{fo{S0#fH*f&w`W%XRD7)(z|RM0|!GQv1%dZ*rVEeE{LqLC=XpMi>W2WH`y?+T1OMuN6T1JCH z*3X~F-MBq(v-H0YkD%$se zw`Qa1$4^n}6oB#{4i^(W`zU&Xk2WM423-%$TwC5ZEpyEHj$ow5KiKc7e75kiy1-N* zJ)0#P%*I@@*4E-K$O%_gSIvxUehp1-Br2!J%zf8hRl%hNYc} zS(+6yy8*D3T8n(zMbt_C0QXqFJILe@)-a1Z3njBQl-HsXf{u_PrkQ441v=iy> zo0t?5@{XO*MpZA_rsMaEHUM$k>F*B!#J&Eh`>DviFa9{K1Gg9_e_Y46O!j?X1RF>^ z_Nes+rcclm_iO1mdeWgF%n#$?;j#QPv@sii=A`@#2xXr}1PB%Pd0a<(8=A3};K`pbI*aqXZz5tQ_!^E-BLf_X{P5&-9da;^-XoLruO1G z9|Cx`q{;VL{w5lDz;lLKT0q4d*MwPLf3Nrc?hd15ZE{m-NNhuoTXAYFf!D^J)B|37 zsHv$b!&F~OizBrs+Z2DqNRujEP(j18Gj8YfwZZurfHi+06)vuEXrntx6BH;27m*4e51;DLB1 z_Pi9AXW8i@eDq?W0VvS-HPazAKn*`5CMM>xoG0`{M+a((?gwO2*8G5>QyM8!R;G21 zyVSvK=Yy_PnVpS>!Cl0kjIP7pzzrLWI>S&po0{-s6UlUAMY zhl#AGX|sqY$cRKv!ywiUP*FShePal{VKpZE#^zf#8h)|KVl8YC)JsHFyVqOZ5|mpY zf)lh%U`YBV-oY6}$0TDBBzB zCwsCPDmNJK*q|AHPH-?uqRf0ogoDB>t>9L+2GaU?=kOnH>ckMBhQbC_Pzs2^lagvJ zYRjG1$IO62%+b-2s34#6>)X#E5B(RJ@}S5A5(dew6&Ca7d{Da*3G_7M`E#NvXY9)t z`R?kUpcilGoSMBX@rRoSTIQhY7{>^NB2=a)@u03w1y24K{094!#?-nHdoI-_AuY3~ zm+F*R&NEkzm*}7HUYRKShBZYpD}zd zGPkf05T%^8g2kI%Ne^_dW&!%hii_ewS)t}XvNNj*dB__SZX$H<-~W(`pV3$y%-v5f z9G0j+ikeP`1VLeUE$)9X{xws(-xOqc@KEp4B*zaACYF*16@d}CCI!^M6JSqPRws(2 z98Et0O8#rZMF&{S9X`E8!|SV+pcFFgh0j34X_IvT;ZBHIRzKenuigDXNI*ftGA_uV zg|PEVs00O6!0kj>kV7$UD}z{&3CH`)j#7SaJk07Ny)U#*6qV!W#m{r)SQyT3wZe4; zj@YV<2Eqn!&$mcE;KYX}OI2JKO|mf2EjFLDz~;(lXlZ6G@3w&LIv4ptJlNbD+(o>mEvvHk>UO4qAq3Qqf_qfK`kJ%Y9o=zFQ!)HFewlF5q+LS zI(kN;Idj7%kTTKHu>FIw{HuNzSmY%mVcMup+Lv@|ia?$*99wMg4BgZQ_02@&dR&uKP)<>DuSCYUvvpfEFMn zx>XtibSOVJb&;T~{H6L*^x6a|nbOU`<$Bq7bPz(09=M-6lcJYJ$EoGEL#b``#<+6Q zx#o#$(exh>D>F~RC(nt%RlBqKee5Lp-L&wBOpX13{)pZ2-}|Si(Vq`~_%djLSloG{ z$>QjEf44pZua=6OernKb-2+jOgnS7{VrOC=H;}D=iyLf^r6hvHS%9apIUcH!d+m!o zrXbq-S&-NsC4X6t-Og5gJ#t4aOyHrZLA}?c?((v-wXFQ0>W&${(`PTc#|HO3B`M{n ze5zd9n1X@X({|@uLY!8_w}rL}egeH&vZI$R9cj|RHb6f=ZUYxkzByF$x9nowoy7lZ zS{7MJQ!W9JjWvXj*eJp&K|`Z&6^;Z+ zB>U#%AtY)NGL}LIRww4IodU{V+M~J=RHXwn#)cqJ3b5V1VY&2z2Uo914*q-$c)#V@jf=W4#ndiYN+RIk}Sgarkm>TsHuf_axzn)=q(eZJ5^3BK-d{=*%~5 za*T4sU#@L?)`ovslmz+OLfjzy{RuAm%@112GdhGqi+ltJsP3>H7aaqaU zi0wop5TzFW>rT$os# znRtJ+ZS3~;*|qCW6DAL4%ss@KqV*$ffB!Pn)z=49F7!|d)aak!qo*6pYtM1_o81%+t*5rstj(hjjaLoC|Ia7<)j&$6vgOQ$Kak<#cYQX!^(D~n0&Mg zQjJSn!Tggf()ZG%JnS(iJeKX6GL=5j9X)n6nNzi!Qm=vAtOi?t$4nNbO;42Zd|-k2 zEBJAWY-;D)b|ecUZ?goo5T7U zNxrUbYwXgJ?qOSncF~QgCsrpkQ2$V@XjWVIj05N#$kih1j_w$E2*C&{ zfu>6y8ms@#;}LStq3pWvu7c2|7u(g73vVh>Mue%BI>7$P3g4JD{wCEH+@G1*k1@C* zlLbUTKuQxD`3{JoUg_wu-Wy#^{jza-!xrhV-v0JvdO8~V5&*wLM&u#&<*NfM438__ zaKcQkvYvJ!Y8NJfM7o3X-TiB7<}~gU4c}uYvG;o#D^xxAt8Zr}%mJqEmv1FS|6=az zqOfNm#JdA(KA4Xi{|;G32NqNy&&^!~fn9IA70WBbUb%Zq@?Q2Y>o2nSvnl9b#_L4| z1yns}qOL9YD#8Q(CmtxYc*Wu|X`m8O3FiNxqmmSu?_xQk$;Qc(2&L2U_7GABa~^JL zLV?6n%x-wTrl{oSO~WP<;Y{rf{J5U6ldty4uFYR%tzQrFrrfYM0`L z-s}}QJrIn{e*DEXO~&+A49F$8Y>epXu}KCWqHp*f&zJ*M;S~@sTUn45j*liMq#6Yg zTXYP(btkTuNnW&3_RP1#TYmBzXbVWB(h|~OeoW=FGj$dwz9%#?eU;k!#=C8{yRUa< zvmYDENkt{dU|laSr<0{|Um&@Lwx>0X-dM3$^-gW9w~o{;b)pH?@t?S>!Wr%f(8xFuM-2>;*i+6xdiHngwmV{8fM%)6#o+e0`#R0|R9ujeF$mQg$JQQX7 z&XKx38=T^nWI7QQLzHDO17=(9nwy1D@y%4ZD-K<{+oHF&h5Te)6xf(q?|Qq(7$3oz zS*h>=v~+u`qhe2JQ76?M-J!ER$@xRIXkkC(KlO%93Uj<;*@n~K!Y;Q{vnDhK1TD9j zkrmx<9Ee>{uKjpJkBFP}cjUy&tG5Mg^cfDUuling>O46kHUx^9dySva)3~D8y`ur3 zKf8*_^M3V`6U)kVId_T|kgGLKk^Y#{jTv0M{ln(;N6qcOW@gVz6aqcX7yYd^jic0q zfc2-3{1PPVXC9W5Ldv{=lq9=~rs>+%hFz4eQS+z}dWQ|4Ozfsgz83HkE@U0UV>%EBT>{)%Ga}upyjr_%vL`VPIC5#E` zU8Lhxv22O94A!Z4%ZQwr%}wYZ!Y*N>2?G4)HjC8eEWK_yMs2*zSKz{O-AW?GPbb{} z&$8LCf0fN%{VAKRgs|XrOzW2KtRIeTulTGe@$uIVD}W={@Ga$qy-dS%N?g1YK|0{Y z2WYMw^R^i+kRWxZ$nb(`eJt7l$`ABRiGjX}grQ->NZKqfF253uS4KKx`3Q9WPD$(i z|F`66zr^vNY_(Z9+H?BwwL0?PBX0JKaA+e22$H4-4jhc#`ZB?l3PN4->?yJeze5*y z509M8Lnnf0O=#rPnv6K&CE&|UHi)W?gepAO`b*56azCw&XP9KOV4Pwsg9nEQitayb z-$2irCSdu1_(AzV7H}~@zL5LLzOYid=AI{R-t<*D>7brnXZi#eBbOg-Qq5NnN@fZ5 zc)&c0nYUX0?;I>4%bYl>=a1%3{l30_HX&)>psw>N_Kx+~z+tPP}%;g!Cv`$Nrvtgj{X)V$qvlwPEkLT9gq-Jc)DpE$`U=h z2=dM^MecS7U!VqyJQI!$rI^VUMS|vZdt+UL_W&P8&>iQO-6NDD>r8|f^&ypyM38dt zLB9LUP}^d6iv#r~!IQcLP~_P-8P=Mh^H^CMi|qFjgN1dxmV4fom~#{1i!87Gqi^7j z@5~g8bY$_Y=q|nKbM#KeXReR8{OM=EsozYULp94KqWYPlVzYb^5slm`R5-Z}TX8p+ zFE6PYXM{U_GAa=mE?8%G-h z>eR3HFEw&$IhkZ_V+u(34`%I#r}6>g|7IiN3dip)e1{_eUT7-gw*;&N@{iA^cZ>^MZ_-BzXH#QWR7*|YclP72mKG&|^Z*>$#h2P~V~kKZ$KAIY^>_uH zmeYo?FXtJ?qQCyptP{$M1a0pVeIOC$1CdDMfg-&(eoqLBp0M1*$b0}Cq{f-E5p z`BOlrdIttLZ7ibL`uYD;gU7tT*9`HVc+ ziT4D=Yx706hgn1aPFE z`um1jP1gmZ)BAfM5iI%#F2JY4t0ZqJCGznk-$`PC)VM0-__2|0h2oYPb&!0`eVWbI zk~4|O?R#K6k7ZGP96gV!k(d;FS$VU~VuFpAhJZ_Q7lGpc+2@O3#cQ^{NyKEt@@fP- zZ2*1C)uP81wT+2+eK1rl5EK$*D`cIx*yz!XR6@bzlfxUXymEqCG%9rMryCF}OB{8& zWRRDG@~QsnmG*yBiI$HYV1zNhrgQA)jyGbR=IJ=ECiPlef<(Ee=OqH+3q*V-ILk&% zt*7xMT-X7|-1$%e6u3OAE+F(?FoHNZJuOS%KpLfFw)w!d1}5BkE`>g9^y0G#jITo`3k`X6O)l|WPpqtbGMOT;9j1TpuKQQXAh@7yl(C?Fs= zZ2s8SW1PdV>BZ-g(t9!T{WMOA5iB#WF}F=TUp~peg1u&O4IqxlUe=o}H?#=mF{GN)w_bP0L@=R#7E+;IOS zZr01-?q_od4dF75!C{3##nBC(Az_S5_1vyd??3v%F*y$^U!wqRfTo=^*E&FbMuR3;-DJd}KRj-q&kt^j7j^tr; zvC&*5sowHqRNHL)|I!qubXuaj_5LD>0;6gzId31dhdcg(etdw5YvC)lYXmR;FTI=3 z_G|O;B0yjwQ}pBs`iT zaS23mx_qaY;^NYb?&N6ap=V}QCYgGle2p&c;s+^-be$Vs=Z%CK53AckXW+?BnMWqZ z#=6G3C*H}k?=I$I3Ndc}tJvzgnN*D9g95z=0ut8KV>zR%PaSWpd2AeyCMI5Z6Boy~ zXW;YL%nSl|EySIFd9`c$Cr!LwNnE1oeYHU+->K$iEpr;dRnsWgK{UvlBPSmuH<4R- zb+i_b$eL4c?dP_n95P6*TC(Glzr^vHW{}fEiGTT+@_7_Z477v-mfV#nMt$!dt^IVl z$#1hBe(Lt-_Gr)9`FPXMhuiRrQc_YMEn%Ogkasb+!6WRmZ8Pv4@z@R$L+8_XBI;P) zzRkal^vKQ4y(B2ulB1bkY~#u)WPC*O@Zmm(goMP>?~aa+1d*Q?rLTK)(AK##f3G!Z zJNUi7YHg3WNGrodlx7D%_l?NM*Z02W@8{Nsr!La)PP$2B3N}S5!$Nn$#dJz{TIX9g<-Tnlb#VpY)24Hk^L?yz}-rSu{-~1*hciUyz0H3B^zQ4exGsiin=-R5O4A9lEM`#H7||= zu_L3#T|R2F)nD_Sta+rF`Y3j*cLg$FWN3IY_C_FqX|8QluW^n z-JNtFp-3FOO&?@`pGe-^&C}ET^K;Uw#gxX|{>I#0=g0Hr?haM0l5*DyWkeWVtCWKT z<+jp$fC>T!{YDjd1MHxQcx;aV|84!sdPR? zt5s}!t$cIr<#}H5ovT~q_uECpM)dZ&jd{Da0PAT!|kD!3g+wf%!!`YV+7>U%mb%HSbr;%9H6lyMN`V=Clt@`)7*u= z!U|T8Gt-!mkf4XLxUW%8p-oejGu?-Z3SBo;bA#&T%bdlZ9#i)B-wBq%tqchld(K=m zT55cesrt=~Unu71+FMi{_hGLK1L~rq0dz>5qiWWsd2kzYCuSxUwF~(@Y%O*SOOmnD zG#)_h^w~Tpe=6%^ytvujv2T5klj5dsJF&bXxH(@807XE$zw$Ku(M>x6KD_VoN_^+F z-0gU(ZSpFQ^$WvANXn6-8Tw3T{WF>FV5Q$*HLFl>(Kq!E9?G{(m zWYxlRbRT59;2$zFNNQ&$L*s^Th+JPa$#_khVy&jm9!7bF{i}H_@2{Jta>MoIVaG5x z#h4lVONn9e1hvb7$tV@;4RNxF?I!!~s1`VC`52#hatWL%#AV7Hr_mRWCj?k!{St;n zpCfdFB_W+Jm)3EQ`w|7@HH?|AU5`>w)%NTC);et(xrX)sAx`&=Nl8vOFiO2?v`KS6 zNG7F~Y~`KVs{F4{9WEV2$L_c@uI!5b&39hG@n$+x0VE3aE;lKmV3qQw8F=mm&+6Xi z-KKn6+>Cv%Y3g3*>z_<`RP4!Qa^E#BPk<J32T;3lMaiO0SxR9XyO`c9wtm z&3R#onO)f{D*L`!2_Dym?oo=o(?Vr%9b+t*rhPa3>o&ho+a{ZRVOXNutQmnLZl^^b z!*-Ob+z}8hQc z1q@Sj7;a{LxwldP6(``{`)fhAm>MPFY1+{BvBs8^;0=2n?)igLpYy_)oMAC>d!M|R zktwD-6+vOFKnb1ijs2Vy7iDMvqp1l3YUQWDzB<2-tc<0bKY`VCKEHkjR&J3Ssuv5X z{1Csa2p{IUUNV9p~l9Fbb~JeBVFJou3u zj7`b)NvKT9F|3@Ho9Ij5wDTzsC2H~RK%lQJudHmvzM*)I_yUZOlDWf7o&Wa4`1J5_ z2r2bB5aM1O)$qBiYo&kXqb}YUjUYN*3T|DxubkS$$OT=lj{9tze6GgWnlfB?g&QW` z{d%i~vC1EN-Q#${(jp_0R{V|{k(rqpYTQNFEN6B}I!;&Mb5JP!l&>^5QF+8@A4=s> zfR$R%oeYaTCHkP@k0kPMxO`e3+HjDT4Z5GcFnHVorGIwmJqcJbFf+d&Yl_}u ze$txPWadhKGC%^(6cBK>nx3qu`*R8kT7ZH)1U{#JTS0;Ska+2(b`ai zKail5l^2VIa2NJP&0Ft}1S^Ahb!vl-zDn&r2a5S-HHmzc2i}ZC6*}Oh{eFJATt)v~ zQ$%_@4#MuizjPE1B*=7<89HA)B>u{Ff$q||?)B)F*%t_ko0P!8!}7%2n6jJ~#px=r zN(!H*pteYO%c$tPXvH`AB47xVt+&;fB?9s!!U@>>8zzpgcRI^#})PNk@R~dh?tCx`;?_ z^f3D@z*2n+N&Wj0CpEPH(lmm-|-dd!P1LuyW|02aRD8ks&hEApUVC zZ~XA&o!LH&z<#UvLjJnz`};iimCvn}(>3nIGyLW1zBd+9`>`=|~y3aE~7_#0J0Z4g= zCdWrvgDB|2DpN#O+?4fn1q(nK$64b_g}R29tyv!@0Hck(09HbY0us0$1u{t-}4R;}!w2XC8FLQo!Z1$%6J!0|h zW_*{uy8c|n!x-XCvfD`$#I7Npfp#Txz@fib7R!vFu~5*x`;9^%|G||@)D-n@M)fPE z1^h97-CGK(#(tD+;`Vf&E@ownd@;qR$?)e?Y2$=0 z2Tt`7We<=-z*9V4?k`O+d0)>|o31$c`-$t(4_~2}H>dt$KwpOF>n@8u`;Y8q)h(U` zI2B*W56&?7BJAz_^#;mpME_{%8o-pN-9Dw#XKmw;BJtmylA2eKTOtIhgBW1HmNA%+ zA=}`Vn81bP2`*JWYx@uEQ3D&C&LfX28?WE7I{Cw-FQ9U@5-nvC4Swl#_YP)CL2uPuqj~1drq)p;~qN_MKL6K?;8<= z&saF;^bZBLWMqy!cTJ;AoA><&@uS=eVe$us)XPA8R(XAJXy|9dC$+9*srRj9wlUTW zu=44U=M1k&6ut%q-Ghp~d*=k4PJuCa_);gy2({FRKj?Mh7kd7ELF@yA9ww8EC};@Z zolfqTay6k+_Yy3M6ZW}VAx{pqG1>%1ahHTk+P*A5sXO(e)6<*p-Ap;|>C|`Y}lbvynO_`;Vky&I54SPi;D;e1$Gb>~tzw6xh{aN4d z@B42(>YVdFuh(^5&vhLbZ-ceo5h1Z#7bJ^b3^{ix1zNoL^%`r%PI_jyXMCz3`rd+p zzh+sY{Zxow*K$PPf-=m{^{h<`p6ldMCXY<79HIycyl&GLc!^7ja+k}QF%0YyYR3!b zs498(F@&|Ika59$c2Ns?apzB(8XViUSbwbLHr(YI0c$!$d_crq-_}g2ERL{iS$#MA z*tkfhpS|t1?uB3OP0p9&lcj0u8=x2`cP<>fHxc;RnnaY)&B=8jz>Zu_mkq7kr?%EE zu`4q>>4w3EnH)2Wba8mxw|n86hoD|-d2nLQxz>v~L_LHKrL7dL4)sHTn-0m{(9`** zO_U^3fFMKnA6#QM7#i=5{u5^lS8)DOLc$_B7hm}y3K>prJ5I5A&T_U4nxMd`><#I4#~v+U;yud!$o(GX>wh`5aGTsw2ZfmCoa_^T~pI6ZlG@m~90wb}*k zJ8!lXGB8q75}*HYeB#7LF~0Z2DcYL0bos}-aoK#+y(bQ6<>M?h%|%8e0gXM+*W};X zN zbzYi>OqreXF+!Gaa^`G~KiO0$%WFi!YML;-4Wkps6-mU!RQ{RZm)x5irLZ$dPc~Xf z)WO|a^Y*sea1|?OV8EyLb+drUSJ&27^=x(tKfZvO|6AgN8EP86kEBYvF-Z_-<_TgF zKuuP-=Qd_UVd!HMK;STlrd}xX)Ow~zN{B7{L^1G;rdGJgzw1iXANaBY3cRxDP@#icf1@c9N>=ao z%u{KMb|{;kZRMZ8WFGuhV@OWk5Q3TIXH@$o&ZUzvzC<|Xm}%wx|5tF!S z)A$4Zb2P^*WE2EER1Mom#*Z5o=cr;?^5q8fDEHaNGl09iiw+A$N;Kr{b8CW;)_@L|M9?aIAZF2|X>jZffZ8a3y&v4Y33I z3+ps$CEaLtM7LAz67L+1ZhOfec$l9VKaxo8%Q?1pSa=Yy9SjXsT{h#IReM_snZBoU zW+tl==WFDYgOkA{r=pAl5|6zVl7#byyo{BjDP**|_c2)a&5yA{bY znDb^py;wOK3E|?&dO(EjmY)~6xKujZoz`=~<^Tn~N72Bl!cSNYy1=kpEe=sGu75ap zDnR#7b+d<~8@kP(VaM&}S?I0hGdoO_W@lu?n2(*;QmgEjm6Tk=_ZKP&N&P!xq$$44 zw`c4RPD-DWJ=%+iWkTaF!i;P4C0Xp4QQFos#47*2*5IX@1`}wHMg|_T8g!Lq>WNLPTPpqTtl5SyoV8(N5fvo0fTYyGfP=8r8Ky@ioIB z{(^6~U`$!&#EQcd=3LTgvW%7m&#dZOW0Mj_^BeC>9-f3VxC2oMQ|!bRrr;8_E#ZqF zXj}8$58dBA82crtG&$2F77c|H5*1~Ct^Zy;_>jFygs2p>Sx~NXEaiy<5EPfx*D|px z8MujP6YcOOIiVV#E9`${OW-2o6i-FShF7|KW|-;K)r-zFy1E5dw14m?Bs2g0Q-=sp zz{QNgBY71+A|g4TCq!jBpQm0>!b}2eLYrsF{XN1RK={UtG{^i-sw^)Y@Y1gGA-sPY z2rpH~ux=w03fv5Jc)FsWlPhyNs*R*A>gyn{3$B?v$w>i_%TEf-{ki8y43e(H+T`%P z2J~DfXtd|>3^bfXrO2A|^sZ6=4vihNonA*W-+yA2-xnmveN#vwM}bh1m;?tmBux%} zpAH%8Z6-Y^if!2VXl{Tu7Co^+x@JyKCqhfJpPg@!j^V3(2!Z$mInBq!Oc&=w7$g8l zv1^cu@%#L?YELYe6`lzeAk2@BzwR`px0`X50Lv9+HEK{u>yz*g#YlSmS33|$>%S`W z_BpuhHJC4Iw%$D7ZR9^YE|fD_5@?n3>%-$WgcMn^nJF zyF=b~YwW?yOd@Q$nyirI6O3;SBd7jR{)ygwvbe=zd`q@1zG1@ZHNvgMjiZko>%IR| z_;h0Wp{Qh0X|%}}jIk{q48rU781Iu%fAPe7(4nj2-OQJJoaLUM2!QYqtIc!hZSLf* z?p9zDxO(i&6Sf)MK(@L%h5US9)L@APeU%@$Wj+*{R;*1DZd-4>^m;gms)L#8lCG{A zl=bKL3WzcSSJb_h%|@&Jgez%JVT+3V#rOw9Ix;*Q0=xuEEE}HP$#^TBRDI62VIU@? zV(!f6lg5*&ZuL!Z#+GgIzk}vC_HzJ+2%=B%QU7&xR7tTtGo>32QI58w-4D3}XoV@( z&=H0MANB~#KFeHKvmGNW>Vt89(tO+2PXvaE+H@(e@h;Z)a>#+D9xVpTwG;-UN;7Rx z?}^0&W1wCu1iWzNG~LKWMGRJx#U}?CGG$;S)pb=GTUCSx3rfs_qv?+X=G_xz5l1Jd z^_7~{9~$UAT3rgRC?aKgcErB>`G@g3f6>L~{ynuz5~0RRWI0yAXaKBmOuvuA>FHaH zG#bx^vTw{jCxk-)Q~%U=`;3TBHkoc;eCpUo-SfA}AL!pPTnaf6K~U%= zMVD)KvX&J)EpJkvO?UJ)=tN@^J#Tv+NLtrl{lZTCcYF_(O&iJUf@-@f z$KjGBcQRYIFFzJ3!S*fusKWiSM{FeL=$}_SET!%A`?yF=bF))Z9)snU?mGLR%hHm> z!;I|M%o2$e%l5%RK$^6B+UYKy=zh+|dRw_;sxeeVA33eayqCxR?7#iWvT{Q&=;#sZB%x?v&-Bi0(~SQCFTCFUu&O)>!6_oxh;Q?kG>h%%-uA#2P_UR#$AR=(Bv zZg1|7Ye(K;vl{JA;Zo*}6vp(@>ovi3By_K7kqcCcD-S4Iq(-*99s|f-N86+6FDUAh z+ia0e7J4aTurx~_>JKCDyk4Tb)qOgm_+8JPXe7=6%$t?QUlONwE38_7d75=)YF-y|K~vixV#VNT9h zBci;h{4yUmnevE(EUNL{y{${m-*2@WTVj^S=F6P#jdrJTHSomiWKC z01mE>GcSm~(;qR~`%gSrxc=)8fM7PlNp_8)(QjlP>Lf?^>QOfW-2c4Oug@p=o7QJI zdJ)h_Lpr zCmZvC^Y8p;7&nN<7W6xbIS+}7uR7~wHYBDDK7T%tyG9ga$I!bnQM*JXPMqi@7V7e9 zLQb1VGqRXrwSNB`Zi*9!f;Y0R$R9G1MUwfNJG8+1wA>Qr!yw91QR}2MKL9qu zOj3CGW!>^VFZz-)OasW|1wXFgjVlyThM<$(I-%R%X?_%1Qc{wiVViH}Lr>*YknlwE zofh>YvZ0z)8t7u1aV~6Zk@-?X_Qv&h>hl{LKxW#aVigNI2nB)TL$a7{$h_)d!^wN* zp0VjfR;im=sWX#ifo}1sQSe={ z7j_@C;N5X$d_shF|FJV!S0p;S!Gpoh(|B6|(1oHZ>N-kzpzwt2N9-+mWcY?Z)u~UP znB@M9Ck&5i2*^WYREVmlI1I)iL|N9YJA^w4L~tQ9`~smvOIi8&7Eao1<$`W0wawP} z+wxlT_i2}H%j(=Og=4rvPn^%2AK4cbd=5q?(iP6#SbBG_{}^!2mc9q;uO3RWg186^ za0DW#IpZLKIW-%5aoII$i$}(f4+PF;yqxgD(yeJc(5)#2EwMSFX-kH#VK1$Z;nWS3 z|Fy0&cT{tAbt+cMJLkA7Zo=-recW zftwq5YBeXe8biz+x9!u(bPC6pWKZ_QaZsT8WoN0a5L4`H*&{0^yTtx030&>=vYSCe zKFtm|q{xgKtLJ!346u{Ur(nA)aWjjukFFi;v|}Pcr0(sPeG{pr#T;zMa0#@y0J%7u z(yxwBeQ!7o-zb&tB7{@UDeYgL@2q(1%Z_`P#;E#6$rx%Gcf}J|o^}ELLG-A^oLT|2 zt&g#{=#a)9fidfeI07e**-rnj`wv9zccyj~p^#|Yn%%B#vzw(XF5ME%~lUxkKlW30I73Zk)I!9FzJfgU0)Y&eD!*?^p zQS-!QcXGzQ{^-b0&gBNTcP|J88yL-dT{>haB$LCU6Q3)xaCARTh_5iIT{YFVVlO=PYOP_H8uVH zV>B`_|J5rk%~-jb+0+y^gJs&>I7I=n_dVALu-u*-&y7Tr$)b9wXgtlZv*XMciJCVL zksZf|qtyquk{X>aZ2}p$=Stoa;fwvpS+aF%M(zt^-7&zfncN zypYqvvHIsaZMl0A@2T9maLI9$mgtNw0Wz-iES9d{vBR&-5q-(=^@g1Vm2)h8i3>dI zFSC?4j`fVY$Dq$KZU;)nogH=@>*1LFk8V=CPLGOqAz|t+57K_5`5N1}aIAcpP?J%q zl@I_cQ<0g^#E_2sh1FLdhh>j|tv(h+#=~ZF6Lp3ep){=i!n|;x8|9K*MZ&7G6I^lf zXQ<(l1Qlxz$A+NP#X}U2Ct?0s3Vlm}S)CJ?Loz?Wx~jtp9hLy+we1fNHQ_0|H0v^z z6Gv{|jA=W1)5-L0!@gz3Asm2loW}}Sr#x6>b)IF8?-6CvjsG-+roFB*R59nK^}OCxP@aXgR_NGS4o3Mv`NU^tvpRSNLJ-OYSTY+R^?sLx|>95Z_e8vwep zt6v7YZP|~JkN296=PFgY929;1ERQdd*@D_Yd4O-hPG_$0B^vv7dLHjqnQf0|Cao%c zzf+`EFMG5bm6W-(e2C_mF&ow+(^^jHJ^fj*I}+GiWh!wo5`9YNnXapPk0&d-Wr|8} zgqlmaO(l|3hX;HaD)L_s9sRU(a9#?MC9mrVPw|LF-E+=V$4?KNs^qYF>hQSSjX>s; zB8Mlz7SjHYEhOb@&5M^Wvnwl4azd(OXA*?gBo zQ+(>W;$4#Pg{{N*8jsw*wX=yOZ^7bG-`BbINc6j@yYKOM4;I2$?f(8bR5mqeat*hQ zA5C8!uz$U0#eTdvy(VA|FUywCw0b#nwfn6Bc7glU9>2L2*O_v^WaR=LVGO#BDs6PB z%kS%u>%2VC+wF4x1z?Z))dr$Muf<8*M|jNKt+?T-Gk2Dab!cQH^#1*ms7x^`{y*{4)Xk@wR^T{Qi z7(0u+R6ZJ3R_VJlWY>&Jn*X){nfurhjtmbcJbDz`u(Odk)KIGXcqxAQ2n;~xgBk2u zE}ng;Nj)rDDLGY$rj=7k<(2~x?eTJ3!m2PMuyc^ZA+dgu)WM0J9u=~@9z62a&351I zMucft7dkmOJB5K_eSX3YCp8o!D5X;;4PpHxA7Z-v>2vq;7bJY#B z?eEK{9=i-p4Tb-Hy_;WRhPtY~Q(%9!!xbicj&Avlt6*PX`u_bp2&Cctjvqp)N9U-r z#kUlCN0bZSZah}EYVQ>Uq70W`uwru?Sg@ZBYa~;bo+hmu>el2ifN~xxfu`=%9kD6! zl=bgwUU6uu=vItfpI#+J@bCu#Jj}A6N@I2YMdSHXq!WSL?0;6qBD)p$*=*ZlqD_if zhg))Yz1hOQw-9-=#rEl{nV7Sl-Ib#?(dg(X^<52Q9T?=|we?JXs;RtDB31VL!@UzD zx2C`_^|8BK!^cOe$Vm8{C5~`{HpeH|yR$VErtgN52U`WHhsUh<8){#ndk*Y1<|)R! z5i)WnR_X0eQStEIBlD$7YJ6;FTckaqK;)uu2xRG+jVE*1mwa+J(h)+n;%jGGv+}}? zgfBjj6SJc9ZK-8k`utVlp?7cXf*koTKyoiE*-aVCeTznK5lAtj}59AZ}c z+{QdUz!TTJCD&@cyv%UniQzs777i3|is=1tQ4 z#Cd9~Prb8s(Og6hot%x|r+-w%6&e>~M?BOj;9r+X+}c^2k{d@ACh$*OSrv!g{O z8qBqVvtP`yy*aB*D{q#wJ#oU8MeUe_IaB;f3E!#klj6qZG#Ye23Q6M_71DC#g?>^u zx^sMa_O?-Q$LCMlhcrJ5JUImyTIVTWU8=gL0&2!H>qQh6@xo1nZMHwj$e!aSBL|F9QUBV<0-23=988RE~ z1zX$CrxSdzn2@Xh1LDP{)4NNTb%(-2-KRMwh3jmXhFeDefr^VQoJyAl6F0X6l;${{ z4;gC>-|pX^0-Hy49vWL;JxjoiL3kJ`pCL$u7 z!36!H_jgF)i%GRW(EICncLjc`j@|7F3AEvmLk0C|M;bJLMj)`X)p$mh!qU9p5)sXX`la`=AqCexKY9Z;?ND zYdCxqaddex`xXz@!W_($V@$%4p=~5|S45o&u(ZW!WC;%qd(De07+4%UbeY&+9HL^1 zK=`6)yLv_4%Jjp-sQ&8WSh@9;>!iC9i0}$b~kv?DwiAZj0q7a=yYLVBLg| z;is$EcUXbB6imE>^?8WMaT=u)WA}!&JBf_T1qgQHa>$~QMUn*Voh^afu8EAMw?Dlt zn>^6w(KRb9O-@y&Uw2xgr|}>CoW&_KjoTQ+)~j>3`C%m*w?2^twngjvVqxNxQz)9_ zS#MVAwvVV-rCe0B@16%bly%cr@~l;}3U&6X@=*f1@g}cZC3#Nc0ScH#Jf{ZMGVE^Y zSKB|NnndXh*MQafUo#n59|3L}?VqrF*wFlLf0bg-|K$dCDSdxv7do-WOf-iQ#9QgN zq-i59r1E&)_vnKjAF&dAYyf6ig(FV$?E>U~Gri>jYW&V0)bdLUuid;Kd@T%z$fc&h zLcvQPySn1udB0ZB(b6LKZg@|9wz$;Rd7w`75-Y=|Z`RSr@cN)4|J#ouz=ZQ_pY~uh zIkFXmnxVttKT7Eh6Ib7j8JGDL61vs;(KrnhshOLz;(1|n^9QCCx4?;r_rS(wT)w!& z<5i%}x0$=~^fS=cEx<$Sp%0S|P*G7#^@NQX|B~CwpZVTexr*0={?vunQ=BBd@J8)) z`l*Yp5p1tPaf}!n51~%06B0?KemkeFJP)_;rP;{>LM|~+TyOTMlOw9YtgKfMevsEH1V#*3>Qu7-PLt}|hu z2mmyIC=P}tCUM06Ji=Ic;i^)FOkmGdt`$^Xu;bf zQ&Sc|nBc_h+(waCXVUD2b;c7cq)2CfGM`-drTCXw5f?QW1G8yi6jc&D{np34mrbV9$Pc9p1j3laQ1YCTv_n z66pGJ-Too!k1Rr&_2M!c263@Gxy+vaF9>8&#dFXUx{Sj`uQxVcE##owQ~7l*wsj?i z;`lBh4UW$fpkC2H-P*kHDyNcaf?taHw_#BI?}{^>Dk@TEOx z`XnC^6}KtE9Y%)`WN(x15SYJ_S?eFP?6XmsKX#;wAVHM|>U$1F>rVE3Hj(@U;Hne7 z^(DDXYO<*4%o#Ij&N=iR)9Q1av9@@GTH#w!7h)Ml`rFQ26ni6babTQ?1lHXnVnWQ7 zT7({SVi^Cw1y)&7mhTag$;CC(T4Jy}mYhXS{69?4>SXB+@z*a2a-6u=j)p+{6gUK% z>$j80G@XS|lcexKqlpUlr_<4`adx_2RviyCe}8XDxOq+% z2Fr3Vz>$RwS0C|z=EUAag#}sn%f@X?ZZ{k$EVTTH5d~`V?iNLZBfE=dKyOE}4l61l zB}$iwCb)HldhPT}(+zPjPc%5eP=U8aebvaz0!9n(!}G5lQIW+cG*;h=kd50kjG|9@ zMSzvz9TUc|1aQvAY-X-TPmfNHj(-xm@`tF1b#pY5({^t&1FSJge=y_({0I+tl2x;n z_C%Ly&Y&8l{T9W+Sfh$VXnPln&#u!UlrO7hrKJpYa>8P-ut}|;@U(4E+M5H^kL@wR z^oDiXIEwy0T&h=26u*K36^CA?b;0+vbMK{<_8VG5=@1@#A2!Hjy?8+W6xQIr#^(3@ zID5|h5z@HK)i3*1M+0WgpP^w6HI*hG_IB2DnB)ZLiHZH(H%axkYdEXAIF&po77n&z zp3|WKMWfTnv87@anbqCyu6NS5kHER3c!Zhvr3R%7nAW5KMQ3MEao&^Ufy(4qp(yXa zyy;;<+<_(sRsz^W**GCut|uc*$K)&Tc3hg_Lp~9-eg#a5ewj)>6BH3TIuuOD*tEQKr1WCD{g$TP-4zI)JF*svvw6tQ zIrJ0Jt;oRcpKSgg+terg=Emk17kNyvs4OBZ5qPK}RT>G#KPcail8q8h;++OG_abK7 z3#c!wfBw9u2w$?YH-YHiC}iZ)FCrwA4%KAcMB!w*%FNa=JUqQ=KY>fOC>RE`edWQ6Uf zgk@&M@9@J~sl{1s#xnbfi<=hjq@_9EYreR^A2pQ88oWmqtC`23^PyH|N-oYsO3Ctw zAIL>{lj6R1bwNdksR0cw1dKtx*2^75c7a#Aa!`i1-~W3s`^Tpc^d>S<_MySERfUCv zX#IID#zvZZgh2ZSj5bzZ=wEcsJj@V-8xf<)%<8+fcycGt5Koq~17*(#D2sJoJyWqc zF2~Q~mc}n>c!Vb^Jy~^TavNQS*ozMYEXJRBEVp>#ep1ZgCmVQu{)F@Y$8g2UkBgnz ze}1WVSE}lldPPPTde0kU{Q^xsY^D)qHP21kC~K13l~MJl;?TIZEB$6x8@MjdJhzRq3H?R7j{+(ay;qCZrGg z7TAd$%4ag`OXy}}D1kk^!fl!_2A0S#VEcwUvs=D6eYLnk{RuEqk#qZHRlUJqzN}JJ z8@FR}a$G9!T++dxk?GMJhfeXrZBIO0=(OiVinI%3@7WUC?#EsFFYnUW^?;g&vS!ZC z_fFOd+#yZX;Q7aQ)mB}}cDm=y;6)nlu0{bzr90N}iuKwN#6h?rPm?Ir6RQ-MyGNLC zM(Nmkwb~WB#t!_o4eTKJ_HFl4_(aQ1JDZi!@5f@OlKvdt(#nF-!{nMICs<%L0(A1r zgNzEjdX!vJdFEKyhVMGX`hLc{vub+l@Hi0B767A6}ikM%P*SP7Ql^%bE-kuo*mUwIB?3ZNg=%eeY9XakMFKNZqVU!$hB?g~h`VJ{H>vOeD*aphk03>a}@F zmM`XKz&i!&aaXqFz$84GOqqP)t9AK|?;#C|9PyV~&rh>al}CM~U?L~1$02(63kMRx z#;k(Bc@VfDIdR|=IucOTasHH`YKLFI+Tbo4d?DS3&ipIYPDJ27@U&pI^-sowDnami z9dM|Zlm|KA{j9Kk@YBkQ;a5%8tc3cAOQ7gxdIB#k7v%wJ!u!a?3x~TxfZ+`O;1EZe?h!$L z(%RAEHa{3FO|cEY^z7G;Pib(Dyv>Q}!mzPX8_;v_=w?)r5X#JPXXG3#v*J-Od ztN5Ka^Ilh(!WaE^gEeKg_V)%r5+W1jLFHfrilHRp`qY~6H*?j+>xN=_$WVr9Cy0$5 z;7CGx$iRTickCPEOGU_Vw0ob30!Dg)HLvXd&l&BmgXNQPp$e{h}(x0q>*VYUA$tS?VNh z=j$5LD6k|7r5J<&9dfhgs1K(n2UlOEOn1*M-p9t-NZ=*I44eyVlYhYlwO42pl{1n`e(OZBaJ#!s=nFkPqgzEQa?6Z>38-b^QdtSTw?Tjqu0F zdMNiMEsZyI+37mA?KvQ0;9%-~K>Pog_~E?jFQ(uo>fr2o0Ns*=)@bRa8aKuNp?xMO z>I6a`wfftlSOohwPWNhpj3DIqK*Ht@uZVUml`~LWAOqicR2{zIp1Z+5h7aR8w2?fA zx2C6fD00oXn9MImJROs5!CLv)IKEL;Ng9L9R*O{K?+U?K*P!RTbAWgNqqn}LG5@j) z8RV^$zzm!*Ly)SIIdk~DO}#x{&XNA`@{5ar;u145;`6k%*T(mcB4ShDaP!MBgW-Vc zUI1WQj%RB$96|Fa=&w<26Vi7M_o&8~A8}R2{J;D{<9WAC;QtiE)4ZIDZ1|{DY^u~c zaErFs6C#CtVuS)uc)~-;MOuUPRgj~*$Bt;}O=Sw1ih(DtI{QSPFhnV)4o#Vjf zCn$VbCBoKMmL)de_gOdGs}Z4mAbSW3X7@uRS`zIm~~3LiZy&N_XO z9g)RWy?b^={YQ9)2(4l9NX;tO-nr{BTGTs3{E7ea0;tkBs=P+F5>HdiFEz|8OP@Xm zYPx}tSK$k)I$zgIe@NFjm!wY3^0%Xiv`UP#+Yk{MmqawFF4GX@v}+GM&Quv z&Nyh_S@k6kVg7fe87I@^e0dxkfM=85{bZ5YF$l@JjURF0?2$Y&$$}a*$0^sW5MwAR z*@H&WoPl3)D(q*;9z)YM>^oCwDSIwOvt$_ZM4SlDC}fMq!gYc{G=S@zz16wR6IRpY z-@8ZTWT(yK`AqX=;ZECYZjol*Mum-AN#%pZ2B!EA`<`?p&|OLHPI%Lck==j%(Uve> z!G5>b^8sU*M*I@n!hvn;1Si*7mlKM+n+;_SQwIsrk0CphSzO#%`de?p&oU{EO({Bb zEesbBW_SP+b9T+oq3N(-UvQ9o2#B|1Ct{l;m({|i=P_oM_kM;LQo6D&A$bl@8mU5# zgKSsrgbF$Gc>UFY>22rCyC41bUx1zK?XFl5JO;c13s#~D7ITX#0zAMj{2Jyt#PPDG zhLxE)2k$LV7BFH2$bAITiyM*|my>KAO(5|GS6-xbk4krDfdp8N`_F~e-6!KeBxY3Y z1Gqz&zU}+Vg_@SDIUxBAnv9ujP;OBlTsOC~KcWNYYTMC*pYw_8PoE~2I6BQD|)gRwcAck;7vYX3J+#dM8_wqQI-J` zFArtoe%w#Fs=LYYToo;;ulc97Ve9sG_w${%aLi*0Br>K)LtPHr5w3YY6j$|1n6FYa zvJ0mLl>p&}-`{Tk`tH+XUTkir4&ZFmibC$f;AxT6?g`0Ls7$JloJv$eIu5rfDA z->kwU)70|$YXprx9G=Vo&+)n0;OlSgwFy);Cg-|tqGmLU6%zp(|0WeZtxkTmS&xG3 zDVbIOA(+PS%!zXs(*Az;$Zp74E#M?pbbdQdRzm$px>wveAT?aK8RSiWQ}QExO5{jr zOFUJjTe~=ucw|>{_i0~h{_Aq8sF%OJS5K71KDJ@ z%a4V4;8n7my?5*MC&(<$i(QX)U5=drZNL>I?%@%+ruPa^5MTz}oq$~Dfh{0p75=8M z^c?){E?r_9m)YfjIZlXM7^RKy;fIda2M&aoE)Qa-gV~D|K#&A*-VQ3NE^Fw9S%61) zX+QZ^Cocy19{tlummFCj3R(frPezu)mqPf92gzhyrdWes|BpPbXXD^)SXm(I5&UXH zCIdGHWyE_;29g2qg+Ndx%xouqD>Zq;p=Ww%Ibq{^Q*W2gTFs-?UFU+sk;5FnK=_Ch z6YiCGxZRQkIYNrgQFYk{r-vk*BAIz$lC*-94wo&~7Hi%i2S|4QW2q14s8 zr!LKGNe`C?tB2MdVQ!=E3*LWeYtxk@{=`rnLPl7!LND8j^J2wHH>=_xO-@V13c&!Y zWn6QND?D0!P4QpZy#%oc?I+p#JW4Epn&C&mTB7OO-RIJMAcn7A*%hbo<{yXHZDK#` zctKMoam_lrs{~3MfZxYq@cYkXq{>fFU{v~{%(_J!y^%&1en%O`_5W^~G) zZ_o5YlA~#PW4sm!e5JqdbnF;@pr~>hEVJuils`J~*qNG+2XFG$Yu7Fv0eaw0nPh&u z{zp5;+qYiVMT|q`Rk?imIPOQchRspEByL#pzoX}M7-2E;q;KD@eMys{$L|)1ph~?n zJ*z8!ekv=WJ&*6N_&KcCX}#1i9#XeI9wLD`4NmdvZemSPhXcy`zdZPqMDT#0)bA>% zhMODp>C-o80@G=}TKOmc+qrdXl|w+dl|ulGV*)z9H2+w)a@PCPDj$5UMI8j` z2=rO?WQ2jc1rp?dyi`UxWx8TvxkStH_H%fea~2j0{8tv;fH?Cw5)xT;J@tQv8p9Kp}`qfz19)frl1o0+~Q6% zCRU+eY!pZ(?(Jdzsk`TyEt6+&TE5FAWTdA7S)RNIZRjYkWyz$iC7)!!4yry<%<2XPe~zv zFL2?H;lwnY-WQGYum#8d!KHlzK!HkE=p2eN+Tf-spND9^d@}R+^2porx^=soH&q9A zrB=cDc93Si^%X)-b)N`+C|F#C@x&oo^R2%&K|UdDy&;&PP9S5FXpJ7{)2A|35>3a{ zWsr+!Q3;`xS}B3(;gmeSN@y?gxuce)_)eJPwwsevO9(N=-zKHUzXeOqo9PibxKxMG z{3h)o5a$3>K&-!3GAF_*0DGjBQgBf-4;~uqhi3^&kfQ}Q9NwX3%!x%!%bdqLM3B(7 zghQS{{6_2TU%7o-LfG!obIhiF4>dm01xiiXOKV>EF@WCT;bTf8!FhDxMo{YLV>n2J z%XEO638_XZBUdNDIR35Oo|^aX1ulCnnp2mZmnze65XBr6oIxplBq%Kw2KK%V@2v(0 zs@3Ma|C;)Uw}I>te$NUTw{Zq1@S2+CmP)_=Na5x{A^B!6U zr@Sp>wz3aUzc)6-0(S0rdULeTJr&^vpm7B{l=ed!okuJC{>l~sM;!R&AI%D1{8x|U zBwfZMl4fq+v>RjnEe3xs_3!{UC{%VEwFvxVm*s>$DUwC@W%qEPIMt-V`>~KIer!|8 zEf2y;%DSe<0}R)Q#0B=)Idp zOU~gZZni}+r8lg-!4uOGLCj;SeLx**VUQdj3&?zid0ogbGIxKEw6 z+N{>XXJFHg5mwSdT<)-fINlJ%xg0=xv{!m`87NXv_~@pnmBx^JA2g@*oud&920Z>b z0p&i*-{K}}V<7L7`KeS|b)G^Sp((fs+l(|Ex?aN$gr4%C<|p{n!@!Q6=hjWpJO&e~ z#`o0dw#^0f#oM=U>#%y~=o!;w&ki+Gl1KY?ip%SZOrFR1d<&HJmg)#vlgJ>r@Sq*8Yj5mPUy3rvL)PJk<;w27K+NxNMvhz3Ppn%;$hs5dtS){?p$q1<8x(cgxxJxyExzm zbTJ_?)XGu6=|xPFMwmtN1#smD7SdQ z=8tHYBL1L~!%>#C@x)=>YS0S@(;E2$-iy^yF)27iP%pi0{4f%dcH|btydFyY))D5w zUF09<9kdD4M#$(R;Z6W6096sno7naHK??S-ktz*N`rm-xm9Ii$+n7~6RbuwGGp>}b z%uLW|j@tLB@7G-?3TsgcWFlxkFKqw#rEn-N5do+f_59*=08|b&4QSo7HS72}KL)j_ z#WrBn?0k7H-fdM{;FVKE0!Z3?$3UbFW9(_hJWwg_Z4WyS&#Z?H0@fV(NyI^h`sD`v zmJ1e4Zf_@W)5x6gvl$U16G*)PSfP+&4wn|)A{kpr~wAhtA<8Vq-;0+Q)8_jk5l}sM(e*bF|R=p$qG9ecBUE}jdFHbv= z{RL*DFVS^?>gw;GcaGix$`0cUISqyKd!wxahL4)m=LT)wDH!W>8kAIVedK*MvQ6_} zpa{@Xi`BQXQ*XR176X%`sG*sQ1EcJFq3Gv>+KtS&QuS|04mw{R{OLsxUh%)uP#+1fs@tTQd`gvMUO0SM>j3bY;2jgg=Rw(u`S6D^;ndUh?hMHs)ajto5cxntJWtN$2e4ll;* zvK*AYvXjECf4C>V@kP&lXU!T?4msc%hkb23573;^hx@};<$Pv8uW%;o2;l8DW_j5S zNA%YQB_|=yasRLmypfRn17-rB4Vl#oub3-(%bJ;UwRi9d>!0sGe;y(lvT>QO?=s+7 z*L3z;iIhZm|3GBP8(s`EcC) zc9bSu{J#vCmf!E!zPegw9Z2=X`r%uw&*6<-8-@EW6?fo`&&V$|ct@ssZ0nb#1=M6M3b1-l2KpYgd*Wd{%B2c zbfgdOyM+*kgtoXN%_73(8SYkfISt(ifjf7ghrT>Fq)aW=ms;-ZeY4NG5J2k0B8hhy z7Z(>JG^&CrLKp9g=?`;a4Lg_P80&>qcP=!J&}O!;9$!j%4_pfTh=^&i(P*_7J{AP| zihMJTot)=g=oBisPXyWg*9ODCbzfc_YW(jm>A=Vve)Tt>6r3%5IqTssVkiX&{QTKI zABY6u3O8Vp&6NCnzxC`zLX~Bl_(1oN&@wfR&b>(yD)7E&2f6&^P9o@9hTmzw@OAh8 z`|oK@a!)JfW=CCd<(Km)z=WPlq+0YEJHfH4YBaEIVAVv|+aHry{p1f4!CvH7$g9SW|j0#xvM7V9e4 zv0=k($pyegsuST4QZ6*+ln1Fwe_JCZ8*p!Q9n}$_S$3+>b`a0a%WIl`zqoOsLdN2E z<*}-Ek}Fl`*7fz~s6P(g)4?IQsPvM_c!<6hII-YUOaY{kOeWdf{B}gJ1&LNd^3H0# z%DbM@It5DZ8Oe}m?u(>TQA*FMQSj)l;vb#Dl{S(a@ArsL8y9aGE&Y%u&;#*Ik>NqL z_LwGn)Vw|~?c{_z(x}1s_poT#I=4=ZdwT8^Vf*{QxT#SNoITsz6sF6EIQase?nxv4 zJNT^~WLX|Vb(38KcF!^PyQ}tBw_;r!zwe!WIfnjbV&n(xN|O((16V}sa_HgbbnqQm z`Px#emqnPM5fB)*gx#2Lk;SpcVM7h3OeJ__dsuDN`bq6l+_x}!ZV{+nlq#THnk5iN z_3sjn^S=Xv)QM+Nb?ZgHKyKC(G;&ECSzA9A_2+%s<)_;X9HqHfuM@~P*92I%^gC_7 zqU_@@4LCkcffl`t&ixd}%j5lD8$4zb9iPQgxscLpF>;kGDa$+V6Y6Ih=*`Q_JVeuS zeaMSU0O^z_LIq;>;j+E`hQi=V=S@dXQB!<{h!@aqLN<3#eOv7qGyOXs7u>gSZ2q)W z)8i{wo|xF7Kv#9QB}B`27kEwNIHsd|>|s#=fgS3K_{u%37FomLAHC3e_9nofiKky> zmIp_NaI}aBI3*Y}!ZMk7vA{h&x|h?M6!7(lo&mpj=xP7J2dO zt1xm2P6<$n((9C;Cw$+fb{2yS=PsRmKYaMz1YMeIXP&Il?(xOMiYGImT&%$BNAR6ii3aq4rej%7d_PW*@L#V&w9H5BzPDRJz}b z#DAN!HEHw{I5uNs<2-|JD2v$*3cQIFvuRHpfbk)bX2)ph8-DCXXG!YV*htzt2pF_> zMKd3kuP_vQiR3R(EA`7R=Zu@6mCS=1(0iAOT7}oPBSEeGIM09Ps%xFil56Ev39@x~ zT$)1gqVPY_>Q&O2RD7=PTaY-aFuA*v8wMLJyOz^Wb4jej;c0Y1@-F{tG`UvXNBMdF zpo8X~N9oT=%P2P~TRd`*xOr8Omg}dY z4iSjks?EHSXr)ToBmHGueOK%7g*&{P)P3*F1%7_Kb@!A0)j2mG-_GNv3DiUatV2$B z)7s~Ju2^*o+Fdt*{V8W?;S1Q(SD$kW^Tw1rfWltCq@4OMuNW+`)1N=9dNs)9(PE#< z4$N&KOsWOw#_>SX#6&T(dheqbc6;U<eBJPXQm&crUqMn+ zUTg02jhyN?D1bhkqZNZ@)s>WohZ*>P)r;RD(SbMVa==0byl@G@d3;8~J|mC?Z%&3b zP+i@f2_+R?Jz3{veph6mx1S%nF)@xezvy~6FpxLxBdKMF_I_W}B3IlWg-yE>?;s}* z0&)pzt|6{CNeXxC>dCC4$uipRH-g|~MwQb+S zJ5(Dc$^j9iC?XyZ!2(z)Q4s{CH|Yq{1(Yr=v4Tob1Pd(`r5B}lP!I(~K$_A~A@tBf zsNp|1o_o(d_kMjpydQo(oDXO+3e9AnJ6ZaD(!mTkY6UnJaQn=owrfNGyOkv^l6?$;p-K!AvJr>L13MXx+>$xgZ}|~< ztV(YBfUj5sj2tr4!5|=6Ga)1e;%~3ak(k0TOU6_l z0q+-j^BW}AFzU41!Owo})Wu(KGyYf&5S9W;0Xk9bgIcrh>Q{fYDXL|e`rThJ?9aD{ zo5!rb5_rpaf7!(E2(j`@usv13i{3`2g(Hu*14nvxe|#+r6w-J`Dg;4I9Y1TO`(BbW zER^*5pyC^v!(sAwI#JJ_#H{DOtKvsMzzS01xtACtyhu8)a`p{v2%VWM_Q=kq4e2W{n{#hqTCU;e|Z5oadv5n18&Se3sxQp=@~#5 zUEU5~zy|*betzCQ6_OYHO!`?%X7IH&)4c2c_<<&H=DDFmuK5E9(_g8rmvcraEj>Bi zN@Q^vIZ;uEl*Sib^v%43W|G*X+~-GC9=n#_{7Bc}rkgi4l`vj*xvfh#P-1w>!gN}H zoov;<4utLbZ6{ubi0(WlrBQSjXl=7sBdZ?(*8CC#KT`sj_Y(^>6k=^Q7==BKcbc-iT&A}HrP@YGpvA*6qT@hW2JZFpcBWI!tOiE`8;oLwCbJz z7{txN&3FN~Q(0AYZT)*GZ8~NA^!kdpsQunclnK9!0^d1zuG*!YCv0ZAvhwse`{6Dj zJaj3_o3IKz^OaGzKFe|Q)uZOkw^MLi**7a^e7kFSkZtE%y#onO>YH!uU}G))eE0xS}o11MeiboWU5$91l3_wj4X6S?cv z)s>{%CdIZr)j`}5uRii+H>YY-Y*!a=WUvK^w)BLxEm0|JYby?|N%pORR%@}#7q!~6 zY~}|-JI5Kj^lw=J;#h1c_@ zD%r$e;@@W7EgkSb-;qlyLmp0z+Z%bM?Hi!&QX7oMHs^{}ZA*5)^=yUTQ8tOnm}w<> zbL)rZ8ON1o}$`r65tq^v$@UVE6OB&TH6Nc5xk$;2+CcjW9l z0o}o0P&tqbU+-1npfr<+R74oO0g}Xjq%~;-&X$hMd6!Y2q{A! zup^5`j(!z#c5T6iWwsR)1^nYbAMGj*c(A#1WQ_F3la}II&%`Mcx*rFJztIX!t~dW| zDMcf}zVle54^1}m_)_{Q*Wqp0^}X-6q3dWjqMd9_?KbjUxohN3zBP5m^{}$#W(&mxlgnDmZCvsE5lfWr;m(bzISl6YIc3(vCNgV zVp+b-7WVjR^LMt6n*VgBhSGfXJy)9^*gHB}HJb(QK#(iXUc5*N3EA%0 zm3N-^`C)2tx6#<@-cz#DM%7B&Iy)S<$H=YidQDgwPVo-Jc>m;Ol395~{*{t3HOJCC zd+&*hj-J`gP34N-3%i=?zR#zbVUud_%%|~Z%^0rGuF^;mT~cXY=i_q@sBUW@b8l0! z%GX=F9(?p@MS?DE*Z8L={SNESrfok%<@wzB6L&BjGA`06C1rMIMcRZvlgcU;iz8>6 zoIQK{z@;KpPqo+-c1Pj-nI~e!gn=4>aMM9K2iAg%PUxtxlL zJnflfeE9irV^ng?X;CZDwI>ht|CsfYtbLW-f5_p>@nYG@t}?4AxusWvW9yTOjE}5d z<>VZVczGirgwL_1#NEoDZC}KzprCDyF{kzU{pR0FIeK5><$ZqqN}LauLxJKp{;bSy z54XPRSFTw0wfFiQ&DRH*#SFDlS`wYxrjiRCe$>z_2xfwz$tGC(w=DV9Q8u{Gsl17}7v8yY*pZh6DCmqacpxI&}wV`9RPXz6;-<$hrkgUukU_sBB$*zT}( zvZEUCkCdln4&oD49C`BlDy%i;n9kO1+8@;JreqYFYTxPf{hCzeip$y+U&759jl{2C zD_$8pczi||62IRSIsCMDmhpTc!)U$i=cePmk&V8@BB@2CbC$A05&8a%8CKNj&UdxX z=e0ufGd5x2TDbQxdKr4@hfT(sYXdq&U^lH*#0ns9>nCSY;@_-B?TC!bB`G5bpK?m6)+ zBBIWzaOJK-pm=R1M`3p>HJ`L&#^Jh7hnt^z%cay0_tWhi@G+FuYjw?C z+rki=a$RB4j<@+a{WfBGFisO=9!>Y88q$hYR2A|J_=v8 z`95Fr*Czum#a9cv+rN2fT;y!*oHy<_rB&P}#+NBetGNd^*O2o4Aq1M~YF?3vTcu{N zmpVL`@%uFM1uk$rf5mf1T;Ga_0qya9HlEr}t2XW)!FY8CcSHJCuRg$sEIEySfB=H^Zwh0&!POitn?PN@XOw*BVxW5bv;p zh_1cL%J(nz7|-NeiTjfluy^MfJb8s8b1%EgAU;ERcQ2M)YyMTk?;4!oy1D8l-EqU8 z=QlH--N6+8%&~2SLinTk&dY`&bV%kGx<9(F*K1)JgeYmADs&|f#d#< zBWmLiqsQs|f2_1~Y82Wy*Qk#Z-*Ll*yoW}`wo}y6K~8N%!QF z#2iC{lU!QD``3{%(w0?)qnSOG1qFHy&&0Ip(Ju|1#W#Pa?p@eD81^a)CpzzlsjV*5 zyiZy4(VE8oDvw$4k)P+`R|;#&E|;G&m$Uil=eIUa5RYmcrqOb`x(vThdIYQUqzgSF zqfew?sV=PM0%0p_^=@2~`~n;Tnzgh%rvbQ#*LyBg%CT23^{r)P3UxtJ^QOv{`P#{u zPlG9Xt`{9H^&*PrNQ5_8(H-TlSM;-{4OF}ICGiLE5b+IbBxm2zG|a|lG5o*e3!v?yyN(n`l$G?VeO0+vHAX+A}-`H z&vP(&VYf^eYo5yOEF2%t>p!^e>|{4dy;VW}$fjh3-%n<2=ETL65f)m={3{R~4wC&0 zX;s+Okxao&_@IZw1w>oQ99FNX^%SLmSmCrCS`j9IALY2a$}_WM_YCT}JPAYfES){~ z{4FYHnw__uc64&0-aJ9`_Y%){oH#u6+*f+D7nXZsRl0wj(YGlyDokcLO~71&bZidu zxo%}e+K)a1dpK}MU$Q#{%Em5yO{VP@28+xl`O9mKteXnN1autMg1#S=?pu^LX>Cu; zJ;n64`a~lXWp8h&@vrlgtMXonG&Qr#P`#+UJF%8bnp?^(`@Yr3k$FUXlZ4uMxe?#~ zC7r#C><1R-Zl1T0t1=e}kvP%UUkR&N9#-+T&DL^N4POM)(kZ7hMGpsceYKBEzSY5U z-{=r+iB(i*4#O}x2ZyeQ?i;uh_5Gh(ju^&!TNV5LRaA0%oYXz5tTN6t*4IzCGZN*` z5NTv4Dnx4Ic`1MM7HL*T^btLg=Ue?uoEtWC%*G>HA4)vVDyEgEcMlpC3`kg#|XsLeW z?mQ0?U3!o0giK>ollHlDmYxkn`KR>WsfDckbn!*mKndJu)(@{FIPi|BR^Qt7{wSqth5IEIS6bGY zb6DIs%^;V>v_YkqaILf;XuXs8A_Cyo?b{5&+>$DxvZnFc$^9*hGpQ;UxLU@?*>@_A zENm_u`%?FGzQJq~5I#v1AfU<^jtbZi0E<<=8j1^3@-mFkL@X!gtTyLVN=66Zua-PJ z?ffyig)V&2!ali7v-Rc9B-!>0moDi*8VI(|lw7imNWP!F~LMDettI<1X-9G4U(#4b?!v!kQ;0PL=_&mZgcTtBCKTJ&mT-S%!W^L(wv z+k*tP*h9~rbghm^q1gCqtMjuDM~|k^$R33bEn!vwkrN5@Wd2V8XCc+o zb`*){B&)V3DP1cWdR9^Cc`?ReZMe@bv|^gD){lbzA^MSru;&IOng#5D%5wYaGl&AH(E%=#f0yS}oUUB$Ut1z-77z0U9L50H3;j`o`% zMabKCPp@p1{2v5d;x&_Ch7APG8Xb%;v2(VqNgvx z%IJifK|{ML36)2Wp6wLo5f7pq=``_-;pV}P_LNdY{Nv&DSUcF<(|f|+r$Ywvv#-zC>!p}7CCa{MinKsk0y~_ zPG^-}Sd4;yBztVqeFy zA8iFIA}lPN)vb`D>G8=^1o`0PuBsPAXmebRQCSywh+ z?305n#hc{dd-h(?gVy=l7X3Tkq$kZiv-edThhSTXv(C#dK#q_s(m(JKHJYVo`IFS5 zWnTZ_xK~ely6bj&D1Qd^j@QFG45LGwvMZ0wSlkVrw|#dl?WQhT z@{|%P+X~+1T3sRTM$Y{yWEGTg^850@9V~#Tz8Z0pC< zlq)Vp0Z+2#mu#$k&qwjSWxG5@m>)UfM_$2>ac6so)$9^M5O#A%fzLIN^t5>l<*9|i zC~+Sy8`Ik%aeq{(oerk;Bz-7$(JRf^A7ucnC-7w(W51_by#`j)c zhd7u%Qt>4iq3iA7a#(#J=P~gO-c>xfN!E2mp|i} zd4M1iJ33h2A1do+=$Z1!6g6;M&i5Z2b}5D{Jzl|I{?2<^zkb!3eaadheq7~aXrZ0M z`Pa1}YY83CGp}q%Ebhbk3lLY~@m%+A8Jke^X*Rxkd%wV#USa~N{d{pT6jaC5!xs(E^)T7iyI+!2eBxS)t zu8N&wyWirVl8N-5@X38rTqyfs2x9?B`1}&~2nE519X9rA3YQ)Y#5xrwuUxGxZ1wut z*1c&9M2%0H24aP!z1g(>lcI^oj3xM1wY9?T#0ue5gU0S>6V@nJx!+gmeb;~t{0qNI z@|!!Hx9aJyhD*W;aFembUP}Hgz|k;G7Eg}w3&<0a;Lh%3)hIry!#>IPHsc+c^|4aA zn>TL`dv*6Nlj@7>QB%<}n!;Ub_CE!UUJM7nxbpV$)y9_xMk7r-S-7=l#5fXMo(ZkTZ(}4%CQvYJ=jesfNvd_=nojBWw zXWs#_l0(gL2=W*%MSl^{!igIZ5V>26#}J{vm>{r}>e|Uy(PLu{gFCir!eg66h3yBThm> z@W3+<1k7!LgR^T%aJDaTk9>Bh!YFKc8v}3|mpiVY4I>FB0~;E{PDYPa^PR5G;KJmU@+LP*@2H{xca1nJ;|(8-VJl z9EGu9tL>`73u_5_^>HZCvW;70@7xtYW@`KMZ&_c-5Z?nkv!S#j=f3xHS(EIgFA$Ex z+`cWPjV*vq{pZuff*Wsf@@FfwUmVDr4lE-8SqXt* z#;QZMTLWbPIKH(kby>6B`WVLJ+YrT<=+%=MH8iU@KRQ~dcn#-}@r8Ayu%|z& zvs!+LKF#WYV747Razqmj+>)u1@wRVX7vM~EaQk{tXn)WMmAZMepxXus`Ad0uD0?B@ zzOyMJ*8dpnD{mN;iHXYAmS>!q#!JNh^i#t({zh=%J=Mk zUVqi!2dWhyub@xv#>D}}rmQ?>&83u*h~p*eJ})-2JGI9=6&@?zTM{s1Fiv}uNz*2z zt_%Y8fi8E1;fJdsS;>gFzkTw1@^dVI%j!+naFYDfB_wb+fODDW4MGt5FFrq|QxRX2 z4T;u?OhyKdY)8zK5y-gSI52jr#dg4SM#$S(U%o?3?^q5Vwahf@ydw|$i3NiY21$j zM}x+y@}OreB>1hLo>Ze`f`2AkMtXlTyYM+z?9X1Zyr}d2XS8;*bJ2Y{!ZyBR2(nGZ z!Xg10jHZugm8wNaJGUhBJ}=StrXJXPWF6iEcdTK&AGD^Um7u8$G&BIF2nSzs}oy^p5w!;A{1 z5)O>xw28zYn~n%~bu(C`_Vk;*19~J+tcoJHemK?xQZ7R#_=PV%jst7*m*cw)cmhvY zF~i33#~%vr#SStOPG3cNyR90pI12oT`pv8WE;ZTP@p*4WtOvv)DtS1u zcW7+9p)e&b4iD+fId8}Komu&}Fw~{=xpyRZGDcWMZ)W5&jdDhuDu)?mGzXgl`2E}3 z*DriOY{58(*_U0ogk0N-FZ)a9*ze9(yoY^*i-ZW1nc(x>-lH$5NIpVp>Pl^La62r+ zwMgun{Dj#wpBKcHRUutnKxfleSm0yoK7DHLDR!ko=Y|zoesgc9g8QLdKrZirtJ}p@ z)@K_(v*O$4VzJY!x5)WWbS`w@fQX==)P1iH`zTAuUtIZdImc*4;ovbU74X+-VfD5L z1y8#cKXF3*vc7zX)4(-JxkNFl@LH=d$xUIR-wE>Oe-3^b@1s*!z40m^OW^LO$P^2 z*m_$5Eh#Xexx8X1S*+040EYI4&z(K0w_jqLyI~_t?vvyf-~)<=W5SmRWJw-@(&|rL zqV(h&IhXqxN=2yxOT4$tyJ{BuKSckO(R(V!jNKI;A*fRkb-f{q9K6HYG81n|opc~yv7M@IMp34IjG|+~z z5u^?IdG9Z*kK0Tzc#?d=W>_{U7Co;jy;3yo>?|ShXTExc@t~M`nW^iX0H~K@vyEkg z|BpO*uJZJ1BwVF_tnIm#$l>P~0n!Esv*urI@l|bV1fKauI!G-5(d#3_zw=r^)EG+1 z&}%8bD0$kMWoTsY)t>4-r`$And3n(kL+F7yvnGlnbY@RxZiQ*-exSXfX3W_fTlf={&)0;yapzqw~P~czy+Ov_I=QQK1T4+sM@$O>4Iri{{K75wlHq`Juzue+! z*wfRrGwjH=a`O%r)1v8Em5vC9Z*LrQsXEM{KJQk2aHogn%7P6W`vNw649t z;*AiCPAgQ47PA!GY_4|=gW%Y~kuK>uWxPfptcg4Jm7OPf%vXvD{B=YX-LTZ1`K9eW z^l2REhwu&Vq&fp7XQf(ZSmJ@rI@&6=IFNwZy2F(Isxhulu> z-p7H-&(F{4o-DCjy$k@cAGk>)QIXvW54l{6eR!(kcVUlhMI<)E6dh@>aU7`USkq&= zz=YYv4?Koew_^E9mJ!HW4i>|_YZZMzPiCi$^>Rnd7lJT0N?(JN0zeDki1{U&-8JmM z0a+IaoK-;lCVdg8f>XuPxuDKEH#IKKJVks9{skcYz?&QFa4)dK3YVHd#)|y>@pDnpOl@Tgu)uQCmvKxAd=Qzp$E>GC8TDy^%3s(sYt_+#xdDV1-gx?CX72VL zP61`{)1fI@72|nXMUV4uZMq;ZL=SVzqrQ*|cb@sq>ZtQJ`jq>=IEng{6Xt>XzvlIB zDBy^T=Zp{>g^OX6z+tX)WxsjF9+X%7_?phj9HP#XoT{DUHf2&M5}R=~aM$WrApU?G z8w1I=V?kJY)Zx3?B#p|~baQP)_%~Pd(#9h_BjXaZlx|~Jmx-tNQBE(LnU!mY$}e2U z5B&fO%988s@qfl6t{)sk5IP#8q}9fATJpq2|bcImk+^`)L6*N9vf*vaWr!0!mSf$nGs?UBvf|| zCH&~DW?ssbK1-4$?YxTRRaRG%Jm$rw(y;{Cv^`S`#PumiBIY0w#W_Q=RFhvtW-Ln< zelg4@{$y&7f5Lqy(|i`$bg=!Pt^>3Mb9 zh7l;DK%d?@3@6Jee)F&|<>Oc6 zh?~!&0?iBT_4C@=PeH)#^P_=}HTP^s^n|}z|M!*XROnWH$=#iL%4Z=O_A1~K=sKQ= zLdxLa0Jo{0QWX{M557pvZn&*^hPVYml751unQ!PmsudvRba`Cg2xI~MmsoR#mM-AP za|@X7CX89Uam0l1c1Q5wjqrab{}HbU2Sz(&!e(cxBHf3$ zr6vqPx``7L2w`d`S2`4?rTML_245eA)W2Vo>RfZ^44&Xef9K*O<8mU+eWFncq96dh zML)6s3D|*42tEU{Fmrpkb7iY9u;x09{}Mls+4IffqVX%Mvaxe0tLk3ORt+1vbY*qY zqZAb^MNBnQR!`pCQ8ZiiVa}I$UEkz5F!^nISw>DvE;L_O0#`M^Qplbxki0aszNYw_ z5eDD;q-FOf7d%Z)Snl6B0JDS7FlRv!?Z2UR`3BT}A_$?$I6GVY!UZ%1Yu9(Ws1L^j z*n0B-B|bo@71>f zkng$PmAg~5dk%vdxB!zXptQf4>{QF4W)MPOzuMnmACrWYTf~odL@f2vq9Y^IP>K%5 z6N2&Ti&Juw8;Rf?WRsgCj|yE({aKs#qb_;A{z)eqB{?4n-6gT%?9rvj4CrG(=*32g zlRC+i?Ed!s!BP6Z4ui7Yj1{WRLv)CUh6UGNf^gsF?W6o6`_#NextPG$ZjLg@Ex9h( zoX5BLiMp>*NtCQ-3=;FO65?2Y9w`6%)9@m-dyI{G*4DBs(LHk-x0LCU*pUf%o#+Y27O;Fy z&LW94mj1AvNm%l4Wc_BSnTnNPJ$U%N@C)WS4AJ&1f*_0|lX+S4OqdoyAYbnp6IQ9e`^@TfyR~HRj^-N~N{Ti|QbjqSEBHmTFiPR4wRuMiNJ0%fd9 zK!V?V1jMl2gHBrm$!U)OVxHKDO^%qIkS`kbIEC(sh;cB0t%XV`lVEp)U&C)=I>kRA zlk9#+k+j~t$sK2&l(rQDioRQ+LvN{0!`A2aQ@4Fku89?p`ezs$0R>;R@zo8&1b1k8 zHNf=XFyo7Sh<6c>0Q$>-1x6R_YLPE)26)I6r>@X8Bg9X@M-p*c-Q=p4wo*nV95Md! zP4df3tv}V;KMbT}Ol8_q^4i4zl$MSHytvt^Q0cW*%%tJ#@;nE4!Y5~7gs%Mfuh52^ z!BcLJ%{lujSDwB^BJ5vWk+|6Yp?zO3XS2s_9%#@Rt0#{E2_Ja9R2CHM_N)l$a}8U4 zvb**n2lNcIJ*{kD6m+?|mG{ffVm~6WSxh_N=P%P~05|-*4 z8>eX0JZ6C~?}a5A&oPnPjpQ;NxaX@?nb z6J7YkOp9Ni21^J-TPnL4#>Q!>lfV9~kixn2!IyQ=7rprznKT6HB!(h?0WvfM1Ao(q zb6{-bVq(&sGSe;pkL)Y#AdTN%Q4$XhHjvt`ezHPXx;ZsQza4f6fz2Aq@7&t)P$igm z<$R{N5uE!hR&jFcv8XQNYe_cLqfq*h_wWUf`$S4t)e>WD$IB~@aosuYmT1UebNQAs&46(z{Is%_X^N7-bCI>q9 zK^^C@%--|t#Bc#r)(3bfe3@{4YVFb1vIo8BF-N#zq>%i}3c6of)N>JZGc=)e3 z*~oFeOZ!p%0FLyjb>2seQg>po112}}zJ)#%1RkFM-8`hM?(U_W#7{8m#DiComXHkU zu|klK(NiNnUK5le4G7$6v1udu+`vd%Ut-2QiN;?41`!73Uj8jtozuKqKYa!@|X4PbCt@&jOGWK45ymz$m9Ib?X=~?PhX<>@~ZUw2&m=qa=SV9Iu!~Z zTCZH-JkC`~=4E0!6;)Lq z7}9bJeZI>wpIN7;*iAs$sjFk0fAE#;Y^WIOQ`Et-0Co!bnw4&~9}8aL(hgT>*|}h* z3zJcFQum=%`>9*j?oTaWJKMR=m$|SoC+BQN)%g%7mu=}>k-7U=MLfvgKve8!$?Xt- zT>l61PL2hBN8=Fy$HG$CSCm2gl;wd7JpJFeIyc#t0t-UO&<)#Mvyp#g-Jh5SCX5Lt#xbHJteV+*g0= z{nFd-%$}I?eDj!fv-!{x{gMfz`B08f6^)MRcBWjZ=`xyK@0W)}_5F-uG|J>Vpw^iL zBX1*#pZi`cJKw$B;uhQor}qQ+osEDWqF~`@9*3oeuLv3k1vo38xp(=_+PCdW`QUmJ zNS$lzFS>sLfNz6s>f&B9hP&z3OvKwV4uAslFMyfWmFtX zw;hJTWpD^VLjnYMcL*W427(Xn7TgK$5E3jva0?zZ$Uty+Cxg4YGmqTd``-HQ_o`Rd zSyg>%clWNdfAl(CtNaF0;d517tIx0cQ+LPgxm(^8D#@g{J#SNLR0~ql~)jfl}SaNSF5rI;C#DqoAjIjvi zVn?hd$_n1=5NA7qg7G1cGJO5mpIC4VXlC@XR3ya=O0KUI!@6PTudf3()LD@gn4D7!C~BlcTHH(MF8(M{QBeyfO-UAl zfj?H4v6})>z#?|!ww#uOIM-_OP~NFwXj5HYJ4cm+f4TQi${x?1hZ{&s(NFH^*L^

N-%(rm#D3fEyqPyp{ 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 cFN#T6{<{9 literal 0 HcmV?d00001 diff --git a/resources/calib/filament_flow/flowrate-test-pass2.3mf b/resources/calib/filament_flow/flowrate-test-pass2.3mf new file mode 100644 index 0000000000000000000000000000000000000000..4d1d0c369d5a0f511aa582c1e68300947d6e8c24 GIT binary patch literal 123202 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

;BZH6nObq zl5=C*yKI(s&0M%x8wMmy^PL@&HNT(so704gk0zXw-t?J(taTo6BbzSqUlrN^0IzkW#dCRG$iPAVZ=Fg2M(<9z; z-Z=6j4sOBq)g`;R03ZG21b4?DsL1)7yZM|cADZKb+&T_(*bn({gMPuEZA7vyJ8uA2 zB5;2&mO`^z6O1xFe^2bkX9FQrZhdwJqjLTa=T9a)heL3{!&`X;xDRvG^Mz&yBkArp z{naSb^Y-&E;`iKVC1}w_?-iC_!9r2eW739|n>tYOO#st^r@h+fY9A{qj9rafP@a8x z>cP^dP(1B)`@`#&1M&m?9pBvfkT8hN37>q4XY)tDvJ5hDn8gDBKgcBV>yt7@S)DdHQUCX$S2Mk=QyAW-B z9PIr0p-*Hr^u`VruS^yil1q#+gjE@>)LY+GY?kIev7CG1+eqxY^e0fa%_ZBac%9+G z_WL9WaHqgM1|BApuc{%ramq&3>l$T!8GdHi4^{oJTunl#JI7#?W2HW8k&o1HxXn~LM_lwT6R z(9F8)R#6M9VZuOpYg@wHOrMVT;w6-Ty!hsn_OdMVZUeK67hgexa*8Oz9Kwtsq>9SQ zc}Mz!Bb8cpJ<=pX#j_4)gap2V(gv`^cL0%wWcQr7u0*0J@~MnnaQmMKzgDZ1xbP$~ z$M#zAy&?XSGn!XeA$mixP&}fPlI&$x|F1&b0&k0i&cR}wPIasU!HrU~#wN+e`Bj7O zuv0vTq9tcfYnEi%R9!V{(Peoj~++VgY%Y6BUzE)mxB?izbn)mQaN284^d%vZa@xSaK&D|D^)rS>X`_gE zWiWOcFTdNYM7RJl#q0-$tD0x-Sye?O#KhFXHV^s+r7{E!?CP|tJQ2Y?1!yN72Q>%e z?sdrVsQGP+|B&Eem%y*qb7vszO2fRpIH~X041R#f zWAg{Fk7l1C@aBTYf9hgD-)@t}3ddE09xTp1(>F~9KJWY#NjY_%Q)xIFZBF*_m=Dz+3CU2c<1VPFIj^gu0}i8$XZgAlTAO`QR+js5v(q~blo@xf z%)6G?{(=kGo)e4+-%M`X5M%tJE4KwALkgxeR%_`>ylwFJR6S689E$O4A z(VCO@bs<^8rD%}|fKCiHt*YEv*dt~g_O{u;d$H5w1s4c&ooRVpDV>F>^Jau4E#T1| zzL7K>9Mbs?UXE44yPAS=uO*RR(&pZyFFRoSU$0_Ah|_Nv5!?@H426x? zxRewo8^VZH43~Kk|4N<~bG!IQ5C?e&nGnh}sCeA&Rcymz(J0rlnga#YwnNjK<4@dLMuPa!vDLxq<-Uo(6$n)DWb7fc;r=su|QoON1K zvagPW`lEzBb-uSn8Pl-);v^>N>WxhTleMxxNE%=ldDYIS&MXq9&WzxkV7mw1BMvb| z?B61?$M_Isz&#aewmbjYi;%KAEPd}8Y)No=*;buae*!~TmW0Uhbjm5pYQk(1h*Gwu_1np11)ZH#(^e+5 z+yuJ;_*k~iJJWI7HiV?6Q(q4m^Bxx^#5|7VGS^|sCXLtq4yfS}$PWN9^TSB&uyu{f zH><2YRX&2q>pQU8BLtkWM17tfpy$8){hAwy^;g5`uxL-3{TBVEm2|msrIh)2k|jh8 zRkR?rKCb6O5L(E-p%iuzR!E&F;c+0N=+e1!Qlo2Gk|7w>>$1O?&A5I=tD>p6uoRwz z&YD9~N=qqAed5xx6hEa9b9noWhSz&45BsgkQCnl8Bab!FUFnfxi=%f{+L8(u?2n9G#cb$C*3r42QzF<=Gpu4dL!)fF|-A*Ld?B9lkD zx^`e{`D*`+ohJ&a4?s)>G^&t}zW!+=1kwI|x+cWqpm9=5_fkl%efO)UPgCV&6jK+G z46(j-O4Bm(l$o+&j+<8UZ$NmjJ+X4<{o``P%8B3njuA$i)?ND@qOITERbXSNy^rKa z^T;d3F$9`dCp-fM_G1gWv4tG-&p&b??7NbB_>#7^t`b>Y-)!w9DwmZ#BByn97(;1! za$X4%=(QX}w?596WGfF{O+rj5Z&NLHMRR3gqQz&b7#`(tkgUSnr(EpRd%`~5_cGf$ z3zcA!K0R~D4-!Iz%sB#WmZUqs#9MCA8xVoAuYXcXnwi-S4>XdU1I8&x@f68rG@`y> zF-8~f6TG6!6k%b6`zyWSv%y$6$V#v7f$89Kx&{Zc9n)iU15w7&U3fMiUBM#v;NM;V z&T*Hf(fSWuG@FNN#J?7<5-$oyVf|hwMlX7)(^NBeA$~BNxmn3c80?ciX5pANnb6oD=YyTLHRhzu3?z5Y9C&onT4n z{VRDHnW-DXq?oUyGMNAh&e)E94U|kG&~Ju0DWb_KXSt0|?IFG?XnyjY8Ic8EOJwJg ziO`R}WtANnhcWdfYo;KJrE@+#afVqyEAvlM;4lDP*ExzdS5H#@=s?1`>1r5fNIi%H zwG)EX=pW(cSL5fa*GcB~B0Rx~10xOdQ;uX;VZc`jAGvYJhMf`;=j5Z#S(ZI)S~#8R zN_D-v*UBvQsm%U{t$4A)b5$jJvet%kGz0x#aCXUz&2uzs?thbZ+kU<4oHA4a{=Rm# z$h0tp@Tb5o7Tqr;r3E|NNI8pqzWLUwlb_fIv41j$s-QSY~1(Wk#+pqz87fH??%sLIZqa!1M|R1<3#Ag6J@}?zTa# z7$@FHP-?G9zTiQPu`8pqQ;p#@+Vpof|2CJ7MZc0J?`ux{%LVEm(R^cvqbYXtzcb9J z;z^g)9b=QD%_;;sLx`Z9A!>kdoI!|cV4cEU5XyZ?+X|#HBd|c<`$vcsef;m^~?O_a4i$C%n=8e5i zu{{?ty{Ao@M~9T-=Q4ywgPShhoMH$9YfCdptM1*Be046BOYr9vdvmpB>hfpdoudy- zJu9<|;##ezlG1fQf849F@z{r6yJtTy1S4>H|Jr(A{Pmu>!$@f-NBd*S@#(xvnrPUArT$+;w)oFcg; zkIvZQf0ZX*Ok;IAV(Uidf(cDku&ey+elB`+C7ImbnP%;0`tMc_S$fZSD;-_m25cIx zp2k}S9T8P9_KK#uJvUC5w8vjPt+Q?{0mp?ljNKqD>nTjjb8^doyIpr}rF1sq{rDy3yY- zwW2?Yb-TjeJtwvIcE^o0CXV)(1F`tZ{vttZ_mO`yd(6&Ah<~F8c3XP1Og1qAD*013 zC(@7}CU}^IX4+Kx41mGcau|`Hc$$CDB)8jRkjO#jI_&sL6lGaKKmda&q||*t^#ErD zF&mudh1nN(oBTGV&-y}9A=bs19HoQ$8QBn*RTcI zk_bupMrtOagG_T7hxSRvqy`46!syS8rg5;BWv}8&&L_<>Fn02Z%X8{W}{&;VhvsN!2J?VLxSIp|9E0*F!UET957%)skPoK0&57-7nU%yZ@%B{iWjR z?}UGU!h z`$~}7;F3i_xA7<}%y|q%61x!WaPC;#5R*U?G9jjAH~3(rxUos9n$78m)UEGm-YP5&DJ~tl*=5fF zCJWH(_r+4s*tSNU9^fjzVl>8oz2n?#$p$;70A;RZg*uO8?X1dJSo>kwz?lrqkHc1d z^-2S@mSj&_M<^*5vYNEG?;m~z;bC|+Vm9e`KO=M zX&{Y+fwl$!1D}FCxJrBlp!G+}wp~a6CSG>k7>aspESa~xsl+IT%0_qa$fJE2|2yRY zMTKLAI+1vV-4%-)saVk|p4~zUpjqTLO9|$GRs+$%JMx^-fR1*l~4L|otY9jNs9vEf8q(pyUV|RS~>fn-2lZu;>O3N>~iHu%gFIR z@*=8JDPp=0^(=zzt745oqyTauE`lRh{v82T<_Ra}mbutGqLKv9@1lUWXQWI)fB}DV z#<;foz(~Ur`h(l-z9D+SP~5W3#l6V!|2We!G*!(`GqdqF0F3;H6E6_ki0nNDOX^dV zz7ZI9oj`2%0WE`tg~isvVPW+J>V0;pHuG6{Cnh&}?Bdp{Hr$&#ltLBMT3Z|2ZBc%I z>8-yy02px-(*!7UEpWwy(b3T249#Ci(2MV+!Gmma#lFR+9NFo5f}tO9Z`hJ1*yq8>OxoIME9}3WJ7p$2j@Wt^72@9L2?beE8ys1NI0}NO^L?P3m^4+nO>9gP%fY9_$ z@cZrZ;2i;Ui&Ar7!KODir?tbRsdxlyB#)RBsz*}NI#?@pmoy<@0MIF5_3C}o-(8eaQUlq9k#WQ2cTnVSaY zU~crW0*~XG*}nWuCp#|y%G*FIU+pg-t7mX(J_lR&-16CCe}Y}R49e2Jd?}=>uU}@U zf&?)^{t+pqiXj}pIM-P!Zl~6<3x*Akywd6jc`XS; z+%_b&Y-+y|3F69z)%pOy;b`5fQ`M5IRwOgbld#vVce=kfy*WK5rnr4{*i#?%d!%p_ zav3tdmV^}Yb@u+#$YZCBFs-kk&*-U(Di67oak@N_lmdyRc%f|!c(gNT&kD_X0`WBQ zNN>coOffP7p9Tay>vlz8)zDhjy0$3zw{~h|or2WmY;d5ajTHJ?) z_~kNi7KWyHU4{Ntj9{ObO~ld97U{rDr2xw=stEp*e<${*Rud;n3SGZ36LliJK9AY+1Wk2X z0fBogvwZ@tapzieFcx+0{c*vgTEgtT!6oH|eRvuYdI60DFNcK=b40UCSNkH9mt=a^ zJv^FW;KdbxMQvglDE@Rl%+_|X!XfXj{Yew)S%w8=7hJ}6zjJw=$5ax=_?QgF#L#>a zd=I_$ZBwzmB|du8gS%~=2T)W=w1#IGU{C}G$vH`ol^_`e$ucWx$T>=8$V1MOL86Kv zIf~>YL4uMb=bZB}AV|((9J z%GGne%I9Xcv|wQ0HSN;Y96!$5oV6W)0^OLV{wn=J3Ud@23=Vqp)a`n-;^j*`)JGfI z&k>v{3oY{thl^bwCPRbyy*~%~?YD8&FO%Um2uJg@py^+gR`k!lk6UDb$evU1W>#8O zg$IZ1Oq=>ipNA{E_(*GCJ$6(K=r@qq1u>konAVv0o|hE6`s|{(LIcQqpQXSoG>yQr z-#ceYI$TXQl`bgv)DMnlFPhiRHblHb-(o4;oV59;C05^=5w~VLe9#^9(Zk%ez{|At zBEB?ysBZUj#9+NR%3y&6b{5Bu@{y2Tjw&gRba6b#M}cKwsL?X#TO2p7@8hB)>%2rGK~%V^rww^a-JR3PXWyKHv2s9 zDPyFvq|Iu~kUqUSh=#pNq*jiBgoow{eu{ozO z&$Z#0^@#rQVd72Xs0!7wzV`SrX@XDHy_YHLW#D3(vZs)9?48^zGJAnQ9#rmfyv2mV z?XE7xfPpd3iH{3xbdOfzshpGvFi)w)*_t~FJv-$`%9pSpIL{=CF`&Yty`hgJ)1rba zq?;C*y16dT?p0ZS^HE=0nXq+=t)6N3%Y5nG&9xm|=D-Y%Z^`HWw4I95Q381SY7NUA z#^6>nW}OVT=4X}mSwh^D<9pKc$gKGvnpz}Ys=ST6fApPwIw8Jp*`LR*PQ0w2xhKGO z*laU3qSC#_2)Us}K<6b20upBXHTAr@2+P1@mu&H`HhP>;CIs!CTKC(r<@4UfrQku! zmLB!+^Ap7hg9Kam($1Zbx{m}npVA&29PiWZ&RPi!4tNtc0hz+i(#7^a2@2;$CL~(Y zaL&Zs9kT#fqr`;x7V{hO=g(V^V!4mYR5;Cc|0KnXkg%XAXyU)Bgq=iwmZr$+$wn{Sw*JxK4{{ij~!FEcf9WU8cwS^U|b zP44~>o7(iJuc|Zan>Ofr3uII0dv?*2u)(sbvbzjj*ZnH1Hi~#VZdm#~HmTfN^C1+1Gf;wm}Q&=&H#_Wg+ zyaVH$ir%377B-D(*k93S41=JnH>2Qe)q^%4KxH&L@igu7bT2WnCNYonsY+j zXfT;pZWd|O8*0B=sf1uHLkRl!x$ri3&%W}9QMPJQDd*Vp?L{`&bPKNOCE90%=org& zOH;?ZAFxinXJ?aB^@qV-W^NN13k91O8l&CNK_sJJ=2qxh>)D3WlEbVuL0bH z995h=FpY1f*bFtw1Lvjnd|*Rts7rLH>Y*63r0&QQW;xFc_l0~UGXwEOT=`z_GGHWr zc09A)HrpgxI9!lw;sc+c7uGwp|&1ROG3tLFACBWj&4p{r!wvOzzqT4zfAW(2Wo@8BQ;Vz13d{Q!#WhRvN&nZTUaT(2q} z(j38dcz0H%%W`eHpqTi* z9hTeo_tet~oHeTFu?*r4@h(^L)STAT9S~dxO}kOqELG=<;TjdHCe!bvnT-jZqVC#_+dXt*{r1~@uL7eP`XzHBif8s;1=7YS-TD^{s z*i1f;GpNaI$)f2yvKQI$yLY>ah_;tstktE0tURf9-oQUC2^HLTYDFnaL|xG(1@tub z+#K-{82Nh4VAC|ROORzptwdo0NjqMgq<8O-$qTAh7AwLc=&=dc9kG}6fEAZp$U2si8DAFA{pryyyD92MGUM#4$}k6zdj6-fI2RrBGDi)ti zl*?4YE)_DS=7^T_p_>a;<*~}ZUN4pUbpwZJ9vdzxOSRUesqu7iDO$v?WX}CQ{LkL9 zy8sk7bTlY&bX6Zef4S)79!D+iI!GzY3tk#8pCE{%PwQ)f0)uM-k34=avF zf*pwyB`+`88i}Wfq&D6iV@;GZNJ?QAx5UeDxX;lK6R~f9jQ()Pi-l!)$mV!vmH&zs zB(mzX^W0}m-Z7o3Mf z91(W4PQZ;%)D{nSeIA2exKb}aq!*$(^0W4X?=$-aPvpGNlUfxe?fdxMmzX;;@_>Mh z!RYL$1HLsH@*LnDKWp406W)FJfOD)u75!`!8B*DtUh!k0Ji*!8Qh1}OT#LgGRf^=`iQ~^xmVyy_3 zr(Z)_It-8%7KRl97!c`pBAQM|#`$+R$Ztl5TwKl*z~<`02q^meP?{TN%>TLw{Ys)9pDVuRi016cvPp(>Pe(T^U>uF*g`cC)8F)g6R-~0TIC>3K|8vOu%--$mr zNl9bo0&k9Bz@>n$I*94*y>+K|u?w`kOmlYInoA9^7q}jXp-uxnH42D*HBx%2&A0?J zhL0AEBx(|5O#Tk`q_Jd2yKw|s5BpBlj;wKNu_Jq zx7EuG^7f(A2&(nJoN6OZBh=?2kzS{r4bmI=p*1$ktj*vpbf@m|{ z*C-ZT9QD0Fk{QgtK^<0P*u^tyBK;#cU-p63hCc$Xoz1`eY>}_;;*;I8vK?IM5-!4a zhd@E$n}n;c3QSv?D6xAp*93QXtx|XA*`>X&mzS>tjOzm83w-Y(X&jrFS zuM04i)l%-iX~T%E1V}gFyKb_`Skxc4=@!#zUcMpZ?BvESSN>J9ML%%Zaiufw*~wR$XlRZVF<~_9LorS`-WIPdSZ_L88z4(f;tr2t;K$qo6)t>-=uP z)y@EEu#^m1)=YcRMd7<%oU5;#b9oLOPBFT&8t1~@h5BLx?YHc2xrs*R1@?;9h%%IU z5pirnqF--}k0>WCUZ4Rmc@QQC006+by>6{K=P3GjAp#Hs^rRi^5$5&?BXv(la~A_n z4?8#z00F3D{M8%q@CfAjq)L{uX7%^j^$dZ-JIbZ8O zq9Iv9+Gx&mc#WsFYq8r-_{|I?aFAb|3*gK8G$rVqUFs3n@S&*p;+UA>4(+$Gu0Xb@ z>~H%3h97ujBz_=Fj^5W%dy{n1SIWb>0nEu% z-BOXLvxcgxFLx`$83ZN{hC1kL{^mc zrTlMXxVOlRoXz1bT%14cPgEJeUyLSxqk0?HtAu&`Jv#aRj3Dg0#)z|fPV=2Ou(7D+07Yv8b7M7z`Yqeu3hCY(9YFD5i z{kTUN^s# zXAijbKU;ZaxOmO%9L&t&oPSv$fEnY6;GF;U5dRkc zXRQ2N{2!4+{-4M(S@>HN8~f33I=`6zs$l+Z``h1U>R$!1_`l=8KO2^oe${_km^{{B Q*f9Z^fS>(;k_7<%2h^&+)c^nh literal 0 HcmV?d00001 diff --git a/resources/icons/check_half.svg b/resources/icons/check_half.svg new file mode 100644 index 0000000..bc99d2d --- /dev/null +++ b/resources/icons/check_half.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/check_half_disabled.svg b/resources/icons/check_half_disabled.svg new file mode 100644 index 0000000..1e6fb24 --- /dev/null +++ b/resources/icons/check_half_disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/check_half_focused.svg b/resources/icons/check_half_focused.svg new file mode 100644 index 0000000..517bb7a --- /dev/null +++ b/resources/icons/check_half_focused.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/check_off.svg b/resources/icons/check_off.svg new file mode 100644 index 0000000..cf58fbc --- /dev/null +++ b/resources/icons/check_off.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/check_off_disabled.svg b/resources/icons/check_off_disabled.svg new file mode 100644 index 0000000..8653c1f --- /dev/null +++ b/resources/icons/check_off_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/check_off_focused.svg b/resources/icons/check_off_focused.svg new file mode 100644 index 0000000..474375d --- /dev/null +++ b/resources/icons/check_off_focused.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/check_on.svg b/resources/icons/check_on.svg new file mode 100644 index 0000000..029abf8 --- /dev/null +++ b/resources/icons/check_on.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/check_on_disabled.svg b/resources/icons/check_on_disabled.svg new file mode 100644 index 0000000..dfd917f --- /dev/null +++ b/resources/icons/check_on_disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/check_on_focused.svg b/resources/icons/check_on_focused.svg new file mode 100644 index 0000000..3c1c56c --- /dev/null +++ b/resources/icons/check_on_focused.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/checked.svg b/resources/icons/checked.svg new file mode 100644 index 0000000..88747cb --- /dev/null +++ b/resources/icons/checked.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 0de0b4e..3f432ae 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -35,6 +35,8 @@ set(SLIC3R_SOURCES BuildVolume.cpp BuildVolume.hpp BoostAdapter.hpp + calib.cpp + calib.hpp clipper.cpp clipper.hpp ClipperUtils.cpp diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 5f80a02..9ed53c0 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -162,6 +162,25 @@ std::string GCodeWriter::set_bed_temperature(unsigned int temperature, bool wait return gcode.str(); } + + +//B34 +std::string GCodeWriter::set_pressure_advance(double pa) const +{ + std::ostringstream gcode; + if (pa < 0) + return gcode.str(); + else{ + if (FLAVOR_IS(gcfKlipper)) + gcode << "SET_PRESSURE_ADVANCE ADVANCE=" << std::setprecision(4) << pa << "; Override pressure advance value\n"; + else if(FLAVOR_IS(gcfRepRapFirmware)) + gcode << ("M572 D0 S") << std::setprecision(4) << pa << "; Override pressure advance value\n"; + else + gcode << "M900 K" < + +namespace Slic3r { + +// Calculate the optimal Pressure Advance speed +float CalibPressureAdvance::find_optimal_PA_speed(const DynamicPrintConfig &config, double line_width, double layer_height, + int filament_idx) { + const double general_suggested_min_speed = 100.0; + double filament_max_volumetric_speed = config.option("filament_max_volumetric_speed")->get_at(0); + Flow pattern_line = Flow(line_width, layer_height, config.option("nozzle_diameter")->get_at(0)); + auto pa_speed = std::min(std::max(general_suggested_min_speed,config.option("outer_wall_speed")->value), filament_max_volumetric_speed / pattern_line.mm3_per_mm()); + + return std::floor(pa_speed); +} + +std::string CalibPressureAdvance::move_to(Vec2d pt, GCodeWriter& writer, std::string comment) +{ + std::stringstream gcode; + + gcode << writer.retract(); + gcode << writer.travel_to_xy(pt, comment); + gcode << writer.unretract(); + + m_last_pos = Vec3d(pt.x(), pt.y(), 0); + + return gcode.str(); +} + +double CalibPressureAdvance::e_per_mm( + double line_width, + double layer_height, + float nozzle_diameter, + float filament_diameter, + float print_flow_ratio +) const +{ + const Flow line_flow = Flow(line_width, layer_height, nozzle_diameter); + const double filament_area = M_PI * std::pow(filament_diameter / 2, 2); + + return line_flow.mm3_per_mm() / filament_area * print_flow_ratio; +} + +std::string CalibPressureAdvance::convert_number_to_string(double num) const +{ + auto sNumber = std::to_string(num); + sNumber.erase(sNumber.find_last_not_of('0') + 1, std::string::npos); + sNumber.erase(sNumber.find_last_not_of('.') + 1, std::string::npos); + + return sNumber; +} + +std::string CalibPressureAdvance::draw_digit( + double startx, + double starty, + char c, + CalibPressureAdvance::DrawDigitMode mode, + double line_width, + double e_per_mm, + GCodeWriter& writer +) +{ + const double len = m_digit_segment_len; + const double gap = line_width / 2.0; + + const auto dE = e_per_mm * len; + const auto two_dE = dE * 2; + + Vec2d p0, p1, p2, p3, p4, p5; + Vec2d p0_5, p4_5; + Vec2d gap_p0_toward_p3, gap_p2_toward_p3; + Vec2d dot_direction; + + if (mode == CalibPressureAdvance::DrawDigitMode::Bottom_To_Top) { + // 1-------2-------5 + // | | | + // | | | + // 0-------3-------4 + p0 = Vec2d(startx, starty); + p0_5 = Vec2d(startx, starty + len / 2); + p1 = Vec2d(startx, starty + len); + p2 = Vec2d(startx + len, starty + len); + p3 = Vec2d(startx + len, starty); + p4 = Vec2d(startx + len * 2, starty); + p4_5 = Vec2d(startx + len * 2, starty + len / 2); + p5 = Vec2d(startx + len * 2, starty + len); + + gap_p0_toward_p3 = p0 + Vec2d(gap, 0); + gap_p2_toward_p3 = p2 + Vec2d(0, gap); + + dot_direction = Vec2d(-len / 2, 0); + } else { + // 0-------1 + // | | + // 3-------2 + // | | + // 4-------5 + p0 = Vec2d(startx, starty); + p0_5 = Vec2d(startx + len / 2, starty); + p1 = Vec2d(startx + len, starty); + p2 = Vec2d(startx + len, starty - len); + p3 = Vec2d(startx, starty - len); + p4 = Vec2d(startx, starty - len * 2); + p4_5 = Vec2d(startx + len / 2, starty - len * 2); + p5 = Vec2d(startx + len, starty - len * 2); + + gap_p0_toward_p3 = p0 - Vec2d(0, gap); + gap_p2_toward_p3 = p2 - Vec2d(gap, 0); + + dot_direction = Vec2d(0, len / 2); + } + + std::stringstream gcode; + + switch (c) { + case '0': + gcode << move_to(p0, writer, "Glyph: 0"); + gcode << writer.extrude_to_xy(p1, dE); + gcode << writer.extrude_to_xy(p5, two_dE); + gcode << writer.extrude_to_xy(p4, dE); + gcode << writer.extrude_to_xy(gap_p0_toward_p3, two_dE); + break; + case '1': + gcode << move_to(p0_5, writer, "Glyph: 1"); + gcode << writer.extrude_to_xy(p4_5, two_dE); + break; + case '2': + gcode << move_to(p0, writer, "Glyph: 2"); + gcode << writer.extrude_to_xy(p1, dE); + gcode << writer.extrude_to_xy(p2, dE); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p4, dE); + gcode << writer.extrude_to_xy(p5, dE); + break; + case '3': + gcode << move_to(p0, writer, "Glyph: 3"); + gcode << writer.extrude_to_xy(p1, dE); + gcode << writer.extrude_to_xy(p5, two_dE); + gcode << writer.extrude_to_xy(p4, dE); + gcode << move_to(gap_p2_toward_p3, writer); + gcode << writer.extrude_to_xy(p3, dE); + break; + case '4': + gcode << move_to(p0, writer, "Glyph: 4"); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p2, dE); + gcode << move_to(p1, writer); + gcode << writer.extrude_to_xy(p5, two_dE); + break; + case '5': + gcode << move_to(p1, writer, "Glyph: 5"); + gcode << writer.extrude_to_xy(p0, dE); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p2, dE); + gcode << writer.extrude_to_xy(p5, dE); + gcode << writer.extrude_to_xy(p4, dE); + break; + case '6': + gcode << move_to(p1, writer, "Glyph: 6"); + gcode << writer.extrude_to_xy(p0, dE); + gcode << writer.extrude_to_xy(p4, two_dE); + gcode << writer.extrude_to_xy(p5, dE); + gcode << writer.extrude_to_xy(p2, dE); + gcode << writer.extrude_to_xy(p3, dE); + break; + case '7': + gcode << move_to(p0, writer, "Glyph: 7"); + gcode << writer.extrude_to_xy(p1, dE); + gcode << writer.extrude_to_xy(p5, two_dE); + break; + case '8': + gcode << move_to(p2, writer, "Glyph: 8"); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p4, dE); + gcode << writer.extrude_to_xy(p5, dE); + gcode << writer.extrude_to_xy(p1, two_dE); + gcode << writer.extrude_to_xy(p0, dE); + gcode << writer.extrude_to_xy(p3, dE); + break; + case '9': + gcode << move_to(p5, writer, "Glyph: 9"); + gcode << writer.extrude_to_xy(p1, two_dE); + gcode << writer.extrude_to_xy(p0, dE); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p2, dE); + break; + case '.': + gcode << move_to(p4_5, writer, "Glyph: ."); + gcode << writer.extrude_to_xy(p4_5 + dot_direction, dE); + break; + default: + break; + } + + return gcode.str(); +} + +std::string CalibPressureAdvance::draw_number( + double startx, + double starty, + double value, + CalibPressureAdvance::DrawDigitMode mode, + double line_width, + double e_per_mm, + double speed, + GCodeWriter& writer +) +{ + auto sNumber = convert_number_to_string(value); + std::stringstream gcode; + gcode << writer.set_speed(speed); + + for (std::string::size_type i = 0; i < sNumber.length(); ++i) { + if (i > m_max_number_len) { + break; + } + switch (mode) { + case DrawDigitMode::Bottom_To_Top: + gcode << draw_digit( + startx, + starty + i * number_spacing(), + sNumber[i], + mode, + line_width, + e_per_mm, + writer + ); + break; + default: + gcode << draw_digit( + startx + i * number_spacing(), + starty, + sNumber[i], + mode, + line_width, + e_per_mm, + writer + ); + } + } + + return gcode.str(); +} + +std::string CalibPressureAdvanceLine::generate_test(double start_pa /*= 0*/, double step_pa /*= 0.002*/, int count /*= 10*/) +{ + BoundingBoxf bed_ext = get_extents(mp_gcodegen->config().bed_shape.values); + if (is_delta()) { + CalibPressureAdvanceLine::delta_scale_bed_ext(bed_ext); + } + + auto bed_sizes = mp_gcodegen->config().bed_shape.values; + const auto &w = bed_ext.size().x(); + const auto &h = bed_ext.size().y(); + count = std::min(count, int((h - 10) / m_space_y)); + + m_length_long = 40 + std::min(w - 120.0, 0.0); + + auto startx = (w - m_length_short * 2 - m_length_long - 20) / 2; + auto starty = (h - count * m_space_y) / 2; + if (is_delta()) { + CalibPressureAdvanceLine::delta_modify_start(startx, starty, count); + } + + return print_pa_lines(startx, starty, start_pa, step_pa, count); +} + +bool CalibPressureAdvanceLine::is_delta() const +{ + return mp_gcodegen->config().bed_shape.values.size() > 4; +} + +std::string CalibPressureAdvanceLine::print_pa_lines(double start_x, double start_y, double start_pa, double step_pa, int num) +{ + auto& writer = mp_gcodegen->writer(); + const auto& config = mp_gcodegen->config(); + + const auto filament_diameter = config.filament_diameter.get_at(0); + const auto print_flow_ratio = 1; + + const double e_per_mm = CalibPressureAdvance::e_per_mm( + m_line_width, + m_height_layer, + m_nozzle_diameter, + filament_diameter, + print_flow_ratio + ); + const double thin_e_per_mm = CalibPressureAdvance::e_per_mm( + m_thin_line_width, + m_height_layer, + m_nozzle_diameter, + filament_diameter, + print_flow_ratio + ); + const double number_e_per_mm = CalibPressureAdvance::e_per_mm( + m_number_line_width, + m_height_layer, + m_nozzle_diameter, + filament_diameter, + print_flow_ratio + ); + + const double fast = CalibPressureAdvance::speed_adjust(m_fast_speed); + const double slow = CalibPressureAdvance::speed_adjust(m_slow_speed); + std::stringstream gcode; + gcode << mp_gcodegen->writer().travel_to_z(m_height_layer); + double y_pos = start_y; + + // prime line + auto prime_x = start_x - 2; + gcode << move_to(Vec2d(prime_x, y_pos + (num - 4) * m_space_y), writer); + gcode << writer.set_speed(slow); + gcode << writer.extrude_to_xy(Vec2d(prime_x, y_pos + 3 * m_space_y), e_per_mm * m_space_y * num * 1.1); + + for (int i = 0; i < num; ++i) { + gcode << writer.set_pressure_advance(start_pa + i * step_pa); + gcode << move_to(Vec2d(start_x, y_pos + i * m_space_y), writer); + gcode << writer.set_speed(slow); + gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short, y_pos + i * m_space_y), e_per_mm * m_length_short); + gcode << writer.set_speed(fast); + gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short + m_length_long, y_pos + i * m_space_y), e_per_mm * m_length_long); + gcode << writer.set_speed(slow); + gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short + m_length_long + m_length_short, y_pos + i * m_space_y), e_per_mm * m_length_short); + } + gcode << writer.set_pressure_advance(0.0); + + if (m_draw_numbers) { + // draw indicator lines + gcode << writer.set_speed(fast); + gcode << move_to(Vec2d(start_x + m_length_short, y_pos + (num - 1) * m_space_y + 2), writer); + gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short, y_pos + (num - 1) * m_space_y + 7), thin_e_per_mm * 7); + gcode << move_to(Vec2d(start_x + m_length_short + m_length_long, y_pos + (num - 1) * m_space_y + 7), writer); + gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short + m_length_long, y_pos + (num - 1) * m_space_y + 2), thin_e_per_mm * 7); + + for (int i = 0; i < num; i += 2) { + gcode << draw_number( + start_x + m_length_short + m_length_long + m_length_short + 3, + y_pos + i * m_space_y + m_space_y / 2, + start_pa + i * step_pa, + m_draw_digit_mode, + m_number_line_width, + number_e_per_mm, + 3600, + writer + ); + } + } + return gcode.str(); +} + +void CalibPressureAdvanceLine::delta_modify_start(double& startx, double& starty, int count) +{ + startx = -startx; + starty = -(count * m_space_y) / 2; +} + +CalibPressureAdvancePattern::CalibPressureAdvancePattern( + const Calib_Params& params, + const DynamicPrintConfig& config, + bool is_bbl_machine, + Model& model, + const Vec3d& origin +) : + m_params(params) +{ + this->m_draw_digit_mode = DrawDigitMode::Bottom_To_Top; + + refresh_setup(config, is_bbl_machine, model, origin); +}; + +void CalibPressureAdvancePattern::generate_custom_gcodes( + const DynamicPrintConfig& config, + bool is_bbl_machine, + Model& model, + const Vec3d& origin +) +{ + std::stringstream gcode; + gcode << "; start pressure advance pattern for layer\n"; + + refresh_setup(config, is_bbl_machine, model, origin); + + gcode << move_to(Vec2d(m_starting_point.x(), m_starting_point.y()), m_writer, "Move to start XY position"); + gcode << m_writer.travel_to_z(height_first_layer(), "Move to start Z position"); + gcode << m_writer.set_pressure_advance(m_params.start); + + const DrawBoxOptArgs default_box_opt_args(*this); + + // create anchoring frame + gcode << draw_box( + m_starting_point.x(), + m_starting_point.y(), + print_size_x(), + frame_size_y(), + default_box_opt_args + ); + + // create tab for numbers + DrawBoxOptArgs draw_box_opt_args = default_box_opt_args; + draw_box_opt_args.is_filled = true; + draw_box_opt_args.num_perimeters = wall_count(); + gcode << draw_box( + m_starting_point.x(), + m_starting_point.y() + frame_size_y() + line_spacing_first_layer(), + glyph_tab_max_x() - m_starting_point.x(), + max_numbering_height() + line_spacing_first_layer() + m_glyph_padding_vertical * 2, + draw_box_opt_args + ); + + std::vector gcode_items; + const DrawLineOptArgs default_line_opt_args(*this); + const int num_patterns = get_num_patterns(); // "cache" for use in loops + + // draw pressure advance pattern + for (int i = 0; i < m_num_layers; ++i) { + if (i > 0) { + gcode << "; end pressure advance pattern for layer\n"; + CustomGCode::Item item; + item.print_z = height_first_layer() + (i - 1) * height_layer(); + item.type = CustomGCode::Type::Custom; + item.extra = gcode.str(); + gcode_items.push_back(item); + + gcode = std::stringstream(); // reset for next layer contents + gcode << "; start pressure advance pattern for layer\n"; + + const double layer_height = height_first_layer() + (i * height_layer()); + gcode << m_writer.travel_to_z(layer_height, "Move to layer height"); + } + + // line numbering + if (i == 1) { + gcode << m_writer.set_pressure_advance(m_params.start); + + double number_e_per_mm = e_per_mm( + line_width(), + height_layer(), + m_config.option("nozzle_diameter")->get_at(0), + m_config.option("filament_diameter")->get_at(0), + m_config.option("filament_flow_ratio")->get_at(0) + ); + + // glyph on every other line + for (int j = 0; j < num_patterns; j += 2) { + gcode << draw_number( + glyph_start_x(j), + m_starting_point.y() + frame_size_y() + m_glyph_padding_vertical + line_width(), + m_params.start + (j * m_params.step), + m_draw_digit_mode, + line_width(), + number_e_per_mm, + speed_first_layer(), + m_writer + ); + } + } + + DrawLineOptArgs draw_line_opt_args = default_line_opt_args; + + double to_x = m_starting_point.x() + pattern_shift(); + double to_y = m_starting_point.y(); + double side_length = m_wall_side_length; + + // shrink first layer to fit inside frame + if (i == 0) { + double shrink = + ( + line_spacing_first_layer() * (wall_count() - 1) + + (line_width_first_layer() * (1 - m_encroachment)) + ) / std::sin(to_radians(m_corner_angle) / 2) + ; + side_length = m_wall_side_length - shrink; + to_x += shrink * std::sin(to_radians(90) - to_radians(m_corner_angle) / 2); + to_y += + line_spacing_first_layer() * (wall_count() - 1) + + (line_width_first_layer() * (1 - m_encroachment)) + ; + } + + double initial_x = to_x; + double initial_y = to_y; + + gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to pattern start"); + + for (int j = 0; j < num_patterns; ++j) { + // increment pressure advance + gcode << m_writer.set_pressure_advance(m_params.start + (j * m_params.step)); + + for (int k = 0; k < wall_count(); ++k) { + to_x += std::cos(to_radians(m_corner_angle) / 2) * side_length; + to_y += std::sin(to_radians(m_corner_angle) / 2) * side_length; + + draw_line_opt_args = default_line_opt_args; + draw_line_opt_args.height = i == 0 ? height_first_layer() : height_layer(); + draw_line_opt_args.line_width = line_width(); // don't use line_width_first_layer so results are consistent across all layers + draw_line_opt_args.speed = i == 0 ? speed_adjust(speed_first_layer()) : speed_adjust(speed_perimeter()); + draw_line_opt_args.comment = "Print pattern wall"; + gcode << draw_line(Vec2d(to_x, to_y), draw_line_opt_args); + + to_x -= std::cos(to_radians(m_corner_angle) / 2) * side_length; + to_y += std::sin(to_radians(m_corner_angle) / 2) * side_length; + + gcode << draw_line(Vec2d(to_x, to_y), draw_line_opt_args); + + to_y = initial_y; + if (k != wall_count() - 1) { + // perimeters not done yet. move to next perimeter + to_x += line_spacing_angle(); + gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to start next pattern wall"); + } else if (j != num_patterns - 1) { + // patterns not done yet. move to next pattern + to_x += m_pattern_spacing + line_width(); + gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to next pattern"); + } else if (i != m_num_layers - 1) { + // layers not done yet. move back to start + to_x = initial_x; + gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move back to start position"); + } else { + // everything done + } + } + } + } + + gcode << m_writer.set_pressure_advance(m_params.start); + gcode << "; end pressure advance pattern for layer\n"; + + CustomGCode::Item item; + item.print_z = max_layer_z(); + item.type = CustomGCode::Type::Custom; + item.extra = gcode.str(); + gcode_items.push_back(item); + + CustomGCode::Info info; + info.mode = CustomGCode::Mode::SingleExtruder; + info.gcodes = gcode_items; + + //model.plates_custom_gcodes[model.curr_plate_index] = info; +} + +void CalibPressureAdvancePattern::refresh_setup( + const DynamicPrintConfig& config, + bool is_bbl_machine, + const Model& model, + const Vec3d& origin +) +{ + m_config = config; + m_config.apply(model.objects.front()->config.get(), true); + m_config.apply(model.objects.front()->volumes.front()->config.get(), true); + + m_is_delta = (m_config.option("bed_shape")->values.size() > 4); + + _refresh_starting_point(model); + _refresh_writer(is_bbl_machine, model, origin); +} + +void CalibPressureAdvancePattern::_refresh_starting_point(const Model& model) +{ + ModelObject* obj = model.objects.front(); + //BoundingBoxf3 bbox = + // obj->instance_bounding_box( + // *obj->instances.front(), + // false + // ) + //; + + m_starting_point = Vec3d(0, 0, 0); + m_starting_point.y() += m_handle_spacing; + + if (m_is_delta) { + m_starting_point.x() *= -1; + m_starting_point.y() -= (frame_size_y() / 2); + } +} + +void CalibPressureAdvancePattern::_refresh_writer( + bool is_bbl_machine, + const Model& model, + const Vec3d& origin +) +{ + PrintConfig print_config; + print_config.apply(m_config, true); + + m_writer.apply_print_config(print_config); + //m_writer.set_xy_offset(origin(0), origin(1)); + + const unsigned int extruder_id = model.objects.front()->volumes.front()->extruder_id(); + m_writer.set_extruders({ extruder_id }); + m_writer.set_extruder(extruder_id); +} + +std::string CalibPressureAdvancePattern::draw_line( + Vec2d to_pt, + DrawLineOptArgs opt_args +) +{ + const double e_per_mm = CalibPressureAdvance::e_per_mm( + opt_args.line_width, + opt_args.height, + m_config.option("nozzle_diameter")->get_at(0), + m_config.option("filament_diameter")->get_at(0), + m_config.option("filament_flow_ratio")->get_at(0) + ); + + const double length = get_distance(Vec2d(m_last_pos.x(), m_last_pos.y()), to_pt); + auto dE = e_per_mm * length; + + std::stringstream gcode; + + gcode << m_writer.set_speed(opt_args.speed); + gcode << m_writer.extrude_to_xy(to_pt, dE, opt_args.comment); + + m_last_pos = Vec3d(to_pt.x(), to_pt.y(), 0); + + return gcode.str(); +} + +std::string CalibPressureAdvancePattern::draw_box( + double min_x, + double min_y, + double size_x, + double size_y, + DrawBoxOptArgs opt_args +) +{ + std::stringstream gcode; + + double x = min_x; + double y = min_y; + const double max_x = min_x + size_x; + const double max_y = min_y + size_y; + + const double spacing = opt_args.line_width - opt_args.height * (1 - M_PI / 4); + + // if number of perims exceeds size of box, reduce it to max + const int max_perimeters = + std::min( + // this is the equivalent of number of perims for concentric fill + std::floor(size_x * std::sin(to_radians(45))) / (spacing / std::sin(to_radians(45))), + std::floor(size_y * std::sin(to_radians(45))) / (spacing / std::sin(to_radians(45))) + ) + ; + + opt_args.num_perimeters = std::min(opt_args.num_perimeters, max_perimeters); + + gcode << move_to(Vec2d(min_x, min_y), m_writer, "Move to box start"); + + DrawLineOptArgs line_opt_args(*this); + line_opt_args.height = opt_args.height; + line_opt_args.line_width = opt_args.line_width; + line_opt_args.speed = opt_args.speed; + + for (int i = 0; i < opt_args.num_perimeters; ++i) { + if (i != 0) { // after first perimeter, step inwards to start next perimeter + x += spacing; + y += spacing; + gcode << move_to(Vec2d(x, y), m_writer, "Step inwards to print next perimeter"); + } + + y += size_y - i * spacing * 2; + line_opt_args.comment = "Draw perimeter (up)"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + + x += size_x - i * spacing * 2; + line_opt_args.comment = "Draw perimeter (right)"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + + y -= size_y - i * spacing * 2; + line_opt_args.comment = "Draw perimeter (down)"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + + x -= size_x - i * spacing * 2; + line_opt_args.comment = "Draw perimeter (left)"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + } + + if (!opt_args.is_filled) { + return gcode.str(); + } + + // create box infill + const double spacing_45 = spacing / std::sin(to_radians(45)); + + const double bound_modifier = + (spacing * (opt_args.num_perimeters - 1)) + + (opt_args.line_width * (1 - m_encroachment)) + ; + const double x_min_bound = min_x + bound_modifier; + const double x_max_bound = max_x - bound_modifier; + const double y_min_bound = min_y + bound_modifier; + const double y_max_bound = max_y - bound_modifier; + const int x_count = std::floor((x_max_bound - x_min_bound) / spacing_45); + const int y_count = std::floor((y_max_bound - y_min_bound) / spacing_45); + + double x_remainder = std::fmod((x_max_bound - x_min_bound), spacing_45); + double y_remainder = std::fmod((y_max_bound - y_min_bound), spacing_45); + + x = x_min_bound; + y = y_min_bound; + + gcode << move_to(Vec2d(x, y), m_writer, "Move to fill start"); + + for (int i = 0; i < x_count + y_count + (x_remainder + y_remainder >= spacing_45 ? 1 : 0); ++i) { // this isn't the most robust way, but less expensive than finding line intersections + if (i < std::min(x_count, y_count)) { + if (i % 2 == 0) { + x += spacing_45; + y = y_min_bound; + gcode << move_to(Vec2d(x, y), m_writer, "Fill: Step right"); + + y += x - x_min_bound; + x = x_min_bound; + line_opt_args.comment = "Fill: Print up/left"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + } else { + y += spacing_45; + x = x_min_bound; + gcode << move_to(Vec2d(x, y), m_writer, "Fill: Step up"); + + x += y - y_min_bound; + y = y_min_bound; + line_opt_args.comment = "Fill: Print down/right"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + } + } else if (i < std::max(x_count, y_count)) { + if (x_count > y_count) { + // box is wider than tall + if (i % 2 == 0) { + x += spacing_45; + y = y_min_bound; + gcode << move_to(Vec2d(x, y), m_writer, "Fill: Step right"); + + x -= y_max_bound - y_min_bound; + y = y_max_bound; + line_opt_args.comment = "Fill: Print up/left"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + } else { + if (i == y_count) { + x += spacing_45 - y_remainder; + y_remainder = 0; + } else { + x += spacing_45; + } + y = y_max_bound; + gcode << move_to(Vec2d(x, y), m_writer, "Fill: Step right"); + + x += y_max_bound - y_min_bound; + y = y_min_bound; + line_opt_args.comment = "Fill: Print down/right"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + } + } else { + // box is taller than wide + if (i % 2 == 0) { + x = x_max_bound; + if (i == x_count) { + y += spacing_45 - x_remainder; + x_remainder = 0; + } else { + y += spacing_45; + } + gcode << move_to(Vec2d(x, y), m_writer, "Fill: Step up"); + + x = x_min_bound; + y += x_max_bound - x_min_bound; + line_opt_args.comment = "Fill: Print up/left"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + } else { + x = x_min_bound; + y += spacing_45; + gcode << move_to(Vec2d(x, y), m_writer, "Fill: Step up"); + + x = x_max_bound; + y -= x_max_bound - x_min_bound; + line_opt_args.comment = "Fill: Print down/right"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + } + } + } else { + if (i % 2 == 0) { + x = x_max_bound; + if (i == x_count) { + y += spacing_45 - x_remainder; + } else { + y += spacing_45; + } + gcode << move_to(Vec2d(x, y), m_writer, "Fill: Step up"); + + x -= y_max_bound - y; + y = y_max_bound; + line_opt_args.comment = "Fill: Print up/left"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + } else { + if (i == y_count) { + x += spacing_45 - y_remainder; + } else { + x += spacing_45; + } + y = y_max_bound; + gcode << move_to(Vec2d(x, y), m_writer, "Fill: Step right"); + + y -= x_max_bound - x; + x = x_max_bound; + line_opt_args.comment = "Fill: Print down/right"; + gcode << draw_line(Vec2d(x, y), line_opt_args); + } + } + } + + return gcode.str(); +} + +double CalibPressureAdvancePattern::get_distance(Vec2d from, Vec2d to) const +{ + return std::hypot((to.x() - from.x()), (to.y() - from.y())); +} + +double CalibPressureAdvancePattern::object_size_x() const +{ + return get_num_patterns() * ((wall_count() - 1) * line_spacing_angle()) + + (get_num_patterns() - 1) * (m_pattern_spacing + line_width()) + + std::cos(to_radians(m_corner_angle) / 2) * m_wall_side_length + + line_spacing_first_layer() * wall_count() + ; +} + +double CalibPressureAdvancePattern::object_size_y() const +{ + return 2 * (std::sin(to_radians(m_corner_angle) / 2) * m_wall_side_length) + + max_numbering_height() + + m_glyph_padding_vertical * 2 + + line_width_first_layer(); +} + +double CalibPressureAdvancePattern::glyph_start_x(int pattern_i) const +{ + // note that pattern_i is zero-based! + // align glyph's start with first perimeter of specified pattern + double x = + // starting offset + m_starting_point.x() + + pattern_shift() + + + // width of pattern extrusions + pattern_i * (wall_count() - 1) * line_spacing_angle() + // center to center distance of extrusions + pattern_i * line_width() + // endcaps. center to end on either side = 1 line width + + // space between each pattern + pattern_i * m_pattern_spacing + ; + + // align to middle of pattern walls + x += wall_count() * line_spacing_angle() / 2; + + // shift so glyph is centered on pattern + // m_digit_segment_len = half of X length of glyph + x -= (glyph_length_x() / 2); + + return x; +} + +double CalibPressureAdvancePattern::glyph_length_x() const +{ + // half of line_width sticks out on each side + return line_width() + (2 * m_digit_segment_len); +} + +double CalibPressureAdvancePattern::glyph_tab_max_x() const +{ + // only every other glyph is shown, starting with 1 + int num = get_num_patterns(); + int max_num = + (num % 2 == 0) + ? num - 1 + : num + ; + + // padding at end should be same as padding at start + double padding = glyph_start_x(0) - m_starting_point.x(); + + return + glyph_start_x(max_num - 1) + // glyph_start_x is zero-based + (glyph_length_x() - line_width() / 2) + + padding + ; +} + +double CalibPressureAdvancePattern::max_numbering_height() const +{ + std::string::size_type most_characters = 0; + const int num_patterns = get_num_patterns(); + + // note: only every other number is printed + for (std::string::size_type i = 0; i < num_patterns; i += 2) { + std::string sNumber = convert_number_to_string(m_params.start + (i * m_params.step)); + + if (sNumber.length() > most_characters) { + most_characters = sNumber.length(); + } + } + + most_characters = std::min(most_characters, m_max_number_len); + + return (most_characters * m_digit_segment_len) + ((most_characters - 1) * m_digit_gap_len); +} + +double CalibPressureAdvancePattern::pattern_shift() const +{ + return + (wall_count() - 1) * line_spacing_first_layer() + + line_width_first_layer() + + m_glyph_padding_horizontal + ; +} +} // namespace Slic3r diff --git a/src/libslic3r/calib.hpp b/src/libslic3r/calib.hpp new file mode 100644 index 0000000..59d671d --- /dev/null +++ b/src/libslic3r/calib.hpp @@ -0,0 +1,280 @@ +#pragma once +#define calib_pressure_advance_dd + +#include "GCode.hpp" +#include "GCodeWriter.hpp" +#include "PrintConfig.hpp" + +namespace Slic3r { + +enum class CalibMode : int { + Calib_None = 0, + Calib_PA_Line, + Calib_PA_Pattern, + Calib_PA_Tower, + Calib_Temp_Tower, + Calib_Vol_speed_Tower, + Calib_VFA_Tower, + Calib_Retraction_tower +}; + +struct Calib_Params { + Calib_Params() : mode(CalibMode::Calib_None) { }; + double start, end, step; + bool print_numbers; + CalibMode mode; +}; + +class CalibPressureAdvance { + public: + static float find_optimal_PA_speed(const DynamicPrintConfig &config, double line_width, double layer_height, + int filament_idx = 0); + + protected: + CalibPressureAdvance() =default; + ~CalibPressureAdvance() =default; + + enum class DrawDigitMode { + Left_To_Right, + Bottom_To_Top + }; + + void delta_scale_bed_ext(BoundingBoxf& bed_ext) const { bed_ext.scale(1.0f / 1.41421f); } + + std::string move_to(Vec2d pt, GCodeWriter& writer, std::string comment = std::string()); + double e_per_mm( + double line_width, + double layer_height, + float nozzle_diameter, + float filament_diameter, + float print_flow_ratio + ) const; + double speed_adjust(int speed) const { return speed * 60; }; + + std::string convert_number_to_string(double num) const; + double number_spacing() const { return m_digit_segment_len + m_digit_gap_len; }; + std::string draw_digit( + double startx, + double starty, + char c, + CalibPressureAdvance::DrawDigitMode mode, + double line_width, + double e_per_mm, + GCodeWriter& writer + ); + std::string draw_number( + double startx, + double starty, + double value, + CalibPressureAdvance::DrawDigitMode mode, + double line_width, + double e_per_mm, + double speed, + GCodeWriter& writer + ); + + Vec3d m_last_pos; + + DrawDigitMode m_draw_digit_mode {DrawDigitMode::Left_To_Right}; + const double m_digit_segment_len {2}; + const double m_digit_gap_len {1}; + const std::string::size_type m_max_number_len {5}; +}; + +class CalibPressureAdvanceLine : public CalibPressureAdvance { +public: + CalibPressureAdvanceLine(GCode* gcodegen) : + mp_gcodegen(gcodegen), + m_nozzle_diameter(gcodegen->config().nozzle_diameter.get_at(0)) + { }; + ~CalibPressureAdvanceLine() { }; + + std::string generate_test(double start_pa = 0, double step_pa = 0.002, int count = 50); + + void set_speed(double fast = 100.0, double slow = 20.0) { + m_slow_speed = slow; + m_fast_speed = fast; + } + + const double& line_width() { return m_line_width; }; + bool is_delta() const; + bool& draw_numbers() { return m_draw_numbers; } + +private: + std::string print_pa_lines(double start_x, double start_y, double start_pa, double step_pa, int num); + + void delta_modify_start(double& startx, double& starty, int count); + + GCode* mp_gcodegen; + + double m_nozzle_diameter; + double m_slow_speed, m_fast_speed; + + const double m_height_layer {0.2}; + const double m_line_width {0.6}; + const double m_thin_line_width {0.44}; + const double m_number_line_width {0.48}; + const double m_space_y {3.5}; + + double m_length_short {20.0}, m_length_long {40.0}; + bool m_draw_numbers {true}; +}; + +struct SuggestedConfigCalibPAPattern { + const std::vector> float_pairs { + {"initial_layer_print_height", 0.25}, + {"layer_height", 0.2}, + {"initial_layer_speed", 30} + }; + + const std::vector> nozzle_ratio_pairs { + {"line_width", 112.5}, + {"initial_layer_line_width", 140} + }; + + const std::vector> int_pairs { + {"skirt_loops", 0}, + {"wall_loops", 3} + }; + + const std::pair brim_pair {"brim_type", BrimType::btNoBrim}; +}; + +class CalibPressureAdvancePattern : public CalibPressureAdvance { +friend struct DrawLineOptArgs; +friend struct DrawBoxOptArgs; + +public: + CalibPressureAdvancePattern( + const Calib_Params& params, + const DynamicPrintConfig& config, + bool is_bbl_machine, + Model& model, + const Vec3d& origin + ); + + double handle_xy_size() const { return m_handle_xy_size; }; + double handle_spacing() const { return m_handle_spacing; }; + double print_size_x() const { return object_size_x() + pattern_shift(); }; + double print_size_y() const { return object_size_y(); }; + double max_layer_z() const { return height_first_layer() + ((m_num_layers - 1) * height_layer()); }; + + void generate_custom_gcodes( + const DynamicPrintConfig& config, + bool is_bbl_machine, + Model& model, + const Vec3d& origin + ); + +protected: + double speed_first_layer() const { return m_config.option("initial_layer_speed")->value; }; + double speed_perimeter() const { return m_config.option("outer_wall_speed")->value; }; + double line_width_first_layer() const { return m_config.get_abs_value("initial_layer_line_width"); }; + double line_width() const { return m_config.get_abs_value("line_width"); }; + int wall_count() const { return m_config.option("wall_loops")->value; }; + +private: + struct DrawLineOptArgs { + DrawLineOptArgs(const CalibPressureAdvancePattern& p) : + height {p.height_layer()}, + line_width {p.line_width()}, + speed {p.speed_adjust(p.speed_perimeter())} + { }; + + double height; + double line_width; + double speed; + std::string comment {"Print line"}; + }; + + struct DrawBoxOptArgs { + DrawBoxOptArgs(const CalibPressureAdvancePattern& p) : + num_perimeters {p.wall_count()}, + height {p.height_first_layer()}, + line_width {p.line_width_first_layer()}, + speed {p.speed_adjust(p.speed_first_layer())} + { }; + + bool is_filled {false}; + int num_perimeters; + double height; + double line_width; + double speed; + }; + + void refresh_setup( + const DynamicPrintConfig& config, + bool is_bbl_machine, + const Model& model, + const Vec3d& origin + ); + void _refresh_starting_point(const Model& model); + void _refresh_writer( + bool is_bbl_machine, + const Model& model, + const Vec3d& origin + ); + + double height_first_layer() const { return m_config.option("initial_layer_print_height")->value; }; + double height_layer() const { return m_config.option("layer_height")->value; }; + const int get_num_patterns() const + { + return std::ceil((m_params.end - m_params.start) / m_params.step + 1); + } + + std::string draw_line( + Vec2d to_pt, + DrawLineOptArgs opt_args + ); + std::string draw_box( + double min_x, + double min_y, + double size_x, + double size_y, + DrawBoxOptArgs opt_args + ); + + double to_radians(double degrees) const { return degrees * M_PI / 180; }; + double get_distance(Vec2d from, Vec2d to) const; + + /* + from slic3r documentation: spacing = extrusion_width - layer_height * (1 - PI/4) + "spacing" = center-to-center distance of adjacent extrusions, which partially overlap + https://manual.slic3r.org/advanced/flow-math + https://ellis3dp.com/Print-Tuning-Guide/articles/misconceptions.html#two-04mm-perimeters--08mm + */ + double line_spacing() const { return line_width() - height_layer() * (1 - M_PI / 4); }; + double line_spacing_first_layer() const { return line_width_first_layer() - height_first_layer() * (1 - M_PI / 4); }; + double line_spacing_angle() const { return line_spacing() / std::sin(to_radians(m_corner_angle) / 2); }; + + double object_size_x() const; + double object_size_y() const; + double frame_size_y() const { return std::sin(to_radians(double(m_corner_angle) / 2)) * m_wall_side_length * 2; }; + + double glyph_start_x(int pattern_i = 0) const; + double glyph_length_x() const; + double glyph_tab_max_x() const; + double max_numbering_height() const; + + double pattern_shift() const; + + const Calib_Params& m_params; + + DynamicPrintConfig m_config; + GCodeWriter m_writer; + bool m_is_delta; + Vec3d m_starting_point; + + const double m_handle_xy_size {5}; + const double m_handle_spacing {2}; + const int m_num_layers {4}; + + const double m_wall_side_length {30.0}; + const int m_corner_angle {90}; + const int m_pattern_spacing {2}; + const double m_encroachment {1. / 3.}; + + const double m_glyph_padding_horizontal {1}; + const double m_glyph_padding_vertical {1}; +}; +} // namespace Slic3r diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index aca55aa..e76efeb 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -26,8 +26,27 @@ set(SLIC3R_GUI_SOURCES GUI/Widgets/StateHandler.hpp GUI/Widgets/StaticBox.cpp GUI/Widgets/StaticBox.hpp + GUI/Widgets/Button.cpp + GUI/Widgets/Button.hpp + GUI/Widgets/CheckBoxInWT.cpp + GUI/Widgets/CheckBoxInWT.hpp + GUI/Widgets/ComboBox.cpp + GUI/Widgets/ComboBox.hpp + GUI/Widgets/TextInput.cpp + GUI/Widgets/TextInput.hpp + GUI/Widgets/TextCtrl.h + GUI/Widgets/RoundedRectangle.cpp + GUI/Widgets/RoundedRectangle.hpp + GUI/Widgets/RadioBox.cpp + GUI/Widgets/RadioBox.hpp + GUI/Widgets/DropDown.cpp + GUI/Widgets/DropDown.hpp + GUI/Widgets/PopupWindow.cpp + GUI/Widgets/PopupWindow.hpp GUI/ConfigSnapshotDialog.cpp GUI/ConfigSnapshotDialog.hpp + GUI/calib_dlg.cpp + GUI/calib_dlg.hpp GUI/3DScene.cpp GUI/3DScene.hpp GUI/format.hpp diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 74a8719..7c2adb0 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -831,7 +831,8 @@ void Preview::load_print_as_fff(bool keep_z_range) unsigned int number_extruders = wxGetApp().is_editor() ? (unsigned int)print->extruders().size() : m_canvas->get_gcode_extruders_count(); - std::vector gcodes = wxGetApp().is_editor() ? + //B34 + std::vector gcodes = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_canvas->get_custom_gcode_per_print_z(); const bool contains_color_gcodes = std::any_of(std::begin(gcodes), std::end(gcodes), diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 6f71b1b..a8189d9 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -880,6 +880,7 @@ void MainFrame::create_preset_tabs() else #endif m_tabpanel->AddPage(m_guide_view, _L("Guide")); + } void MainFrame::add_created_tab(Tab* panel, const std::string& bmp_name /*= ""*/) @@ -1566,6 +1567,45 @@ void MainFrame::init_menubar_as_editor() // Help menu auto helpMenu = generate_help_menu(); + + //B34 + //auto calibrationMenu = generate_calibration_menu(); + auto calibrationMenu = new wxMenu(); + auto flowrate_menu = new wxMenu(); + append_menu_item(flowrate_menu, wxID_ANY, _L("Pass 1"), _L("Flow rate test - Pass 1"), [this](wxCommandEvent &) { + if (m_plater) + m_plater->calib_flowrate(1); + }, + "", nullptr, + [this]() { + return m_plater->is_view3D_shown(); + ; + }, + this); + append_menu_item(flowrate_menu, wxID_ANY, _L("Pass 2"), _L("Flow rate test - Pass 2"), [this](wxCommandEvent &) { + if (m_plater) + m_plater->calib_flowrate(2); + }, + "", nullptr, + [this]() { + return m_plater->is_view3D_shown(); + ; + }, + this); + calibrationMenu->AppendSubMenu(flowrate_menu, _L("Flow rate")); + append_menu_item( + calibrationMenu, wxID_ANY, _L("Pressure advance"), _L("Pressure advance"), + [this](wxCommandEvent &) { + if (!m_pa_calib_dlg) + m_pa_calib_dlg = new PA_Calibration_Dlg((wxWindow *) this, wxID_ANY, m_plater); + m_pa_calib_dlg->ShowModal(); + }, + "", nullptr, + [this]() { + return m_plater->is_view3D_shown(); + ; + }, + this); // menubar // assign menubar to frame after appending items, otherwise special items @@ -1579,6 +1619,8 @@ void MainFrame::init_menubar_as_editor() // Add additional menus from C++ wxGetApp().add_config_menu(m_menubar); m_menubar->Append(helpMenu, _L("&Help")); + //B34 + m_menubar->Append(calibrationMenu, _L("&Calibration")); #ifdef _MSW_DARK_MODE if (wxGetApp().tabs_as_menu()) { diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 64c04f3..ccda7c8 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -21,6 +21,8 @@ #include "PrinterWebView.hpp" // B28 #include "GuideWebView.hpp" +//B34 +#include "calib_dlg.hpp" class wxBookCtrlBase; class wxProgressDialog; @@ -210,7 +212,8 @@ public: Plater *m_plater{nullptr}; - + //B34 + PA_Calibration_Dlg *m_pa_calib_dlg{nullptr}; //B4 wxString tem_host; PrinterWebView * m_printer_view{nullptr}; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index eab71b7..969eec0 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5363,6 +5363,81 @@ void Plater::add_model(bool imperial_units/* = false*/) if (! load_files(paths, true, false, imperial_units).empty()) wxGetApp().mainframe->update_title(); } +//B34 +void Plater::add_model_calibration(bool imperial_units /* = false*/, std::string fname /* = ""*/) +{ + std::vector paths; + + if (fname.empty()) { + wxArrayString input_files; + wxGetApp().import_model(this, input_files); + if (input_files.empty()) + return; + + for (const auto &file : input_files) + paths.emplace_back(into_path(file)); + } else { + paths.emplace_back(fname); + } + + wxString snapshot_label; + assert(!paths.empty()); + if (paths.size() == 1) { + snapshot_label = "Import Object"; + snapshot_label += ": "; + snapshot_label += wxString::FromUTF8(paths.front().filename().string().c_str()); + } else { + snapshot_label = "Import Objects"; + snapshot_label += ": "; + snapshot_label += paths.front().filename().string().c_str(); + for (size_t i = 1; i < paths.size(); ++i) { + snapshot_label += ", "; + snapshot_label += wxString::FromUTF8(paths[i].filename().string().c_str()); + } + } + + Plater::TakeSnapshot snapshot(this, snapshot_label); + if (!load_files(paths, true, false, imperial_units).empty()) + wxGetApp().mainframe->update_title(); +} + +//B34 +void Plater::calib_flowrate(int pass) +{ + if (pass != 1 && pass != 2) + return; + const auto calib_name = wxString::Format(L"Flowrate Test - Pass%d", pass); + new_project(); + + wxGetApp().mainframe->select_tab(size_t(0)); + + if (pass == 1) + add_model_calibration(false, + (boost::filesystem::path(Slic3r::resources_dir()) / "calib" / "filament_flow" / "flowrate-test-pass1.3mf").string()); + else + add_model_calibration(false, + (boost::filesystem::path(Slic3r::resources_dir()) / "calib" / "filament_flow" / "flowrate-test-pass2.3mf").string()); + +} +//B34 +void Plater::calib_pa(const Calib_Params ¶ms) +{ + const auto calib_pa_name = wxString::Format(L"Pressure Advance Test"); + new_project(); + wxGetApp().mainframe->select_tab(size_t(0)); + + switch (params.mode) { + case CalibMode::Calib_PA_Line: + add_model_calibration(false, Slic3r::resources_dir() + "/calib/PressureAdvance/pressure_advance_test.stl"); + break; + //case CalibMode::Calib_PA_Pattern: _calib_pa_pattern(params); break; + //case CalibMode::Calib_PA_Tower: _calib_pa_tower(params); break; + default: break; + } + + //p->background_process.fff_print()->set_calib_params(params); +} + void Plater::import_zip_archive() { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index fd37720..54f7ff9 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -16,6 +16,8 @@ #include "Jobs/Job.hpp" #include "Jobs/Worker.hpp" #include "Search.hpp" +//B34 + #include "libslic3r/Calib.hpp" class wxButton; class ScalableButton; @@ -164,10 +166,17 @@ public: const SLAPrint& sla_print() const; SLAPrint& sla_print(); + //B34 + void calib_pa(const Calib_Params ¶ms); + void calib_flowrate(int pass); + + void new_project(); void load_project(); void load_project(const wxString& filename); void add_model(bool imperial_units = false); + //B34 + void add_model_calibration(bool imperial_units = false, std::string fname = ""); void import_zip_archive(); void import_sl1_archive(); void extract_config_from_project(); diff --git a/src/slic3r/GUI/Widgets/Button.cpp b/src/slic3r/GUI/Widgets/Button.cpp new file mode 100644 index 0000000..585e8e2 --- /dev/null +++ b/src/slic3r/GUI/Widgets/Button.cpp @@ -0,0 +1,327 @@ +#include "Button.hpp" +#include "Label.hpp" + +#include + +BEGIN_EVENT_TABLE(Button, StaticBox) + +EVT_LEFT_DOWN(Button::mouseDown) +EVT_LEFT_UP(Button::mouseReleased) +EVT_MOUSE_CAPTURE_LOST(Button::mouseCaptureLost) +EVT_KEY_DOWN(Button::keyDownUp) +EVT_KEY_UP(Button::keyDownUp) + +// catch paint events +EVT_PAINT(Button::paintEvent) + +END_EVENT_TABLE() + +/* + * Called by the system of by wxWidgets when the panel needs + * to be redrawn. You can also trigger this call by + * calling Refresh()/Update(). + */ + +Button::Button() + : paddingSize(10, 8) +{ + background_color = StateColor( + std::make_pair(0xF0F0F1, (int) StateColor::Disabled), + std::make_pair(0x52c7b8, (int) StateColor::Hovered | StateColor::Checked), + std::make_pair(0x009688, (int) StateColor::Checked), + std::make_pair(*wxLIGHT_GREY, (int) StateColor::Hovered), + std::make_pair(*wxWHITE, (int) StateColor::Normal)); + text_color = StateColor( + std::make_pair(*wxLIGHT_GREY, (int) StateColor::Disabled), + std::make_pair(*wxBLACK, (int) StateColor::Normal)); +} + +Button::Button(wxWindow* parent, wxString text, wxString icon, long style, int iconSize, wxWindowID btn_id) + : Button() +{ + Create(parent, text, icon, style, iconSize, btn_id); +} + +bool Button::Create(wxWindow* parent, wxString text, wxString icon, long style, int iconSize, wxWindowID btn_id) +{ + StaticBox::Create(parent, btn_id, wxDefaultPosition, wxDefaultSize, style); + state_handler.attach({&text_color}); + state_handler.update_binds(); + //BBS set default font + SetFont(Label::Body_14); + wxWindow::SetLabel(text); + if (!icon.IsEmpty()) { + //BBS set button icon default size to 20 + this->active_icon = ScalableBitmap(this, icon.ToStdString(), iconSize > 0 ? iconSize : 20); + } + messureSize(); + return true; +} + +void Button::SetLabel(const wxString& label) +{ + wxWindow::SetLabel(label); + messureSize(); + Refresh(); +} + +bool Button::SetFont(const wxFont& font) +{ + wxWindow::SetFont(font); + messureSize(); + Refresh(); + return true; +} + +void Button::SetIcon(const wxString& icon) +{ + if (!icon.IsEmpty()) { + //BBS set button icon default size to 20 + this->active_icon = ScalableBitmap(this, icon.ToStdString(), this->active_icon.px_cnt()); + } + else + { + this->active_icon = ScalableBitmap(); + } + Refresh(); +} + +void Button::SetInactiveIcon(const wxString &icon) +{ + if (!icon.IsEmpty()) { + // BBS set button icon default size to 20 + this->inactive_icon = ScalableBitmap(this, icon.ToStdString(), this->active_icon.px_cnt()); + } else { + this->inactive_icon = ScalableBitmap(); + } + Refresh(); +} + +void Button::SetMinSize(const wxSize& size) +{ + minSize = size; + messureSize(); +} + +void Button::SetPaddingSize(const wxSize& size) +{ + paddingSize = size; + messureSize(); +} + +void Button::SetTextColor(StateColor const& color) +{ + text_color = color; + state_handler.update_binds(); + Refresh(); +} + +void Button::SetTextColorNormal(wxColor const &color) +{ + text_color.setColorForStates(color, 0); + Refresh(); +} + +bool Button::Enable(bool enable) +{ + bool result = wxWindow::Enable(enable); + if (result) { + wxCommandEvent e(EVT_ENABLE_CHANGED); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(e); + } + return result; +} + +void Button::SetCanFocus(bool canFocus) { this->canFocus = canFocus; } + +void Button::SetValue(bool state) +{ + if (GetValue() == state) return; + state_handler.set_state(state ? StateHandler::Checked : 0, StateHandler::Checked); +} + +bool Button::GetValue() const { return state_handler.states() & StateHandler::Checked; } + +void Button::Rescale() +{ + if (this->active_icon.get_bitmap().IsOk()) + this->active_icon.msw_rescale(); + + if (this->inactive_icon.get_bitmap().IsOk()) + this->inactive_icon.msw_rescale(); + + messureSize(); +} + +void Button::paintEvent(wxPaintEvent& evt) +{ + // depending on your system you may need to look at double-buffered dcs + wxPaintDC dc(this); + render(dc); +} + +/* + * Here we do the actual rendering. I put it in a separate + * method so that it can work no matter what type of DC + * (e.g. wxPaintDC or wxClientDC) is used. + */ +void Button::render(wxDC& dc) +{ + StaticBox::render(dc); + int states = state_handler.states(); + wxSize size = GetSize(); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + // calc content size + wxSize szIcon; + wxSize szContent = textSize.GetSize(); + + ScalableBitmap icon; + if (m_selected || ((states & (int)StateColor::State::Hovered) != 0)) + icon = active_icon; + else + icon = inactive_icon; + int padding = 5; + if (icon.get_bitmap().IsOk()) { + if (szContent.y > 0) { + //BBS norrow size between text and icon + szContent.x += padding; + } + szIcon = icon.GetSize(); + szContent.x += szIcon.x; + if (szIcon.y > szContent.y) + szContent.y = szIcon.y; + if (szContent.x > size.x) { + int d = std::min(padding, szContent.x - size.x); + padding -= d; + szContent.x -= d; + } + } + // move to center + wxRect rcContent = { {0, 0}, size }; + wxSize offset = (size - szContent) / 2; + if (offset.x < 0) offset.x = 0; + rcContent.Deflate(offset.x, offset.y); + // start draw + wxPoint pt = rcContent.GetLeftTop(); + if (icon.get_bitmap().IsOk()) { + pt.y += (rcContent.height - szIcon.y) / 2; + dc.DrawBitmap(icon.get_bitmap(), pt); + //BBS norrow size between text and icon + pt.x += szIcon.x + padding; + pt.y = rcContent.y; + } + auto text = GetLabel(); + if (!text.IsEmpty()) { + if (pt.x + textSize.width > size.x) + text = wxControl::Ellipsize(text, dc, wxELLIPSIZE_END, size.x - pt.x); + pt.y += (rcContent.height - textSize.height) / 2; + dc.SetTextForeground(text_color.colorForStates(states)); +#if 0 + dc.SetBrush(*wxLIGHT_GREY); + dc.SetPen(wxPen(*wxLIGHT_GREY)); + dc.DrawRectangle(pt, textSize.GetSize()); +#endif +#ifdef __WXOSX__ + pt.y -= textSize.x / 2; +#endif + dc.DrawText(text, pt); + } +} + +void Button::messureSize() +{ + wxClientDC dc(this); + dc.GetTextExtent(GetLabel(), &textSize.width, &textSize.height, &textSize.x, &textSize.y); + wxSize szContent = textSize.GetSize(); + if (this->active_icon.get_bitmap().IsOk()) { + if (szContent.y > 0) { + //BBS norrow size between text and icon + szContent.x += 5; + } + wxSize szIcon = this->active_icon.GetSize(); + szContent.x += szIcon.x; + if (szIcon.y > szContent.y) + szContent.y = szIcon.y; + } + wxSize size = szContent + paddingSize * 2; + if (minSize.GetHeight() > 0) + size.SetHeight(minSize.GetHeight()); + + if (minSize.GetWidth() > size.GetWidth()) + wxWindow::SetMinSize(minSize); + else + wxWindow::SetMinSize(size); +} + +void Button::mouseDown(wxMouseEvent& event) +{ + event.Skip(); + pressedDown = true; + if (canFocus) + SetFocus(); + if (!HasCapture()) + CaptureMouse(); +} + +void Button::mouseReleased(wxMouseEvent& event) +{ + event.Skip(); + if (pressedDown) { + pressedDown = false; + if (HasCapture()) + ReleaseMouse(); + if (wxRect({0, 0}, GetSize()).Contains(event.GetPosition())) + sendButtonEvent(); + } +} + +void Button::mouseCaptureLost(wxMouseCaptureLostEvent &event) +{ + wxMouseEvent evt; + mouseReleased(evt); +} + +void Button::keyDownUp(wxKeyEvent &event) +{ + if (event.GetKeyCode() == WXK_SPACE || event.GetKeyCode() == WXK_RETURN) { + wxMouseEvent evt(event.GetEventType() == wxEVT_KEY_UP ? wxEVT_LEFT_UP : wxEVT_LEFT_DOWN); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(evt); + return; + } + if (event.GetEventType() == wxEVT_KEY_DOWN && + (event.GetKeyCode() == WXK_TAB || event.GetKeyCode() == WXK_LEFT || event.GetKeyCode() == WXK_RIGHT + || event.GetKeyCode() == WXK_UP || event.GetKeyCode() == WXK_DOWN)) + HandleAsNavigationKey(event); + else + event.Skip(); +} + +void Button::sendButtonEvent() +{ + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); +} + +#ifdef __WIN32__ + +WXLRESULT Button::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + if (nMsg == WM_GETDLGCODE) { return DLGC_WANTMESSAGE; } + if (nMsg == WM_KEYDOWN) { + wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_DOWN, wParam, lParam)); + switch (wParam) { + case WXK_RETURN: { // WXK_RETURN key is handled by default button + GetEventHandler()->ProcessEvent(event); + return 0; + } + } + } + return wxWindow::MSWWindowProc(nMsg, wParam, lParam); +} + +#endif + +bool Button::AcceptsFocus() const { return canFocus; } diff --git a/src/slic3r/GUI/Widgets/Button.hpp b/src/slic3r/GUI/Widgets/Button.hpp new file mode 100644 index 0000000..2f5c8ea --- /dev/null +++ b/src/slic3r/GUI/Widgets/Button.hpp @@ -0,0 +1,84 @@ +#ifndef slic3r_GUI_Button_hpp_ +#define slic3r_GUI_Button_hpp_ + +#include "../wxExtensions.hpp" +#include "StaticBox.hpp" + +class Button : public StaticBox +{ + wxRect textSize; + wxSize minSize; // set by outer + wxSize paddingSize; + ScalableBitmap active_icon; + ScalableBitmap inactive_icon; + + StateColor text_color; + + bool pressedDown = false; + bool m_selected = true; + bool canFocus = true; + + static const int buttonWidth = 200; + static const int buttonHeight = 50; + +public: + Button(); + + Button(wxWindow* parent, wxString text, wxString icon = "", long style = 0, int iconSize = 0, wxWindowID btn_id = wxID_ANY); + + bool Create(wxWindow* parent, wxString text, wxString icon = "", long style = 0, int iconSize = 0, wxWindowID btn_id = wxID_ANY); + + void SetLabel(const wxString& label) override; + + bool SetFont(const wxFont& font) override; + + void SetIcon(const wxString& icon); + + void SetInactiveIcon(const wxString& icon); + + void SetMinSize(const wxSize& size) override; + + void SetPaddingSize(const wxSize& size); + + void SetTextColor(StateColor const &color); + + void SetTextColorNormal(wxColor const &color); + + void SetSelected(bool selected = true) { m_selected = selected; } + + bool Enable(bool enable = true) override; + + void SetCanFocus(bool canFocus) override; + + void SetValue(bool state); + + bool GetValue() const; + + void Rescale(); + +protected: +#ifdef __WIN32__ + WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) override; +#endif + + bool AcceptsFocus() const override; + +private: + void paintEvent(wxPaintEvent& evt); + + void render(wxDC& dc); + + void messureSize(); + + // some useful events + void mouseDown(wxMouseEvent& event); + void mouseReleased(wxMouseEvent& event); + void mouseCaptureLost(wxMouseCaptureLostEvent &event); + void keyDownUp(wxKeyEvent &event); + + void sendButtonEvent(); + + DECLARE_EVENT_TABLE() +}; + +#endif // !slic3r_GUI_Button_hpp_ diff --git a/src/slic3r/GUI/Widgets/CheckBoxInWT.cpp b/src/slic3r/GUI/Widgets/CheckBoxInWT.cpp new file mode 100644 index 0000000..efbea05 --- /dev/null +++ b/src/slic3r/GUI/Widgets/CheckBoxInWT.cpp @@ -0,0 +1,125 @@ +#include "CheckBoxInWT.hpp" + +#include "../wxExtensions.hpp" + +CheckBoxInWT::CheckBoxInWT(wxWindow *parent, int id) + : wxBitmapToggleButton(parent, id, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE) + , m_on(this, "check_on", 18) + , m_half(this, "check_half", 18) + , m_off(this, "check_off", 18) + , m_on_disabled(this, "check_on_disabled", 18) + , m_half_disabled(this, "check_half_disabled", 18) + , m_off_disabled(this, "check_off_disabled", 18) + , m_on_focused(this, "check_on_focused", 18) + , m_half_focused(this, "check_half_focused", 18) + , m_off_focused(this, "check_off_focused", 18) +{ + //SetBackgroundStyle(wxBG_STYLE_TRANSPARENT); + if (parent) + SetBackgroundColour(parent->GetBackgroundColour()); + Bind(wxEVT_TOGGLEBUTTON, [this](auto& e) { m_half_checked = false; update(); e.Skip(); }); +#ifdef __WXOSX__ // State not fully implement on MacOS + Bind(wxEVT_SET_FOCUS, &CheckBoxInWT::updateBitmap, this); + Bind(wxEVT_KILL_FOCUS, &CheckBoxInWT::updateBitmap, this); + Bind(wxEVT_ENTER_WINDOW, &CheckBoxInWT::updateBitmap, this); + Bind(wxEVT_LEAVE_WINDOW, &CheckBoxInWT::updateBitmap, this); +#endif + SetSize(m_on.GetSize()); + SetMinSize(m_on.GetSize()); + update(); +} + +void CheckBoxInWT::SetValue(bool value) +{ + wxBitmapToggleButton::SetValue(value); + update(); +} + +void CheckBoxInWT::SetHalfChecked(bool value) +{ + m_half_checked = value; + update(); +} + +void CheckBoxInWT::Rescale() +{ + m_on.msw_rescale(); + m_half.msw_rescale(); + m_off.msw_rescale(); + m_on_disabled.msw_rescale(); + m_half_disabled.msw_rescale(); + m_off_disabled.msw_rescale(); + m_on_focused.msw_rescale(); + m_half_focused.msw_rescale(); + m_off_focused.msw_rescale(); + SetSize(m_on.GetSize()); + update(); +} + +void CheckBoxInWT::update() +{ + SetBitmapLabel((m_half_checked ? m_half : GetValue() ? m_on : m_off).bmp()); + SetBitmapDisabled((m_half_checked ? m_half_disabled : GetValue() ? m_on_disabled : m_off_disabled).bmp()); +#ifdef __WXMSW__ + SetBitmapFocus((m_half_checked ? m_half_focused : GetValue() ? m_on_focused : m_off_focused).bmp()); +#endif + SetBitmapCurrent((m_half_checked ? m_half_focused : GetValue() ? m_on_focused : m_off_focused).bmp()); +#ifdef __WXOSX__ + wxCommandEvent e(wxEVT_UPDATE_UI); + updateBitmap(e); +#endif +} + +#ifdef __WXMSW__ + +CheckBoxInWT::State CheckBoxInWT::GetNormalState() const { return State_Normal; } + +#endif + + +#ifdef __WXOSX__ + +bool CheckBoxInWT::Enable(bool enable) +{ + bool result = wxBitmapToggleButton::Enable(enable); + if (result) { + m_disable = !enable; + wxCommandEvent e(wxEVT_ACTIVATE); + updateBitmap(e); + } + return result; +} + +wxBitmap CheckBoxInWT::DoGetBitmap(State which) const +{ + if (m_disable) { + return wxBitmapToggleButton::DoGetBitmap(State_Disabled); + } + if (m_focus) { + return wxBitmapToggleButton::DoGetBitmap(State_Current); + } + return wxBitmapToggleButton::DoGetBitmap(which); +} + +void CheckBoxInWT::updateBitmap(wxEvent &evt) +{ + evt.Skip(); + if (evt.GetEventType() == wxEVT_ENTER_WINDOW) { + m_hover = true; + } else if (evt.GetEventType() == wxEVT_LEAVE_WINDOW) { + m_hover = false; + } else { + if (evt.GetEventType() == wxEVT_SET_FOCUS) { + m_focus = true; + } else if (evt.GetEventType() == wxEVT_KILL_FOCUS) { + m_focus = false; + } + wxMouseEvent e; + if (m_hover) + OnEnterWindow(e); + else + OnLeaveWindow(e); + } +} + +#endif diff --git a/src/slic3r/GUI/Widgets/CheckBoxInWT.hpp b/src/slic3r/GUI/Widgets/CheckBoxInWT.hpp new file mode 100644 index 0000000..5e88c2d --- /dev/null +++ b/src/slic3r/GUI/Widgets/CheckBoxInWT.hpp @@ -0,0 +1,55 @@ +#ifndef slic3r_GUI_CheckBoxInWT_hpp_ +#define slic3r_GUI_CheckBoxInWT_hpp_ + +#include "../wxExtensions.hpp" + +#include + +class CheckBoxInWT : public wxBitmapToggleButton +{ +public: + CheckBoxInWT(wxWindow *parent, int id = wxID_ANY); + +public: + void SetValue(bool value) override; + + void SetHalfChecked(bool value = true); + + void Rescale(); + +#ifdef __WXOSX__ + virtual bool Enable(bool enable = true) wxOVERRIDE; +#endif + +protected: +#ifdef __WXMSW__ + virtual State GetNormalState() const wxOVERRIDE; +#endif + +#ifdef __WXOSX__ + virtual wxBitmap DoGetBitmap(State which) const wxOVERRIDE; + + void updateBitmap(wxEvent & evt); + + bool m_disable = false; + bool m_hover = false; + bool m_focus = false; +#endif + +private: + void update(); + +private: + ScalableBitmap m_on; + ScalableBitmap m_half; + ScalableBitmap m_off; + ScalableBitmap m_on_disabled; + ScalableBitmap m_half_disabled; + ScalableBitmap m_off_disabled; + ScalableBitmap m_on_focused; + ScalableBitmap m_half_focused; + ScalableBitmap m_off_focused; + bool m_half_checked = false; +}; + +#endif // !slic3r_GUI_CheckBoxInWT_hpp_ diff --git a/src/slic3r/GUI/Widgets/ComboBox.cpp b/src/slic3r/GUI/Widgets/ComboBox.cpp new file mode 100644 index 0000000..5600477 --- /dev/null +++ b/src/slic3r/GUI/Widgets/ComboBox.cpp @@ -0,0 +1,309 @@ +#include "ComboBox.hpp" +#include "Label.hpp" + +#include + +BEGIN_EVENT_TABLE(ComboBox, TextInput) + +EVT_LEFT_DOWN(ComboBox::mouseDown) +EVT_LEFT_DCLICK(ComboBox::mouseDown) +//EVT_MOUSEWHEEL(ComboBox::mouseWheelMoved) +EVT_KEY_DOWN(ComboBox::keyDown) + +// catch paint events +END_EVENT_TABLE() + +/* + * Called by the system of by wxWidgets when the panel needs + * to be redrawn. You can also trigger this call by + * calling Refresh()/Update(). + */ + +ComboBox::ComboBox(wxWindow * parent, + wxWindowID id, + const wxString &value, + const wxPoint & pos, + const wxSize & size, + int n, + const wxString choices[], + long style) + : drop(texts, icons) +{ + if (style & wxCB_READONLY) + style |= wxRIGHT; + text_off = style & CB_NO_TEXT; + TextInput::Create(parent, "", value, (style & CB_NO_DROP_ICON) ? "" : "drop_down", pos, size, + style | wxTE_PROCESS_ENTER); + drop.Create(this, style & DD_STYLE_MASK); + + if (style & wxCB_READONLY) { + GetTextCtrl()->Hide(); + TextInput::SetFont(Label::Body_14); + TextInput::SetBorderColor(StateColor(std::make_pair(0xDBDBDB, (int) StateColor::Disabled), + std::make_pair(0x009688, (int) StateColor::Hovered), + std::make_pair(0xDBDBDB, (int) StateColor::Normal))); + TextInput::SetBackgroundColor(StateColor(std::make_pair(0xF0F0F1, (int) StateColor::Disabled), + std::make_pair(0xEDFAF2, (int) StateColor::Focused), + std::make_pair(*wxWHITE, (int) StateColor::Normal))); + TextInput::SetLabelColor(StateColor(std::make_pair(0x909090, (int) StateColor::Disabled), + std::make_pair(0x262E30, (int) StateColor::Normal))); + } else { + GetTextCtrl()->Bind(wxEVT_KEY_DOWN, &ComboBox::keyDown, this); + } + drop.Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) { + SetSelection(e.GetInt()); + e.SetEventObject(this); + e.SetId(GetId()); + GetEventHandler()->ProcessEvent(e); + }); + drop.Bind(EVT_DISMISS, [this](auto &) { + drop_down = false; + wxCommandEvent e(wxEVT_COMBOBOX_CLOSEUP); + GetEventHandler()->ProcessEvent(e); + }); + for (int i = 0; i < n; ++i) Append(choices[i]); +} + +int ComboBox::GetSelection() const { return drop.GetSelection(); } + +void ComboBox::SetSelection(int n) +{ + drop.SetSelection(n); + SetLabel(drop.GetValue()); + if (drop.selection >= 0) + SetIcon(icons[drop.selection]); +} + +void ComboBox::SelectAndNotify(int n) { + SetSelection(n); + sendComboBoxEvent(); +} + + +void ComboBox::Rescale() +{ + TextInput::Rescale(); + drop.Rescale(); +} + +wxString ComboBox::GetValue() const +{ + return drop.GetSelection() >= 0 ? drop.GetValue() : GetLabel(); +} + +void ComboBox::SetValue(const wxString &value) +{ + drop.SetValue(value); + SetLabel(value); + if (drop.selection >= 0) + SetIcon(icons[drop.selection]); +} + +void ComboBox::SetLabel(const wxString &value) +{ + if (GetTextCtrl()->IsShown() || text_off) + GetTextCtrl()->SetValue(value); + else + TextInput::SetLabel(value); +} + +wxString ComboBox::GetLabel() const +{ + if (GetTextCtrl()->IsShown() || text_off) + return GetTextCtrl()->GetValue(); + else + return TextInput::GetLabel(); +} + +void ComboBox::SetTextLabel(const wxString& label) +{ + TextInput::SetLabel(label); +} + +wxString ComboBox::GetTextLabel() const +{ + return TextInput::GetLabel(); +} + +bool ComboBox::SetFont(wxFont const& font) +{ + if (GetTextCtrl() && GetTextCtrl()->IsShown()) + return GetTextCtrl()->SetFont(font); + else + return TextInput::SetFont(font); +} + +int ComboBox::Append(const wxString &item, const wxBitmap &bitmap) +{ + return Append(item, bitmap, nullptr); +} + +int ComboBox::Append(const wxString &item, + const wxBitmap &bitmap, + void * clientData) +{ + texts.push_back(item); + icons.push_back(bitmap); + datas.push_back(clientData); + types.push_back(wxClientData_None); + drop.Invalidate(); + return texts.size() - 1; +} + +void ComboBox::DoClear() +{ + texts.clear(); + icons.clear(); + datas.clear(); + types.clear(); + drop.Invalidate(true); +} + +void ComboBox::DoDeleteOneItem(unsigned int pos) +{ + if (pos >= texts.size()) return; + texts.erase(texts.begin() + pos); + icons.erase(icons.begin() + pos); + datas.erase(datas.begin() + pos); + types.erase(types.begin() + pos); + drop.Invalidate(true); +} + +unsigned int ComboBox::GetCount() const { return texts.size(); } + +wxString ComboBox::GetString(unsigned int n) const +{ + return n < texts.size() ? texts[n] : wxString{}; +} + +void ComboBox::SetString(unsigned int n, wxString const &value) +{ + if (n >= texts.size()) return; + texts[n] = value; + drop.Invalidate(); + if (n == drop.GetSelection()) SetLabel(value); +} + +wxBitmap ComboBox::GetItemBitmap(unsigned int n) { return icons[n]; } + +void ComboBox::SetItemBitmap(unsigned int n, wxBitmap const &bitmap) +{ + if (n >= texts.size()) return; + icons[n] = bitmap; + drop.Invalidate(); +} + +int ComboBox::DoInsertItems(const wxArrayStringsAdapter &items, + unsigned int pos, + void ** clientData, + wxClientDataType type) +{ + if (pos > texts.size()) return -1; + for (int i = 0; i < items.GetCount(); ++i) { + texts.insert(texts.begin() + pos, items[i]); + icons.insert(icons.begin() + pos, wxNullBitmap); + datas.insert(datas.begin() + pos, clientData ? clientData[i] : NULL); + types.insert(types.begin() + pos, type); + ++pos; + } + drop.Invalidate(true); + return pos - 1; +} + +void *ComboBox::DoGetItemClientData(unsigned int n) const { return n < texts.size() ? datas[n] : NULL; } + +void ComboBox::DoSetItemClientData(unsigned int n, void *data) +{ + if (n < texts.size()) + datas[n] = data; +} + +void ComboBox::mouseDown(wxMouseEvent &event) +{ + SetFocus(); + if (drop_down) { + drop.Hide(); + } else if (drop.HasDismissLongTime()) { + drop.autoPosition(); + drop_down = true; + drop.Popup(&drop); + wxCommandEvent e(wxEVT_COMBOBOX_DROPDOWN); + GetEventHandler()->ProcessEvent(e); + } +} + +void ComboBox::mouseWheelMoved(wxMouseEvent &event) +{ + event.Skip(); + if (drop_down) return; + auto delta = event.GetWheelRotation() < 0 ? 1 : -1; + unsigned int n = GetSelection() + delta; + if (n < GetCount()) { + SetSelection((int) n); + sendComboBoxEvent(); + } +} + +void ComboBox::keyDown(wxKeyEvent& event) +{ + switch (event.GetKeyCode()) { + case WXK_RETURN: + case WXK_SPACE: + if (drop_down) { + drop.DismissAndNotify(); + } else if (drop.HasDismissLongTime()) { + drop.autoPosition(); + drop_down = true; + drop.Popup(); + wxCommandEvent e(wxEVT_COMBOBOX_DROPDOWN); + GetEventHandler()->ProcessEvent(e); + } + break; + case WXK_UP: + case WXK_DOWN: + case WXK_LEFT: + case WXK_RIGHT: + if ((event.GetKeyCode() == WXK_UP || event.GetKeyCode() == WXK_LEFT) && GetSelection() > 0) { + SetSelection(GetSelection() - 1); + } else if ((event.GetKeyCode() == WXK_DOWN || event.GetKeyCode() == WXK_RIGHT) && GetSelection() + 1 < texts.size()) { + SetSelection(GetSelection() + 1); + } else { + break; + } + sendComboBoxEvent(); + break; + case WXK_TAB: + HandleAsNavigationKey(event); + break; + default: + event.Skip(); + break; + } +} + +void ComboBox::OnEdit() +{ + auto value = GetTextCtrl()->GetValue(); + SetValue(value); +} + +#ifdef __WIN32__ + +WXLRESULT ComboBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + if (nMsg == WM_GETDLGCODE) { + return DLGC_WANTALLKEYS; + } + return TextInput::MSWWindowProc(nMsg, wParam, lParam); +} + +#endif + +void ComboBox::sendComboBoxEvent() +{ + wxCommandEvent event(wxEVT_COMBOBOX, GetId()); + event.SetEventObject(this); + event.SetInt(drop.GetSelection()); + event.SetString(drop.GetValue()); + GetEventHandler()->ProcessEvent(event); +} diff --git a/src/slic3r/GUI/Widgets/ComboBox.hpp b/src/slic3r/GUI/Widgets/ComboBox.hpp new file mode 100644 index 0000000..bac3523 --- /dev/null +++ b/src/slic3r/GUI/Widgets/ComboBox.hpp @@ -0,0 +1,95 @@ +#ifndef slic3r_GUI_ComboBox_hpp_ +#define slic3r_GUI_ComboBox_hpp_ + +#include "TextInput.hpp" +#include "DropDown.hpp" + +#define CB_NO_DROP_ICON DD_NO_CHECK_ICON +#define CB_NO_TEXT DD_NO_TEXT + +class ComboBox : public wxWindowWithItems +{ + std::vector texts; + std::vector icons; + std::vector datas; + std::vector types; + + DropDown drop; + bool drop_down = false; + bool text_off = false; + +public: + ComboBox(wxWindow * parent, + wxWindowID id, + const wxString &value = wxEmptyString, + const wxPoint & pos = wxDefaultPosition, + const wxSize & size = wxDefaultSize, + int n = 0, + const wxString choices[] = NULL, + long style = 0); + + DropDown & GetDropDown() { return drop; } + + virtual bool SetFont(wxFont const & font) override; + +public: + int Append(const wxString &item, const wxBitmap &bitmap = wxNullBitmap); + + int Append(const wxString &item, const wxBitmap &bitmap, void *clientData); + + unsigned int GetCount() const override; + + int GetSelection() const override; + + void SetSelection(int n) override; + + void SelectAndNotify(int n); + + virtual void Rescale() override; + + wxString GetValue() const; + void SetValue(const wxString &value); + + void SetLabel(const wxString &label) override; + wxString GetLabel() const override; + + void SetTextLabel(const wxString &label); + wxString GetTextLabel() const; + + wxString GetString(unsigned int n) const override; + void SetString(unsigned int n, wxString const &value) override; + + wxBitmap GetItemBitmap(unsigned int n); + void SetItemBitmap(unsigned int n, wxBitmap const &bitmap); + +protected: + virtual int DoInsertItems(const wxArrayStringsAdapter &items, + unsigned int pos, + void ** clientData, + wxClientDataType type) override; + virtual void DoClear() override; + + void DoDeleteOneItem(unsigned int pos) override; + + void *DoGetItemClientData(unsigned int n) const override; + void DoSetItemClientData(unsigned int n, void *data) override; + + void OnEdit() override; + + void sendComboBoxEvent(); + +#ifdef __WIN32__ + WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) override; +#endif + +private: + + // some useful events + void mouseDown(wxMouseEvent &event); + void mouseWheelMoved(wxMouseEvent &event); + void keyDown(wxKeyEvent &event); + + DECLARE_EVENT_TABLE() +}; + +#endif // !slic3r_GUI_ComboBox_hpp_ diff --git a/src/slic3r/GUI/Widgets/DropDown.cpp b/src/slic3r/GUI/Widgets/DropDown.cpp new file mode 100644 index 0000000..0fd1e20 --- /dev/null +++ b/src/slic3r/GUI/Widgets/DropDown.cpp @@ -0,0 +1,492 @@ +#include "DropDown.hpp" +#include "Label.hpp" + +#include + +#ifdef __WXGTK__ +#include +#endif + +wxDEFINE_EVENT(EVT_DISMISS, wxCommandEvent); + +BEGIN_EVENT_TABLE(DropDown, PopupWindow) + +EVT_LEFT_DOWN(DropDown::mouseDown) +EVT_LEFT_UP(DropDown::mouseReleased) +EVT_MOUSE_CAPTURE_LOST(DropDown::mouseCaptureLost) +EVT_MOTION(DropDown::mouseMove) +EVT_MOUSEWHEEL(DropDown::mouseWheelMoved) + +// catch paint events +EVT_PAINT(DropDown::paintEvent) + +END_EVENT_TABLE() + +/* + * Called by the system of by wxWidgets when the panel needs + * to be redrawn. You can also trigger this call by + * calling Refresh()/Update(). + */ + +DropDown::DropDown(std::vector &texts, + std::vector &icons) + : texts(texts) + , icons(icons) + , state_handler(this) + , border_color(0xDBDBDB) + , text_color(0x363636) + , selector_border_color(std::make_pair(0x009688, (int) StateColor::Hovered), + std::make_pair(*wxWHITE, (int) StateColor::Normal)) + , selector_background_color(std::make_pair(0xEDFAF2, (int) StateColor::Checked), + std::make_pair(*wxWHITE, (int) StateColor::Normal)) +{ +} + +DropDown::DropDown(wxWindow * parent, + std::vector &texts, + std::vector &icons, + long style) + : DropDown(texts, icons) +{ + Create(parent, style); +} + +void DropDown::Create(wxWindow * parent, + long style) +{ + PopupWindow::Create(parent, wxPU_CONTAINS_CONTROLS); + SetBackgroundStyle(wxBG_STYLE_PAINT); + SetBackgroundColour(*wxWHITE); + state_handler.attach({&border_color, &text_color, &selector_border_color, &selector_background_color}); + state_handler.update_binds(); + if ((style & DD_NO_CHECK_ICON) == 0) + check_bitmap = ScalableBitmap(this, "checked", 16); + text_off = style & DD_NO_TEXT; + + // BBS set default font + SetFont(Label::Body_14); +#ifdef __WXOSX__ + // PopupWindow releases mouse on idle, which may cause various problems, + // such as losting mouse move, and dismissing soon on first LEFT_DOWN event. + Bind(wxEVT_IDLE, [] (wxIdleEvent & evt) {}); +#endif +} + +void DropDown::Invalidate(bool clear) +{ + if (clear) { + selection = hover_item = -1; + offset = wxPoint(); + } + assert(selection < (int) texts.size()); + need_sync = true; +} + +void DropDown::SetSelection(int n) +{ + assert(n < (int) texts.size()); + if (n >= (int) texts.size()) + n = -1; + if (selection == n) return; + selection = n; + paintNow(); +} + +wxString DropDown::GetValue() const +{ + return selection >= 0 ? texts[selection] : wxString(); +} + +void DropDown::SetValue(const wxString &value) +{ + auto i = std::find(texts.begin(), texts.end(), value); + selection = i == texts.end() ? -1 : std::distance(texts.begin(), i); +} + +void DropDown::SetCornerRadius(double radius) +{ + this->radius = radius; + paintNow(); +} + +void DropDown::SetBorderColor(StateColor const &color) +{ + border_color = color; + state_handler.update_binds(); + paintNow(); +} + +void DropDown::SetSelectorBorderColor(StateColor const &color) +{ + selector_border_color = color; + state_handler.update_binds(); + paintNow(); +} + +void DropDown::SetTextColor(StateColor const &color) +{ + text_color = color; + state_handler.update_binds(); + paintNow(); +} + +void DropDown::SetSelectorBackgroundColor(StateColor const &color) +{ + selector_background_color = color; + state_handler.update_binds(); + paintNow(); +} + +void DropDown::SetUseContentWidth(bool use) +{ + if (use_content_width == use) + return; + use_content_width = use; + need_sync = true; + messureSize(); +} + +void DropDown::SetAlignIcon(bool align) { align_icon = align; } + +void DropDown::Rescale() +{ + need_sync = true; +} + +bool DropDown::HasDismissLongTime() +{ + auto now = boost::posix_time::microsec_clock::universal_time(); + return !IsShown() && + (now - dismissTime).total_milliseconds() >= 20; +} + +void DropDown::paintEvent(wxPaintEvent& evt) +{ + // depending on your system you may need to look at double-buffered dcs + wxBufferedPaintDC dc(this); + render(dc); +} + +/* + * Alternatively, you can use a clientDC to paint on the panel + * at any time. Using this generally does not free you from + * catching paint events, since it is possible that e.g. the window + * manager throws away your drawing when the window comes to the + * background, and expects you will redraw it when the window comes + * back (by sending a paint event). + */ +void DropDown::paintNow() +{ + // depending on your system you may need to look at double-buffered dcs + //wxClientDC dc(this); + //render(dc); + Refresh(); +} + +static wxSize GetBmpSize(wxBitmap & bmp) +{ +#ifdef __APPLE__ + return bmp.GetScaledSize(); +#else + return bmp.GetSize(); +#endif +} + +/* + * Here we do the actual rendering. I put it in a separate + * method so that it can work no matter what type of DC + * (e.g. wxPaintDC or wxClientDC) is used. + */ +void DropDown::render(wxDC &dc) +{ + if (texts.size() == 0) return; + int states = state_handler.states(); + dc.SetPen(wxPen(border_color.colorForStates(states))); + dc.SetBrush(wxBrush(StateColor::darkModeColorFor(GetBackgroundColour()))); + // if (GetWindowStyle() & wxBORDER_NONE) + // dc.SetPen(wxNullPen); + + // draw background + wxSize size = GetSize(); + if (radius == 0) + dc.DrawRectangle(0, 0, size.x, size.y); + else + dc.DrawRoundedRectangle(0, 0, size.x, size.y, radius); + + // draw hover rectangle + wxRect rcContent = {{0, offset.y}, rowSize}; + if (hover_item >= 0 && (states & StateColor::Hovered)) { + rcContent.y += rowSize.y * hover_item; + if (rcContent.GetBottom() > 0 && rcContent.y < size.y) { + if (selection == hover_item) + dc.SetBrush(wxBrush(selector_background_color.colorForStates(states | StateColor::Checked))); + dc.SetPen(wxPen(selector_border_color.colorForStates(states))); + rcContent.Deflate(4, 1); + dc.DrawRectangle(rcContent); + rcContent.Inflate(4, 1); + } + rcContent.y = offset.y; + } + // draw checked rectangle + if (selection >= 0 && (selection != hover_item || (states & StateColor::Hovered) == 0)) { + rcContent.y += rowSize.y * selection; + if (rcContent.GetBottom() > 0 && rcContent.y < size.y) { + dc.SetBrush(wxBrush(selector_background_color.colorForStates(states | StateColor::Checked))); + dc.SetPen(wxPen(selector_background_color.colorForStates(states))); + rcContent.Deflate(4, 1); + dc.DrawRectangle(rcContent); + rcContent.Inflate(4, 1); + } + rcContent.y = offset.y; + } + dc.SetBrush(*wxTRANSPARENT_BRUSH); + { + wxSize offset = (rowSize - textSize) / 2; + rcContent.Deflate(0, offset.y); + } + + // draw position bar + if (rowSize.y * texts.size() > size.y) { + int height = rowSize.y * texts.size(); + wxRect rect = {size.x - 6, -offset.y * size.y / height, 4, + size.y * size.y / height}; + dc.SetPen(wxPen(border_color.defaultColor())); + dc.SetBrush(wxBrush(*wxLIGHT_GREY)); + dc.DrawRoundedRectangle(rect, 2); + rcContent.width -= 6; + } + + // draw check icon + rcContent.x += 5; + rcContent.width -= 5; + if (check_bitmap.get_bitmap().IsOk()) { + auto szBmp = check_bitmap.GetSize(); + if (selection >= 0) { + wxPoint pt = rcContent.GetLeftTop(); + pt.y += (rcContent.height - szBmp.y) / 2; + pt.y += rowSize.y * selection; + if (pt.y + szBmp.y > 0 && pt.y < size.y) + dc.DrawBitmap(check_bitmap.get_bitmap(), pt); + } + rcContent.x += szBmp.x + 5; + rcContent.width -= szBmp.x + 5; + } + // draw texts & icons + dc.SetTextForeground(text_color.colorForStates(states)); + for (int i = 0; i < texts.size(); ++i) { + if (rcContent.GetBottom() < 0) { + rcContent.y += rowSize.y; + continue; + } + if (rcContent.y > size.y) break; + wxPoint pt = rcContent.GetLeftTop(); + auto & icon = icons[i]; + auto size2 = GetBmpSize(icon); + if (iconSize.x > 0) { + if (icon.IsOk()) { + pt.y += (rcContent.height - size2.y) / 2; + dc.DrawBitmap(icon, pt); + } + pt.x += iconSize.x + 5; + pt.y = rcContent.y; + } else if (icon.IsOk()) { + pt.y += (rcContent.height - size2.y) / 2; + dc.DrawBitmap(icon, pt); + pt.x += size2.x + 5; + pt.y = rcContent.y; + } + auto text = texts[i]; + if (!text_off && !text.IsEmpty()) { + wxSize tSize = dc.GetMultiLineTextExtent(text); + if (pt.x + tSize.x > rcContent.GetRight()) { + text = wxControl::Ellipsize(text, dc, wxELLIPSIZE_END, + rcContent.GetRight() - pt.x); + } + pt.y += (rcContent.height - textSize.y) / 2; + dc.SetFont(GetFont()); + dc.DrawText(text, pt); + } + rcContent.y += rowSize.y; + } +} + +void DropDown::messureSize() +{ + if (!need_sync) return; + textSize = wxSize(); + iconSize = wxSize(); + wxClientDC dc(GetParent() ? GetParent() : this); + for (size_t i = 0; i < texts.size(); ++i) { + wxSize size1 = text_off ? wxSize() : dc.GetMultiLineTextExtent(texts[i]); + if (icons[i].IsOk()) { + wxSize size2 = GetBmpSize(icons[i]); + if (size2.x > iconSize.x) iconSize = size2; + if (!align_icon) { + size1.x += size2.x + (text_off ? 0 : 5); + } + } + if (size1.x > textSize.x) textSize = size1; + } + if (!align_icon) iconSize.x = 0; + wxSize szContent = textSize; + szContent.x += 10; + if (check_bitmap.get_bitmap().IsOk()) { + auto szBmp = check_bitmap.GetSize(); + szContent.x += szBmp.x + 5; + } + if (iconSize.x > 0) szContent.x += iconSize.x + (text_off ? 0 : 5); + if (iconSize.y > szContent.y) szContent.y = iconSize.y; + szContent.y += 10; + if (texts.size() > 15) szContent.x += 6; + if (GetParent()) { + auto x = GetParent()->GetSize().x; + if (!use_content_width || x > szContent.x) + szContent.x = x; + } + rowSize = szContent; + szContent.y *= std::min((size_t)15, texts.size()); + szContent.y += texts.size() > 15 ? rowSize.y / 2 : 0; + wxWindow::SetSize(szContent); +#ifdef __WXGTK__ + // Gtk has a wrapper window for popup widget + gtk_window_resize (GTK_WINDOW (m_widget), szContent.x, szContent.y); +#endif + need_sync = false; +} + +void DropDown::autoPosition() +{ + messureSize(); + wxPoint pos = GetParent()->ClientToScreen(wxPoint(0, -6)); + wxPoint old = GetPosition(); + wxSize size = GetSize(); + Position(pos, {0, GetParent()->GetSize().y + 12}); + if (old != GetPosition()) { + size = rowSize; + size.y *= std::min((size_t)15, texts.size()); + size.y += texts.size() > 15 ? rowSize.y / 2 : 0; + if (size != GetSize()) { + wxWindow::SetSize(size); + offset = wxPoint(); + Position(pos, {0, GetParent()->GetSize().y + 12}); + } + } + if (GetPosition().y > pos.y) { + // may exceed + auto drect = wxDisplay(GetParent()).GetGeometry(); + if (GetPosition().y + size.y + 10 > drect.GetBottom()) { + if (use_content_width && texts.size() <= 15) size.x += 6; + size.y = drect.GetBottom() - GetPosition().y - 10; + wxWindow::SetSize(size); + if (selection >= 0) { + if (offset.y + rowSize.y * (selection + 1) > size.y) + offset.y = size.y - rowSize.y * (selection + 1); + else if (offset.y + rowSize.y * selection < 0) + offset.y = -rowSize.y * selection; + } + } + } +} + +void DropDown::mouseDown(wxMouseEvent& event) +{ + // Receivce unexcepted LEFT_DOWN on Mac after OnDismiss + if (!IsShown()) + return; + // force calc hover item again + mouseMove(event); + pressedDown = true; + CaptureMouse(); + dragStart = event.GetPosition(); +} + +void DropDown::mouseReleased(wxMouseEvent& event) +{ + if (pressedDown) { + dragStart = wxPoint(); + pressedDown = false; + if (HasCapture()) + ReleaseMouse(); + if (hover_item >= 0) { // not moved + sendDropDownEvent(); + DismissAndNotify(); + } + } +} + +void DropDown::mouseCaptureLost(wxMouseCaptureLostEvent &event) +{ + wxMouseEvent evt; + mouseReleased(evt); +} + +void DropDown::mouseMove(wxMouseEvent &event) +{ + wxPoint pt = event.GetPosition(); + if (pressedDown) { + wxPoint pt2 = offset + pt - dragStart; + wxSize size = GetSize(); + dragStart = pt; + if (pt2.y > 0) + pt2.y = 0; + else if (pt2.y + rowSize.y * int(texts.size()) < size.y) + pt2.y = size.y - rowSize.y * int(texts.size()); + if (pt2.y != offset.y) { + offset = pt2; + hover_item = -1; // moved + } else { + return; + } + } + if (!pressedDown || hover_item >= 0) { + int hover = (pt.y - offset.y) / rowSize.y; + if (hover >= (int) texts.size()) hover = -1; + if (hover == hover_item) return; + hover_item = hover; + if (hover >= 0) + SetToolTip(texts[hover]); + } + paintNow(); +} + +void DropDown::mouseWheelMoved(wxMouseEvent &event) +{ + auto delta = event.GetWheelRotation(); + wxSize size = GetSize(); + wxPoint pt2 = offset + wxPoint{0, delta}; + if (pt2.y > 0) + pt2.y = 0; + else if (pt2.y + rowSize.y * int(texts.size()) < size.y) + pt2.y = size.y - rowSize.y * int(texts.size()); + if (pt2.y != offset.y) { + offset = pt2; + } else { + return; + } + int hover = (event.GetPosition().y - offset.y) / rowSize.y; + if (hover >= (int) texts.size()) hover = -1; + if (hover != hover_item) { + hover_item = hover; + if (hover >= 0) SetToolTip(texts[hover]); + } + paintNow(); +} + +// currently unused events +void DropDown::sendDropDownEvent() +{ + selection = hover_item; + wxCommandEvent event(wxEVT_COMBOBOX, GetId()); + event.SetEventObject(this); + event.SetInt(selection); + event.SetString(GetValue()); + GetEventHandler()->ProcessEvent(event); +} + +void DropDown::OnDismiss() +{ + dismissTime = boost::posix_time::microsec_clock::universal_time(); + hover_item = -1; + wxCommandEvent e(EVT_DISMISS); + GetEventHandler()->ProcessEvent(e); +} diff --git a/src/slic3r/GUI/Widgets/DropDown.hpp b/src/slic3r/GUI/Widgets/DropDown.hpp new file mode 100644 index 0000000..e2a6cb4 --- /dev/null +++ b/src/slic3r/GUI/Widgets/DropDown.hpp @@ -0,0 +1,112 @@ +#ifndef slic3r_GUI_DropDown_hpp_ +#define slic3r_GUI_DropDown_hpp_ + +#include +#include "../wxExtensions.hpp" +#include "StateHandler.hpp" +#include "PopupWindow.hpp" + +#define DD_NO_CHECK_ICON 0x0001 +#define DD_NO_TEXT 0x0002 +#define DD_STYLE_MASK 0x0003 + +wxDECLARE_EVENT(EVT_DISMISS, wxCommandEvent); + +class DropDown : public PopupWindow +{ + std::vector & texts; + std::vector & icons; + bool need_sync = false; + int selection = -1; + int hover_item = -1; + + double radius = 0; + bool use_content_width = false; + bool align_icon = false; + bool text_off = false; + + wxSize textSize; + wxSize iconSize; + wxSize rowSize; + + StateHandler state_handler; + StateColor text_color; + StateColor border_color; + StateColor selector_border_color; + StateColor selector_background_color; + ScalableBitmap check_bitmap; + + bool pressedDown = false; + boost::posix_time::ptime dismissTime; + wxPoint offset; // x not used + wxPoint dragStart; + +public: + DropDown(std::vector &texts, + std::vector &icons); + + DropDown(wxWindow * parent, + std::vector &texts, + std::vector &icons, + long style = 0); + + void Create(wxWindow * parent, + long style = 0); + +public: + void Invalidate(bool clear = false); + + int GetSelection() const { return selection; } + + void SetSelection(int n); + + wxString GetValue() const; + void SetValue(const wxString &value); + +public: + void SetCornerRadius(double radius); + + void SetBorderColor(StateColor const & color); + + void SetSelectorBorderColor(StateColor const & color); + + void SetTextColor(StateColor const &color); + + void SetSelectorBackgroundColor(StateColor const &color); + + void SetUseContentWidth(bool use); + + void SetAlignIcon(bool align); + +public: + void Rescale(); + + bool HasDismissLongTime(); + +protected: + void OnDismiss() override; + +private: + void paintEvent(wxPaintEvent& evt); + void paintNow(); + + void render(wxDC& dc); + + friend class ComboBox; + void messureSize(); + void autoPosition(); + + // some useful events + void mouseDown(wxMouseEvent& event); + void mouseReleased(wxMouseEvent &event); + void mouseCaptureLost(wxMouseCaptureLostEvent &event); + void mouseMove(wxMouseEvent &event); + void mouseWheelMoved(wxMouseEvent &event); + + void sendDropDownEvent(); + + + DECLARE_EVENT_TABLE() +}; + +#endif // !slic3r_GUI_DropDown_hpp_ diff --git a/src/slic3r/GUI/Widgets/PopupWindow.cpp b/src/slic3r/GUI/Widgets/PopupWindow.cpp new file mode 100644 index 0000000..135802c --- /dev/null +++ b/src/slic3r/GUI/Widgets/PopupWindow.cpp @@ -0,0 +1,37 @@ +#include "PopupWindow.hpp" + +static wxWindow *GetTopParent(wxWindow *pWindow) +{ + wxWindow *pWin = pWindow; + while (pWin->GetParent()) { + pWin = pWin->GetParent(); + if (auto top = dynamic_cast(pWin)) + return top; + } + return pWin; +} + +bool PopupWindow::Create(wxWindow *parent, int style) +{ + if (!wxPopupTransientWindow::Create(parent, style)) + return false; +#ifdef __WXGTK__ + GetTopParent(parent)->Bind(wxEVT_ACTIVATE, &PopupWindow::topWindowActiavate, this); +#endif + return true; +} + +PopupWindow::~PopupWindow() +{ +#ifdef __WXGTK__ + GetTopParent(this)->Unbind(wxEVT_ACTIVATE, &PopupWindow::topWindowActiavate, this); +#endif +} + +#ifdef __WXGTK__ +void PopupWindow::topWindowActiavate(wxActivateEvent &event) +{ + event.Skip(); + if (!event.GetActive() && IsShown()) DismissAndNotify(); +} +#endif diff --git a/src/slic3r/GUI/Widgets/PopupWindow.hpp b/src/slic3r/GUI/Widgets/PopupWindow.hpp new file mode 100644 index 0000000..88993de --- /dev/null +++ b/src/slic3r/GUI/Widgets/PopupWindow.hpp @@ -0,0 +1,24 @@ +#ifndef slic3r_GUI_PopupWindow_hpp_ +#define slic3r_GUI_PopupWindow_hpp_ + +#include + +class PopupWindow : public wxPopupTransientWindow +{ +public: + PopupWindow() {} + + ~PopupWindow(); + + PopupWindow(wxWindow *parent, int style = wxBORDER_NONE) + { Create(parent, style); } + + bool Create(wxWindow *parent, int flags = wxBORDER_NONE); + +private: +#ifdef __WXGTK__ + void topWindowActiavate(wxActivateEvent &event); +#endif +}; + +#endif // !slic3r_GUI_PopupWindow_hpp_ diff --git a/src/slic3r/GUI/Widgets/RadioBox.cpp b/src/slic3r/GUI/Widgets/RadioBox.cpp new file mode 100644 index 0000000..17712a8 --- /dev/null +++ b/src/slic3r/GUI/Widgets/RadioBox.cpp @@ -0,0 +1,42 @@ +#include "RadioBox.hpp" + +#include "../wxExtensions.hpp" + +namespace Slic3r { +namespace GUI { +RadioBox::RadioBox(wxWindow *parent) + : wxBitmapToggleButton(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE), m_on(this, "radio_on", 18), m_off(this, "radio_off", 18) +{ + // SetBackgroundStyle(wxBG_STYLE_TRANSPARENT); + if (parent) SetBackgroundColour(parent->GetBackgroundColour()); + // Bind(wxEVT_TOGGLEBUTTON, [this](auto& e) { update(); e.Skip(); }); + SetSize(m_on.GetSize()); + SetMinSize(m_on.GetSize()); + update(); +} + +void RadioBox::SetValue(bool value) +{ + wxBitmapToggleButton::SetValue(value); + update(); +} + +bool RadioBox::GetValue() +{ + return wxBitmapToggleButton::GetValue(); +} + + +void RadioBox::Rescale() +{ + m_on.msw_rescale(); + m_off.msw_rescale(); + SetSize(m_on.GetSize()); + update(); +} + +void RadioBox::update() { SetBitmap((GetValue() ? m_on : m_off).bmp()); } + +} +} + diff --git a/src/slic3r/GUI/Widgets/RadioBox.hpp b/src/slic3r/GUI/Widgets/RadioBox.hpp new file mode 100644 index 0000000..8f30994 --- /dev/null +++ b/src/slic3r/GUI/Widgets/RadioBox.hpp @@ -0,0 +1,39 @@ +#ifndef slic3r_GUI_RADIOBOX_hpp_ +#define slic3r_GUI_RADIOBOX_hpp_ + +#include "../wxExtensions.hpp" + +#include + +namespace Slic3r { +namespace GUI { + +class RadioBox : public wxBitmapToggleButton +{ +public: + RadioBox(wxWindow *parent); + +public: + void SetValue(bool value) override; + bool GetValue(); + void Rescale(); + bool Disable() { + return wxBitmapToggleButton::Disable(); + } + bool Enable() { + return wxBitmapToggleButton::Enable(); + } + +private: + void update(); + +private: + ScalableBitmap m_on; + ScalableBitmap m_off; +}; + +}} + + + +#endif // !slic3r_GUI_CheckBox_hpp_ diff --git a/src/slic3r/GUI/Widgets/RoundedRectangle.cpp b/src/slic3r/GUI/Widgets/RoundedRectangle.cpp new file mode 100644 index 0000000..a3c7c13 --- /dev/null +++ b/src/slic3r/GUI/Widgets/RoundedRectangle.cpp @@ -0,0 +1,35 @@ +#include "RoundedRectangle.hpp" +#include "../wxExtensions.hpp" +#include + +BEGIN_EVENT_TABLE(RoundedRectangle, wxPanel) +EVT_PAINT(RoundedRectangle::OnPaint) +END_EVENT_TABLE() + + RoundedRectangle::RoundedRectangle(wxWindow *parent, wxColour col, wxPoint pos, wxSize size, double radius, int type) + : wxWindow(parent, wxID_ANY, pos, size, wxBORDER_NONE) +{ + SetBackgroundColour(wxColour(255,255,255)); + m_type = type; + m_color = col; + m_radius = radius; +} + +void RoundedRectangle::OnPaint(wxPaintEvent &evt) +{ + //draw RoundedRectangle + if (m_type == 0) { + wxPaintDC dc(this); + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(m_color)); + dc.DrawRoundedRectangle(0, 0, GetSize().GetWidth(), GetSize().GetHeight(), m_radius); + } + + //draw RoundedRectangle only board + if (m_type == 1) { + wxPaintDC dc(this); + dc.SetPen(m_color); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + dc.DrawRoundedRectangle(0, 0, GetSize().GetWidth(), GetSize().GetHeight(), m_radius); + } +} \ No newline at end of file diff --git a/src/slic3r/GUI/Widgets/RoundedRectangle.hpp b/src/slic3r/GUI/Widgets/RoundedRectangle.hpp new file mode 100644 index 0000000..9709010 --- /dev/null +++ b/src/slic3r/GUI/Widgets/RoundedRectangle.hpp @@ -0,0 +1,21 @@ +#ifndef slic3r_GUI_ROUNDEDRECTANGLE_hpp_ +#define slic3r_GUI_ROUNDEDRECTANGLE_hpp_ + +#include "../wxExtensions.hpp" + +class RoundedRectangle : public wxWindow +{ +public: + RoundedRectangle(wxWindow *parent, wxColour col, wxPoint pos, wxSize size, double radius, int type = 0); + ~RoundedRectangle(){}; + +private: + double m_radius; + int m_type; + wxColour m_color; + +public: + void OnPaint(wxPaintEvent &evt); + DECLARE_EVENT_TABLE() +}; +#endif // !slic3r_GUI_RoundedRectangle_hpp_ diff --git a/src/slic3r/GUI/Widgets/TextCtrl.h b/src/slic3r/GUI/Widgets/TextCtrl.h new file mode 100644 index 0000000..3f3ab2b --- /dev/null +++ b/src/slic3r/GUI/Widgets/TextCtrl.h @@ -0,0 +1,10 @@ +#ifdef __WXMSW__ +class TextCtrl : public wxTextCtrl +{ +public: + using wxTextCtrl::wxTextCtrl; + WXHBRUSH DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd) { return wxTextCtrl::DoMSWControlColor(pDC, wxColour(), hWnd); } +}; +#else +typedef wxTextCtrl TextCtrl; +#endif diff --git a/src/slic3r/GUI/Widgets/TextInput.cpp b/src/slic3r/GUI/Widgets/TextInput.cpp new file mode 100644 index 0000000..08bfb4f --- /dev/null +++ b/src/slic3r/GUI/Widgets/TextInput.cpp @@ -0,0 +1,240 @@ +#include "TextInput.hpp" +#include "Label.hpp" +#include "TextCtrl.h" +#include "slic3r/GUI/Widgets/Label.hpp" + +#include + +BEGIN_EVENT_TABLE(TextInput, wxPanel) + +EVT_PAINT(TextInput::paintEvent) + +END_EVENT_TABLE() + +/* + * Called by the system of by wxWidgets when the panel needs + * to be redrawn. You can also trigger this call by + * calling Refresh()/Update(). + */ + +TextInput::TextInput() + : label_color(std::make_pair(0x909090, (int) StateColor::Disabled), + std::make_pair(0x6B6B6B, (int) StateColor::Normal)) + , text_color(std::make_pair(0x909090, (int) StateColor::Disabled), + std::make_pair(0x262E30, (int) StateColor::Normal)) +{ + radius = 0; + border_width = 1; + border_color = StateColor(std::make_pair(0xDBDBDB, (int) StateColor::Disabled), std::make_pair(0x009688, (int) StateColor::Hovered), + std::make_pair(0xDBDBDB, (int) StateColor::Normal)); + background_color = StateColor(std::make_pair(0xF0F0F1, (int) StateColor::Disabled), std::make_pair(*wxWHITE, (int) StateColor::Normal)); + SetFont(Label::Body_12); +} + +TextInput::TextInput(wxWindow * parent, + wxString text, + wxString label, + wxString icon, + const wxPoint &pos, + const wxSize & size, + long style) + : TextInput() +{ + Create(parent, text, label, icon, pos, size, style); +} + +void TextInput::Create(wxWindow * parent, + wxString text, + wxString label, + wxString icon, + const wxPoint &pos, + const wxSize & size, + long style) +{ + text_ctrl = nullptr; + StaticBox::Create(parent, wxID_ANY, pos, size, style); + wxWindow::SetLabel(label); + style &= ~wxRIGHT; + state_handler.attach({&label_color, & text_color}); + state_handler.update_binds(); + text_ctrl = new TextCtrl(this, wxID_ANY, text, {4, 4}, wxDefaultSize, style | wxBORDER_NONE | wxTE_PROCESS_ENTER); + text_ctrl->SetFont(Label::Body_14); + text_ctrl->SetInitialSize(text_ctrl->GetBestSize()); + text_ctrl->SetBackgroundColour(background_color.colorForStates(state_handler.states())); + text_ctrl->SetForegroundColour(text_color.colorForStates(state_handler.states())); + state_handler.attach_child(text_ctrl); + text_ctrl->Bind(wxEVT_KILL_FOCUS, [this](auto &e) { + OnEdit(); + e.SetId(GetId()); + ProcessEventLocally(e); + e.Skip(); + }); + text_ctrl->Bind(wxEVT_TEXT_ENTER, [this](auto &e) { + OnEdit(); + e.SetId(GetId()); + ProcessEventLocally(e); + }); + text_ctrl->Bind(wxEVT_RIGHT_DOWN, [this](auto &e) {}); // disable context menu + if (!icon.IsEmpty()) { + this->icon = ScalableBitmap(this, icon.ToStdString(), 16); + } + messureSize(); +} + +void TextInput::SetCornerRadius(double radius) +{ + this->radius = radius; + Refresh(); +} + +void TextInput::SetLabel(const wxString& label) +{ + wxWindow::SetLabel(label); + messureSize(); + Refresh(); +} + +void TextInput::SetIcon(const wxBitmap &icon) +{ + this->icon.get_bitmap() = icon; + Rescale(); +} + +void TextInput::SetLabelColor(StateColor const &color) +{ + label_color = color; + state_handler.update_binds(); +} + +void TextInput::SetTextColor(StateColor const& color) +{ + text_color= color; + state_handler.update_binds(); +} + +void TextInput::Rescale() +{ + if (!this->icon.name().empty()) + this->icon.msw_rescale(); + messureSize(); + Refresh(); +} + +bool TextInput::Enable(bool enable) +{ + bool result = text_ctrl->Enable(enable) && wxWindow::Enable(enable); + if (result) { + wxCommandEvent e(EVT_ENABLE_CHANGED); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(e); + text_ctrl->SetBackgroundColour(background_color.colorForStates(state_handler.states())); + text_ctrl->SetForegroundColour(text_color.colorForStates(state_handler.states())); + } + return result; +} + +void TextInput::SetMinSize(const wxSize& size) +{ + wxSize size2 = size; + if (size2.y < 0) { +#ifdef __WXMAC__ + if (GetPeer()) // peer is not ready in Create on mac +#endif + size2.y = GetSize().y; + } + wxWindow::SetMinSize(size2); +} + +void TextInput::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + wxWindow::DoSetSize(x, y, width, height, sizeFlags); + if (sizeFlags & wxSIZE_USE_EXISTING) return; + wxSize size = GetSize(); + wxPoint textPos = {5, 0}; + if (this->icon.get_bitmap().IsOk()) { + wxSize szIcon = this->icon.GetSize(); + textPos.x += szIcon.x; + } + bool align_right = GetWindowStyle() & wxRIGHT; + if (align_right) + textPos.x += labelSize.x; + if (text_ctrl) { + wxSize textSize = text_ctrl->GetSize(); + textSize.x = size.x - textPos.x - labelSize.x - 10; + text_ctrl->SetSize(textSize); + text_ctrl->SetPosition({textPos.x, (size.y - textSize.y) / 2}); + } +} + +void TextInput::DoSetToolTipText(wxString const &tip) +{ + wxWindow::DoSetToolTipText(tip); + text_ctrl->SetToolTip(tip); +} + +void TextInput::paintEvent(wxPaintEvent &evt) +{ + // depending on your system you may need to look at double-buffered dcs + wxPaintDC dc(this); + render(dc); +} + +/* + * Here we do the actual rendering. I put it in a separate + * method so that it can work no matter what type of DC + * (e.g. wxPaintDC or wxClientDC) is used. + */ +void TextInput::render(wxDC& dc) +{ + StaticBox::render(dc); + int states = state_handler.states(); + wxSize size = GetSize(); + bool align_right = GetWindowStyle() & wxRIGHT; + // start draw + wxPoint pt = {5, 0}; + if (icon.get_bitmap().IsOk()) { + wxSize szIcon = icon.GetSize(); + pt.y = (size.y - szIcon.y) / 2; + dc.DrawBitmap(icon.get_bitmap(), pt); + pt.x += szIcon.x + 0; + } + auto text = wxWindow::GetLabel(); + if (!text.IsEmpty()) { + wxSize textSize = text_ctrl->GetSize(); + if (align_right) { + if (pt.x + labelSize.x > size.x) + text = wxControl::Ellipsize(text, dc, wxELLIPSIZE_END, size.x - pt.x); + pt.y = (size.y - labelSize.y) / 2; + } else { + pt.x += textSize.x; + pt.y = (size.y + textSize.y) / 2 - labelSize.y; + } + dc.SetTextForeground(label_color.colorForStates(states)); + if(align_right) + dc.SetFont(GetFont()); + else + dc.SetFont(Label::Body_12); + dc.DrawText(text, pt); + } +} + +void TextInput::messureSize() +{ + wxSize size = GetSize(); + wxClientDC dc(this); + bool align_right = GetWindowStyle() & wxRIGHT; + if (align_right) + dc.SetFont(GetFont()); + else + dc.SetFont(Label::Body_12); + labelSize = dc.GetTextExtent(wxWindow::GetLabel()); + wxSize textSize = text_ctrl->GetSize(); + int h = textSize.y + 8; + if (size.y < h) { + size.y = h; + } + wxSize minSize = size; + minSize.x = GetMinWidth(); + SetMinSize(minSize); + SetSize(size); +} diff --git a/src/slic3r/GUI/Widgets/TextInput.hpp b/src/slic3r/GUI/Widgets/TextInput.hpp new file mode 100644 index 0000000..1013e7c --- /dev/null +++ b/src/slic3r/GUI/Widgets/TextInput.hpp @@ -0,0 +1,77 @@ +#ifndef slic3r_GUI_TextInput_hpp_ +#define slic3r_GUI_TextInput_hpp_ + +#include +#include "StaticBox.hpp" + +class TextInput : public wxNavigationEnabled +{ + + wxSize labelSize; + ScalableBitmap icon; + StateColor label_color; + StateColor text_color; + wxTextCtrl * text_ctrl; + + static const int TextInputWidth = 200; + static const int TextInputHeight = 50; + +public: + TextInput(); + + TextInput(wxWindow * parent, + wxString text, + wxString label = "", + wxString icon = "", + const wxPoint &pos = wxDefaultPosition, + const wxSize & size = wxDefaultSize, + long style = 0); + +public: + void Create(wxWindow * parent, + wxString text, + wxString label = "", + wxString icon = "", + const wxPoint &pos = wxDefaultPosition, + const wxSize & size = wxDefaultSize, + long style = 0); + + void SetCornerRadius(double radius); + + void SetLabel(const wxString& label); + + void SetIcon(const wxBitmap &icon); + + void SetLabelColor(StateColor const &color); + + void SetTextColor(StateColor const &color); + + virtual void Rescale(); + + virtual bool Enable(bool enable = true) override; + + virtual void SetMinSize(const wxSize& size) override; + + wxTextCtrl *GetTextCtrl() { return text_ctrl; } + + wxTextCtrl const *GetTextCtrl() const { return text_ctrl; } + +protected: + virtual void OnEdit() {} + + virtual void DoSetSize( + int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + + void DoSetToolTipText(wxString const &tip) override; + +private: + void paintEvent(wxPaintEvent& evt); + + void render(wxDC& dc); + + void messureSize(); + + DECLARE_EVENT_TABLE() +}; + +#endif // !slic3r_GUI_TextInput_hpp_ diff --git a/src/slic3r/GUI/calib_dlg.cpp b/src/slic3r/GUI/calib_dlg.cpp new file mode 100644 index 0000000..bf46f8b --- /dev/null +++ b/src/slic3r/GUI/calib_dlg.cpp @@ -0,0 +1,242 @@ +#include "calib_dlg.hpp" +#include "GUI_App.hpp" +#include "MsgDialog.hpp" +#include "I18N.hpp" +#include +#include "MainFrame.hpp" +#include +namespace Slic3r { +namespace GUI { + +wxBoxSizer *create_item_checkbox(wxString title, wxWindow *parent, bool *value, CheckBoxInWT *&checkbox) +{ + wxBoxSizer* m_sizer_checkbox = new wxBoxSizer(wxHORIZONTAL); + + m_sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, 5); + + checkbox = new ::CheckBoxInWT(parent); + m_sizer_checkbox->Add(checkbox, 0, wxALIGN_CENTER, 0); + m_sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, 8); + + auto checkbox_title = new wxStaticText(parent, wxID_ANY, title, wxDefaultPosition, wxSize(-1, -1), 0); + checkbox_title->SetForegroundColour(wxColour(144, 144, 144)); + checkbox_title->SetFont(::Label::Body_13); + checkbox_title->Wrap(-1); + m_sizer_checkbox->Add(checkbox_title, 0, wxALIGN_CENTER | wxALL, 3); + + checkbox->SetValue(true); + + checkbox->Bind(wxEVT_TOGGLEBUTTON, [parent, checkbox, value](wxCommandEvent& e) { + (*value) = (*value) ? false : true; + e.Skip(); + }); + + return m_sizer_checkbox; +} + +PA_Calibration_Dlg::PA_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater* plater) + : DPIDialog(parent, id, _L("PA Calibration"), wxDefaultPosition, parent->FromDIP(wxSize(-1, 280)), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), m_plater(plater) +{ + wxBoxSizer* v_sizer = new wxBoxSizer(wxVERTICAL); + SetSizer(v_sizer); + wxBoxSizer* choice_sizer = new wxBoxSizer(wxHORIZONTAL); + + wxString m_rbExtruderTypeChoices[] = { _L("DDE"), _L("Bowden") }; + int m_rbExtruderTypeNChoices = sizeof(m_rbExtruderTypeChoices) / sizeof(wxString); + m_rbExtruderType = new wxRadioBox(this, wxID_ANY, _L("Extruder type"), wxDefaultPosition, wxDefaultSize, m_rbExtruderTypeNChoices, m_rbExtruderTypeChoices, 2, wxRA_SPECIFY_COLS); + m_rbExtruderType->SetSelection(0); + choice_sizer->Add(m_rbExtruderType, 0, wxALL, 5); + choice_sizer->Add(FromDIP(5), 0, 0, wxEXPAND, 5); + wxString m_rbMethodChoices[] = { _L("PA Tower"), _L("PA Line"), _L("PA Pattern") }; + int m_rbMethodNChoices = sizeof(m_rbMethodChoices) / sizeof(wxString); + m_rbMethod = new wxRadioBox(this, wxID_ANY, _L("Method"), wxDefaultPosition, wxDefaultSize, m_rbMethodNChoices, m_rbMethodChoices, 2, wxRA_SPECIFY_COLS); + m_rbMethod->SetSelection(0); + choice_sizer->Add(m_rbMethod, 0, wxALL, 5); + + v_sizer->Add(choice_sizer); + + // Settings + // + wxString start_pa_str = _L("Start PA: "); + wxString end_pa_str = _L("End PA: "); + wxString PA_step_str = _L("PA step: "); + auto text_size = wxWindow::GetTextExtent(start_pa_str); + text_size.IncTo(wxWindow::GetTextExtent(end_pa_str)); + text_size.IncTo(wxWindow::GetTextExtent(PA_step_str)); + text_size.x = text_size.x * 1.5; + wxStaticBoxSizer* settings_sizer = new wxStaticBoxSizer(wxVERTICAL, this, _L("Settings")); + + auto st_size = FromDIP(wxSize(text_size.x, -1)); + auto ti_size = FromDIP(wxSize(90, -1)); + // start PA + auto start_PA_sizer = new wxBoxSizer(wxHORIZONTAL); + auto start_pa_text = new wxStaticText(this, wxID_ANY, start_pa_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiStartPA = new TextInput(this, "", "", "", wxDefaultPosition, ti_size, wxTE_CENTRE | wxTE_PROCESS_ENTER); + m_tiStartPA->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + + start_PA_sizer->Add(start_pa_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + start_PA_sizer->Add(m_tiStartPA, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + settings_sizer->Add(start_PA_sizer); + + // end PA + auto end_PA_sizer = new wxBoxSizer(wxHORIZONTAL); + auto end_pa_text = new wxStaticText(this, wxID_ANY, end_pa_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiEndPA = new TextInput(this, "", "", "", wxDefaultPosition, ti_size, wxTE_CENTRE | wxTE_PROCESS_ENTER); + m_tiStartPA->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + end_PA_sizer->Add(end_pa_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + end_PA_sizer->Add(m_tiEndPA, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + settings_sizer->Add(end_PA_sizer); + + // PA step + auto PA_step_sizer = new wxBoxSizer(wxHORIZONTAL); + auto PA_step_text = new wxStaticText(this, wxID_ANY, PA_step_str, wxDefaultPosition, st_size, wxALIGN_LEFT); + m_tiPAStep = new TextInput(this, "", "", "", wxDefaultPosition, ti_size, wxTE_CENTRE | wxTE_PROCESS_ENTER); + m_tiStartPA->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + PA_step_sizer->Add(PA_step_text, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + PA_step_sizer->Add(m_tiPAStep, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); + settings_sizer->Add(PA_step_sizer); + + settings_sizer->Add(create_item_checkbox(_L("Print numbers"), this, &m_params.print_numbers, m_cbPrintNum)); + m_cbPrintNum->SetValue(false); + + v_sizer->Add(settings_sizer); + v_sizer->Add(0, FromDIP(10), 0, wxEXPAND, 5); + m_btnStart = new Button(this, _L("OK")); + StateColor btn_bg_green(std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); + + m_btnStart->SetBackgroundColor(btn_bg_green); + m_btnStart->SetBorderColor(wxColour(0, 150, 136)); + m_btnStart->SetTextColor(wxColour("#FFFFFE")); + m_btnStart->SetSize(wxSize(FromDIP(48), FromDIP(24))); + m_btnStart->SetMinSize(wxSize(FromDIP(48), FromDIP(24))); + m_btnStart->SetCornerRadius(FromDIP(3)); + m_btnStart->Bind(wxEVT_BUTTON, &PA_Calibration_Dlg::on_start, this); + v_sizer->Add(m_btnStart, 0, wxALL | wxALIGN_RIGHT, FromDIP(5)); + + PA_Calibration_Dlg::reset_params(); + + // Connect Events + m_rbExtruderType->Connect(wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler(PA_Calibration_Dlg::on_extruder_type_changed), NULL, this); + m_rbMethod->Connect(wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler(PA_Calibration_Dlg::on_method_changed), NULL, this); + this->Connect(wxEVT_SHOW, wxShowEventHandler(PA_Calibration_Dlg::on_show)); + //wxGetApp().UpdateDlgDarkUI(this); + + Layout(); + Fit(); +} + +PA_Calibration_Dlg::~PA_Calibration_Dlg() { + // Disconnect Events + m_rbExtruderType->Disconnect(wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler(PA_Calibration_Dlg::on_extruder_type_changed), NULL, this); + m_rbMethod->Disconnect(wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler(PA_Calibration_Dlg::on_method_changed), NULL, this); + m_btnStart->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PA_Calibration_Dlg::on_start), NULL, this); +} + +void PA_Calibration_Dlg::reset_params() { + bool isDDE = m_rbExtruderType->GetSelection() == 0 ? true : false; + int method = m_rbMethod->GetSelection(); + + m_tiStartPA->GetTextCtrl()->SetValue(wxString::FromDouble(0.0)); + + switch (method) { + case 1: + m_params.mode = CalibMode::Calib_PA_Line; + m_tiEndPA->GetTextCtrl()->SetValue(wxString::FromDouble(0.1)); + m_tiPAStep->GetTextCtrl()->SetValue(wxString::FromDouble(0.002)); + m_cbPrintNum->SetValue(true); + m_cbPrintNum->Enable(true); + break; + case 2: + m_params.mode = CalibMode::Calib_PA_Pattern; + m_tiEndPA->GetTextCtrl()->SetValue(wxString::FromDouble(0.08)); + m_tiPAStep->GetTextCtrl()->SetValue(wxString::FromDouble(0.005)); + m_cbPrintNum->SetValue(true); + m_cbPrintNum->Enable(false); + break; + default: + m_params.mode = CalibMode::Calib_PA_Tower; + m_tiEndPA->GetTextCtrl()->SetValue(wxString::FromDouble(0.1)); + m_tiPAStep->GetTextCtrl()->SetValue(wxString::FromDouble(0.002)); + m_cbPrintNum->SetValue(false); + m_cbPrintNum->Enable(false); + break; + } + + if (!isDDE) { + m_tiEndPA->GetTextCtrl()->SetValue(wxString::FromDouble(1.0)); + + if (m_params.mode == CalibMode::Calib_PA_Pattern) { + m_tiPAStep->GetTextCtrl()->SetValue(wxString::FromDouble(0.05)); + } else { + m_tiPAStep->GetTextCtrl()->SetValue(wxString::FromDouble(0.02)); + } + } +} + +void PA_Calibration_Dlg::on_start(wxCommandEvent& event) { + bool read_double = false; + read_double = m_tiStartPA->GetTextCtrl()->GetValue().ToDouble(&m_params.start); + read_double = read_double && m_tiEndPA->GetTextCtrl()->GetValue().ToDouble(&m_params.end); + read_double = read_double && m_tiPAStep->GetTextCtrl()->GetValue().ToDouble(&m_params.step); + if (!read_double || m_params.start < 0 || m_params.step < EPSILON || m_params.end < m_params.start + m_params.step) { + MessageDialog msg_dlg(nullptr, _L("Please input valid values:\nStart PA: >= 0.0\nEnd PA: > Start PA\nPA step: >= 0.001)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return; + } + + switch (m_rbMethod->GetSelection()) { + case 1: + m_params.mode = CalibMode::Calib_PA_Line; + break; + case 2: + m_params.mode = CalibMode::Calib_PA_Pattern; + break; + default: + m_params.mode = CalibMode::Calib_PA_Tower; + } + + m_params.print_numbers = m_cbPrintNum->GetValue(); + + m_plater->calib_pa(m_params); + EndModal(wxID_OK); + +} +void PA_Calibration_Dlg::on_extruder_type_changed(wxCommandEvent& event) { + PA_Calibration_Dlg::reset_params(); + event.Skip(); +} +void PA_Calibration_Dlg::on_method_changed(wxCommandEvent& event) { + PA_Calibration_Dlg::reset_params(); + event.Skip(); +} + +void PA_Calibration_Dlg::on_dpi_changed(const wxRect& suggested_rect) { + this->Refresh(); + Fit(); +} + +void PA_Calibration_Dlg::on_show(wxShowEvent& event) { + PA_Calibration_Dlg::reset_params(); +} + +// Temp Calib dlg +// +enum FILAMENT_TYPE : int +{ + tPLA = 0, + tABS_ASA, + tPETG, + tTPU, + tPA_CF, + tPET_CF, + tCustom +}; + + + + + + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/calib_dlg.hpp b/src/slic3r/GUI/calib_dlg.hpp new file mode 100644 index 0000000..4889c4d --- /dev/null +++ b/src/slic3r/GUI/calib_dlg.hpp @@ -0,0 +1,52 @@ +#ifndef slic3r_calib_dlg_hpp_ +#define slic3r_calib_dlg_hpp_ + +#include "wxExtensions.hpp" +#include "GUI_Utils.hpp" +#include "Widgets/Button.hpp" +#include "Widgets/Label.hpp" +#include "Widgets/RadioBox.hpp" +#include "Widgets/RoundedRectangle.hpp" +#include "Widgets/CheckBoxInWT.hpp" +#include "Widgets/ComboBox.hpp" +#include "Widgets/TextInput.hpp" +#include "GUI_App.hpp" +#include "wx/hyperlink.h" +#include +#include "libslic3r/calib.hpp" +#include "Plater.hpp" + +namespace Slic3r { namespace GUI { + +class PA_Calibration_Dlg : public DPIDialog +{ +public: + PA_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater* plater); + ~PA_Calibration_Dlg(); + void on_dpi_changed(const wxRect& suggested_rect) override; + void on_show(wxShowEvent& event); +protected: + void reset_params(); + virtual void on_start(wxCommandEvent& event); + virtual void on_extruder_type_changed(wxCommandEvent& event); + virtual void on_method_changed(wxCommandEvent& event); + +protected: + bool m_bDDE; + Calib_Params m_params; + + + wxRadioBox* m_rbExtruderType; + wxRadioBox* m_rbMethod; + TextInput* m_tiStartPA; + TextInput* m_tiEndPA; + TextInput* m_tiPAStep; + CheckBoxInWT *m_cbPrintNum; + Button* m_btnStart; + + Plater* m_plater; +}; + +}} // namespace Slic3r::GUI + +#endif diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index d8eaa44..e48d323 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -795,6 +795,56 @@ void ScalableBitmap::sys_color_changed() m_bmp = *get_bmp_bundle(m_icon_name, m_px_cnt); } +//B34 +// win is used to get a correct em_unit value +// It's important for bitmaps of dialogs. +// if win == nullptr, em_unit value of MainFrame will be used +wxBitmap create_scaled_bitmap(const std::string &bmp_name_in, + wxWindow * win /* = nullptr*/, + const int px_cnt /* = 16*/, + const bool grayscale /* = false*/, + const std::string &new_color /* = std::string()*/, // color witch will used instead of orange + const bool menu_bitmap /* = false*/, + const bool resize /* = false*/) +{ + static Slic3r::GUI::BitmapCache cache; + + unsigned int width = 0; + unsigned int height = (unsigned int) (win->FromDIP(px_cnt) + 0.5f); + + std::string bmp_name = bmp_name_in; + boost::replace_last(bmp_name, ".png", ""); + + bool dark_mode = +#ifdef _WIN32 + menu_bitmap ? Slic3r::GUI::check_dark_mode() : +#endif + Slic3r::GUI::wxGetApp().dark_mode(); + + // Try loading an SVG first, then PNG if SVG is not found: + wxBitmap *bmp = cache.load_svg(bmp_name, width, height, grayscale, dark_mode, new_color); + if (bmp == nullptr) { + bmp = cache.load_png(bmp_name, width, height, grayscale); + } + + if (bmp == nullptr) { + // Neither SVG nor PNG has been found, raise error + throw Slic3r::RuntimeError("Could not load bitmap: " + bmp_name); + } + + return *bmp; +} + + + +//B34 +void ScalableBitmap::msw_rescale() +{ + + m_bmp = create_scaled_bitmap(m_icon_name, m_parent, m_px_cnt, m_grayscale, std::string(), false, m_resize); +} + + // ---------------------------------------------------------------------------- // QIDIButton // ---------------------------------------------------------------------------- diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 00f117e..aad5aea 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -158,6 +158,9 @@ public: return m_bmp.GetDefaultSize(); #endif } + //B34 + void msw_rescale(); + int GetWidth() const { return GetSize().GetWidth(); } int GetHeight() const { return GetSize().GetHeight(); } @@ -167,6 +170,9 @@ private: wxBitmap m_bitmap = wxBitmap(); std::string m_icon_name = ""; int m_px_cnt {16}; + //B34 + bool m_grayscale{false}; + bool m_resize{false}; };