From 9ca1b0466af6401360b6cec33c883079dca6d3ed Mon Sep 17 00:00:00 2001 From: Will Charczuk Date: Fri, 12 May 2017 14:17:43 -0700 Subject: [PATCH] sequence => seq --- _examples/axes/output.png | Bin 21680 -> 24495 bytes _examples/bar_chart/output.png | Bin 16578 -> 27930 bytes _examples/custom_padding/main.go | 9 +++--- bollinger_band_series.go | 16 +++++----- bollinger_band_series_test.go | 10 +++--- chart_test.go | 20 ++++++------ concat_series_test.go | 14 ++++----- continuous_series_test.go | 14 ++++----- ema_series_test.go | 4 +-- histogram_series_test.go | 6 ++-- linear_regression_series.go | 8 ++--- linear_regression_series_test.go | 14 ++++----- market_hours_range.go | 12 ++++---- {sequence => seq}/array.go | 2 +- {sequence => seq}/buffer.go | 6 ++-- {sequence => seq}/buffer_test.go | 2 +- {sequence => seq}/linear.go | 29 ++++++++++++----- seq/linear_test.go | 48 +++++++++++++++++++++++++++++ {sequence => seq}/random.go | 16 ++++++++-- seq/random_test.go | 18 +++++++++++ {sequence => seq}/sequence.go | 33 +++++++++++--------- {sequence => seq}/sequence_test.go | 4 +-- {sequence => seq}/time.go | 6 ++-- {sequence => seq}/time_test.go | 2 +- {sequence => seq}/util.go | 2 +- sequence/linear_test.go | 33 -------------------- sma_series_test.go | 14 ++++----- stacked_bar_chart.go | 4 +-- 28 files changed, 205 insertions(+), 141 deletions(-) rename {sequence => seq}/array.go (95%) rename {sequence => seq}/buffer.go (98%) rename {sequence => seq}/buffer_test.go (99%) rename {sequence => seq}/linear.go (63%) create mode 100644 seq/linear_test.go rename {sequence => seq}/random.go (84%) create mode 100644 seq/random_test.go rename {sequence => seq}/sequence.go (85%) rename {sequence => seq}/sequence_test.go (96%) rename {sequence => seq}/time.go (97%) rename {sequence => seq}/time_test.go (99%) rename {sequence => seq}/util.go (96%) delete mode 100644 sequence/linear_test.go diff --git a/_examples/axes/output.png b/_examples/axes/output.png index 8b445783310fd5f01810742d58ec85f6eb986f16..61c376cc29d3351fe48de2b38f254a906a3ec3d6 100644 GIT binary patch literal 24495 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 literal 21680 zcma%DcRZHs|G#O73PmMlmc2vDE+Hg4$$*Ol&wE^tpYl!Fqa@TM2!b4yyM9d-LH5Ic5`-Kg zgukj7p7J7yx|7_sE9%a%vxCGDIvSO0JN)Y19i38bIK)qqYK%ce?%B1w`?*Ew>Aegj zk0jcalAkdyP}Z^CBX;u_`ImZ3W$tHb4IuO1?X!AL$(UJ`@95oFXC z{}<&kbc~4dwX++v=zn-(rmKL25BXC8xDi;|^tcNnU8R9@VpwzoA`Zu{BiXjzt0g7}U< zN7kkJisjjd?E-Xe3m+Y4x|qTn($&)RoJXDpoZ_L~Jcb4hF-SVJpAfe=S3aMWmG!OA zZO%U7Oo!QMZBTZ_QX^OKzy(*_?08dj_U+uC1NJSECXZ&iGFv3}w%0zaRUYOp`O(0V zpi^kkDO9!5+~W3&-^<4ADEe4lmHl2bx-?9V|TkR)24^yWHtn-DvLZuQRK^xb26@ z92^{a>S#nBc64-%^_`GrzXQW(w;P6SS{vs}?c##Gyg+;ONX75B$P*AElX`h6E zuPypW&wY_?*D&cyMcw4w8d=;Lz8sw!lzE&jF@iI>b+jBjJlW~#8yhW{xmA~{&CcvT zp3d&>t({$yrYN}`ik(8s?jgG-t~xqQ#h@8Xv!kP9=|d4wPTjJVisf&vyBiZ48gcw) z-@Yp`;K#ouSNvwqyOpwSpPW?aI7zYUoOq&8#rn^HbD{ONn5}+iQI9_JG%lTz@8fp8 z*!k6V$I3TvzC7PAu{}bj@3vSIbVextLG9_`U0kvK8m(PDLsK*lX5{Iqxr*hRig zxe|pv)f)`RI+|TYDN*3}JP`I9Qvu0v@g=jY@J2T3sf5VK`)jz($*zSxA zX%44?inxkG#LYCK)n0p7(qa5iT{$uXzLn&1B{B&%r8H{jY4onCCMYpAEqy<|o!DDt z{YGn-)^zVUem$?Nr-l#`C$qhGsyXWVNqM@X(j)D_w>7KksO2m!dkeN-+5rq*zZHow)WM&=ePCKl}feKIXKp3 zcfH8*<6?_1e7HiTc!kT7q*y9zG2JMq#OW$MdMVM_Jatn3MbH(l*b6lNI#Vj_EDGr@ z*U>;Atio5ruCnEG-L(q7hkNwW@_5u{pf`HKlQFFAn(Wtmhm6}@;AM{K>`GmC5{}{D z#k(;T)e*-VbG6J}J@SLDJNv)}ty=u=OD~_g+Mn65j0$o4#>l>Uni&60;mX1tMqVaqzlfV}R=-oyDxMsy4Y7oMfsr-+x? z_^YOUt-zeeCosyKK!&nS1$Q(&*#3G<+wPNYR{XOP7j9oAN&OlXQgqI=hho=G=$-4@ zN&Neto{!2EzAIy-+(i9Jjj?;(`Dc~w@6ShK*vgKlO1za;O_iGBSbh1kVeJJ81^yyaPWzdzF;#HnVST5bMrxOt!0&H=Jc)*dTFQmq z@GZpo7Q4;{ZTr|&^tNhm@;Sl&BpJ)w{9Nf@rPEt(DwmAfgl z)GZ+8tT0AR7vRdWA78Fy!cG0Nyr;-4TJ`vgL#sZA&-0x~G``T=)pbi(S65qGWRj^V zPkeJSc~EWy|c)@qn7VUMoe#=I>6-_~B3-n06&_1g+YDEZ*PgMhn9Xaln@|#4?Whepv*WS1R<*Yy9dPof zyBU5=q}LfOv4Jml4K8LLh6RqxxKJogWGYn^s#mzr)4gJI`dzTdT!~K8%2c~OON;o{ z>}arrI25xKh3MVky)BGyB|Z;(?!4Akb^5eGv}({+AGxVsvMiP=#}Im*Q~!h8+(4;z zk=5xUDPF3AVEx^t=&JP^p1Gk9*8N2ZyDMoE@vd`uCQZ17UHn3veRV&(_oU#R&oNBK z32Ip!$sJ|_VoUYs{F8KCv4xsC4{CB~>`cI;e}o^9o7lzGhI zlbp^!9uu7`Ei$80m zMBeL`<34Q7ad2_bOeuaE$#HjE?bO7I^Hgo;(NKA;l@DvEs}~d$^k5}6TZ5mA;d-2g z-HShb@EC85gtA5BAoBY~cmG;okaOjWb!w-Fa$lRrh`H|-dzAKW=VX=sih&_7LxGJp zc{Et&*c8R(IvOPO?eat{4)-v+X*EE9`)7z0>D1)prM>NCY=|T}@zq2AshPpaE(*7W zZj3lKZhLk=&QBYaO4uZGo-3W0m2-nN(w3qS-tcBH&%B+P;mc~bewC|`w94~KKc5Y3 zn5V@(?ACRv+})gch+JC#;nm;QXLtAsHaU*`qV16AidsbLwimocdHsUVy`agNGpZPy z8@()%v?)b5xa|3C&)U-lo9%9IFflRtU1N-tm)jX8Ucuo=r*Yv4+hbe9dml`+aE~-K zqYbI}O~2-}D2Zlg(`(yunjEDuhrj|MGiScIdVt3Er;j zE#4acrhVrQ_lNbL?Mf12Ya+<%>Z(VTL~&)yVjW$T%j&f2Txp$nZa+3E+Z}6(Tl_+y zRPg!pAWT88NpvNy&+_GsU+?q3QE#%HzYOoVd#dTSwv)MKF|$zNii}G$b%LsPMj6ff zg*eF}*ZIogVGr$Y$1S&yPY!hJ*ar>T&14qeQdbvUsNPrVPoL0YM&xDm{BrF#WYKv* z{M#!b+ez()tIrl`#bNx+p6}VpewrF72fR^~-ILiRr6mncsqMa{@EN2)(#2XaNWy=)tnVyYz8-IDVFfvFz;nz zIg+&)I@!RkXQsrx6A_k8tg8h0yV|BYYref`CGSv;8CM-=&(2Vu@!FGy=OHi7A5oaT zNv(LrT{EewqmC;&x9pS@KCO}HowqKOUHz3~dMB*-T2^ug(K&n~q|69p5FVA0k_<58 zN@G`Ad}}r1rG$SLEAM}1G>@~fx1Mh63HlCYUY849&uNp{-cF@1TpC9+VQve)Kv3v* zQR+Tur|U>EZ*MIw(|mAbSMj!iExv#=vnpJF9nnkO+VAQhcikjn)8Ka7}BXbo0l}X@kjrngzE5lG%XrAU3djcr@A2=iePt*&Cd6 z$g_kmc)XkV*i^E;u}ocvsxK6eUpGpkN23-PgI`}#^p-@3FQd`}4)y?7zK{6VlSVK> z?X(J-#H#4R(*imxUzFfqv&9o%D16t{i1!trcRz!s+O!vOF#4>V76-MyNP%qvv5x-Y zP)v$!y2FI)jp`u=^x`ZRgWO02|1BWF2Q)9*K#a2Ks!F~l#ABj>`3#Gg-d88#QZQDsRHr?PD@&dbcq zEGsK3Dth=v+{bXg*GDf>;d|eM=sea(W_$Ao=SEJY;=gN`32pvhnI1pgG!>HOtPW4r zgOWyb=Au=}_EJ-J`CQrS><@dpTQl9+7|6;kmqr6$*?zd(O?7BLEx@vFeT;6qfGcjV z5VAv2zs(sJ9&}|$UU*7*J%-EB+U#o%%k~MIl&nD6-TGHYcVt`~H4=QD%^nQ;0tYL=adoJe{>Mf+&%n6ye3q&1GLlDj>mkh^2t zXQ!w8DpjJ!2hUxxx6gMMohupj8M=v1i}aV{08@%&R&Z}^^rOln?%Z0td)B%)&!jU$ zV_!6iQu_?CeT8d-PWtBNQyv(3dUEIW5#M0ZrFtIsDFrEgCU}Tv5_t>co_xL+%~YST zA(n2Ob2Z+{=6%5)E6JFd?zXl(jBVJ>G}{jwrT~SVe-QW@z33H3qkO}(j14PKwVQZy zT976WZG?S?sgF^Sp+#}C15<6^BGx@Lq^G8q?=aP7e1UEC)Z$@=tg7A3N;k}B-Y8D3 zww|7KsD?_fE?W19qZ^8s7&2PgSFB1hR}wM9hK|)(FyW6y=U*)eJgeFJ=CIhv%_@re zxY?s3>;n(`tsy^uSQ~N;me^enEkl=Z^_#G^FKFKTiktpx2_N{`zhgJS#l>|Bpv_cT zLi`qu=jNtM)o_(nZ=Tq|F7N{%mKr&rf5=(>+{9BAYbiPrYk$xYUEQ7y)j24VqG~G- z_hD~3VN*I#QzZUEbZ91R#zju9;kx@pn}K_DdqcK~5AGo$Psxq=uftu77(m&9RkVJ2Gs7f5oWP+TZ^MSdoU-^S|jJ-KE()oCwAUiN$p ze#?;ru)UFNvm!Oe%?`&OjV#w1JUn{_O<=4?#HK!|CZvYg-2SA^xV%rVdKcZ*p2S?g zflkL=^WQ+H@u%Jo1l?xU*NlnTA}(k%y11$r^EBzo>z)qYeyk!1mkj zc0y-1_EAuyBc4rj?&@nb5;#!!o^61%v^FiTXvCEAro4Nq^O6`dvLOSP z4DybJQOZN->qT1AEEtLBS>f=696R3cvT zn~_?ahr4+nofm9vHCmVIEntQ@=zE6`o5{}RDu-s)5n$amfDW@M9gl)cdlVbhV0`QS z?ZscOY>SGEB_NGIOaMj>wzHdZabsg+)%G}#7d6T$Qi|diqY*5|BO0L`gYr)~U@_** zJLqB{H_l8?)4I;)ItaVBD+=w*nn|3whyZaXhJi+Qq9tK3VQ(X$j@I>kN5V-xAW9yS zE;_pbh=4@h_uUo$_?$msjJcc%x4gUOr;|Z4040`2pNq_Wmm(|VQMxqZ4TO#iV<^yx zb3<4q%x3%M>df9u)$UB20uRkSPBym7vpJs+awm9fnzsu$&GUM~xFtuXI;HW=2BZph zyGTt9*mxxR(ETS#2iQ$uu~$gOp(USbYp#=jMj2`@77+j+)vtdzo& ziC*!}KmA_Q#Jqat>gozS>Rj@3VGBSrfNZ`lw@By%oc%sRhFO;qpspMXQ}Chjva7}% zKoBbX)`C?%&4<{ou``)d&b0*-JAx@00fXC*8(7!Gs@c+F@0xiU?yG)IBQiU+dl+hT z{kh-)%-&9e@lue`5S4Rh-uupXn*F^7JvIA|qvR29sL4MO`qz!ePcAym4HzbD&VP#^ zz|6Z2=PS*@5Qlf>oTBwyrsisPir`y%W>z=d#JAi4){y#+#yJg@E_^y{pS?TIg8}SS zvV-fFb-{dqRd4Vq*SmnjaJQ0cXDc(kndY=s)U?~Qy6IlEargJ{_n{%N?JHn&($dwn zrc-P`+ku4!pvW~0_YrUUuEQBA3>A4GFC5Gem33LZ1s zt+dJ#5kB^%b$OeX#u9fkTPxobh-ulg54?9&-Q6pP=k<%MUb=fUvZXC45e$!2_-U9C5`~2%R!8T8EzgWQo zz)3}Pzbj(3bK4(Ch}V2f-ksfNLz5P%ML`l;ZhwCqM9Dax|Ne*E7s2Xbc#6gyPUZHCp!2Vi$+Hd?LJs7e3%?rf>IMd zaJ1@Ak481!9z1NIiZ(?4>VE;DKR}}71A6q|6>7=j9waj)*5pU2MdCYo0%dgwfoGBd zF;K;?{iy z+BT&okTJYA1q1}3!#@YPIm<+Ae0)4w_hIh|O&!BxCr8KL9f|cH`$VofR}MWrd}`?a z=c7^*Pp0LdM{Etx74M1M+36Zf?HanCtu>=&>6X#|(FlXoT07+lZi@?No-nHiLu1-|!j z?L3f-phU%_4nn7qu(v(oJCrg6g5B2MDM&8e4r$h*M8IbW;$Z*RO$sjdf^~`;42KoBIIV-@A+qT0q}nVPTIS zGF($sROF>XmAa zFWzappUXfc1p#gAX8;fF!yZE~z3Hi`Qh-mRi|cAiVvh9;zDFvZfZ5d4cVES9*I{(* zn+3h}?jGYs4BkT&@#% zyQkXR_KOw7i1=WuEFBFH1TK@WQ_-45>i5EgD=Z_bAoGh8Pfe z0tsI;x(KWM@>$ZBIFas~hfC)P4q`|wAzKi!{+$rv7$E82M5>its}9nKH$+54yq#vD zO}-tK!s@#E)Pg;d9c8RF&_-pJMeX|IH@(NZ9@ZXl{bbv+HPh%kMusF;V;_=P4>W;} zM)tdk_K=C4wv-JXqUvx|0FmO3ygQP3A1z3(9G1_rynD&(YcE7eL0jw(@DX7ZK$A~e z4$5Cb(iO|-j~?fKD!Yp)qx6&Kv6_6yx>iR_`F-w--~|tY#2+XQ_nJzDwrSn#&f9K> zdOKjB&YB8RBZ>6rwLQqXu@{PEgNmLpdym=YhDsneuEJ|PBmNED5oR_BIwcRVPZTmn z*XM8kCg$vbm_w@1%fd}}DgTDF<)9wm9Rif01>C};wMCv$9h^W(A<7XjT;7eBS4qw{ z11N9VJt4>Lv|LYz_@fAkIX~V3G&!~FLYyO9p&JA|V1|HyeGL%lCkO`tDVfJLvK&x4 zjsV#~AM^->v6Qb-&xU9_u}yZ-s+zUuFi15Egb^e*v&`o&M#%1IsX3pu3sM5I5-~ul zH>*JmN|u0X81Y**OjU*w(Q^*{K3ay=$W6$HSi@#<9^hSJ&%LS?R{^0TDG#R5fD>L$PX>LEnyJF|{$n#7t87mB=mnHOHPETa|4j&+D1yo- zC>{xU(sS_|JZ&)%?NBcsEWF?7z=|%FH}L%-WDqebsefpx0jhL}WIXzbH~t5lMsPPR zEiIYDUtYHV^*#FMqO+^(R-#OHw<};eGKU`6V`!k;QjgSG_~u8X5f&(qyht1B3@J<6t*y8ZK1RftJ% z{3H-oqbRpm(H~vEJkf$#tT{!*4H_L7M#2sgqfU=MM7;p+vdJ`wov9c>%adGp9424; zl5SFVB@$E<02s8tjd`R!-I>~f%h4OxuynUb54WR3s>NORcGj??z&KujHXh(~yj>$3 z-CBQTaQBRul@O3^>^wXYKyl4RCw+OYte(|qt`4UuH4GTCMzR@dh-xQQdYJOWWH0bS@RFq zI$wE=9M;bX2EWS;7VAD9sX4oB6fE{|Qa1u2sQ%#hmlAE&vb8M6h)90y0WmN`YO#UEBP2U6nB4goF%2g?d*M8%vleU{mH_d_{^ zKS%R|&!qpEqafSn%6EXizj1&Esiw-ESOgD)1jt9(B|rT`H?JkPqGpG*1P>P|hFRlu zd+T+mhvq9^o!dr}{!otLXNdVtsL-$V>CqLe^w-knpC!hWzUqVpydwl)Q%rQV#oWf` z!-&rrQjyslV5}|4g7=`j=l9N{O62#Yuly~OWgjd$*@NqrgKXVKpB&}}6VWM~vZ>T7 zLdW6R&bfh|zz=!d=^~FmURqm60omlm%Ke%)=G2GCAz~X zj|j*x9xLw0ItXKzmzL~&Kex8G^RMW^R(E^yzX%!02Vl?X)^oLHr7Qz+cW-yCYJxgV z@fEb0v463lI-`Asme_C56!q=kP+EL#7_+DAH0b!#k0ndLYKS*bfxFarG7U{a!T*%= zVJCO@^_3abk#3E_tkB&Poq3-R?i)P`-EP36H`?7mt%Uw3QSIhslePY;9jt9}VPPhq zTv#DsUC}9Xn98YQ;ylbyyU9b~>BsqZTfhk$lQ98)Y3>IsVe%s=zD7zik!lfbS4iv^0gs{+lB~B>4ajy(svncR&I`;04uV z;e6N31{R14ZUazsKeMrXSPwyt(4*?xe_ID2VH_a@ECRaa4j4UR7%G_Tg3vY+348`o zR>pfxfMUlAf)7MQ6ixI91+c1;kB_154D7L;QCi*OVJ#^gs!&g=^qCUrsB#H0E!;+YGSYlzTkDJVleo+n%G+|&Tq7CWR! zB#;jxuxR=poY;``DP;l5v*!c2ht~tVDamyUz5;{fv}rn{Mo?0b(ID72UriKSPY9jy zx^v!I80ZuyJoAY7pMas={zr6zp?2UAq-SgNKZRDUfy3|}SKuuc_@%R(NGnh6-&Xui zDFx-I5hMYM)cr*7^G{uygU`uWUc*xig&>;2Emxo#%~t8@&f@W1%J0I80>bM3(3|A6 z{99=SYzgnmA^Q(hgz2V1V?ap_F;I#|*Uh~{_ZHuetBuyQ?Ve-ltO^5?LF+YZhDgn-)WUY?abygnB2V zREuY`1qUhr6TuNM3SgERSg=#&?t0qVs1+gJV{^)DvjQ{~)Z##c%q|0UYME7PI`Zjh zxl<1$#V{rX3k!>`Y<-E9b3T5D5&v6Vl-4SvEkTu-rL^rUnFE;}QR(B{rh70xqNY3# z0Dt{;U~4!97LxZ#tRU5tkl$4<1`3t)WI(TbSC%eXp|kH4Hu45O)}-+JvNYbbwtzB| zdz`C}-ia-5Wi~kVwMQ`l?`Brv@3jXV2=8-9|L$AP4NTErAxVR|GcDGxv2N$#JjhmH zsC1i%bLw+XRZ2ijZcjgtz_&Ohem)m0dY6T0D2dnRw@m*c43PR);2NFRD`+1W z(9zIvgkn24R5#_oeW!rc$wp~M-xVuZ+>hqou{%XTkUqrr5z#vTKub{arBn185^ ze0kV!9wwt6EEH|O_t*Ye;?4hE*^D2(NV88@pH2$kCV6@l$jJ1x_>8x2LpH0gr=w?JL=)+QF4uf=!0ezDN zC|Usgd{({#YY6Ji)aCB>Kfy68Y9J&I{Y>jUhlVgFR}cF~lNp3axY8f0Z=sS7Y3ZlT zoSajz@48UD7p$~n4?J&n*>nc5rt1J*7dG5n=eA!BZ~sEw6yV@7{TBNOY8kA=Z!v;R zHkjpRA^Ud+Y)VEBmOoh21`8=O|6kIvfO>EI8c4_SxP1uk1ILFC^)NfDYH2rhOYO#U z^7pPWK7hMHPa6y~RQOtXa{68NE*MkdEn_cQ_r+eepPre4-U_-4Sj@8q3ms}oy*!F9FN{O` zl9`o-Mudj64&rlgXgW-RdunQ`x6%XDK%?R1#>mg{EIK zt&@RT?JOWyRZlX&S3UX5NP$BwVR$12wEC@(6qh*v=@x)2ZgmXt+`f*=pup2!tF;pz z`y=sHUxJD`+W3c&B98BK{DNjlWZ4B^SD{=$WvG=y^IEddLC3-4L&r;_&<{ePgMpRF z(bh=bGladjYwZA3Xse)U9zk6*fy4^eKjKX$$z|?ZbE+sxMwkiVdm8`2cX0I-`7PSCz^YOt%Inc(ez zcQ~3ImFn)m;CM&iTiuOrqnh85sX;lZNHFK>%-uyRsxmLk#1P5a9jus({q=lr^=T9d zA(ZC{kp;H4vdO?R{e-Bk5v@F)gb+#}Gn5m2B^4vKr3sv1Ghk4J_cSbxk1lN>&nhwu z=6Dxh`$bd%(_#$SX_xKa0x{e%MGopAC&N=!Q-y1`!P7XCQiXJmQ9y3c+#Et!_3 zT#%L|!Ke=wXj)j!(11wG@c1I9AYGArdT3FVTo7zdr=;!Ixe|=-LD*wX*JWjL)H68)7j3Mm7Bg zvzms6psMfO+#C*v19W%kY{H8+mhc9ERCKbmkBq@wkpo>cFY!~?t&2;xq~=i}@^K`f z)pEb5U>egjTF_r4or>z z32>SyrM3Gf4LGzb4sUi9`wV^iDSLy~T(`h`HM%%O&sx4vdWAjPLTShSW+VE=A4{e) z-k}*!WFH7@p_>&eZ3?(qlwq>$&Jz3i>|DIdG<=3p@gB%Qdikb7JES0PeFB%u8t8$& zat4#w{h&&!UDtgux{95O7MHh~s*iZ98mAQZQ-#tLDt+SjSa)165Ld;65Bq61t$K1k zPAta(3EG~fBmr&qalbFWnqOgYntG4M!OgHc=Ts$PR2w+&HX%}$HPJ`JfFycCKjy02 zTS&*OZ>w0>W}2y#xtPxVa2ZzE0ZXXv5XrIlEw{x0{Ts~T(D>^EpO>omN?u+bGQ4@Q zlY@i0y877W*O&Zt;=6Ekg3d+65>a;k8`e@UZOeRnUJIu55Lz8AIx`+O)dZZHuX}}3 zfM_oQ*3I{<{w7*bN(^i=7c@UCMGgZF0k06sF7I4X-OKQNT}%Nx;Xhc*7>F8_MnG6) zvOjE2OYANNQ{22X0@C1iJD5lzmp8|Yl~+`3qdxeZ)$UV(lD{02-A_nRJ^|+>P@{|_ z0dO)jV&Gl^j{|COQQv?a^h5x#+m7pWRXOw`v*5baDz!^-hca&qunce#7Eszcv{MVd z9yZ0=DiN@bB4OVp{|~kTp%iKtFv`6R=TPSCraRJcxuD=VO*sgk;?{Z5Y-(GvC{x~2 z@o3rS1C%a`=O}Kn3ZUvg7vrvnM;{1f`JV{vf`$faaRPZ546+hp({GbKK&2}koU`>< zepPDIUu3-nBIO1U6Zc|pV1A zv$F*(o9I0A)t$A6gBxU4yUWE@JDHW0JJ5az12hI`DK?859v_^&{9983&qi@@2HFl2 zE1{|FO*`5bV4QYywSa}(d+%Em?kN`JBpl~D$$$Ifbj*cPDoY@OrZ z0@_&#%MVp!DN*xO9N-)l!KUX6kT+pVZF9r1E)9~eyld>FApHrrKAKuIXr_Yi@3#zt##8Mh#^2MqnjUdKBr3GJ0566feQ0oOg zpb<5KZyf%alARF2y@9CkB{RH*GZ1K4G+v{bKQRPy=8@lFxjrvXg%8U@eL70MZW*q8cO?CX!&5wS`vttM|%l|;0hyfuza^vEkK~bm|Pt(yvRXwOyPeIlD zU&s?VB8{+GrQ-F;kfBIks2C1SCg4+n&#XU$JY|phZAZi(1Oa;#Jgeu-e$e#(4z1*a zlTf&fcvi|lTl60n>mR;kh-D7lA%sGg)5vj!YBwbH%%2h^ETwJLbam$N^o)!?DZ0~Ank{0t6p`z>rSSy=$|UH>=- zAd3b|lCKm>5Xy-yEiGAHET4$)FSf;i66a(qx0=tg1AV$pmPro}IgCh}5&T{^Fubo? zpO#<4n`zOajd}^9xpn(mTOWY$1^fCH`A?AC;sq_E;!Yl<_WGFUE()60#J9L|UvRlR zO8vw055C(7^uP+9e}?U643z}eN{YD76@lau3`ZKet9DmwPU(w&ry_YeYa}K08Q3I2 zs7)Yr6(=R#ovhsNxlN8bbtRrtW#VO6w(ckubZU4T{_bQP3Kk;XPsnlW{rVbaZ|!km z)#XxT0kRk9p5~bK&vdj8>!nPN`Nw$uffZ&J}`c6=~@_D$LEUc_h0!wUd zz(^mJol0#U5^ZgRZKY(f_6!j~7K5+SZMR(2ZAmRtnI0*O3FCK6PSxz`z3q)W49p{L;~e^>;GISJWP3Pe04%f-oQLe|{%~<6Gh*?K!daGB7jawvCP2OS;f|* zuoz({`C^{L*pLLPaogvXK-xj}+WsgPp_>61N|S8b;WX9swzjrVy_Efvl6dxJ=L%QM zMH=^at|y4}-@z>g1=w*gefaiPT|;_o{}gReUrD2mJWV;8G7UbRLuT{;X$nuNfMyao z;DzKA|8_oK5sMH23UGxr@^>?d^vLe_RATs-;t!pL!G6zUDgSK>ho>ceKZYFS=S0s_ z9az=HH|tKrKJgp0lyH$(_z<#pTuvLSQhE6=F%WbX;0xKTpW(gt|1mW~KB+d=s355R zmnj^c#9Vpz2=ZH%qihpYLsdCCwAdoboc^qcF`nWg)Dl51Q9knj1Ic(Y@^9?({BKV< zJd0H?{4(<8@2Z>yex)g|FdHI&xaC)rQN!h5>;&Mo&tt^M)v&**zThl_hxxoXLO`G5 z7x&;ZU45#<$RFnjV9g;%(meNh{!fqxLZWI20sVi2JU}+=Z;+5KX_Vdin_C{9g>1b+ z2tDy;S7J*MBOkGm?E4&!Cg8?_Yq&aZ(m!JJH^mZG{XYI<`y~I{LXEPfNcFuJk_6TN zFh-+(9JrEfd3C=hdh+yT&_}CUa;V$CxkQAQdFeEQE*swMD_k9x!p6VP5?ne9HyJE7 zNg2))fLZT}5~AS&bo9oF z<){W&UhPT)P%aPg6s77%{_YM&HA|>Antv7*>U1#9SzB7Z5_2u$#3a3~{V)UE%L{(9 z=b!nu)iE~+CGVU9Wky?4!6GUg1-t;0UZifo-ptf4wgCwpb%w#|Az$c1cOi`ogOcQ+ zn*ap~7@-G4k0!?F+`%t^bq#MA>qu8akqA^7vPyRWg$Fkn9GSif6{YEKvTp1NUtscA zpHNG4p+w0%n85#nIaUKDivXNTK?l%TJ0K&F94ItJNJyHk6+O5=ph25+(UQw9Y`%jzJH!~hBMMn zPV<|_VsX_DM6IKWp=aDcDx36=59*GCGKYuQfJD<8favhVMg z#yp=;SzkGFA&uUrPpH1sp3E%-e=xdpM5zC4k^7z#!Di!weB8ObF==j7zCIOoa<8+> zSc*_w20eUSqUiecZ(lF zGYFWXfP9-T8GSxbD%KiYbGLZFt_dV2)J+SA>?^afxVvrWpz+vTYT_9No;D-n8wi$@ z+CZ$sUhxA%#gHpBK90J@EvUg_cfnV}%G$cnY(syuEgHS5lORQU*%&xa0PK$@;yOD! z(P^%}GqRUZ$se3GWwEzzSn1uZ{6#s*R6`*0WRrS?$=h6p&Rtf2)us#Fg8QY(HH^|< z-cFgkkguwy81$MIdq+MwB2mTu=&|Fk{e~yRTrbbyhFouc>x^~JHo@$b%nZ2W6hAzQ zH)t7%N3bX562e-0VLANo06SyeT)8bygggNxjW)X0H9|2&;IWN|p;$)A5d z+3)W}SpWJXDyw|d^UrHf;Nm-?$AeXvy^mf*A3uIHrLY=cl~7d8uI7V~Yz;Nk+13*oBQsgs>Sd06m-_?8t6ARAJH> z!FO5h1=H!5IiwpmggwtMFl+%uI$;X7XKc?E#YEo7RW9=farS=o_S}F1;X3W>)?sMr?l*}X=SM{e&pH5nv8{7ho zLCX^OUAw3h>-Zlq_3*!cOOU8?=IC9G5z7cM)_P=m^M=c8PcF#`_Gj7^m-nCKe14dO z#03CqrkTr8m6smfR{3DR7PVv%5a__hTz>rK&6|P(fzg*6OLC^h#<8N0+8pvmFlW zQekhO?^16zmb-qv9#-B!Eni{Wrx6ZSRn_aOS?A#ReRDWV@WfZi?=5=Vgg2FxB;3{) zz}|(M8x(Pv{JyYoza{vJJ79j$NyVfiKJ_Nc2E*A$|CVnr_`F(vzP|dDq!J8M&&9)< zNj3I2qSiLB79IN%vG*-bpJOJ4YH<%H1;vZ5ZUEYnCQhMBUcOPxQRk$_HE2dNfM|rHwBsO%m_dS3)h$ zRQ>|p{cmDoV+X1*n6XoJun%W?^CyVt+!Ci!NO!METUfB4u&fVZfKD==;{3)5(5gOq zomJzJ4Wb@j{m7>$rJg#B&EFZ1)=x@K4!spK^ka3ZorRI{(5~I53 zyNr)kr#0@jIC?K6UYA=gSF&nOS^@9lSJ}dl_usX99{s3({5+4TKfJ9Rz7y1`Vl~sB z*Cd||yWh1unG%)~At;y68aeM|nPHk|{N>p(s_)ikE$90RIhsmC4-#{AAL}kVM^3-F zfpMOFJU3WwlqVBJy;$~ORHlX40DclAc05uq&1rr}F-G8u9{)`N{^vtw&WntKo}=)a z8qPb!T7)9%L`SG3OU3U0sHVegU-@)(d$82L?vg^&b*9l#t~&+ypQkB#AKxvTXNTm3?top7>{J%iNMP{PysF#NNp_Jz96@J&0S!KalbjG*BF> z*@IH9Qq1V^>_Hb*0=3A)StX@vx}W>yZV9$_rmL|W`chXHE(frWrz?O1%CG&X?c;nt z?)LeM=_JlRlQ4bvg*O5|AsROq?YEmKsL$&+9*>DMl{_MEU+JC!xXM%2%8K*la&oXZ znAwVzJp!|}i=QvT2JpKP@KH@wH81x3Cz{ToLQBo70Wv8X?`~~#x0stUus6?(=bD6k zC8M~}_fC^X{A%fmv>cZ6x%^CUilHI+ymXCD!M)I9{+!EodE0Xw+WD-~%{h%B;wxmF z98Vr!zyBN?FXoytL(kz7FG#@>oU%TsS!Alht|hM(E)byF;L#G1@sg9FLbq7Ffhu*sMN45b!GcYhf6glAVxwG@7qer;} zM`fR%ZHN~W5q?#asu0b6H&rS#fF|SKj<>frNJJfAX;n{GRaR6`5OG`2;UmzNy8Z3q ziRO4~!Ag#R=g+h56lTmw>>vI4(;55ywN&oin(yRaUwf^bQtI2ez}-{sWD5rgYNGd7 z#9g*$cHv-Ut!Hq-J<7|PT#~zS{?@Eqg5uM1hpDjCd6LmWICb8cQ0+*kaPsH+;%EgU z0fRE+&XsmL;epgE25^!DHn7u~=qaaH>VmcmjrFiVAoUJ|cm=1|Lg_xyKOT{dr}Ts# ziGjeAM;aO$sKOWFr&l6aRR~RFQkjw&NxwLEJ=s45 zcZHslje>FujoTF)RiGcr#xFKoK0|kWQN%X1ijWFu^Nmz1Fw4IbQ_VMhS|DHFoqq9x zO8!MI#|?2gtQ;$&Y@jk_IrZ4@sk#HC|3Dqun9x)-z{{8l!m<`eTvSmYD7U z&vT57?CNg~7EccZ9tfgY{=%JoRbzP*&d2yokVbH5a%*PkWLbzbg|c-L9w4zAswl7oKJBum?xk~y7l}049AwsL)_!K^DFC!k z*`k(SP~opr@kFF&>%&>dPA9MzI!vh=wFE;ZP1^(~(;%!T;9()#q}b%Tec4q%*$tck z{jU-k+peU0tw}Jklx$*re2cIYc{$bJhV%<$Ge8x?^@0!{e)*8r^J5y5$Me+S*9inG zudD3NbiN~+0Go}U!NOrVte?&gD|L0snn~y=?&`qgm_UAnj`~}_ZB^!!NLRhOx3~Re zc{j7}Vq5)ev&end8G(C0Y%TVxS7*9`haRkSbt<-HY9*f>grd}{b6oE|feO_&>3K?y z;VG^RC88(GotpY7LClpFE=_4uz4ER}gssoKSk94vY)*+H?jwbhw!-`xh#Y0N$BDg`?MB^kUk{OrS!M@B1p z>Cuw$18G+{+61jCR~EZ{kRFSq&zo4a3vz=>PE*fsRP`GwG8cPdW_o?^MoNzn9=6U1{E$z^2DWY80 z*C6Rss7~jMK!e#(8km1i?*8)&mp!&GG39&gY}!P>*8a@nQJiXVGKnxfJ$-BvjQY?c zin!D5vy3-xxm)9}GOMxy=v3+|cDPD^*>{FNg@oX&ZuvuNb~R{djqcukOA!dJl_EH5 z1S{OwZJ^{qU-+aW;ZMsSP>WSQ$0relOgS~vYA+t;aA9I)eHNv$eVCPxFSHmaxL2SH zg294T%w;Tgji1Tyjb5dTAOi{Ac0jxI@8kxNB+v4q`&80n`m&IGxVJLpv(@vbmqH=Y zS{A`wU{ljBb6{gig$5Qp za~nHr!@4Z{BRo7}4tkOnLW^08`JSa$nIX0zdob$69#`ASmMxqMuWNn&ojI`;cGJmi z5TveoNmog;!b!q}P)NmkrFKu_1NSW+cun_U;m604l1mo|gGk(-X(svZyLn7?oA`PZ zL^t#kugKxHDl3AQ0$g0pudxnVgdIa5_(5}j`QCT>2OLOpL{eH!Tob!S#+O`6)h4@G zG1rIC5kZ&#lGpIbPWGN4W_>UwL;9J;=21rTjMGYhldpwrYxe^GkkT)}X*Z(ML;fdKAx4Q_C|+-Om3azA;A8EXQy? ze+5pl+>8@0ghb#V3q5$wp4Ll`Q#qe6Lc!H7bMW)`zxwg4n2Y*s5(7KyyPst|dQFiW z69c%-8*p`AzY*cu(b0mDsW$gJ7~*(&U^^1bKHPo@yw+!|!bAcPJN4k+A{kR2y6 zsadac2DmS{^FcC;f>2&UV%)2Gy7L{&oJHDHch>^DFnjG@+ef|{dNHxV(wj}pfZ5n8 zg=~k;TZdMBq5r6oZ>l)NJmWbrS{HnIVIYU;G`VCtCA<1{^7a)GDL*e@Tp-OVyghm6 z)JcZL5&fc`lYG=CPcj#A9pvOa^)x63e8*kTxA^gTKFZds^ggQ6v*PhBvImMh)D*hn zeE4nX+Oc%Tghq!-nhYvl z=&MTDRc0$MRs_yKm3&)Hsd+wz;`9lQ)w#j`5<5++Fz?9b;HH&w(_k(FzgQ^HPn|hF z9HO*;<{uG3sZvBM?)J` zcheJxB*O~fWG)$$yhE)dLoH}g0KaeWTFSS`qSGI#hip`0tQa$6t;(dN8h%?5(nTix z`k&CSn^aRbAT_?1B)PEeced8l7EW^OOg>Wb!vxDmvg<;362S9;{-~-re2UTtoBoH2 zU%3$#S7QJn)yS{h;p5{wa+33Q$fw}9CxZ12Xc*1`W&%5Uh3lG4#c-1J;i{016>a9k zJ@~OEeo`v4FNdUwA(uh9$$KAi324EOKLVGvOoboF_3TZN*AWvF&sXhHr_yyk8e6pj}Ji?H9y*JjwWdfNOTUM z>|+xd2{q`2lfL*(^k{vK1YaTmJiw~YzlPm7r&iKy4~ZUj%{;Wk&^QE{SulQ*38t+y z{Ctq{vVedC{1RWRa4(#t^!7ke zn8P(2aEw1+kCBg=!K$Swl)7zPQ0Gv8D=F2PsVy|h%nR+=^&2;4zrWr`!pzC}l{l<} z>&TNguP&I#1JmPm@F=<5Pj$%+*aqr!Z%z;%Aka;_NpplX>xN`@qG`SEPw}D(;YGn$ ziecU+K)n{(4%41Fqo6OpaVk$c{HK$CZ;UkC-NOyi^G?uaFM1zsi1zM1#$xvyAgz{1 z2PR?pL%$GQ)HSzDIV9AOwp4X=?&obWIICnRfMN9h8_qR5`tYX|; z@+AIx_WvbXatu#?TGY-=tN-wT@$1RAr#3fy-7UMV{&m4_(FF~2lu|D*nYZwT_~vxb zm>36RokFOf)o&y}gly*6Wi`Qsnvu2V17BXIi2|LqjiKx+H>C z>bN$(y)=-Om4!{&)YP=ln;ZG~miL>8h=_`cijA2z7hZCI;VwP9#1Ua(ru_wTgQYfU zQt{8$Yinz_x3>=t4&r$nIPTpGkBDF`6-%LIVrpw`WuT?CF4frE+jH|cO?=$4;>^Or zaKd-c{sYwMGiSDple>+nsHhSh$Nl{;((oVcPAn}gZEbCN6UIw5>gV@fWO$AW?ik?dKC93ZKRR>zH1h~+@3|bU zN--=Jvhz3JzG~_-wb#+PVS}6dRcF+?wB>_`;Hw8W(laxkSqnba(RsfkgYQ?T$I9X~ zBLCZzBPO-7^udi)@{csfAA{NXUJ*Bmv2pdVwZ+Gg@V3`kKek|waT=inP#Xf;9*1@k z66Y!P28zti;a@W}G%T4(aH+skp;sDlu;Pky4{4Zm8)23CS+Pka)p7B7?UC7OkblU` zyW2G#voO>)M59oBCxLiAS)mN(^Zrld&g8;EbKns+<;HX?kL75ML84nvK7tU(=jqd@ zEkl(p!EwVr53H=Lf`Wo1mMytj^f#zNcm=Vdd7Zu}Wu@E^yF<)s5q;l|Hk2(O_``<} zQM~l@61Rw0oZ94JgfbL9+?8W6AN2LtNR%)OAI0gdq zKCZd!JzZ)aFP)<47bDVg%bMhj6j2ev{nRC>Gt7;YwLq*@=cA-SuqsV)MZgtBwzk zZr{Fr4PTTx^n#!stLlRXH9gtt%Gqjm$W5b|RD+hNhgg@{^d($f4~`D^4-XFJ7Z!p< zs6z8qKEY&9gz;o$edqM)_m}6*QRJzqsmuL^bex>Z^p_}j?CI~`^>1F{8=a{*LM{}~ z6=S-?JgJdivd(YfQM8Mkx;oU>N_dHvUv#Nhh(j3VIE7m{>@64Gq@myBp2YVYKeA_BYN|$Wt zETunHNzI#66H7C;&}$nI(ZsecyTmd{b`A{b_@gUrB{bnD(NYPbSWFN;&nogdIo9KL{2+I47yXc0%%@v2uHePm}_se+fNKs6% zKv12Q{65FTLvm$aLU%^q|6ykLL}&v67Z!QzaTKdr?dcyIcKIszKKZo!qN$VRSm(rU zRk70#k6RCqpHSD`M_n#x#^2YzH>q%xG<9L;(bFHO{UmhL5S~vPOm~PQRKwI>*WFaL z9!t1ACg{OCJg@ZEWueY-ne+^4V>8^8gO_Qw2BJG24)lYk|1A1>dd&nkXYnfEdHYV) zyI)rraB#=q;i7`auNI0tQtREHX{AseINC_?TnY*JMZHxmOFel1PaK-Gy+0>JnvGM~ zXS$=8ip6B{>cZN-lReV`)*Vdqbg(iGQq_}KB9&Aq0`VO8JMshqaBG4Sib?-8z!jfV z)3qs6Mt(#^vpVkfrvpg|VZzjd6|6rmh+-_Zr|arUvKAL(x9F@(3TZg^g=NNr=1=z? zwoj#s)0v7f*rl}Y1*o1pZ0>kQ>6_|s%Dox=eoN)Q;^fVMO?A|R@3nVdTr-_>BK>oF z`PV7R%qy{iW;vz9hl6f{TLI%wlK8!bGCHu1fykh0>k?y%FD-3ys`tKrvlprO9)C%- z!|HoX?>u>GB}1i+d5Dc|_6lEO%baizdD}f;O!0*oS16HXzyyK3($R{QJWVh!JC;O;Mj)Mgv2utFuFQl8zGfHsyp@P`iY+$eI&*kO};;A($)zWLQ0r$;OhB5SKal? z(>}L+=#sm3sp%c=4m~z0a$>Ktj_CMu$z{m^p`=v)j6#O6b=(A;#Oq4}zxiG!{(*6u zb-$+i(uyZd(#<*J!-)=tKYS)6PdyMlc~Fgo9zc|cN4AON+*VX^j;nip)uEN_kZ)Av z^l9DAk$_hHtel)G_d|%Hn$_+@&+;}UuHiTO;F4-ED(6O+7ngtf^eI0-f8`-99o;~G zKXMv&9tiIi=ImEYOia$r6CDGp8q~b)FF!^#665^7TEm1?<2Gl@<%N2$T2xp~ zw?ubmDd(ye=d5Jm`{~a7j5jVUOG%m90fg8R%@$4RuBA1+HqmItp>Ak6`zuA9jg2jO z`_ZFEegqU8(GtAm7Q+=z+}zw%RaM?^LTRLF!+%Uq>oZ330J?;q&!3qEzt;zl7F&#H zX=+MhJ&}^qs&=mwzDem_P*5;AH5D)5F+8#M_}05ZlU|75+w)gxxnW=cVywq57m8X4 zSNGX|sG3+3ZFJu=mXK1z5HMJj;wBeZ*6}+6B#p&tar>v)DW_FgYVm`j7?2oYz zxXtu;dGK&|w5~FZDjiWzCx>4kXgs4MfQrpm%U-G2kg~R3e}E?y$F(+>mUuL;T-{$} zHc&?(usE~R7B6Ra|9WhzR=&QZfAFe$=ajh#+JRI*q1*%e@zg{gk<$?HA{Kw=d9~_Suh!z8 zy0?3<(RS+8Dcxt!h8-t@044_q<5TwHEyx7*@fB-7* z-Q8V@1m3>bi-J*weBN)oy-)u;mMktV?(OY$vB^-FUvsp*uL%f)9K8rUJ3cf^Mk@Ud zQ=1oy-5||Bjf_mL7Ysa$3ew6|rVSsqs5IGh;gHEtSgG1K*U=e$aLx!uVR3Qr%X4u+ znJ_uwvx$p|)z;PFo%MQr>skNjzQvlF2h*3dyuQ{QKj}@l;{WpH z%WL?4O?uDPJv|Wsd`q3TGF$bNjrwD8PoG?Q=v<4MLN|*_TQ^odDRp~+;mhOdEdp=) zIHK=g1>aEQl$Y9q5X%?@@q(`y$*TM# zt#btArbb2={DmPO0_5iX1}13-`{8&1)3zyx`@t?WouvKC1cbCs2F)^dM#h}H zythUZe-A%n9i`&$hc{tULXHS9OoIHQBA7!5el?ZmRuT)#f634=+7v$ z<^78QhC%1FvAKiUfsOiRtRzk$w>tUY7pq_D8;v@fsEcckyrmk;6BD|HYSH0`02wG%x0i7Y1ug$+K=zkui>6;qWEQWabvtB zk8E>P3NbipIwCIhy6xHa7Lo*79^4 z-@SWRGB|w7{pUh%wR^9J9eQ$E#%lft7>Y1m+&DG6<*ZNAp3QD2e;%AfBc;*cjrK`l zH$ORXH>>)pajl2b^hxZ44xf4MX|U|01}DiqV>cZC0Xkb!6Dtqe{}y%*&k$_By!`+@ zMs@Ex<{8^%&!`z|5OS(B@>cM^obeKM#7osm_Lxq1;jVtvUNO=ku+i@6ZgVN%Ui&Ns zW|Gt}3thBEHcR>V-tYXqr||5J@z(CgwNv<82;?!SW9BWeFWJ%hOgww%1qF{fxyJ4$ zR~1w0!Pq$=bXO3}UGZjL=(?su@#3YWrYO|Nt+a{ZYU7`)!qH0!wX6Yh;#MlR#2E+k zZ)wbi_;G!e_Q4P~I^R1AxQLDCL)8WZ?^cgytoC&rj-0|-rFxHkG=hxwZ}BFDIomOu z@sjq)UO3#C4#_e@IZ4-SH$E~7MULPTji&v1yW#!#&7=S&pMKLK7gl-iNX~Dsb{*}R z233#4%GrlgoI^N4r3JM}9n+eDkl;gA4TSxscloK~u^F1M?5L0YgmZ5zsC%nfwf4uz zH(?0>6w9>7?{}!1>M{3;xvyaU#DCh%nQOCS_W{TB!Bghr=9hSt4cZ#{NM@wu6mWa6 zh`;yXR-^xhIDhuy(f%puUJ2EefjFFdh1wQxA0e|nZs?7LJ-{#8^rl1{zkX?Qolr4I zGKr&CW5s=$KMDD0?W0WM*Ja|G>OU{wiy6=q!&6ick;L9K+!E~PQxO?tI zoRa(*OET%LQ@v$Mw{d^+GX-A_xa&bycAQHbJnp5>ab?(g@spLMi^e8mH6&}#U1M?a zl+g9#Et{f2DD>jibuosmdXoLuE@wPcFW$x5xxOfMV(`xh6#p=^Bb`k@$#9SHRV)K3 zxfc1?jjv$>=h=>1P<8HavYCB6`!t06t>Ym)WxQm$QmJ#dUG}7aeGzZT>YSCUw!~iD zsxM}Oyr(dTUBoHe(-WErmEZG=5FI4-feujq=|Di=@?HA;JB7r4kG@RS@`=~_967o( z1>QM+`%z?SeUglPVpsnqvAr|WK5fC<6pQ311}|VP>nP;gI&IG}>|MzmkTgg+U0r;K z-rElz-n2Tx3125r4r!ukB9_}&VK=oww++e6Jjb^Rb{eu|kCI0mvDsy1NFWDK-7_>Z z>t5IbgsBWf2BSs^&@;|c{{);#{{e84VE|{%?60|x1eyi3UHbV$q0u)hDkw$1&A`T{ zv+Fbw#Q8IhJKuS0-fp31%Xw~ns+q@r@eUmw#D&pn+8XH@vlenyG2k=Rf)E9xC;Iz<^k_yhvWuly%Yzh@i`BGXM-8}U(nvDj2=;;Fq zt=Goumj;R<6kZg37aH1|tIhQGF%~88XiiQ}Gi`}Gj=V(vdQ1I^#^i^;~WF_wL9dH1FBv*k+R+DY>%i)Z|5m)9&c5ZfDm6phA( zRU1EffDSvXGUkY_M$TtJ)&NbEieesHYou72pZ{gZ{%^wHOKN(B>(4kHpWoXUNStBO@bhY;1rj05A&G zvMZfmVP?F@r~d(XQn zpCR*==&L~u)6>(y^dgbY7L4IyeB>cgX$###gXoBbppuM?Wz7D3x3DXmV}?l|dy`2t zz=v$3hM{9&3pnNdY=Xe@ z(#7V*gHgW6(z}hArilIx;0aO$f6aae{bd|H;ltb`)sm+XG%r@ih8f$DTQ^o4b&N)}q;ZCLe`Z2fJ(hIb# zDTl!NcPj5UFz6B^9gj_Z?Rr=@+}R99OoeDgvm8z&(fV5E0qDS(8V zr;3V-oZ%zcq$kJ_!{FC2_Y5xg@6Hs>a>fFK0I~A<#K+?4kgu~8%Y@`1G?C42uCAYy zOhiS`*+{-$`FUtxe%M=mWT&n^0QibpB5Jf%US3{ugwmUxoxNmeIhxIYm7DS-aGOpQ zo?mrlqg@;}bF;E^tuqv^5E1=i1NlKP=}p@V4K+1ub&AjK{mz0!LRk_3HvrAU5 z|Dd~f@18X8nsA*%)N>>O|E>-oK;ZW{f#Edl`0(x>5xyT)XcHDCYc&0h8#)U;*;z{2 z_uY`}lAUb&EjPRaFSAke^Sh&t4uNz70YN1BEdcVK#lC#$`1>T6FE{Zjfg18$B3Djc z-eIXfJT{i@Qb5Rc9*{G>O>L8}CZi{h=h)=mQ7wnOPgfOP8|Q4xG#K@5+LA|}Y5`B+ z1|XeAB5L&~&q`QC#L==tbvf#2zc*XG@e}^~+FD4sfq@{mugcUOuW#a`{9FcSvKM{>ZPBF6Bc%P0u<9l-7-{ z?(D3@^2AGV#18FnXvd_MmzM(}jO61v-gn;U7nI@JD!hoeLi(*W0+)a(WOPsG2Ziqk z^=pT0J46TX(O}VL?)^wy{j-0tlS0IQvz-%gy+7fp?uVHbz7ak6JHxmUC$HaL)ir4L z!c8P^+^G)}s4??8zWzF2(%z@v^-I!5Q^tW%Gu3iHEnHnXzWZ$S-)!d!7i!{<)xEPp z|9v}OMoEbxN`f$8pk_#aZhf&+ef^$7aqLeqYEBM=Ic@5p5yp{$k|a1W`tz7LbzOzy9%>Wf+n-zf z{pO)onSf(bSlic#1cVS7rh~gIapu+^`!l;_A}wqUT8NE3?om>op1|>Zia^Og2S)vj zkUbe)GLN1|7+r8TF*wI0HM$RGc!YNh z%^lo0r=*_O{t!}n0Q6_fT{WBmWkdCljg7L3A-iBwh>lfvW zGb%~bOY*9s^SwPZT6ZR%v3Yo2IElIcAT*Y`ap8X06|n&fwW*-rMf`RJm`TJRwErMS zRbx+WUMT*#AQmUj?cHR>3rA7w=g5*UjSJKwkBLiPkulC-%K4r67CRVq)4HEaV((O- zCFbjhP$hS3zE8#}=qkBkUZmmZ=yba69JDU^Bzo{XWxc58i@lw1vJ5<|F0i zJBhxIdwhM&xAk!BjCfT9&RAal)Yp9ve#Um7MG?st5(e=g3wj5{D)NiX+>u3U#lYa; zGQH+y+3f{v6MYCaO(kOE;Hc&6x4tH!i~3uVvY42J8Z)dT_lo7P%42pLxDCnHWsLhIBpx*2Z7+iq9kR~8mw~Tv3U*j3vf8% zw}=EEi;If``w59LKnCHPs^#`(#>U2fgt3~(HbqTG8(t%itz)mMm7{s%-F5FpVoDJd zLLk0#4j$&BqVgM3Y5Z$kqxR(j2di~et-;rMlr%Lfoi_Bt#YiAomyrQo2#XT-50Jsc zBj{x_6hL;)PylF^s`Inkp?V1+EsjPyvBzi(}b1kkBkX0ma=*o;Yw|(j9b; z`i#cj(l<~>Rsz%eAIR#1J$Bdi2-Icp z3QV^pS`?}=X_P#`>X@@N<#1_@xd+4&opR1CZ^J@0!N;nq(Tx*Nq@_s%>Mviu3^Y}8 z2Xp71NU{~c^Srz~+)MPYf`j#~Bbybqw1Bpx4sDvWcCxl+4P{G<;&*daQ&STZtOd0m z`0Q*YlicMb^sFJ<<}ZIHEnphxvM*McSH3zkLE9sm8;uB0=^mK`QjXwR*pK5=y1n=79~GFKk(Vx)82&Bw*Nau({tk%_o6ePT z8Jq44n#m*bii+L9M@dl23k!cs;B!H8I3DfIKu2Lh{x&UYoM>upzRIS5p7I+8V5S1m zihusRp8424vhx~@k*b^0SQoHP0~D2z!or3N>+j#+@T+^u8Xd)Z<3;@InVt{2@4CGYK{c3QS|iVKm#REh6K?6&vcV4TyL${X+nPXeM-+(gE>3~Ivhlgig9NQ-t)|ZhFpp)=f ze&6}CLT!WP$sRy(hKi^Bdh_N@LMZ@Y93NMH0T!0G-1r+JF2M0(58X6kf z+SL$7@cq~XFld zBZoEB4-#hhPCr^(NdoE{gRcYaK5p$ou*;3MpXeNH!}yNs11vde)9(KgtTFSs$-;v} zf1&ns7nznPaBL@*Z&YfveL8t1{RCuoV9Ed>uOufYCo5|OS%v}diZ%y8e0MEuHAgT2 zj}1&^cXv09R2(zedC1te=DXL{*1QS-|71FyavvQmq`e2K6UB-K9TC6F=7dHh_h4#N z$C1Rb2;CUh{XsFx_;ee!H|&ClA~}G_QMsJEh2}d2vTV~jpL7;D=q73{+VkXJo@JQE z_w%|uvNLXb9~>|v1Fl9fV4T_BSU|DdP&o;xi20U+Yv)!~3~lyjes=CrP`-}n84=RU zXUM)FuLrw`qFU^aIGtRolMiAi4-=ND4W8zyoC-RUMaRbTU!-WDd95AMF(I`Xd=X}!7+!0|K73<1IcgK0d=LDC9fQVmy|kLlZL zCVo1Fj9NPhn4@M019wLmOI?%Ilalbm)#W}oT}4sZy1U*$gAU7HOl&U6FVnC!N|8)r z;q+M0U=vTr@Pi}T2r~9v1mNWo`FZtt7xrndsh-I@)ym}OHMwrT@p3yjq4W9p{?@Xg z$qC~uLCJds_JH{2-S1J}KkZ?8LMOdu<^p7lW}UyM71A>fodf89ttjuDV+vb$13-!p z!pOCri9hD3MNLe_f=c^;S0edep!vo2SiVzO2pvMq3wGCXTo?M2SxCcGi5m9)=-I!2 zT}1eDVAwl>sAeIBdmJggnFpz8fg!&T1O~ulo?|D_n68GP{h2*b1zOihNT-1vfs>!-p3-L43W>H3gP(> z!=8%V$RCnd(UiyxrZyRSFglXeuf7^!4@aaD|75o0*xpZ8S89 zfI!8`c_j#3cc->+l+gop>oXVc{tpH*yeZp%+C|z45XB>DiSA`4y*U{3B8WlSE=z@g zmGHYtK7W=;lKDQh4q%P-iH*$$=#|oOTr8mAfpX-ie(C=JrMlSJ-J`t4&Fut45Rtz( z;jdr6-bF?_9341?G*Z2N+>@gj8xzx?rMzo-8h8Q8&hhWNbzA5t~-&R^gnjn-h4mXgx97JMa@7W+3ivr_E5S)__A3pr!%Y5*_lat0svY z=3DmKqU?)6)rAeE&I~4=5qDeDIuz-~4=>=-Pu1u=%{j%p*)BvKnlWJ1B|a427f$^IYQRML-&-ndd3u zWi49k_Rr-fe%T>_I9~>~JpeSY?1T3r`rdXf+3%Q6tT{r4V`!MZ#UtTWb-4{gnS(We&HRLO(v?e1nNRiMSg#-59YJQSkG%m&)uGQn&yx#kFyXTk2i#tE2$ zNwt6N)>o!5{0uS*>%`eZ1hY42!Vrln06XgE_n8+{a9itv(+6^{f3aqcpsuf|>qE}= z{0H%h4FY*PwCUu@li(*UGw#mpOq1?p=hJOCFZdmdo8S`OSs7WGnNil(wqU=4M%S$g zeEX1lzJ2@l*ozK$O&32rCI%e@2M0CsR9wMP0unQ0@s1}(m_1+B%vlC2y#3L_A{k0j z0M|{J==-w43pzy24c$By)Rs2NZnixM?ga>Xj@%LCpm?W@aUQ9({1s|}k>lmQ$7NDz9U?`aN$C36>=Uj#^?hdQY|c8TslU^Y3ou*J|ToX zUxy5vP>>%vOBGQ6#d53`9kLS>U#89_u8PAv+gn6`Nlz*~^;N$9K)C;Lbjr+5l2LFI_HJaT^)D+6HFQ@vxEn?Pa;aPR`YNX2nV5m5ey=yz3HQfzSoP`A`o5}v@-Zmij!MSSKhd# zu(zB|AE&T7hR_SphUY^c>8EJ1_74`CW9V$ydk)?{npF&#Vm|#IhQo892}7UB2`RdF z79#n-&Y0Ba>AJ55JA!>-=J+p?|1e;8oXx1_ab+TuTikI|wTgl?cJCD8yd4@1jQXv$Pj)t6 z$GMkchBmaWMrw;lUD(41u@y0j@ppQvZ~cXbWWNqBhK+_OJ=#SB0-X{JARF;YZPLDS zpXAC0sq$jm_tS}b!ctd35rth52OV0@f5(Wu1hxuXiT@(@LKwxs4d>*);Lu^_#>|t4 z9vat=IW#b}qT$$XB#^`B?u);Oz?nvKXpf{ra4~SI<`stE#ghCUox3O&w5K36^XuDt zflq-YoWCqUet}Piet@TJc6Mj}&Pi}co^<`KYW?)+m(@defSU-iCNv-nlmo3;3~wtE z8BCM9PQZ9xm%kC1en2DM)#gs&2@MYr1C_q zWtCe~9wqd=&tIZ+cCZkLvuH5sdEw{cDu!MrmV8{KQL=z7%M1w`LWBhk^r#~KqNd4X ziFS|Pt?uihaW(?|T|};l_X?yPln>b|iCKcBQ3foHClI5Fm?mF)u3S!RywPDiaIjkw zFa3%<>iboYs1Y@9&~rlPcfMWcIW&NJzOW8{*##R&cQN}Df>}5To=w)k=r)wnE<>TH zLQzFC>T$`JkGQ!`r~&WU?T@kq%|MX$;HE3F7Yck80$&tSa=V1#JVJ*H z{I)Jj9alRnIO5Y+(1zQfTq)PBB*MU>6NqK%nAEJyOmM`T4}YqxJRGkNV3*th*77f3 z<=~QiB&7fL_S<|4;Bo=#V5A~1uS172(dEl~Xzx3S-pa9{Kst=L?SQLNDvgbnmX?Z27wqpXgaS-VE4ynG z9I*`S?6yF;L`O%rsK0*w8nhNu)@VoGVPG$TrF3<3!=|K>PEeo?Z*6VWU~~W}9e#lG z@O~3O%49xLRasURLkM1=3IJ;U!h%?!#{!GQ<8f5cIPv!JEeOn#l9Ef^eCWM{?3Zzl zL$3S~VRhff%)GK`#Q;2O0-7A8k042oXLjRC8DvW(aM9EjcD3AxAC) z#Qbm9jQ=m7A|HBc3cam+w9=`*jH(=adtjn_iaSy(Sc#A42yIm{Uq6E&Kygmp2ojlq zX``#FOG>Xoc>Q|oB$V@jL6m_(68Ouh^~p&+Y6B@2H{>Q5T%kMy^wgf79<}Tqts%69 zhq*w*e93)ICCgE~lY-V1z(W5)|F_+3HF0$ocjov;WR zGao_9zp3E*slQgIoEsjw@seSZyq~e z0z$vKO}WWL;=qRyQ@QlkzV*?FpwQtMfwRf5EhVjhCq`9O6;deOs^|8Tw&g>WF)693 zJpc){*|eF}eSqGNsS?66GBmU-9~vGU_@$qJ`MhsJse>r0tn5BD6l+mZQu5jO3*RKh z*>iP&_Uyw>7bLJ?)b1}Z0P>uj6ab0=*R@~?YAWyVdS5&} zJ)znsN3C#vbFPzJvMq|mi;z{nB?>&lhx3G(JQ7S=5lq`IH}SHh&w6ZZ3b-WR zueb=E$yo=kVH1!T<{a2jRO{~2jlAsts+(K#{7uotfoEbh%q=gp_*rAt{x>x}Xkg=+ zgf1+pk+v>s%8`kc=CB0{&BM^?o0}}=DkZw=qbB5Okqb^Uy%R+P&d#Mk7?pc=tCWT=BY>QuF0rj(`qPTL-8Uumc*sRQdf~ zNss7Nxc{>!-2dL=FNDD{zz2+c^VMg00OcUG?h&c>7uv2aPNiNZ18h2vix)3=qX7z;5&HTYFhk+ovr8X*N7Op7 zX*rv`_QJFUAa4y88WW4;GIDCFJ(V}kpfmfa-9j|09efFQEdwwc)wQFp6E%ii|KvX{ z4o^|yrk%F_oI(Ro5g+=dLu}>rDzhO~Ce|d!LBJtV=J11~TzVT?az>2ipc&v~L7Q^% zjHK5;((jH{LFlQMt0GulIRi)(8wNg5?{7-|(26&LITK>4=i9lzvzWxYLARi5HQ&dR zn*5RYDG|u=*KYNdFRMTKhxzVf;5x#W5XO#KkPJ;fD!xx?IAfJRRa@6g<;aiz?g&h^ z&v^@W%Czc51;ccVq%dp1==#hCGoazW0tU`qcwBm zxqnu0fBd%!?ltNmG~gr?{2SkI93~FbRJ(5X89=2n6n=WY0gWwE%h?E=Ic~As*Mfn4 z$n2hnijWc1(GHuzPd(pVpx>advAE9^7%9k#TU%Q6`bq!4BOxuKq)vHKCjG~19+(v$ z9eESb>hi=INcLdc3~AM;BgTnI-7j)o$S#I_JsJBVb;aTK02EM4sDR}Qigxsxh{DBg zM>dCxLH)~3Zl_2y)U3ErlzH3DP%&|SS_CMFlk-7zOk{tjgCa;sr>>N>GMA>veOT`m{oYH z@5M%iD2ec1BlSFllt%|E^V6qW-t^j4yp)s=X~X$})k5t`(+Kc0ky#J;@J z0LsyTXNRh)g@uJmV6{LNyC0te6&;XF4k~Jzmlf2ecF8IC$5lt&Zm+(^aB18NqMa|! zzd%pB#osLPQab?r@>MEx)xm;mZ*Onj_vJPt<1!>p@I8SQ8XFrs>-7*Ss?C1?kA>wo zLeHH!!+i}uwCUUAi4!M=;|Q&{<`rXGMLG*ONwH23du@7Gmm@4A+5gm+|4ZGZh8LPn z&-n6XJ>Fp$$bBgh5s?vPyt6`%j*eDVEQxI>0Fynr+9)WVbAv?AP2HLcO7KUBp1nV2 zG;_9FL8hyTpZX6jcm(1B3hc@jtP5?1rltp5xgOUqUfdW#9gZ9Z*TbTvASA4r*}$f> zE{$uRnzt+A?@n3d6RFAeYp8DkNB=(&`TkEqQ^HP z5BVn&IQ^`%)WQdLHX>c~zwFQ!vMuZkxa7Ja?W}%t(Ia8Ov$rp7UF9$}G%-PgT_{11 zX1;Ob0c|*_I7aL-5W6l4COAz;!vPoQ^D#6^R>AuCJWoX;O@NV+k&Vp;0Aj!;23lYx zExF_}!U%7Mi$R?@)Ko(DL7Li%}Hla-{O;G_6TeYL%h%ytovS%;0%X&^RRj<^>f$l`{~4e~uKy(*!ekK=H0 z%H1ZvZ*hG57iX~wJsS1u9;05KVS#pB^AjgM&!ye_ZQZSq^LpK8Cbdb}hwfmHw*Vc= z1Lq5oG~S!#F&>^3Bi#ZUzy4Ge&7;X{UaXimp(D0G!n-nje@3R2M^@dZbguP8(V;Em zbvOX8N(i#A7kQB&HSXQE)lX~UU60tuj%!Cl8?qEozXrtl-R9LIN6Zh8hc$SAZzq>gd zEWSUY5CGib`SuJn?!dFE`N%4qU-XIHz^q*!xrf%|M3ZPU1wfijv=I^|YnN<-;vSkQ zY?w)~9IE`r>28hUc?(x+UIERi^J$@=-S6ks$*KGCO$k@%%D!;_R&L*Sy9r&x$hu_Z z#^(0T;brdvd=q_2s!+8h26Y;F$pAWQ(!u7c)54-Y_W}2;6SrNbjwX+|!bYr)hXZ;{ z5e?`nZ{6?VJ?3yRU5(=Ew~=k!T+*9^zh}{?ERY3Ymq<0^RZZ)TbQ#&+WfgZmag{Bp zH!9w!ZS?JT=uaX<@_l(OIdLn>q(q+OvT*Kad;0q7Idx~~eV`focFL^yFfEQB&32I% zcGcTq=?9W)dQ8JI((p|XzGvY5$zt;5ib)^W=`!w4#Q)MG54e4jJOLmt!jl}vHt;M* zjH_xdB~!2B$gJ9RD&E5~F4Jpj0C^GZ1aLRi0AA%i(MQ*17HFK-VNX1 z2L~;wQ@x9)ZoGFLhs16>#%LW;|3nQt&i{rI;UaynQIO4iZt$pXMH#rEHz@4 z9mDb9Ct!ed08yfhZvWZ8nOQG4j@vIn4sWQ_H1S)~@!?mN#E$PXVhyR7az9Cf8Q#$o zNiajIq&QA2%t+~E<> z4iE%TAMg28xX&~qQeL~~^2J*(2O}HX@U1V;Uq(+2L$9KnHSL`aefe#3sRnL4YIz*a zFKy}~o;Wq<0YwP!1!va6{QOypPN*|hRD7P_hjbV2+ys2<;seD*fMn6t>AL`Y0cUNt zUcGV!{Cvo1wQT!0b8xgsjZ9`)MBH95gblZUQ`r8NObXH zK9q#7u38E{wz07RTL1t@I1$IuaTltiz#8Z*NdR5|-v??6rBInJgheL9mBn zYKR~j-o2ag@#7>^4)8TzJ?{(Q@=3}saDCmPp^1!$&;kZ<&k&A6y7@M}qy#N@L5V$J zN8NSUZGc;bYI`_=g#+wiVPVWp!2Lo#0070^y{g-|wW(=tUm7eTqj{O7eU(Swm)@g{ zd2{9*Q9f29rr1&;JDVhyzRp@OEmkMM}`j}59q=6_74s|0=we;ZXN)RfdQU7chYCb2na#| zH=*nfcA;4Nv&tu$MAvtOtRT3%6J#mSg7r#8g^bd>aRO@0;LL*JVdntV9=4rrLP0QZ zz%EOFNnBDg2&|CdocHblnHD4hWoyRNP(or~u9>ZbuJq=UhUhoiQTD5!fhi4NaY5H> zcffsYOVIo3Rf{#4#$;fS&Lqb1nP`Lqu3m_c^EoSID}haJfxgER)$0xb5zYZhL>d9)U}3cHc_ZncRwuaF#KrL{}$Ir zu<@ZYEb`UIwtchj0z`aXm)SS2FR0dLI=uXL^I!%}g<%$hce_Hh2Wb0tyh8&};!zA_ zCrJ4vFulHp^b~u80r_ycMfB9vA$f&GFbQ^zP>*HfO{O%Q%*|hj8A)juY6+`}QB~ka zJTHJ>Q~ynlKyp&jQ*b7J{rc4dV8dBs)PijpxCvC~BVcy(sI8yE#=}$0P#}H;1NWD> zo*!?hqjMt^s48$_vpT7(U)`|FR%(8hcZ&$TiO_c_8Vimiti6^=Lob0K$IpttR;72~ zGmacY8Ci{g{xL#Kp?&f5Eut(4ou0B&z}|Umv~pHfR6v+HbMj%et^{=_u#jLi35}2E zvl{nlO}pqfBQ(Ef6H zB$KulIJUdXqXsrTw(}G5Y*pakgZX(lNDU4gmoic6XeQL}bwEJ#&!0cPesuh&+zzBjmWef~7$muPj=mJf8`oThz$m(hoXztgTt`B^E>J<_q zEh~E=vKe%rCt_mH*1vrd7W@tcnp@6p;Ms@g_{&T&LMZalM}2hhfb!17k+y(`t@`-^0pcTr&+?!$uqtHl7dsp- zFtlKH3LktImbr`U+&ObH>FN2s5_E~g?uFD3{sM)Fx_W7i!;6AQ&Ex;DMdBk{p_b}F zmIrL5JHjTPr!q4%NTz0fN{0I5DDQ4K8KRL$%`0FIbsn%&(p1ld(PhZv#WP7eFuBxsl2Lft5rswE3OO3^5TckprCK+}vawVZvQA9E*s-6^Fe~74*>xF24Oz;{7Y~h;Hd(nL4rk3zjftdtj_Viz z>DfVW1`)`u$XT|X*y*Na;<}98J0$KpL9@x+raI}!{pix#$6!4NF41W`SF%T2c z04E_a<7gT!0gUj=+{$}+U{<~AOj#Qglpuh9z2+T&p|f8)617>~(?3?3cmNcTN9z9CC_h9B(~74W|@g!{v4gc>GIM)5&}_FTp38r9<(o z@*kZ|o_(e{5<`RU^JlYelfAuydM<3P+Uta=04M;<_R1_SC5h-LULWKTZX%Q^Sm zVe0KRF4uMw+ik-eC$#tj5p~dqOi>BRmv5OjC*thbi3O2VvUd+*V-O}{PypWksc&(z z8Hw*ynu8SSohKX1=&hFy6hh-`#OPNTyQi6|28!wFUL*>?xzZrdV$vevvdN3a^j;bU z&zJP7WN^2`ov^UXzJm29PgRXaiM7*`5@13iYGz?m_6@)+5#;0S#MvgvfGw_y{*f~n zi0J7DEYx`x9?4*n`^2>Ki}yO2QfhUp@n5a~dA}^QUP$CW%xVO$+8xBG6_^;rIx}Qs zQHG1IxBCxgO-^(kV5SbjQ39scgw25Ae!5^{@(13%MfPaXuXOI_QkYeN;8j{oN$7_o}5+xZ(qO0fkS8LIAdE6 zr~e59lK@m8`ILo(gn+FY(a7osK?{$aMdJj-r@}h>&w`0rse_J-cB~y=pSv&rRM|u? zN-Xd$g^5kU5gO>KaVX&d|IX%hU1qXjD24^lDfkMGVuAcsDMzEpl@m&ie&^|mBzH77 z(*Y=i^BniYpq>&KEZA!jL4ombhcX&Co04+!oBu@|pAQ)s{!la?&%?>bH`LhZM`#T= z5lBR~v{(NAz!%CpI&x8dEG^}R2ZN)?zMPMj7hQP^b+DDGutlssjx%SkTyJV!4NT3- z9`aM#P4qB$ruGR7y+a|$=D>wnZZ#nS2V-`3-)oNoViI&z3x1Bcc#{)&)g^20*3_xK^_d1;=pB8f^p0%klSuP?7EcWPVa`Q@=7p{)zs8L6~Tr7r?)GQhjMM$kBX#ylS7dfq-;?NAtVV2C#8(F zX(2@RVop*g(Q>jY5<-|!9VEq6wop>m%2t+CMrDsN-}THm=X=k2-#^~p`@O%fzx;ZP z=b3q)x$o<~wp+(ScCjRw>sKy$h~J~)GCX_{G;s^r7_Y)T8P+H*GB7AdYD;9%qT&wJ zS3;)L)T97(Io^$q79quQ0n~yi_)G_H54%#Cux6S~@y9{`_-9i9Je7ZvyqjIOV*7(mFKc z1-ZW*HGj=6mKk-p?}vys>6(}?z7ao`E-taZq7ozHpU#*r%qFkL9&wyCi-gK9UGyL5 zt3=xi#nLh=KK=#uUayz`o;{Iyd8(4hDJdoBO#KNdqvm(-qPP3(x3VIOA74WvmsteF za2^Fcu*Vu96yUNk4(pfbclb!IAkbq|1TOVRtXGFl;>+WgL60z}stsS?mzZ3bsVsl( z{gBAbsY{*|WDTWJ7Ku{_;mSoEy|3U8GoZ6&4m6z0lCE zLd<06iYsoLmdZ!r&3-DMAxZXMzM9R7xZ8B?dr#I5PTz)3@2)Q?g@bWHt?{3KsUrtg z?Ohw=!fwiJFKVrmET#d@qlA&!5aaQD0np)^X-Ck}NvEa`9hJjJnqVgTXlD zeqQf=PfwFFn5QM@^``t{i{gT+p+(CW9+dS89w@p|!D#*z-=egP-ftRRz4qs)8U(agl)&!tDglx85 z5GI4so0g_q7z$o7Org{1aQA>F)%5+oYBK%pn&#$_=`pT8MD7S?78bu71y^q>ZvN-iG3+V~()78q7C!If#L-R`p7wm~& z%ELE{T#zCq2I96Nd<}e(vL3G0xS3ibZ9!o4kSm1H-yNpfVk_R*`OOC@AJCL7`5uSR zO@>i&<%$*2Pg#w3lCrbiK>UK(BYl{vuHsi+8?zt7!JL-%Yh@?;*O1^+^0l{LA=!bd zV82J2Xs#Xo-gzpu0&PJ`6I9!2ie9hJv2w@X8t3NR(=ek7p5o_Wu#aV5IQ`6OqOsR& z*;^t+-p$&xK}nrbOsA>RRg) zk8hanRy|RlbLVEP@#BSOc++R-3>l&{a&2Bgr{O2l9Lf3(O2J4;_`H^4YJAxU^-6pS(j+&;ACBK=s@Z&hE`r(3G_m6-5 zL@v~6O0)QxA8U`TOlT18=&Y@)XNAYC7~H=wNaI_dD2_vt4ON@%z3#jF?Hh&)v)uxm zE^a@q$K(MAVj@t6(4TQ3Y-zr;g^Xv;8`+{M=lM%&pyt3bIeQHe2U*y zK4*d%Gc^t#-IVf7Pr-QcCOc(vb|mhr;`Fn)%NA1^&xnSCJ!OKNc&RzVTe-N3V9gbx z&2JMp_#>-62Kk&b+-CHAFG~n%_!@EFn%|(Rnd8v-i8Q1X+ZzuM5_OKE-M^B&lgS#X2 zQR$?c1aPCBRsHjB@snP$RV!Wd69_J_BYXx-0k5EU7j9S+{(!;ok}~m7FdPb$oi};> zB#ujYtMyJ_n}(UD`wp1P%{x9cUvJXgvW9#EA|Ch!_f#=sq1A&Cw;Xybwmw#1Q$wuJ z`stI06}=J(AB(@x%5ONoG0J(kk`S?%A;b$kT4NR)eyUV+IIVYi?E6U5*2#P4_DlSL zZj$O-lKMM%YWVZ6oSKE##Bz-)_Fv?VzIg0vYK~)t__z$hD^|joD&rHIoat$4+30-{ zct;5Qblg=L6+^b8+BQW61@Qyy7+P*0}%GSiK}P11B@98P|rvXpW8$gUrVy~~5pM-FAyNa}5Yw?cn2x-T8dF8&mzub{w4PEJN3lj``N zfW3zL`UN`n_V)0T!whC3c*Mo!1=`fTSjy7Ume=D$px?k5Ev03)}Fk<) z;e>jWC_wi?z-#|~H#<}*`S(3i9Z`(E1r8ME_-9m3>w?``dmx=`aH^jsAON#g$h?~* zL4Y(AkniTrpbS!zlVRpdF?;rVe~wizWFnB4l#|~|FsDf6S!DsGAe(8HZXtEGq_|jd zvquP6)Dk4E_4QxGsWRyF7jV(Wiq&ThKW;Q$Yf)=n5N9)5`CQN@b#2e%ZEM*dr2Eft z8A#%5G!NKKe9W%a9LuEBT|joO6Rw<(T2Hi?cXRv)H=(n9$&w}1cKYAAJT-Up%ec;! zT(y4v-P^Y-?C+p7v&M1#U{#LQF*pbO{ZSiqoFsr;@-pf^Q9Pb16T=;X?x1%-vK9`#aRT|Zr9U!K7=%(6na_Rx zJk0k@UP?-EW#@WTkPl~c+R5g5)cNet^>#bM2Jer%eD&cw#Fe@r0$4%hV=($qgfNt}a`Ux7hMYfT zwTQ+cO;H(%4$|@X(S|oo*(i>$EB5T}{}3?0t3tn8g1qa$UpRl>H=ADcl(axVs}mPT z2ep^Zugxw+prSxyaYo9t&ISi>P*G8Q3g4eesy|!+GbG^;B zo|`KmAh13kEG-JSt}4&vHT)Q?`lI28dk50uzs_RLjm|njNeLJ#j0~1&{t6$gvykS) z3QoRsHYp$wG=KZNw+Gk9L`6ll%TtGUb+K{y)czI(xbdh(p>s#SBmnuanP`rBQ2 z!wYlEp8zhwBWh&=9(Z(gM-LOlB_#)`RHR=#;mU^B5vAm0M?kV!dPas5mD+{$*{*mE zWX(|5BPiL@(gJ!6h1?kB&`p(5H`xX01@or1HqmdzwJ)YZ9Q{|MU6~)>%Y!L9kA}LZ zunGeA1w!^>4;5?I?B!f1A37%cflpM4efu|`sbT1Ke-DM-6rLB1co1D5ek&ELnpyxu zCtw(^6Y5H6NXQ!iH9fs){Sm-%i-d*IgI?L%8i-I1I*J^=gPg?z3+|fZ`R|bE2S}4b z!{(|pOEpjKWi&{yS_KQs!#tr)>DrL&emunDXQ{I|0$xX5 zL~ZZZ;IU09r6H8qPpn#w7^#~=noO%PB^nQZKWKeUCq3gqOOC9*kF4={@h0B+i62UL zXVS#NH*7aPm0XV!2@s#lMkAOpWLTJdy@1M!nS{FWgkOp-#Uwq}m`h`Bv<+dr<|%*B z4n^$vnZthj>9IcyjQRcCUfXY(!x-|O#7AxMVWCrKx1L#As&^VTH#yz1F$}i3HBE1n zM@K>&KkLtTgOs{!`8I5zF#p1KVpO|fXGOd`bMjP#zN&Pd5EjLHCj}_U4?3;9TW4lp}Bgh6O5(A`IXKUouAYZ-en#hgDO^Xs43hqm2G zP>AMrbxV;M!*sXC#(mQLjU;vnW{;$DKRrc(E%j5{5{#+7`7DN|n(&Tk5^`b^>NTCm zE+HGFkcMEwtQT)y0G>;G? zL<}z_6ED5lshzFI{cF7U)CtFurnw?V+4fuBEbD;Ey#=<9M zJGtx&aW-rEI)XP1fNgAc+^=4lRdn8b{CpM30SmwMUEIb+&7pGtjLmkmD#1<{_~Uf~+;#A}Oqn_r20d~U zng1Rq_iw_q9`?v$T4mmYR+&d~6O7VVm8HX7zSd*C$;Ybw?6_Pd;qdZJjuRa2X%?~t z4;~1JdSLm#P}&50vqXi5kBpA?HWx(Y&vCK2j@j^ZA<1NXDB`3`tFF~?BD z6d^&uy%3jBg&4VR->a4udd*=$$)h>3JaeItq%)%E+K#3xmlWwuT z_vF7J#-h*>oEq>P@|~DLVDnKHnf2&a!!ACzl$^2Nq^$SX!xAVeF21E1J>FLXw5ruj z2M)LX#C^;a$5-=sx%Et!JWC4;Mb!?jstRUj3i!8>5___@n%o!#v*XG`_nOEE6Z-y^ zh>DW*&z8ABTzHNU&py09#t(*pTrjoiDoatMf=xM4Pv0;rFgvrsyJ^X?@j~v5lIHGU zdRdxF!V!vRku&*|g}Y8+q{>v()kTcfG&f(L=g$7&N!B`DAfd~>CTCSu)voz1KymU> zmG8((9id>d93IJUcosjHPC~Y^_$P-|Ua9n!2kRt$SiXgAdtTuL)s>y!0JxYx{Alw$ z@*XkEBaylH806UQ%?w~gcf0)vq(wd(3pfal?IWK_jd`Cq2h73Hm@)a=wB3DtRuhj< z9VsCp(bYpi)l6BKHa-Zfl#Iapd8#${S8MGO{0AYmYpr>z$w6$6gD}ZIDyiHJWX|iM zy!!ru{|%aC1#nMuZVfuY3k%~%mHW?;^@zT2twfettt$PoF;Bw&IHRa&#~~_)tsA^qN|-vbP%s+@iRn0CU&R78c1hhjU$9U#xov zLO&1@Tl)~fF2`2i?q#m7u3fAfFeYHT8p!cvv;%oNgsQ5J{eZa^ zt%!YE6C)10c2%pk_^gDvBELpUP0fnY!0A*7?D_Z+57Yi^TfTcY4zbq!fc+EELdX&M z_9a4Co^;VAy}gG&lwC@IJGcEwFys*jaemhMy5Zhp@_GrkB9y|!v4h0EK>57ab4X!0 zF77#%daCt8i9O0qPf7Hr9C=Vs@V2Qbzt#69_a%gg?$>#WsX-Ji>|tQWb3XECryjKoL_fQ(*5jH zoj09V86^c6kJ+2atiLk$f<`mo>_*;pIqzrfSE){%K6bjn&#>Pew#cx3;6V(enYii`ORR;U| z1Wek$9#zZNc2%)zc~DYvL9Hyue)e0yiKuoJ-o*uwyZ`$2KI@=kT2G^*qN+x|Y>}qz zO}v%oV*2YFyF$`ihxwUh%a-X?$1)t(_HcETd~=6(etu@W(xxg}zOr3qY1Krg+T4ZP zhx4|pni(4(soitp#Q5Cws7$M6U(IDrstr4aiaB%7iHMB%)m~9dHKe?lULj7-!2%}7lCNJq&g9A`YN|R+Yv=^KGYK=&&{QPr$@bgq zVJFRvRZ0&G4Deg@$>rEh_xy}fOf^(C$#d>xZEkoh%aq@vS{ZRVyOFx*xh*ZO@RnC* zz927eYxeG6PnVr~M~RY+G-k0aKH#c0JJJcjivaZRHN;n z{Yc?{a$iTWU(5yy)eE`QzP>(jFV==EYtz~U4eFi8kE9qiWSIBW#CuY!DgiNEzAF)=YPu;5F7ZX*NVVY&A=5HR+$6Y~qRgQg}XHe+2kO~iDzE0|Va}&fVlNYhYtz zlWN$ontJEebQ297VNFE-$mnQTSXj75;GLA~m2WPxkkT?U%lwa?t(tGXw~3sjbIi1} zBvv^ypng5iGTD`e%U2_*-6po4nl#(wB-%3?6tqiBtl*WKO?FO=>|I~hW5*IDd=6=t zH8U<={H~m$;`XS8Jmu?@SA9KAF2pZM2Ocba-2dP6A?I6{Y81+QyA?qbZhl@ug3oTs zSXWm!ej+F+$lu?8Zf=f?+fY_Wjabu5QkrEU*^ZQj@-VU7`H8x`ZOYj;=7pXt2}v(r zd?+tJdf>p@v(6hUI1<-y=crHC^Skf7^Mr2JOivWjgO%qSQCmnK?)LEi zu;Y(E-rxNEkesY1Sss@hDquYl6_>N~xb`JEIe&L|X=7t!6O)8O_CFREO!C>YXPaqh z+dDcmOd?g{nldeoW+(b>$GXZh%zGE+XH~PTh9{dG{Y1o`?uw6(x9*Ke6%Y^*b=%3p zUS3|#%5!G%EQj+vStMUS4Lx%6ZejTI=g%V}BT)jYHS3b~_PaZ8WbiC_`}Xb3crQO6 zUy+#?>&0EWcD>GP7fqugj<(v}+S+>e-aWU(aAj}RBu6>98l<~YxWra3hIiMZCfdEE zMa9ILvaAy|O9LvJii`{13#jDS)s~iC>}B12CS^A}aT}+mQ$`;Zk zA)(p+mi45%*x;J)hC7J071)gmXgT+zNxRsW{qf_+hK7a?4i04J87$m`2M@OFmpV-D z5BF2)`Tp{Aia{Ntj%ohhKt2?t`I9)P*Bj=D8$UneC$|dk+IZnHnu2rX)Uc^JdIXi7X!I7 zEe8$jQVi~`rhXl-R`9fNHJANFU+vwy%Z-eTaQ5HnA4jKM`Kv6HiO)=Xa-boZvf>XK z8cz?8=E1=@_W9{wp{UlqZ{Hr+zds_~^cT5iZu)u7N+)Td=`Uqvafn1!`*EL`m>3IJ zWAUKHns%6si@gd9Gv^ED&IG=cl#~FcR#H(_M_v)r)BpbB^rcH4_wP7TW}9MTVpk&%&wM~XO% zbhx;$HgR&WNf`AwwaFo~<`u|*4kww*dZhgsvslsnxHuzC%{TGcMol@$ltbya7w_=K z=?Qx8l&i~~1fJ6K40K0?Rw*R8PamUx-8EPp7h0u~sCm&#arfdCeD@;m4jlMeT+GJ7 z@lD+s+~zD}sQpB3M2O8hbz8)pMni(-$BQ5EZKrU#1og*mZl(9vZjtDHv316I6H~|u zz3Xyva#B)Ht3rZ;4!di83tGEoO${JRK|w)Bv3W5%hfaOT%UeZ7MXzOVZ$DV0sypK@ zypV=6A3mOLJ^Dsqpf*u#rmsHz%5ox|l$4Z`NJEv*pBAzp*Zfdwq)uua~^FH@;w{JJ@>nQ_2_lXnN-k9?>;8#f#o=dFHze#U3d2D+0 z7YZpk+t#w5Lb`wd{=R+tre-=edW4PIq~jvw%g{_nRN@u0jy>)TIuh zdWU*>g(draS%QjJ4Ez>{`S=uOIdk#1UBV7oNhSVAKj-Cjcu5PD$F4E4wDj{G8ynjs zG_{+BMWeIixpJn(iS!fS79Y!3M0W;!wN3xVjTb6$sqxbk;Y`QM-9YLZzg6QW4%Dh_ z&|3VWq*nBTn?%$|aqL3O67!V#pQi2q>h(0z5hahe>^H1WyDSNWBlLY*T=R& z79p22JCF(Laa^b3T#A}T8ruhT>7~NrU~O%U&cnXE84bi_h7Dz5e$y`ABl_$#a>-q{pQVFi z!QUDibDkKY6}WQiRx4@;zj;r4celI(&(d?t2XGtgq^H*lqTaCKNAI{u?o1*Ik_f+c zquppJfU@y++Z+>dx(^jTbFGxwUNw=$lY5_8{Gk0`^l?}OYd_ppP!=MnXpu_KWBBFE zm-b)30+noL#=22tDyouaC08ubRExpJZ2j5@ljEF+S*+xn(NoCLot<2 zsGI1o3!j;soZPg2y&gHKJK%(#iHXS*NfySHt5*4BGye{_g9i_WiMdaVj_TFCzv;S- zJ;Zh(y{4uHt=`t&6c87JE%sKIef}IK8>b>OT=3<~4nGe0gfIE|qT77p|2zvA9E!Fc z(RuA>Wn~nylk+^~w)2FGxouBmgke+8JR0OT5fNgdqU5@|RNbEvinQCeZ{N0U0__n0 z$&)zIz+z-Fu8I75kD#p};+9Gs0G=yvE{ID>#VV!_;7%kgb_hGnMP7+`BNeQxrWRJ+ zyPZQx4sfeewuo4Uz<%IXmPtnum&M1W+AO2}YgvX__g=aW>ZF=PtumCEP&{MHXXom7 z*YrvQPIPy7SL7hvy}fDIZnCUjwODJNs6G`J_ZkX~bH2lW8D$MWyioG|m=^FF4XXB! zx0lN|vR#kX{{G@)f=01Axw3LJd$JKNiYkE}`Zc?IIh4{ak>ivzef|7?{rbhDQ?XCy zaLW3ng5PNg1i0Onk4mJQ2zECjcj?llB=?dx;o&Fw`SlXX49mgx)6>&Em+jl3zTQ6e+U0u>cA*_Td-iO0b~dWzA=fi!&VcL8&Ci2=qo~qh zjcc_+Pv}+kxpL;94p?>g$btd*awzN8{}^idtiddz=(2Y)i#oLo3dfC0bf-lCfIOND6n#*G_U=#zU?nTMO>^g{!k zh+jWgYNP)5en?)Hle3ze8b&lV#%nn^ECAp*RI=ofjtUCSV@>7d`=du51t0HGA)97>WL2ICc~V^%c(fQJ{-KaQ z&Y5rU<^(<)_g2LWW>2aVDjP$6A(4*c9@F~vgr0|k zi%TZZ+}zx!;O^bKuk2s9P7V)8UJes|c&F-gV48Wa@4b6xks9h`(35Z9I8L1S+5Yr5 zKUE#=EcNpA+{Ui3?}4p_g@v~ETR;QaK8?$N!Y*ZWb^f&wv=X4;y3n&M2OHOKJG^Gi znyw#_l>-f#qobpEJBEMCOmopOFJufX`4stoa!nq9_`DYNriA&I*;_*77~x=eOYT0)1%cuRT3ON|g@NZrl__pVCJzia z3-!8ZeOW=Yvdx@(7T06lUp{@Rx4W~x?A zEge@qSeIJX{*+iGM7uB#Pb!j2=P&i(7W&CvO^vkX2)S9v-_aNAbL?$#3y@KvfS*WT zVh(@pT+@ocn<6ee_Y4YBf(&{s>Uu*jqbf)_C~-$e2Snt-!u_GgYn>&XhzF2-8BEnx z5$>w)G`ohhVuL!fURCt;{AAO`i6!-8=#-VUbwg>yg2+!4GB=(^kH;rXJN1F#Umk4+ zJIR>+scPM^)q1Y3X@MIJ3Yt?W;5q6{e@AJ$NHY5OWO-RxS?j|G4x|N|uV24D0-_O= zFN3Pm(wHaaCl_r5|Gy`!cR)Zua4^Hpojv{i4M{pzu@97kda#J9ER+=J$Oa18kG*1xC^HRgBb$_`e?DDrS~r*vhYW4S`jb?jIa z2!H->2V>Q3W8(w0a!E6sinTv;xAH6_9!lab0luz

dG}q6K+M1@GH(&(Qgax(|nJ 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 diff --git a/_examples/custom_padding/main.go b/_examples/custom_padding/main.go index 199a8e7..95ec57c 100644 --- a/_examples/custom_padding/main.go +++ b/_examples/custom_padding/main.go @@ -5,6 +5,7 @@ import ( "github.com/wcharczuk/go-chart" "github.com/wcharczuk/go-chart/drawing" + "github.com/wcharczuk/go-chart/seq" ) func drawChart(res http.ResponseWriter, req *http.Request) { @@ -30,8 +31,8 @@ func drawChart(res http.ResponseWriter, req *http.Request) { }, Series: []chart.Series{ chart.ContinuousSeries{ - XValues: chart.Sequence.Float64(1.0, 100.0), - YValues: chart.Sequence.Random(100.0, 256.0), + XValues: seq.Wrap(seq.NewLinear().WithStart(1.0).WithEnd(100.0)).Array(), + YValues: seq.Wrap(seq.NewRandom().WithLen(100).WithAverage(256)).Array(), }, }, } @@ -57,8 +58,8 @@ func drawChartDefault(res http.ResponseWriter, req *http.Request) { }, Series: []chart.Series{ chart.ContinuousSeries{ - XValues: chart.Sequence.Float64(1.0, 100.0), - YValues: chart.Sequence.Random(100.0, 256.0), + XValues: seq.Wrap(seq.NewLinear().WithStart(1.0).WithEnd(100.0)).Array(), + YValues: seq.Wrap(seq.NewRandom().WithLen(100).WithAverage(256)).Array(), }, }, } diff --git a/bollinger_band_series.go b/bollinger_band_series.go index 9173825..9dbd3b8 100644 --- a/bollinger_band_series.go +++ b/bollinger_band_series.go @@ -3,7 +3,7 @@ package chart import ( "fmt" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" ) // BollingerBandsSeries draws bollinger bands for an inner series. @@ -17,7 +17,7 @@ type BollingerBandsSeries struct { K float64 InnerSeries ValuesProvider - valueBuffer *sequence.Buffer + valueBuffer *seq.Buffer } // GetName returns the name of the time series. @@ -67,7 +67,7 @@ func (bbs *BollingerBandsSeries) GetBoundedValues(index int) (x, y1, y2 float64) return } if bbs.valueBuffer == nil || index == 0 { - bbs.valueBuffer = sequence.NewBufferWithCapacity(bbs.GetPeriod()) + bbs.valueBuffer = seq.NewBufferWithCapacity(bbs.GetPeriod()) } if bbs.valueBuffer.Len() >= bbs.GetPeriod() { bbs.valueBuffer.Dequeue() @@ -76,8 +76,8 @@ func (bbs *BollingerBandsSeries) GetBoundedValues(index int) (x, y1, y2 float64) bbs.valueBuffer.Enqueue(py) x = px - ay := sequence.Seq{Provider: bbs.valueBuffer}.Average() - std := sequence.Seq{Provider: bbs.valueBuffer}.StdDev() + ay := seq.New(bbs.valueBuffer).Average() + std := seq.New(bbs.valueBuffer).StdDev() y1 = ay + (bbs.GetK() * std) y2 = ay - (bbs.GetK() * std) @@ -96,15 +96,15 @@ func (bbs *BollingerBandsSeries) GetBoundedLastValues() (x, y1, y2 float64) { startAt = 0 } - vb := sequence.NewBufferWithCapacity(period) + vb := seq.NewBufferWithCapacity(period) for index := startAt; index < seriesLength; index++ { xn, yn := bbs.InnerSeries.GetValues(index) vb.Enqueue(yn) x = xn } - ay := sequence.Seq{Provider: vb}.Average() - std := sequence.Seq{Provider: vb}.StdDev() + ay := seq.Seq{Provider: vb}.Average() + std := seq.Seq{Provider: vb}.StdDev() y1 = ay + (bbs.GetK() * std) y2 = ay - (bbs.GetK() * std) diff --git a/bollinger_band_series_test.go b/bollinger_band_series_test.go index b591848..8801220 100644 --- a/bollinger_band_series_test.go +++ b/bollinger_band_series_test.go @@ -6,15 +6,15 @@ import ( "testing" "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" ) func TestBollingerBandSeries(t *testing.T) { assert := assert.New(t) s1 := mockValuesProvider{ - X: sequence.Values(1.0, 100.0), - Y: sequence.RandomValuesWithAverage(1024, 100), + X: seq.Range(1.0, 100.0), + Y: seq.RandomValuesWithAverage(1024, 100), } bbs := &BollingerBandsSeries{ @@ -38,8 +38,8 @@ func TestBollingerBandLastValue(t *testing.T) { assert := assert.New(t) s1 := mockValuesProvider{ - X: sequence.Values(1.0, 100.0), - Y: sequence.Values(1.0, 100.0), + X: seq.Range(1.0, 100.0), + Y: seq.Range(1.0, 100.0), } bbs := &BollingerBandsSeries{ diff --git a/chart_test.go b/chart_test.go index 6a04793..90a3c19 100644 --- a/chart_test.go +++ b/chart_test.go @@ -10,7 +10,7 @@ import ( "github.com/blendlabs/go-assert" "github.com/wcharczuk/go-chart/drawing" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" ) func TestChartGetDPI(t *testing.T) { @@ -392,8 +392,8 @@ func TestChartRegressionBadRangesByUser(t *testing.T) { }, Series: []Series{ ContinuousSeries{ - XValues: sequence.Values(1.0, 10.0), - YValues: sequence.Values(1.0, 10.0), + XValues: seq.Range(1.0, 10.0), + YValues: seq.Range(1.0, 10.0), }, }, } @@ -408,8 +408,8 @@ func TestChartValidatesSeries(t *testing.T) { c := Chart{ Series: []Series{ ContinuousSeries{ - XValues: sequence.Values(1.0, 10.0), - YValues: sequence.Values(1.0, 10.0), + XValues: seq.Range(1.0, 10.0), + YValues: seq.Range(1.0, 10.0), }, }, } @@ -419,7 +419,7 @@ func TestChartValidatesSeries(t *testing.T) { c = Chart{ Series: []Series{ ContinuousSeries{ - XValues: sequence.Values(1.0, 10.0), + XValues: seq.Range(1.0, 10.0), }, }, } @@ -505,8 +505,8 @@ func TestChartE2ELine(t *testing.T) { }, Series: []Series{ ContinuousSeries{ - XValues: sequence.ValuesWithStep(0, 4, 1), - YValues: sequence.ValuesWithStep(0, 4, 1), + XValues: seq.RangeWithStep(0, 4, 1), + YValues: seq.RangeWithStep(0, 4, 1), }, }, } @@ -550,8 +550,8 @@ func TestChartE2ELineWithFill(t *testing.T) { StrokeColor: drawing.ColorBlue, FillColor: drawing.ColorRed, }, - XValues: sequence.ValuesWithStep(0, 4, 1), - YValues: sequence.ValuesWithStep(0, 4, 1), + XValues: seq.RangeWithStep(0, 4, 1), + YValues: seq.RangeWithStep(0, 4, 1), }, }, } diff --git a/concat_series_test.go b/concat_series_test.go index 1f15339..3856e0a 100644 --- a/concat_series_test.go +++ b/concat_series_test.go @@ -4,25 +4,25 @@ import ( "testing" assert "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" ) func TestConcatSeries(t *testing.T) { assert := assert.New(t) s1 := ContinuousSeries{ - XValues: sequence.Values(1.0, 10.0), - YValues: sequence.Values(1.0, 10.0), + XValues: seq.Range(1.0, 10.0), + YValues: seq.Range(1.0, 10.0), } s2 := ContinuousSeries{ - XValues: sequence.Values(11, 20.0), - YValues: sequence.Values(10.0, 1.0), + XValues: seq.Range(11, 20.0), + YValues: seq.Range(10.0, 1.0), } s3 := ContinuousSeries{ - XValues: sequence.Values(21, 30.0), - YValues: sequence.Values(1.0, 10.0), + XValues: seq.Range(21, 30.0), + YValues: seq.Range(1.0, 10.0), } cs := ConcatSeries([]Series{s1, s2, s3}) diff --git a/continuous_series_test.go b/continuous_series_test.go index 828493c..89af981 100644 --- a/continuous_series_test.go +++ b/continuous_series_test.go @@ -5,7 +5,7 @@ import ( "testing" assert "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" ) func TestContinuousSeries(t *testing.T) { @@ -13,8 +13,8 @@ func TestContinuousSeries(t *testing.T) { cs := ContinuousSeries{ Name: "Test Series", - XValues: sequence.Values(1.0, 10.0), - YValues: sequence.Values(1.0, 10.0), + XValues: seq.Range(1.0, 10.0), + YValues: seq.Range(1.0, 10.0), } assert.Equal("Test Series", cs.GetName()) @@ -54,20 +54,20 @@ func TestContinuousSeriesValidate(t *testing.T) { cs := ContinuousSeries{ Name: "Test Series", - XValues: sequence.Values(1.0, 10.0), - YValues: sequence.Values(1.0, 10.0), + XValues: seq.Range(1.0, 10.0), + YValues: seq.Range(1.0, 10.0), } assert.Nil(cs.Validate()) cs = ContinuousSeries{ Name: "Test Series", - XValues: sequence.Values(1.0, 10.0), + XValues: seq.Range(1.0, 10.0), } assert.NotNil(cs.Validate()) cs = ContinuousSeries{ Name: "Test Series", - YValues: sequence.Values(1.0, 10.0), + YValues: seq.Range(1.0, 10.0), } assert.NotNil(cs.Validate()) } diff --git a/ema_series_test.go b/ema_series_test.go index 4b08570..e2867d0 100644 --- a/ema_series_test.go +++ b/ema_series_test.go @@ -4,11 +4,11 @@ import ( "testing" "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" ) var ( - emaXValues = sequence.Values(1.0, 50.0) + emaXValues = seq.Range(1.0, 50.0) emaYValues = []float64{ 1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5, 4, 3, 2, diff --git a/histogram_series_test.go b/histogram_series_test.go index 0c7e6c0..744ebe1 100644 --- a/histogram_series_test.go +++ b/histogram_series_test.go @@ -4,7 +4,7 @@ import ( "testing" assert "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" ) func TestHistogramSeries(t *testing.T) { @@ -12,8 +12,8 @@ func TestHistogramSeries(t *testing.T) { cs := ContinuousSeries{ Name: "Test Series", - XValues: sequence.Values(1.0, 20.0), - YValues: sequence.Values(10.0, -10.0), + XValues: seq.Range(1.0, 20.0), + YValues: seq.Range(10.0, -10.0), } hs := HistogramSeries{ diff --git a/linear_regression_series.go b/linear_regression_series.go index 1ff2dc4..13c3cb0 100644 --- a/linear_regression_series.go +++ b/linear_regression_series.go @@ -3,7 +3,7 @@ package chart import ( "fmt" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" util "github.com/wcharczuk/go-chart/util" ) @@ -107,14 +107,14 @@ func (lrs *LinearRegressionSeries) computeCoefficients() { p := float64(endIndex - startIndex) - xvalues := sequence.NewBufferWithCapacity(lrs.Len()) + xvalues := seq.NewBufferWithCapacity(lrs.Len()) for index := startIndex; index < endIndex; index++ { x, _ := lrs.InnerSeries.GetValues(index) xvalues.Enqueue(x) } - lrs.avgx = sequence.Seq{Provider: xvalues}.Average() - lrs.stddevx = sequence.Seq{Provider: xvalues}.StdDev() + lrs.avgx = seq.Seq{Provider: xvalues}.Average() + lrs.stddevx = seq.Seq{Provider: xvalues}.StdDev() var sumx, sumy, sumxx, sumxy float64 for index := startIndex; index < endIndex; index++ { diff --git a/linear_regression_series_test.go b/linear_regression_series_test.go index c26934b..c24dff0 100644 --- a/linear_regression_series_test.go +++ b/linear_regression_series_test.go @@ -4,7 +4,7 @@ import ( "testing" assert "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" ) func TestLinearRegressionSeries(t *testing.T) { @@ -12,8 +12,8 @@ func TestLinearRegressionSeries(t *testing.T) { mainSeries := ContinuousSeries{ Name: "A test series", - XValues: sequence.Values(1.0, 100.0), - YValues: sequence.Values(1.0, 100.0), + XValues: seq.Range(1.0, 100.0), + YValues: seq.Range(1.0, 100.0), } linRegSeries := &LinearRegressionSeries{ @@ -34,8 +34,8 @@ func TestLinearRegressionSeriesDesc(t *testing.T) { mainSeries := ContinuousSeries{ Name: "A test series", - XValues: sequence.Values(100.0, 1.0), - YValues: sequence.Values(100.0, 1.0), + XValues: seq.Range(100.0, 1.0), + YValues: seq.Range(100.0, 1.0), } linRegSeries := &LinearRegressionSeries{ @@ -56,8 +56,8 @@ func TestLinearRegressionSeriesWindowAndOffset(t *testing.T) { mainSeries := ContinuousSeries{ Name: "A test series", - XValues: sequence.Values(100.0, 1.0), - YValues: sequence.Values(100.0, 1.0), + XValues: seq.Range(100.0, 1.0), + YValues: seq.Range(100.0, 1.0), } linRegSeries := &LinearRegressionSeries{ diff --git a/market_hours_range.go b/market_hours_range.go index 19ccf0f..de32e8c 100644 --- a/market_hours_range.go +++ b/market_hours_range.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" "github.com/wcharczuk/go-chart/util" ) @@ -115,31 +115,31 @@ func (mhr MarketHoursRange) GetMarketClose() time.Time { // GetTicks returns the ticks for the range. // This is to override the default continous ticks that would be generated for the range. func (mhr *MarketHoursRange) GetTicks(r Renderer, defaults Style, vf ValueFormatter) []Tick { - times := sequence.Time.MarketHours(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) + times := seq.Time.MarketHours(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) timesWidth := mhr.measureTimes(r, defaults, vf, times) if timesWidth <= mhr.Domain { return mhr.makeTicks(vf, times) } - times = sequence.Time.MarketHourQuarters(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) + times = seq.Time.MarketHourQuarters(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) timesWidth = mhr.measureTimes(r, defaults, vf, times) if timesWidth <= mhr.Domain { return mhr.makeTicks(vf, times) } - times = sequence.Time.MarketDayCloses(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) + times = seq.Time.MarketDayCloses(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) timesWidth = mhr.measureTimes(r, defaults, vf, times) if timesWidth <= mhr.Domain { return mhr.makeTicks(vf, times) } - times = sequence.Time.MarketDayAlternateCloses(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) + times = seq.Time.MarketDayAlternateCloses(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) timesWidth = mhr.measureTimes(r, defaults, vf, times) if timesWidth <= mhr.Domain { return mhr.makeTicks(vf, times) } - times = sequence.Time.MarketDayMondayCloses(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) + times = seq.Time.MarketDayMondayCloses(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) timesWidth = mhr.measureTimes(r, defaults, vf, times) if timesWidth <= mhr.Domain { return mhr.makeTicks(vf, times) diff --git a/sequence/array.go b/seq/array.go similarity index 95% rename from sequence/array.go rename to seq/array.go index bf870bd..08479c2 100644 --- a/sequence/array.go +++ b/seq/array.go @@ -1,4 +1,4 @@ -package sequence +package seq // NewArray creates a new array. func NewArray(values ...float64) Array { diff --git a/sequence/buffer.go b/seq/buffer.go similarity index 98% rename from sequence/buffer.go rename to seq/buffer.go index 7f61449..be7c32e 100644 --- a/sequence/buffer.go +++ b/seq/buffer.go @@ -1,4 +1,4 @@ -package sequence +package seq import ( "fmt" @@ -47,7 +47,7 @@ func NewBufferWithCapacity(capacity int) *Buffer { // Buffer is a fifo datastructure that is backed by a pre-allocated array. // Instead of allocating a whole new node object for each element, array elements are re-used (which saves GC churn). // Enqueue can be O(n), Dequeue is generally O(1). -// Buffer implements `sequence.Provider` +// Buffer implements `seq.Provider` type Buffer struct { array []float64 head int @@ -61,7 +61,7 @@ func (b *Buffer) Len() int { return b.size } -// GetValue implements sequence provider. +// GetValue implements seq provider. func (b *Buffer) GetValue(index int) float64 { effectiveIndex := (b.head + index) % len(b.array) return b.array[effectiveIndex] diff --git a/sequence/buffer_test.go b/seq/buffer_test.go similarity index 99% rename from sequence/buffer_test.go rename to seq/buffer_test.go index 6c9d20b..19fd64d 100644 --- a/sequence/buffer_test.go +++ b/seq/buffer_test.go @@ -1,4 +1,4 @@ -package sequence +package seq import ( "testing" diff --git a/sequence/linear.go b/seq/linear.go similarity index 63% rename from sequence/linear.go rename to seq/linear.go index e17526f..699a5ac 100644 --- a/sequence/linear.go +++ b/seq/linear.go @@ -1,18 +1,18 @@ -package sequence +package seq -// Values returns the array values of a linear sequence with a given start, end and optional step. -func Values(start, end float64) []float64 { +// Range returns the array values of a linear seq with a given start, end and optional step. +func Range(start, end float64) []float64 { return Seq{NewLinear().WithStart(start).WithEnd(end).WithStep(1.0)}.Array() } -// ValuesWithStep returns the array values of a linear sequence with a given start, end and optional step. -func ValuesWithStep(start, end, step float64) []float64 { +// RangeWithStep returns the array values of a linear seq with a given start, end and optional step. +func RangeWithStep(start, end, step float64) []float64 { return Seq{NewLinear().WithStart(start).WithEnd(end).WithStep(step)}.Array() } // NewLinear returns a new linear generator. func NewLinear() *Linear { - return &Linear{} + return &Linear{step: 1.0} } // Linear is a stepwise generator. @@ -22,7 +22,22 @@ type Linear struct { step float64 } -// Len returns the number of elements in the sequence. +// Start returns the start value. +func (lg Linear) Start() float64 { + return lg.start +} + +// End returns the end value. +func (lg Linear) End() float64 { + return lg.end +} + +// Step returns the step value. +func (lg Linear) Step() float64 { + return lg.step +} + +// Len returns the number of elements in the seq. func (lg Linear) Len() int { if lg.start < lg.end { return int((lg.end-lg.start)/lg.step) + 1 diff --git a/seq/linear_test.go b/seq/linear_test.go new file mode 100644 index 0000000..70c5719 --- /dev/null +++ b/seq/linear_test.go @@ -0,0 +1,48 @@ +package seq + +import ( + "testing" + + assert "github.com/blendlabs/go-assert" +) + +func TestRange(t *testing.T) { + assert := assert.New(t) + + values := Range(1, 100) + assert.Len(values, 100) + assert.Equal(1, values[0]) + assert.Equal(100, values[99]) +} + +func TestRangeWithStep(t *testing.T) { + assert := assert.New(t) + + values := RangeWithStep(0, 100, 5) + assert.Equal(100, values[20]) + assert.Len(values, 21) +} + +func TestRangeReversed(t *testing.T) { + assert := assert.New(t) + + values := Range(10.0, 1.0) + assert.Equal(10, len(values)) + assert.Equal(10.0, values[0]) + assert.Equal(1.0, values[9]) +} + +func TestValuesRegression(t *testing.T) { + assert := assert.New(t) + + // note; this assumes a 1.0 step is implicitly set in the constructor. + linearProvider := NewLinear().WithStart(1.0).WithEnd(100.0) + assert.Equal(1, linearProvider.Start()) + assert.Equal(100, linearProvider.End()) + assert.Equal(100, linearProvider.Len()) + + values := Seq{Provider: linearProvider}.Array() + assert.Len(values, 100) + assert.Equal(1.0, values[0]) + assert.Equal(100, values[99]) +} diff --git a/sequence/random.go b/seq/random.go similarity index 84% rename from sequence/random.go rename to seq/random.go index bbdb2df..72fc8ef 100644 --- a/sequence/random.go +++ b/seq/random.go @@ -1,4 +1,4 @@ -package sequence +package seq import ( "math" @@ -16,14 +16,14 @@ func RandomValuesWithAverage(average float64, count int) []float64 { return Seq{NewRandom().WithAverage(average).WithLen(count)}.Array() } -// NewRandom creates a new random sequence. +// NewRandom creates a new random seq. func NewRandom() *Random { return &Random{ rnd: rand.New(rand.NewSource(time.Now().Unix())), } } -// Random is a random number sequence generator. +// Random is a random number seq generator. type Random struct { rnd *rand.Rand scale *float64 @@ -55,12 +55,22 @@ func (r *Random) WithLen(length int) *Random { return r } +// Scale returns the scale. +func (r Random) Scale() *float64 { + return r.scale +} + // WithScale sets the scale and returns the Random. func (r *Random) WithScale(scale float64) *Random { r.scale = &scale return r } +// Average returns the average. +func (r Random) Average() *float64 { + return r.average +} + // WithAverage sets the average and returns the Random. func (r *Random) WithAverage(average float64) *Random { r.average = &average diff --git a/seq/random_test.go b/seq/random_test.go new file mode 100644 index 0000000..30261c0 --- /dev/null +++ b/seq/random_test.go @@ -0,0 +1,18 @@ +package seq + +import ( + "testing" + + assert "github.com/blendlabs/go-assert" +) + +func TestRandomRegression(t *testing.T) { + assert := assert.New(t) + + randomProvider := NewRandom().WithLen(100).WithAverage(256) + assert.Equal(100, randomProvider.Len()) + assert.Equal(256, *randomProvider.Average()) + + randomValues := New(randomProvider).Array() + assert.Len(randomValues, 100) +} diff --git a/sequence/sequence.go b/seq/sequence.go similarity index 85% rename from sequence/sequence.go rename to seq/sequence.go index fe1663e..dfc369a 100644 --- a/sequence/sequence.go +++ b/seq/sequence.go @@ -1,27 +1,32 @@ -package sequence +package seq import ( "math" "sort" ) -// New returns a new sequence. -func New(values ...float64) Seq { +// New wraps a provider with a seq. +func New(provider Provider) Seq { + return Seq{Provider: provider} +} + +// Values returns a new seq composed of a given set of values. +func Values(values ...float64) Seq { return Seq{Provider: Array(values)} } -// Provider is a provider for values for a sequence. +// Provider is a provider for values for a seq. type Provider interface { Len() int GetValue(int) float64 } -// Seq is a utility wrapper for sequence providers. +// Seq is a utility wrapper for seq providers. type Seq struct { Provider } -// Array enumerates the sequence into a slice. +// Array enumerates the seq into a slice. func (s Seq) Array() (output []float64) { if s.Len() == 0 { return @@ -42,7 +47,7 @@ func (s Seq) Each(mapfn func(int, float64)) { } // Map applies the `mapfn` to all values in the value provider, -// returning a new sequence. +// returning a new seq. func (s Seq) Map(mapfn func(i int, v float64) float64) Seq { output := make([]float64, s.Len()) for i := 0; i < s.Len(); i++ { @@ -51,7 +56,7 @@ func (s Seq) Map(mapfn func(i int, v float64) float64) Seq { return Seq{Array(output)} } -// FoldLeft collapses a sequence from left to right. +// FoldLeft collapses a seq from left to right. func (s Seq) FoldLeft(mapfn func(i int, v0, v float64) float64) (v0 float64) { if s.Len() == 0 { return 0 @@ -68,7 +73,7 @@ func (s Seq) FoldLeft(mapfn func(i int, v0, v float64) float64) (v0 float64) { return } -// FoldRight collapses a sequence from right to left. +// FoldRight collapses a seq from right to left. func (s Seq) FoldRight(mapfn func(i int, v0, v float64) float64) (v0 float64) { if s.Len() == 0 { return 0 @@ -85,7 +90,7 @@ func (s Seq) FoldRight(mapfn func(i int, v0, v float64) float64) (v0 float64) { return } -// Min returns the minimum value in the sequence. +// Min returns the minimum value in the seq. func (s Seq) Min() float64 { if s.Len() == 0 { return 0 @@ -101,7 +106,7 @@ func (s Seq) Min() float64 { return min } -// Max returns the maximum value in the sequence. +// Max returns the maximum value in the seq. func (s Seq) Max() float64 { if s.Len() == 0 { return 0 @@ -137,8 +142,8 @@ func (s Seq) MinMax() (min, max float64) { return } -// Sort returns the sequence sorted in ascending order. -// This fully enumerates the sequence. +// Sort returns the seq sorted in ascending order. +// This fully enumerates the seq. func (s Seq) Sort() Seq { if s.Len() == 0 { return s @@ -148,7 +153,7 @@ func (s Seq) Sort() Seq { return Seq{Provider: Array(values)} } -// Median returns the median or middle value in the sorted sequence. +// Median returns the median or middle value in the sorted seq. func (s Seq) Median() (median float64) { l := s.Len() if l == 0 { diff --git a/sequence/sequence_test.go b/seq/sequence_test.go similarity index 96% rename from sequence/sequence_test.go rename to seq/sequence_test.go index e9927b4..33f8458 100644 --- a/sequence/sequence_test.go +++ b/seq/sequence_test.go @@ -1,4 +1,4 @@ -package sequence +package seq import ( "testing" @@ -85,7 +85,7 @@ func TestSequenceVariance(t *testing.T) { func TestSequenceNormalize(t *testing.T) { assert := assert.New(t) - normalized := New(1, 2, 3, 4, 5).Normalize().Array() + normalized := Values(1, 2, 3, 4, 5).Normalize().Array() assert.NotEmpty(normalized) assert.Len(normalized, 5) diff --git a/sequence/time.go b/seq/time.go similarity index 97% rename from sequence/time.go rename to seq/time.go index 7cf0083..79ef02a 100644 --- a/sequence/time.go +++ b/seq/time.go @@ -1,4 +1,4 @@ -package sequence +package seq import ( "time" @@ -6,12 +6,12 @@ import ( "github.com/wcharczuk/go-chart/util" ) -// Time is a utility singleton with helper functions for time sequence generation. +// Time is a utility singleton with helper functions for time seq generation. var Time timeSequence type timeSequence struct{} -// Days generates a sequence of timestamps by day, from -days to today. +// Days generates a seq of timestamps by day, from -days to today. func (ts timeSequence) Days(days int) []time.Time { var values []time.Time for day := days; day >= 0; day-- { diff --git a/sequence/time_test.go b/seq/time_test.go similarity index 99% rename from sequence/time_test.go rename to seq/time_test.go index a26be04..31da051 100644 --- a/sequence/time_test.go +++ b/seq/time_test.go @@ -1,4 +1,4 @@ -package sequence +package seq import ( "testing" diff --git a/sequence/util.go b/seq/util.go similarity index 96% rename from sequence/util.go rename to seq/util.go index 7d9e57e..685a408 100644 --- a/sequence/util.go +++ b/seq/util.go @@ -1,4 +1,4 @@ -package sequence +package seq import "math" diff --git a/sequence/linear_test.go b/sequence/linear_test.go deleted file mode 100644 index 979b799..0000000 --- a/sequence/linear_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package sequence - -import ( - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestValues(t *testing.T) { - assert := assert.New(t) - - values := Values(1, 100) - assert.Len(values, 100) - assert.Equal(1, values[0]) - assert.Equal(100, values[99]) -} - -func TestValuesWithStep(t *testing.T) { - assert := assert.New(t) - - values := ValuesWithStep(0, 100, 5) - assert.Equal(100, values[20]) - assert.Len(values, 21) -} - -func TestValuesReversed(t *testing.T) { - assert := assert.New(t) - - values := Values(10.0, 1.0) - assert.Equal(10, len(values)) - assert.Equal(10.0, values[0]) - assert.Equal(1.0, values[9]) -} diff --git a/sma_series_test.go b/sma_series_test.go index 6c110f4..fabb06a 100644 --- a/sma_series_test.go +++ b/sma_series_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" "github.com/wcharczuk/go-chart/util" ) @@ -33,8 +33,8 @@ func TestSMASeriesGetValue(t *testing.T) { assert := assert.New(t) mockSeries := mockValuesProvider{ - sequence.Values(1.0, 10.0), - sequence.Values(10, 1.0), + seq.Range(1.0, 10.0), + seq.Range(10, 1.0), } assert.Equal(10, mockSeries.Len()) @@ -64,8 +64,8 @@ func TestSMASeriesGetLastValueWindowOverlap(t *testing.T) { assert := assert.New(t) mockSeries := mockValuesProvider{ - sequence.Values(1.0, 10.0), - sequence.Values(10, 1.0), + seq.Range(1.0, 10.0), + seq.Range(10, 1.0), } assert.Equal(10, mockSeries.Len()) @@ -90,8 +90,8 @@ func TestSMASeriesGetLastValue(t *testing.T) { assert := assert.New(t) mockSeries := mockValuesProvider{ - sequence.Values(1.0, 100.0), - sequence.Values(100, 1.0), + seq.Range(1.0, 100.0), + seq.Range(100, 1.0), } assert.Equal(100, mockSeries.Len()) diff --git a/stacked_bar_chart.go b/stacked_bar_chart.go index 5bd5959..49e4739 100644 --- a/stacked_bar_chart.go +++ b/stacked_bar_chart.go @@ -7,7 +7,7 @@ import ( "math" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/sequence" + "github.com/wcharczuk/go-chart/seq" util "github.com/wcharczuk/go-chart/util" ) @@ -202,7 +202,7 @@ func (sbc StackedBarChart) drawYAxis(r Renderer, canvasBox Box) { r.LineTo(canvasBox.Right+DefaultHorizontalTickWidth, canvasBox.Bottom) r.Stroke() - ticks := sequence.ValuesWithStep(0.0, 1.0, 0.2) + ticks := seq.RangeWithStep(0.0, 1.0, 0.2) for _, t := range ticks { axisStyle.GetStrokeOptions().WriteToRenderer(r) ty := canvasBox.Bottom - int(t*float64(canvasBox.Height()))