From 28b3b9dc247df00e09321fd9d6eaa6d6e407e266 Mon Sep 17 00:00:00 2001 From: Leon Liu Date: Wed, 1 Jan 2025 09:51:34 +0900 Subject: [PATCH] update --- bun.lockb | Bin 165008 -> 168140 bytes index.html | 18 +++++--- package.json | 5 +++ src/App.vue | 62 ++++++++++++++++++++++++--- src/base.css | 3 ++ src/components/FilterDetail.vue | 19 ++++++++ src/components/Info.vue | 10 +++++ src/components/TreeNav.vue | 24 +++++++++++ src/main.ts | 6 +-- src/models/index.ts | 62 +++++++++++++++++++++++++++ src/services/filter.ts | 26 +++++++++++ src/stores/{counter.ts => filter.ts} | 0 src/style.css | 36 ++++++++-------- tailwind.config.js | 12 +++++- 14 files changed, 251 insertions(+), 32 deletions(-) create mode 100644 src/base.css create mode 100644 src/components/FilterDetail.vue create mode 100644 src/components/Info.vue create mode 100644 src/components/TreeNav.vue create mode 100644 src/models/index.ts create mode 100644 src/services/filter.ts rename src/stores/{counter.ts => filter.ts} (100%) diff --git a/bun.lockb b/bun.lockb index 954119ddc99cbdd009e7e2ad8b3694300277c532..660d487c5ffb13c016079515fdc2c39491dab272 100755 GIT binary patch delta 32649 zcmeHwcU)9Q_xHV5R#_DUMFm6wyC^6f1Q)UEVnIdhae-ApniRVN8WfXg)QK5;Nn*oF zY_YdkV~jQSf?X`J_ws(vEkY8_^ZcIA?|nb-AJ2aH?wNDu%*;76XJ+o*z3fb$Q2Nk< z(vv;vy&SuDSGm(e5AGY_w;xfeaE4iCzCi}@Pe5%!Q&luJ%S0k2IW0XpElsFVQV>dmPckJX$HfT3Wt~#+9^_OY3I%LH zSCtZka-efT$uN{nAC_VkGBT)?AXI}M)svDMmuQAJpXn9-a8PT=o2k4PXeL!?rxl1x ziZh`ClyQ$SC&nE@E!05&6!-KrRi2&}Ej&V+8c2X!)Dzv{HW}0wlzN~k-cWZ|9kfRB zk)YJDx0>$?O66kBf(NP+gdWhM0#?YNE-w$OsNr5{fao&t)ZiN?O3s=0pi&du0hKNS ztpWaXQ0m|qP#4gapw6JRRa#1=w=1BJApb?BD^xlev?}CjDvbnn0w1JOXN6{FSs+0J zQV1s;L63qufc^{$53VI+!VVG*H=b#H7NQhtDv4z zZ3=8~1@DCLA$e&~s{bA2G}U@ERQxojMVk^#F`4Et2xw#iK*`YtprrT|1t{=_nGzDv zu8?L<9BfV%gmB0ybb`<@`XFmMXgSdJ4U~>J?4^`*gdWYHcyGmlW1uu3T~s>ChaAC( z#izj*csxO^Xh1@8lqn%ih%rZH41hc_4R3e_qe2=HH&F7ZEGSK#0p_H%VM)1PB6TSrZxy0-VT-2F0Ld z{RlaAVQcW@=@Ibcxi^$uK&?PY?=HHYy8Lz%CBH3(tOEFx2F2iApu{f;Q4CoRo_e@{ zn!DM0XnLwCx2Yl+)s#Kb)y|v{s!ZwR6mt^%5h!xf5(MF^W=cJ-&6Rpaf~Ou%1f>yp z3psVnBhWISGg>He^H6iN3H2;&smP~-l0D;9el#d`P>Lxv&Fr2Sot6p#8Q7q;5*ief z?gP!k;#9>xYJMkBE9kWXEe*P?jnc#Y;|64;n$v_fZIzG;LOvN(2%ZcLX~$lbtd{8l zF|8GsU>n(U0+iI!GNMyWX=cHJo=T0WZ4_iXJ9PQe6LG!W-yOxl)jm zIW@s!2(l=UNdIt0CFHk(Qh%)hg?{FT5KqM7o?=Q%%R>fr1PfOb$AMCXnVl7RXHfFf zt&2jP!BanN22Y{A8k7vV3OUgqx+>)#gHpLa*MrdiYen_DDIxvWimJdPG7O!XoG{od zOo~(@?Q>A7crYkUg;-Ns@({$#{_aY{i^3Gc5_>55*be2nHXU+n3jG`;sOvj|QUk+G zi3!wYBfwL|zP*%+_CiJtTmVn<6zX@p4uH2K9{S{Q6e#I+SIcW5AC+o~#s~_(^-;=K z>?;WUNpS!Y)Nnkm3#dZGx;$)7pDBth)QW>ZNiWfyI>78D2%5YQdNiiX`YDc_RrwMK z__B~sGO^+MYMGv@J<+kr1LI;$srL~W)O=GcJQOOaW>ZW|TxyCbX;`8uJv!EuN-Gbh zHOf)-DXHdkT)3oa{jdpnRQ-_Hxae4<b62)1c#G z(o@YCK`2lKOHqgnFsCKNC8Y~OcD&;EHBf3e!8|w#D#BS+zE7n`L8(7t%;psLxHMrl ztSAS*DdLsn+Vw@1M5+&=mVpA)U?{suZRnMwP&21xq{m@d zH>VBCFsBX^9uHCqn$ys^FrWeyDHM}Z6%S0&$*JUeDagt2X$T+k>~WkDau}q9fynQP zUbBWAvF{Ee2AJaI_Jukb$~I5|G?QX9BQ?%F9+jkIBn^vBjxiUYqVkacs#drPv>N#D zKxx(|4^gO=KUviu2U;5WgF&eWwhUDak56-#rw?LBUP)I&PKMtYCPd1KGng_|aXQv9 zJ*c+P#iJrp>;_7PCXZ0|jV9n7z>mh*l3`j8?Ez1QuZ?B#WvgXs9kdK$sx~S)IUx$` zr&j%g(TaQyI*Xc_i_xG^VW2cZlOZRw&^2<19?DWevPZVE%{2ujGfs_Bt}R_aoxyJh zwWnqDITWbk5C~jAOMp_W*M%GkS@%K7uI-I};)gn&i@ohKL6mc7&oN{2>GU|(46wW)GHtnHCn z)qc4-f9;41wzIdgPS$nnF6w&!!C0}>+XUN7*KhQ@d+Xal&6k?i&+KP$rfzA)fB2FPrb! zMye~aLPvvci6{tR?4DzgPA3UMD>-HSkoq2}HnOaI2|;K~DKU)2IfaOm*iyV7VYi(^ zq^cIot*Sw1wjdSvszKs;wzO)9u9;2{y0aBkgLE^IlB*W)vbbs?qB~oP_aW>y-j}g@ z&LMisQi9MKog=b`PX4-{;9AJdZbPb>oDwXxI$E(fmk|9#@SZ49hUNG5*KY$C3{J;9 z!~MlqY^h6#E(yaK%vQJr>GF_jOeygii*pUpxnO1(SfXo?zAsW#t`zg^;4jTA%?e!& zl2;k#R^1@YDZ}Ec8*Hy&6uqH>uAuP~^lX7+9d_B#QmR#!_5xJb*=vxlYtORNT@AhAI;{Pkae!*vkU^PT*q!`3XX zra`hT#|mp2^ih}w4V1j<{`yJas1ikUe>s*{%b=?PyIQanwSsg5w3M{YhQ-%5NDpmT z9!P;LD+Fm%p1IXANMDy{@pTM3TU@BdvBWw-y5S#ESCJYZ%i3XUFw3b`NSWl64I=(C zIhFh&b@)Td9rLJ|SbE{R?a^sOw3|NhnqW1zR zrM}=An(T9=6bp_ZrIe_IyJN+Ien=^0mmsC+J^3IDuBFwNg;YznqIQt(Hd01P>3wPo zLL((qYWPbrwOOIJLB9;bW)PNO4Zx(In{OPXDmx%n9+yLv1hq)R=P2Qt1MD+F2Z#@zf3`ulEz z&|a=K-^E}50L$Tk4_qVy{4K-8au)-z=T?Jo3Xeu|;#h1k! z4APgrEYD!jZ-ty@Kh_Bsf8A|xSV&!ibPZv77<2Csq#J>hflQS)`mw?ggCzJfx26W2 zm%ku%qZ;+ONKwy-WU77#IO+sM033Y!{t;% z%(^7z-aJH9hU7JPxr1~OSV{Ylj832cr9t1KsUW}-to5F$0hVC!r>vaPiKfi0l|f%2RB;ib z*Ti3M1gFF-In2~NIf8Y+fb*e_lir82_|^t}Fs1{>IIA?v9}-{*hN1wvSj53}0HgGq zTXU`7sL~j4G)YRxeYzYRji`1U2xPfC1sNWTPqVCA?NC^9|5jN za}7A9lWFt02ad`q2D-y5_?=}b*OCm5_D4PQ^bN28(~+&H5u`8QR+&0VclQR@2};=c z;Nfy`WN;~YVSd?`xpgq;!w~&ctI}PQz>zg2$Y0%Ma9(VMQ;@E_ky02NeG8XppWLSs}=^Fy_|DAhm7J;yW4iGqI-7EQa;i2adF7g~)U6z}&(O`Z#o>GQ$z- z`g!2UFzguUkqh9+A_N+yq;p4Qf?}xs{H0+XS$t=M?iz$$St9%mfGx^sqo|bCiMe$# zNM|~+_$~&$UAW>*DMm9r3>^nEyU>uS(nSA~`o)cU2k&>SZGge?x3f2UxRDR5^)810I5doUZ)`aOQgtU z3%Q4z^(x*|pM%5X%PPknW(Qb;QMwJ?t*g;nt^k*eU64{jlX~KNaMTluF$LhrP=%}2 z=R;Gq{q-hrjgg00f)Jb4hvoG(=+CGsrQ|5A(N`(1jy^alpez;Z`m(&w4Eh@o`ay`W z?dz|vjZHIHu9Jc|3LM#juE03V2S>#bi3o{T;HcBkg$OKw?RnW zV-;$FMa-mJ6Tn;)=m3s_0mb3;9B^1{Xf&JpOIJ-SFUlZQieiOPnCVdheJOxEY*_l? z;K)G49s*@OIAz}BDqa5u9CenwZ0N$H>6!;yn|>BjAGCDGiK8*pmx)no#_kRG0>NP^ zr@b88{TDGT-fYnCf{k08Suq-&ivs(=Vb4YZnm#X8PF{kf`u$m6f2QA`$e zE~z{QhhR~;_5%a~2CLjwa5M}8-EZh0gQMQTT8p9ej%9AK2FWsx#e;kq&+=jo`X}+q z3Ib;l3&8`G4GP7F1z3WiKEl*8`0JJs#}b`_^w*H00YsmpC#xlBEk4BPbOoo30LtiR zf>VbY?Vm_sh4BV`twgO_EG3dDk;M-*=oUbjDlcgjl9UjD&8RON9EAr00>P34j=WR4 z>Zq!z^h&v8Ey$>k+JmF9k~MWX;QZLVCPDhWsupU;!eWu4IIpZ#-N2E*$_$(ej@pvL zRN9}y@{$bt5`&aRAgtl93kBCo4uSDVkupNGufJ|9am+nDNdFcos!}H}e}Soj;0vy_ z%nbq80UXR96<`U5dP??Fs-DIQQw;iuG-dd(JR`X0f+H1WDLoBNneF6m-E<{}U^06*lr8I8I?GEn=tDCEp*Ms|jL!krN!~#3Aw~U-X^h$BI#?+REsS4} z!K^UNpqmF_C@JeMBZb?a8bOlp5SEv2kVXz+h3N+U`XR~`ki$;*99#?L?iVBl4W-D_ zrwmoxLWsk>-@s8f$N{gfKTPRJWzRQ(Bh!`rVg@*hW?Ud579Odb?3T`JxV%Ecs8LAa z0|AWn2BdHmiMt1Mk#v7Ja~o>V)gB=TZP~r_ApPe^VTY$NYk_;)5v*{iL0@^Ka=)+m z|2a6tHf);uW8moWNr|^=qm<%$+EDee;HclQVPV$K9>wB^8>C~SSl)1hzT{}dZscLD zX$6jkQMsnd0!JPy`_E6KS>6bP^l~&S1Zk1U+(u%H%2cM5Kw~RC&SZHIdS(ei6O=<2 zckxq(xY)q?L;JSiCFym8$e&bkP zmO+|7jumDZ^vA|21B^ulJA>tTWjmGK*ADbBP-mB17C#2J zPq{2_3^uD=WlN|;18r+RK^YhUFC9=$`&`6!1#+<8XO*NZyh>|1dW$c#*@RV4*A*OY zZVldSwWCF56=)Kulq*mIs0m0wZI#vqrMBDwdi@g>k?#Re`9=V}ic>xKK!Dl_#wUaz za^eG}3NZHai>L(<3Xr@RKoz5_EohN*24sl8)`3W%QwPuJ&1bw)q&cl0-XV> z7$YLTic_)_{VKnRk_Y`{?$4AAGyz1T)coR<>W@+7A1L`x1og6(Pr#c65C4ybaXWq=bZPn4$dS%6~YHbB$%K0vSHl!E>d zkV(Pz6rk5XQS$7Wto3I~6};*~{ z_^8xRr2%Swu*w@iX~^1u(u*jS4^#Ot3res#xz3qXT{t-MyQ`Z0F-pa|BcD`ysI;f5 zUz}2Xy;V6;O7>BCqGiFysXQpuS>gm|Pb!w6ivJxdu{jf*+mg}rpcfTPQ%e`8BuZE1 z#VLt0@Ky=*OVCp6?S#s5Oilwwx!Q?Fi)imRC#eq`QNK@qEvn< zD0#756xggU9B5t&t5qGMl+0J@kE)y~m073C*Q;`(B;Tm=|3pb|i>g|>RZf(WC-6qo{){RoO3AZ$qjt{I^ryr{Re>laFR46HN?um^k5QVfw^Y5`svc2F z7UGTSzpKjsPT@cG*8?a}MK3@}_oZ5(IHihStMY%Mba`L_Z|G#rRx2NvaJ&<>xl~lC$WP>y(Fc5Bou|-szPx}1^YlwJ<(6iFHT7mrOJy_3Zi&bUYt@r ziI7uPGA;GgK#HnJl=wj^Pn5RNp(^ARlWt3vbNFNUno_$U6m6heg`OtcB%YsV(?OF zrko(l_p6ErRRxWb^8dXX6O4cHI}&P)cZ@450bH7NDW~)Qw4I@f!~4{pkkeQ#@7tzjR}g`ET8s zP_X^e4G9@a`Q+*U?8XHB|8Lxx$kA>?wc}Nsl3^88IZ;a5sXS4dO_fxhDDi)~A))dA zli)8r6>vmBTAE$d3jQ~5OzKes22}iycP7aH?~TcSZ%hycf4V{W?~Mui5&{P)HLoj^Av^dd@&>wj-d{(rkMas2d+$(q19y)83`ggrmidRNbPed_2>o&5UH zoE=S2hBT?NY>2Jmh_-0Qz~ zC5BxT-j#a?N>`rR%c9M8k2@`2zSv~(%enqdGsdJp_ZwH~*$>|}uFGW3 zC{|@t7Dck@i>=txMaK5dT6>@tU#<9g!%6SmK6i&KOXD&9cdhIGc6w=2ZVNB=r-fGx9y%@sCDw)G}GlRXUnlBOYB+u#YWMU%~%}C zUM#UlfcuV$eqmaXqoua0BMh?nQBeP`LZ|1jPu|IMlg zZ!R2qcj@q)tmt2#bsV>({z8ZAF_CX?>>cvUjE!v0QhOG$#3(jADJ34=#4O6|1<+h$o&+%OaWm3M;k;TtjBNJd*7P zm$BR^da|9%BSkOfup(0QW`pqV!w%rxm$|Nt6#dvRy!*4Gcn@IpRz-?|EF15Q*%`bC zG0)YJVlbP4_a>}hHTw8R^mx8e3}I99BgLldHr_*7=#Pot?k=bsD6g#mv zyoa-$c<;;{eu@;kut9k5$`0T?g1K&t6uYruc#mX9@!p-)+Y~AGVA*)@$T1b?8In*i(}#rj0QOK4x>1b<%5geh0)k)6cd?gCq`p8Mgv?jv)zT!0GF}L zC=Oyf!43V{iq+a}6w}zC-I1*B9xHYdTn2OfIg*_Qm-Dj`&#xZ^m%G=B`R*}_!&vs7 zNEWcqid_dcf_d&m^n;tW*C>u+1>mOd$H?q6ikWQ6zDU;Q0OkU?Y!+ zJp{MppcRWaU=(xMf&=jH7x;J3D2`|02jSl#_y=wR6Mun!;LN`m#V=VtxY%Fe-yx$o zk(my`zr*kk+}F(ZSNI1m<5#0Nh3y14^f&l-*eEhK=rH^{0{_5GW3Io!KX5s}8AZ;H zg3CP$|Be{N87%t<{5uB!z|CTwN8um1X-AFX9995s`f>Po%qY%dQ;xyE6Yvk*0v384 z{()O~+$es}9)eqP68@bqiVN9-6Y%eM_;=DME@t5;;om9v2W}}7e}{kI%)cA)Ujq5y zVo$@rQ$}$GGo6BeXW$>WRm}D@`~#P9+9>9;o#2L^g@0#^;u<#S4E#F>|G=$du4myN zxSX>_aRWOFF84hAJ7*L(vg~v4?*jY-x0!jKhkxLvoi~bGSpm4|7vbLpqqv<-xd8tz z!9Q?2S?ERh2X5g-qqv(r1h?ce{JUfn_pk+*;9mj!yKEHqvGB|A?+W|_cYuin@DH51 zz$pI0^1;Pkg@0F!;;+nf1^!)wf8c&&wpZaFxQwet@hIB~Zs>LRcg-jsXM?W6zZ>um z+)3to9sYsKxo#9sv7_K}Z^FMDM)3^Gz5)Mk!9Q^4nCDIS2X5L;qj-T8fSZ0B{@pT) zm)MkB@UIa5fh%C4x8WbSg}063RrV0vk~{FP&?sJK3ku=iUHEs$DBfh@ci`VW_y_Jb z6Ys)5aOS&4@ea!e7keN6-7|{!nCTw;`vd-g`-9ouhkxKQ?i-x6Wv&n4AGn+cM)5g23NH5%{Cj8=U$X3n@b5AF1NWMFK7xPXradx>Z&?Aj z=}+L_W25+b9e~O{M;y(Vfo-8sJvfseNckmEg73TRC z9)g?pmiE^IaMRzz!*@o}nN4{YIjs$>cnZ#yg}#rR_5$3(_eQY>d-y(*FA+tnX%Qke zv}p^(NZwr%t+-AEUx$Z_5LlLgU>ynSaZ!TcClZ(?2BEDb?({*VMq%0duP27;D+K^X|TTS1^J3qflhUKRpNYY5hnpe+}zAoz&{W-ADc zJf8%yfg%8WG&p7J}0x$gzbWk{=~OZUqQ@%R|tEXP1W{zz%}zBynKxM&Z-Pb4tgLokr%lOWa+f{G3hByy7j1ol-R*h7M3ZtDoaeiCFj zLNJK$B*9Q82x?VY1JSY#S2I<-35Y{&JbksDb5hIafRS139@;p3j{Anu+Rm9vHT$k zmQ;rz!WDuXzQ7fN?lmCLRfk|a53de^WladykzfKBYe4W53CuMh_>$+7Ahs3+6>CB; zk(+8lU|$=8JtX*=+tz|$KM68wK`@2yB*D-+5Y(y-0po*eLr}La1Sd%_jl0%?;4}$x z>OjExQ4-|VgTS{g1T%PcT?hi)Ah=F~S=_T81h+^qtsVq(cmWBf*N32`8wB(C6gLRk zG=ShK2^R3s`eLN`9iKtud;XBf54>#ykcE6f1F>VKb{DaTZY0&0g|x)1A2#|?=@Y;G zl2@V1%fO(1i-M-r5WBQZzcc>O)_1cTFB|Z~y+@;?_qK?%{<&1YU8$ERt!;DZxz)Qm z!ym8z)%T}jcPERB*XwG1+DqS<+&Yi5ZaislMCP{@$DXtPE;P%@G-RJxX~bu} zGCReZ23;$$X4;dK_%F6jXzg=n)!iHG_V$0WpiGwXX^C>%v!r;%3u--%OIT{T^IEX` zuUl*#gNHnE+YvbP@tuGdHr<1&j6LxByY+*gH}@&oZ~G*R9#@|0Z~5#P*Z6MR+^YTZ zllQ#X*?}IO(0YQtzt>(CalJ<#KK{oaZ@+P0UEhAr^sD{%{%*3lVfudIxjPA5U$Oo1 z#II(JxK_*Equ!5~(jw>lILrOJd7YQqy_hk(L{>+e7cWJ=GeA5je@JX;!MC}KQ!(Mf zJ#YD2Zny{rDE9)qZ^8yMcwbVc=mm^nzA+@T>zJJ1l&HoOJ}$hP(^m-!u_V=;Atpr%InIo@qZ!;2p`~ z*;Lsm?Z*bT_dp$TSrTvP9xD2XQeNK;lbVSKMcr_G870?TnWwi9?LV}*8DB<~rBVZ^ zRB7%1=2s2i)-A=xy4Uz_%8Cr&vR78xe~UYy_w*!REE~q>w?!9J9fp4qCt(#u_~$PC zTDEo$x*T7yX8GWgdz%eYnu*&*EA1bT7mOzlQ2zLa{q4nL9XA{a5Oc-S`_Co4)^t~^=rmJ<)H>e|3*$l|2 z9DQd%Pan{0wyKA(ZZZW+RY=dr;7|VUu8b<1tIFsbP+L_tPnD5zH!)i@|t>vhJw7M?*AFq z?*ZsL|GfY`3qa2mtN|#HM*tMO^sqxJkOrg!84~;+%hh(~fuL0BqY5{LxFMW1K zJtG11*v=#13Gftn20RBkKn07C{B3>^=sn2p11*ql3A6%Q0~wGF1}JWa0>gk&z-Rzl zEPfdSiEJPT7za==e*w^!-dIe8RDfbR2}lI6@Cb20Jb-^Akw=d@nns02h(^6DK(S8G zJ{$n(A&U*b3DkQMI0cLWpH0uHWFavC_yYwV01p9rE~P6F0Yn1yKumj}9YBu_(Gxc< zffQ6U2%zsM>8YJ&06pDb{2KEBeufWGS92y6mY04ssjKtAvz zt&3}s=mUd31Ns3bAPR^EXjw4>{eb~MED#QK2D$*v0a|8S0il2apcQ5ZuoKt?>;`@Y z_5%BWIzS@;{}zG&f5i|tMIr>CM@z7;(f{kwzi10RfL=f!fF8V|hj6w6=g`PmU?S3A z0$%~+fbqaofR?UDR35Y^Kwme|!&kH%wE|5AZ44R+_|l_Do`4rXPao1Ff42ZDz#1qA z%mQf3;Q(zZGl8i9185sthsKgX6M%t09MB#J13Ca*fe4@*5DDCX{x#q#kVy;ZP2e(6 z09*ks0@r~Hz&W5X3IzaxKoy`G-~=2%-Y>v0;3)7La0I9a!~ju1G;kiebPY-me9`(F z1WJ#_;pxgu`QgSg5Yj$I`__D58n7M(dxG`?dH_101W*#Vi@bY)2T%umZJ;J_5%5RF zM?t>_Xfa<1ECLn-w9NJfo}%1Opc`mkT7|?q;63md_#DUueg~paSqxwX`T?B*dQPqd zkc|9(sOTE#4&W!GX)8-ZdIk^=v;)pV)(@cFhG-#h8+Z#;_k}_~Bvyj10G0!^VbZoi zy9Du+M|1~Sir1}8v`f@Bkyqp$c}hJ;aWM&?sZNVz5I{rc36w**MxYIWGf1BXY5~50 z4^R`R0k{Cp0PP|U{N!SBl{>AURRLNuzH_M~p05HZrd9yU0UCcJURkqMcW<8%Yj+}=!HyKU=79&r~p(1Dgl)NM}WH56>tV<1Fi~CH^+UQZ z&5tK;=k>dNxSqb5#CwQ0lp{01Z(P zjlX6!70@gmkMsn9*8j1k1^WLQIB9xxjqZ|SAU=R!6Im=BPQ)_V~7a+CsbDX;`s4A82o z6Vag-VC*;J4X@cHB>v@(V!g_hF?F<`wX+oaHuCWG@bne%Rn(871HK9R1*A$V6eth9 zQx*2s>G12;dC>Fq@bd7)5cBs?@J)k4RVXxT_v}r%8h>1cf~Sv%r-!$^<60r-SHtn0 zeS7RUB{$*k(Fo@A_G?6MaVgJUgO)b&S;Xz-zkyUaf%?jzRJ#`k5_Erj-xa02Jy4;) zaEVu43-w3be=XGC@PQx>+OKeHKh`ISePNxSM4lb8QZQ5`BAsZHu4chO3 zZ%vD+Sx5KoDRO+^7<#jsT1NY^K;-y(_)!_{qhamm1d-$EiR!%hQ8b26`R~ENDl`ER z!daFp8|)^py9t2W_BE=4RGaf`lta^BDQIXywo=kd5ec}^- zX@ls%x2zNC`y6UQR4Y=sDSQeP#5+7>z3A=qLXtnu$=a3Kp&*X(&w4=dfZOjuDxsoZm~Xcy#5Wwl?Pubox< zwj>;QCr6AwW|6%4k*V*V?g(_QUuiFLD3(#i+lnV`7VZ6-VuoV?vYe$WeZ%kHPk}}t z%?NCe$f4;U-);2|S8c|=l*a{5U{|u@TTm9=MPV-0vE~oJI%z+M9~pk4eV<1M3Q&M1 z7aHqPj@R5GdiiO;fNvOmt!KuSb?wM|xm$$4JF4ZVjY-RF_@XUhn3MJs-OrYnn6_%v z`%&nUMjinkf!I`Sx%F1qq5UrV)LjE2_%f@Bu)`noKLB?(w!H7p2&h@My!TeoOZU0Tdrqvqu1TPsXj`6_-X=Dd8kXm+wuxR+PbVYxje759iC`E zjvrDgynkx$ffx%4#X#yD?dS8y80QVVv$Qn+g;>k6sK7^WN0+O=xSzG|{oO~U9S_zj z($IdB|97v=?!kgPe{SlmIu~-=S`}$buJG*+RIdH(f64S?F$sqs zOGOIW!2n$^ZeK9|Nw#BA&g}}k1C`Z|5(s!OqNBCV_@hM{wJ`&n(Lrl!S@daiE2lzH zPD?vJ8)cnhpy2`y|2iuIyj~w^RiyE`9X~>~FM>u5XuRk$sYoLXQ1rhyjio}CZ+nTs@zI`R2byLNCuqh>Qd+fcF``b?``J6gc1a*Nw@R}S7+lvA!M zzfWbg!wBLw1~2g`nRuf}Lp!eE+}QrDJik4Qhds1f+g9blyI`4iz`?RsaeY!l>dY?E zNUh3Kpy8(-iQrbguDAH*)dfWw%BczXmFa%pz5jj6#?YdiHC6dGD!UK6IxR*wzfFI% zAmrKRA`R^%h6V#GmwLQA9%H3hcE2hwyBn5?)#R@evb=0Zbt~A^IjTsbay8x*8h+Yo z4?C|*qxp+IbNBpJh3Z{2_uB<%Cz`lTcQQsm7P=7W+$kYH=G(M?dXcg)hQv zS`V#$iFQ0(f;7Txx{NC_TAg}t{3`9ZeW~)uq4g5eOqt4F(%jm7>d#`9lXeKhqP(wH zube&|DX^&XH=9Rk2Zx$8ca*$^J+LzVNPR^S9le|`Vd1KMKTaT~a z1LL%#0^%*3#C>0=i&r%0LPI-D;C`pbNw;hhy2v@6jnHNnH~tP~t7s=aT_EZp{411o(vHCBG5m+EPb*$rsklUCQ{4HE1EQCc zc6i2vpGT$4K6U6gG;r}pA@|OmTOSndNK`6;t(gMGK`j}E z2dLz0N_i|C)CkjhzEU-B;o~9Uhn4uS7ax5HG5^tvMtKb6w!Qz{gkKk2Y0!Pltcn{7 z9dot}g!^>$hbf|+J~Hg#y3^-Ewv1MDynKaY-n_%FqP?$ngwRV{^T2mLzs``m4%ZVt zf^tHMkX7*R*OhgBtftF3^15-4&-xYD?w_jMN9_n*rzpoEkT*So zFi~e0^>5LL+Vj%~aG|SCAt&uTls5X+_p)~^tXWixYJn8pn3tv6CN$5GGDqB)OyMy<=W;qT; z-E^CSMJ%@|cRB$pG&-s&?*!g%La1_+JaWp;o~3rU%#p+qp?u^Cv9VubGx<}PtgkJr z-CB^g@RV$)JP$@9#|HKd-)?u=&bA_5-DB6IR=#S+T~1<^wm6BvQ5iq&F{7ckzW>Jg z-DB?}b?wNSMw7b@I({=HOEwqR{rKRrIZr}Ge%fI+Z8rJ#vir)T1~k-rc$b#)mquBG zU4I?*)ph54a#`7kpq6~gNvwITTJi@}hjw1g!f)r^)w%Qwg=T!cmH zlM?Y;_nVQanR4y2#=@3-$M0g8)SxxDJ_Swf1RXKYv^(x=-!;(0r2y?4svT0Bw!HT# z+`(vP=`^i)X?o-Bme>olT`Hs<|M?X5pcCr-i1rzZjc91%jreMWQ%!jJ(`eN*jQ2ZD z_a$Nc{!@fRi!i>DEKo73RChjEuHVnrQpdZNO3qcbp2JLu($)cCD^+TB*}1!Y&T zvBaFgwE}(MZ;hB}l>FO_DV0b0!Z1$?>qZ|Am8r5c^U}(j>+m@?Vv;V3;4_d!BF(B}#SR)ri`4-~s0_wfc0Bzb?vB^1YOKjZ5{c2Dytndlvnomcki2@^pQ2>&e2Xl>NGlG%lZ5@%aNl-FJdJ4 zJnY%tN&ZF@XA<$0^QcQZduVRn)H{_b9;2wDSf!hlaAndh8TKyOdwvyMv?E676DYyC zGv9`?PR%+i8ZTarh~3rwn}w2C9}?OiJ9p;GFN*e=gTT`u#q`*{Yi_yuI!WveNkvGs zGm0XP->o@3*`|lwt~?WGLxXPRJxf2lk4pGTh^;Ijpa3hlV1s?`f>?9f-= zh#Z=7$XVTmpGR3I?ck;5$)0Ny?nlpshPwXz(3RW3Q9teIrK8>RjcVu>Eao~ z`4OZ2`l=H?`syuVJLMV#Tt<_)fk zVSd_qQbAvQcizkO<<24v^~kBL_VvA{K68DHX{wbS9m`iWhUhyaSchj&N%1Y3%BleTkM? znoH#7bzsdyz|XU(X&tvy@(1UUi9MpYr6C)~ov61C%b);;WCo`gP8S=x@u|PAaoc6kplO9J*ayex1LQRa zGN(2hu)LO97Cnfv=L<1_pVq)fxHfk%3ZMQ6S2>LgCqPXcXVtr}cD)r>G8*P1T|JJGC03P9ND85GJJAGo5?gL&M6* z+B?y~Vzm36$*uj)&?}ejxz%g6IvITJJq*N0gHCQWc?g&8i)*FTL-|klVZ1h?TZZzI ze_(*Lqr#TCcK_~G&U?Bwpg@KdI8BTmbIH2* z^)EY;r$59M|AWzdG6uu%ub(o=*5Z>fZ{hEsWsJiY#B_bZGWkU+tDRFe%FDxfSA`Pz zXh{wM#Q!Hg9e{b*@ESalzk~Vg5x$?&E^H5F@s*G8vBIa9IQdH(2Yea%n#$G9=8Ybs zE1PEHD_@w@|4hh_5$*xFdI<3FlozWW**xa4=;kyG8n)1QgczoIqki!cWg~u(&GR0k zQ}1WX489QN&JV<@()KYt_}SmMH_Ot`>B(b`DZHz)E zFeT_y@uK_Baj2#aBz*WK(XrO2FK2I+kWd!Ss^}zM>XjJkbstlU=FW(xE$m$jH{`tn zUjcmhG@f*%YA=5)w1ekFvaZ~Jx!G;)qrpyP`0!VvK^k3_Z+azGt1kZ!6gB+LyII0& zWBI?D_RNpJBE79)ipl39M*I-D%*A0pcxpGha)kAJJD-au!g%A?Vl}ChnfC45KU z%Oih(-h%*c5qaN6E$WV|BuwkBQx>Nlu(I^GD=Y@DpE>Ra=%qVir;gc3z9yc&+qs9em{SG-j8{mwb$BfU)I`d?|shu zede4k3oFdNx5Dh$=Dpr+cCbg!qP%jU+Y0v7e{OKZmje%P>itrqV+|)P|LxAFp77jl zdgSxWoQwv=k3VTxjD4u#@sx}omt!%xWC*_*8UpR&&|#FW2Hz6CBJ?ZxVCY8<%^5W| zcWiD>(RzoEE$i`AB7YXN5p*mx6goiaD<&~!bkW$Xq9V^3ug6mXepKeD(Ye_k&nkE+ zxS^a~Ac+E1;qNZ*@l=5pL8W7q9XoMMj%Q3^?#LW^|5}ipzXV#D{Kp*rUZ|8GlRGLm z6BAL5DbCIrnY-U-S0sY5MOmI*WJ*W+VxCy)rx(&-98@fgf>NZU3XI6Jq0&&OlkbB{ zxe>M_J!xc${weAckNyTP9lx$3#U!DqMH<|vBFqNG+pBv#P2g5K^dV?t_B>W=&ZwF`d`S_`@ZDte{Rn$YD?DL)@7defn` zJjI@p0!J_qTAPecRt5tAl?uY0{EASi;55CJ3id*!p^u@W_c~M>TI}S{a`GoTd@fYV z-$htpTghl>jTjPz!?Lqv5^Q1|WaRFNv@Opqin)D6=2*`<K6~9oYXU} znH>;gGRInD??!Sb^2LF-jm{rkm|HYSlfq@bB48 z;KlM#Drg8jh08_nbEvp{TRS^H4zneM*0r}gyc8<@Y`@)+1@M*NhZV)-RGu)lFmp_* zEyzh#)yg$3F6dxS>Ct0yMq!UfBBvGG*OLt|9_|N~5!i=Z9P<@aB5c}q zwmfG-PF5!MJlM&WPl8H+Mmzj4s5od$W?@lI%*d>wfe567HLkZqLt--Kww#ISj$&sg zKN%{a6AP^XRb6Zk56c}st}v&_)2gc-QjN)%4t)wQ9c|W4)hl1WI0!MbsALm;v-|}W zwW4uZg_%V;p70)a@iDoDnPaJLRkKT~I0a=XwbJD=Vtr&kpG;D=LFU(lMMmI)8kQXMBG<((<8F@nC3W z=!nds(YKHCcvfWC4L=mHJJxT2ozHe>&9xHbl_m5?k`UJ?L8XC-nIrSXWm)i2ari*H zqUFe>fsODYA0vL}vl3nwjRELagm#CDUI(YV8}dU7GqV^$&+1$3@_#^wiDIuocEfq> z`%)pXZVg-6!M0*cr{cy?>EOtm!r?jb%u`4HDS9%d>Q>v34Gw=8UWR7;5cRmPesNu= zKUpJ2-D(eF8FXH@?T0&|vYTu`SXV-AF^O=gC^vg-VGbjRf>iJ@g`@*H zMftg-#!?Yp5C?C8O2hd%<42+5+2F{RJM?v^kNoVMoG~%EMV`CquS~5g&o9a_oE2o1 z9Yg_XFd52@R1yQN2+bWnYIGr;86%j$ArErO=k|f|rnEkn(RMzawEKLrLt%(23!hc~<+L zDtNOV@^j=DOM!8PxiNV#W5$h|m^C^(XEPO5L%zzXP($m(-v^ahpFurB-TVoT{wSz5 z>7e3)f81_&Jg+Fmnm)viwUW+5E*<}Pf+xdDluocKyoIUbBg5V3`cRQ5`k~U%j7j#s z5eZN5lni5RrDLv#mcdKMpBS$0t5m<(b&x_V)eap!I)5nZr(6BbDYpC`oF&cNGt~~2 z$xs;~naE-%Q_>32R~an{$+QxCn~Q=s6sBl^e(w~+o4u+)~S*m$>s{oZTKipsL^6l0}oUO&}a z+w1WRP%-sWyrW53RU4)1VEt6XRLvWt8a-4l#}f5?gH+!)*Wf3V}18>lJM2eB3avP<3Z-@7*k&RN! zRX!En*l*rYLFGZ#R8UJH!4*|>6TewlQROx9dtbt3T~thy6!V5k>JV~ONkvEc&Fz&` zUZmewpAcZXFEQ20CP}_RxK37IQ*b2!E$S-Ub~p8NfZsTatkk}KDn4`No?M1 z<<7X6`i|61mMn#kw^NT?OdTbap_a91SC)mPpQZK~sT(EbJ3=bOazsH?k{KVWqGSEu z!OR035u4(DhSc>|>Hw*(R;m@V+RhzI%9gDq)x*jSVv^Yx!=OMFerF43f+ zTVf0;TegN&Ppd?^2sgJ6DZ9RTq-?!Cr0n{dG;(G6r0gE7A!V01PpZ2*8r!aHV^?i9 zDO>I9i?Sw6O}n}gq&lk@hH@LJfTVn3ksePgJ5(Z*%pQ>{FTw9q2sc zR%*&=Ji^LWFb3ed+U2??2f;`s==V%EnyN#Ie)C*Y6`kbw#x}DeJSxS!yO~;=WyMNp21eCgw*x29GLILsHNBXy&16{PhS<&AjS78sbs64aZQrUBe5zk#cy77 zjamvRxkepI@%!FqL6fQDRdEfHdVu3K}GN zC&68>j)tX}n_H{ARKNEef(}+2DQ(oDRKHo&Mn!k<`xet7nfNRb4U@dv;0TV!DQ4{i zb*O{io0TA|5uG#_CaAnLzj+`*Elu-#>tR)Ysm?csl=#GuPWqO>iTR8qCVmIk$8u_$ zB+f>p^WN4d-($&MCpBIjy{=u^wjR$UOH`Y(qpZ|)QucU!Ps;L+w>?vF2nABrkxuQr z7vM%&{u{|PnmvjqNDYzlX7BduP-nk+roD>3-fwpItGw&|zBPW=p|S%0tOqXAzquRmUi*`&LI>V8MxFWUu*IiF>E~9Avp*}vS6Add0&BRqmFh+ zG52>+hr0TGP0~Cb#;v4+l=RMkYokV{rug0@)f2hxwQ5Wj+iNR(B?rOC%#iAne2>7% z67E$e!;*Zb;d}obXU>oe)EIwDi5+Hpq4`7dZ~f~t4unas8|v2n{hEue6tZwJXO~6etBFk^VLu* zlakELp6bwze(x59ebvz>DZYli+;OLd1$(GJI4>XsY? zBaPD)?272eP6OvrE1M(-!HAcAsvsfBx5(kjskl@t%MLO|*lgNg32cU&;*|&64cQAxcR1-1E+N=v!bx$aK%*qz zcW}}yu8d6b)nd;TO>2bBzPGAFL;b#I5sDY6jA%Ix#{w(8j!X_3Vn+m}F?~85Yluvl zv?TMxAu2lCZ=N5b^0NKDHklqztd+;kt#M4uwmXe)DX<)l ztyxTFIoj)RWyJ4h^&AyF!tYDZVb-H!FR#1chy;gAAd2aL!!3rBQD9rgl3j2zU*M9H z%+TR#X|CTqFVuJiqVjTzeV8SQg19c~(rZu=XV-4r0|N)@BPQ=Lfzmq-5}L zF%6Wv?P7C`OglK+{gmGX2aU8N!)wLKNI0>~cGK%{qG)^Mw8PmOPQoaAoGeZ6NVr666Mc!4UAZhQN8n`N zv==M?XuDtbB%A~%ZCMd&t{APN$M}7R5lV4p5?gokG1hj%@Q)@X%0wp~S?qB3YQGOo zyhv!U21XQkJe(l0y9;+KTu(SA457OWPP}CqYgQ;!d4+yo`$BvCSfo+82ToM%1$8}K zZ;O+#saj+Q5&dU*>J8V4JOZpsauAG!t>r3nOOc8m>-RMu>+vwdofw}E*W21px07mP zDa&m1jkAkd3xt_APUVgBduJd_6J_rvQd|OYIT=1)MUVHJ+2d8-c)xGKczX(1Vdwo8 zu9I4plwvl%T_Vpn;C9<8LL94B!-*TLfcI6OU^~-31?UDRUAH%lX>bzFXyU%F9L_S! zTW_MZP_r-Qkg~%rjtv7Qi6UG?$VtvbwREE2TX~Yl(@l*WpW@3W)!nL}g~fbrlFFOp z_gz5P2Vq&YGA}u3vfDfMPTw1FZ1J`$edX@3OLIy>UT-+@9NQL=efJ&e&}6^)#vLm9 z4!`dhdD3(8SZ!jb*gdq@#u0F0qrDM5Jw-)N@tb?6s60r^scPvI_NuA&yz_t6pCn&@xWRB3T99lMt3y-$-jWhI={`C&#e3^CV%>C90b$p zVwEW~)Sky116d`fABj4jKl^fCj(>5e{t(^@1oMpMORT z@|y!G-vY?za_WO;;H`FuH3otY3F{+NDqw`IkI=H99S}JqXjPmFm5)%#zYa))oq-s@ zN@ab7N;ytWExj9{qQ?oJ_30(;O93L-`UsUCavETLE~iq_EkNiXEBDV-D!$c`Urt4T zh$9y&?PWQ97VUe20IR=z8|`5>Ss$S_!7Q8oU!%qU6Ajd*lS`bA{$JAK|JQ>5L*?-Q z)p}eWYnB5UyA_UQLWN)H(3c(g{|%LTUw6vCA?0QKt%O4>K;H%O5n2&^A`Bm)GEKLG zD&Pko)AAsY&*fBR#Ze%^b^^%fYE;^{GQ_fz!tlAAN=2uDME7YR7MurCu_1*VDjg{Y zFM2_aT&U<(bok4u$SWJp{3l_#wu+-DR4NK_c%i~qcldvYihfP>#bcpP`EaPrwn&F> zW?(;QPZS5C%{hq0F;J=C8i&R?w6&8jcgIM6Tc`}#bx`>TmGW}?j(jesVsUpzevy_% zV5;!@8(0I;%PD>%R5bfKw4X41E~nCbh9eg$Nx92MK0+%&vmO3wRI+lMd}zF7&u~ZZ z?@&{%yT3t*ST&MTQgDE zPQFla#^Vls!jQd{4~dIZ6c#wVP^sV_P-*x%sAMgXgF{9Bg2P`<4ds2XL9t}4baI7? z_Nxy6$FcJwZ%B3i>i=<80tQ0euX4u2Ufwlda{A+c8KC|pjZ;5&|7sOY^9711U~ z{?DkC|G?1`D#;HWy2Vfx9;#>g;A2Ncs3bq(APd3gj$EiDw{wsxzi{Z6BIF}flJYB) ze1uAJm&0F;%KZIa77o$*!BG?{$$cE8q5Y2hYE*o2n0%?|XQ-(D;^<#arJi3M`Cq9u zUu^|BVYq-|V`w8vNo++)X@^QOnuFBU!jb6kqZ@hlEYt(N`7#%qad`5N|@asO$2@plAY@03YDZ}ioByE7b*jB zy~A5nEt_52@@p4IdN~zQH%ERsm0G(ya-lLBH#)pf$?xm%LM7SX;e|?mhQmYcaTS4N z41mg{z1dN?oQi0WBfp$VT;(|O%c;~e0=Z=6agh3NbM%A?pKm&Gm5)Fc%OXeNaw?*6 z93;*rLuJO5KxM^$04n7aR6Ownlt0e`IXF}rddiV6gi1ZnIdqvDSIZE{0IhT~Rzvyo zye@|;s8sldBNr$YmEFBEIt4qxe5~@nOf-pRYX_|I05rq=&+bW&h(BAJi$q`lo9TiNF8U#m6k# zlF#MTivP<6S1Me||9@P3Ti^5Nhi(6V=Hi3) z|8nh7{2#pdkoM&w#PW0%akpHMNkSHo5L;kT;s2eB4yi%(ME_r3eAo^D`Pu{j|Hm#q zoR0Q@%I4Hd3|2As%gtvtCmXGkfBRZwh~v8dwQG@A+CF_tkm~$=z^JR{JfESGpAS~2;6hc}(hPL~ zZt>E95w5zukfG)+4OYuu2pA32S-7q*1gljq28;-0EXz=5;BuA)jK*pu+>#fARn3=qHEJ8&Cb)!`14f*h_Hu?1ufF8iTE)GRVYE^Aa!gQrIVP&MuVxrYY7WO_ zb&z9Qm9{FwxK=&JF-4u^*iLnOEyHN97QTi}tAdqxb-+kf>8mr04(fT1Y06lWVRTeC zalB5gpT~BGzUY zJ=H{xz0@|2y;bvd8Qh{fjbk76CC3|8+*=t&Uv)3Xerhkr{;KWU8AgVh!*PH*$nhqX zwm!ocs2<~ZvpUJ~7S*jZ!x*F%avZGAa=cZgZ^$r)sOLFmD&w6DW2m}`W0qRUFJB-G=0b{rd*~nu4RXEfep zG~N#wqt!OJO>haD0!D$FwkbnRct2R}gDX;Tn=@3@reHO9bHEs<_QLIi>-<5$xLwWp zAVbaEOnkvjRB0a)Z66R{9|nxc>LlC&xPDs##uT-13nTL(BlA&!-zL*PBHFePZE(|+ z@iEZ`m-BJJxJ#{sTk;Xn_DR5)t};KtzK^jFZiWikihZA8-`0R}uPTLG0~fh1VBD_? zwqf5^?1OtyMSO~V+pzD`fH6yLgWCj`@L9l^qo#d^eV<|n*D9s70!jQQ#$+yS_LUj&RN)xs~ZZwL163>Z(T^qtuE z1@^%$RK}Os2bc3@z*wYK!Y$c}eP0E*t32~7?E4b?;GR<!%CYv3Zk z4j3<}g0Hb}7xuv|QxV@_-`CjpO~6>Lw!v+JOV}OYmh@@6vF{t~gL_5AeT#j&vG3b} zu}bZQ+X>fsPrz8M=Ip_~Z?O;Vb(OXk`}Sbp-hlC@Ith0GuHSb7W1U*~9ro?TzV8FZ z+baEg?E4P;;7XP81NOn?{17nSQ7hq=e2;zm0>(y_xexn(z&^P5RmhLnw-5V%3>ceL zDcl;k$o&E1LshUJ`+meexQ|rC0qon4eFp-@Cu$qqCb)!y0b`q*b`bjxU?1FPD((>W z9mKvv0b{$`3%3)l^WlK;g_?61`wn3r+?Oit2=*Puz9Ru+mpTb|0IuKBfbor5coh4N zVBfKT@vTZfhJ8n|4{onAj$@~41tSQY$)eJ8OG?x>3R8T)?1zMlieakUL@6I{YC0pp~a_6zp?jD2uF ztGH9x_Y3x&3K*x>^mJW&Z(1d2jKdh3CO=d zJaeYMns*ul&j!p39@Xb;f7SI27M=|lhBAJ`Lb#mY0!A6N5^f2%`PV!bFuW@B92WkD zg>dCn$nRKq4hw$|7(P`Bw+1fqkAP8875ssPzhfa>u!=a3g@0h-`G8SHZG+ncmvA9q zgs5p3u<$$(9L2DgX5kXW11am7QNYHyluu}w`D`1UKl28VKrCM=-qxf?j%?2sVizp(cWKJ*_5!2{nw$`p23^cjHDK zR|`Q@O*H1#LZhGFD}tRO=v*5?hMrTK!^~O;PKn?qomK}ya%}{Q>mayUpA^9X5%jBz zV31x|7s0$b2)y+W+^W;-A?R8c!734CY9kcE84=`!BFNG!MX;nEf|_9na&%@Gf&rlj zHi}@l4hcsP6oz12ID%YVDuOj4h^&v`HeFC3!H94K+eI)^M>IfCr#^z|4G@gh+eENQ z1PKih6zFLU5lm=+V4nzzbX)|2sD=pUMj#lc_ljVr2s$@HaJ!z<2*Jz<1gAtWQKvOV zklYBt;>HLj>ysilAcB5P5KPevn;@9i7=bquL9tGcM9{Sff>k1zrj4cu&WIqVDT2H7 zN)arHL{PICg6TT58G->#5o{E}3>^}MAgCFFaZw2F)ukd>BZA202=3Pf%@K@!K_mfj|UO(IBWfnbiF)&jwVXaxI2pmbbI1W_#z%x#HauHGwxog(NQ zgFx#!F$iY1L~u$3kLk2n1j#W77RMr(uTP5LfC&0sgWyTM@EQd3Vi9;-A$Ursw?feM z8U(9EuuvOuL~r$;#wNKr!1GNRJ+-y*u;JGsZSdZT1Y?5klwd@uA)#d}xKD)mqr&Qk z5{y2E_pPejJD{hvHfl@$qe(`PcSH#HKCE7u%sOn9ai5OREOhlt$wvJ$W^9!HIK_CY zk^A5KS^2rK@;{7nDUlXy{~Mhx(+d-fNm7Y!*`At{TJfWnrsfYt7M$n&kNx`A{E(s- zw&83BzEi?aExNJw?{X zD>VwSNaW91ebXy?;R^2rzCjgXs4cwAl^1(^53c98sgf{m%&WS3VOQgABiQ{9#e2!L zEVyfRRA1xMUKRE{DRJWQ40&2Vu-NEPEO!ftM1H!FkITz=23r!3=OIT&zQmLt#^f{0 zk;zw>w>vVq!$5T8=Op>TRzAwnlW+0LIC_sbGQNl}_LOska~+}lVp7SGJ?hA$bHR>G zJ2JT~SlB+0DtbZ}%(IkIZV+^_$ic4XC&WdP~GLXpW=!8O2a$GT@6 zMY%Uk+$0@XpZlF6z1sy;d=m=!YWsD^rWJn}dfQxj2CsruU*sg5 z$zU~DBllzMpporhCW3pw3@{Dc2_6KpG##a&e6iXO$QP~G16du?pd+CP&^DkIXbEC~ z+<+zbHgPkNb;qI)S^>zSF1y0RK+6I+m&AiWwi(%0R?t{3bT}9WvO!nS1#|1jwZ948A}nIATn=_DCqme7zUQJWc|MAO^_#-xAsaY$yFWhyZb*6=(>; zb;Jr|d9my*p+FWsSp?m*E2joa)&N=`T;L-zm&THA1f+VIDrJETg`BfQfk+_Z-WW)k zrqE_UrdPDA!7(JHpeS4eWS&YCKL-lHNRS1F0_lHOAoj`Jj0bwoN~1-&3tfcO+g2K> z!AT@#gGm5wbok3gMsW|40niqG?Wd7f#E>%$AHm5_8Ye&;sNQ* zc(54!11tjbK@kuy6oP61y<%%s)G&_&Srw;)ir_IY4~zq2fw<@%=-oi{D}c&C8k!9r z1$TnEK*~%0Bfzb5CTS_Jz{B7!aJ#J6Qm6z>0u#XmfY@5br$8rzJ3v(+I@5r3QaVxz zNC%`rkx55pIlOd08h0C>L0amNG7kc)lhV-r;9hVas16=*sK{JPq~~*ht1EJ;Ts$Ei z5c)KD20RI#0GD@6jFb*81W$vfzyeTwrJ__U5M@`%ZQ$?dv*=2rm*>9|t z!6xuNcn`b-O2K;YwhZ)JBsPGJ;9c+m5XCKE8`ugy2A_aW!FCW$m^TMaKw}`wYaJl# zeN9jUlm(SRFsKB?164o}X<5t508`e|3kc7G9pHW-%ip(PH~13l1Ydx!!8hP5u*>0p zfbIj4;5)Dv>;Yo^dLa4VgZq$f632jKi13g@k3x@t{^UJp70vAz?y4s-z0xnxi* zQpuathTC+yvw#RXQo@n}Ns$ z5^sZL{BMQH0@CxLAQNPRJdg{dGh)41EtZZ0VpRbc4aAyJU<@b%g zgi5`SfCs??4j)08>!snjU=ENm5v7Shfmz^TAcZ4Pmcr8e*-$s{A<}NX)3?YxYoqEP8IcC`t5fiPT|e^!MA9@;p{qGZkVp}Hk#}8@vZ!V)ZuL- z%=kzTLKNygYPiMrMTOgLd-)dA7#xSAaDY=$te*3wQB$vf+bA3AK4&;`lEdA}J2FkSd*tHw0bgxfnu+w@Y?4Pvc^zP3+x6G-lzgutAGtYSS`SnJf zzpH{#-Js)2FBxB?i%YT1eX8-|rr(Y*x~~{;$$?H&HVONCy?cZ7f(=F;^RXZu1`Ttc zf86brjx|r+w(Xp0w82>kjQwjty7#}Qc}1Oi>jo@z8Zh_!bh&qoc!sv^J4TDJGd?>6 z9y@RU{n#R<4iN82c z-->!InqhJZfO5%GktHo#OwSow)$q4Zu;$FEiuwc^39<=D9X+ls&70q5!3_+rL>#f; zK7P4rNz;R-XY+Y-;+ZCKi9|_zVldHtPIKe*p((9$v=4<=G~bpzw378@W=R9{yTR$l zj*TIwEv*v8ah3D~?=q_Hv!LH@`0I-&W~8=4BMuEl)ei7P_o2`?y?xC4#O|X}R_m66 z``+gdv6KCSrS4a58C7lI!oCn+{DHkmD_ zs&4rn5p-8oef@hzwE0L?UHG0cszwuMy_j>&zz3VIYTveoaki@d}#OlT&hc0P6RNcB7E;%#! zv8ipI_~62&oR!t}F)8al82sUBVK+@3e=6#dhWjAv-Mim@@`dB!Or4Q+u`%v#^o}Zd`EGY8R zOB$WRbO$sN-N%4$TUa&x-Kc}TE@`+A3XiT9)!MlK`-PWsribZ=q^$dF@u9VT_f=_7 zlJ3oLsm1+^C_qZZ*o9snL4DCwR?$0Ql)1vyR98(0GJheVf=M z9zCwdd|}io+sacCtt)?O)GCwcvCao-mreA{iq;LcvM{+%T95vrU9+4A6ULi{oIqH6 zVzeH$72Dlsu)lh?{#Ub07Obfut0SjSF|FK(qjz6*VbAVc_Vl~d^woN5pTE=%`|F93 zwNJ67;O!1OjXJvBHe-lye+&EE&OU?jCgSV$`t5B--7xnN>0Q3d?;Ksa`gOZmQLrtp zW7_uC33H#;emHOPJ-%xbpSq;EpoQ+a-SSPfmim@Y@uT}7cF(Z4-aR_I;A?c_?Nh0? zE%j_P%mFR+(ob31ziFv=!za2wUyq*mNtLNHduU3q!Vq;H_wn@ag;hWQN8kG4tVyL$K0U=W%E#LFHjLFnM5B$vudcK4>#bYQ|6uipZL=*uk?Ti3 zVlxD?pgP=@AZLE2?fF_|xW1JW z#=5SaUhz3US6_A#$sk_%oP5XAf9v7a9^1op65J=}A6Rl2_wYO0vrz8@zed6`gJB(W42_E;s{6o5BRcv%`zpv0? zua{;w==2>}kkeY{?=b2Z7F(N1VwbIBH|U;i^JGR0IktnD@~>KTO4clQc_cDR-}-{s zaY9>Wt;Ii{q`xNA!`!Fu-*)=7HvXSF&Y+u4q(P`@!H@Q^W>46z&tM`0K4-4Ars?dMg-d}^n_1K?7 z=gNxR7%R)A@1LC#=Dyot%Gw)CQc7ohV|6l)Gf;O$xahVk+!*G*oM73P4L{xR@T8|N zndi9gFOGL=(Am3;5$=^qqWkWGRoi>_D47*;Gu6m-WLzuH-|sj}+v~8e@!PugI`L~G zy78y&?e`|Q?*#D=HrIZBJm_2MlJj8#&%UZMXZ!U63Yd@i^#@-wC38~s5vgcQs&4qr zB^sNPYG0EkcmLp6{QP=swoIJ3*hIbz>0n9tb(*fhQ48zVk(ESj8Om2{qy{pQ4?B)J%Ly6N5(GvUCZ zM;e^}xivX#bYj3)9kqWq3*Wwu_Ek&URVjlS1>Yx2lYJ@TnRcDse%Ch=Zm#h_Y-4h) zy@KySJLv}~Yc}qrpWRLS?%NfjPVPQlRQtqgH08pAR^0b5EPiys5pTmG+#oqP+0NUyw~Uiz)kBhh^;#4Q_J9;iE|Sx+=&O+nLr|AVnK^PSvT39nc=)WSDkc0bHk zUG?>Qj2>a`n;<&W{C3{8ZwIlcvxQjwY1U1@w1*4Bb$ag})*fF#|4sq3Za{b6D;Em^ zJ#{agX&KO!e&VLk#)pks`u)8|c$oVNg9%}|TldZ!{1a8mGR9`vA@JyTjD`Ddf;-9$ zn&19`#iJ|*t4;Uq1@{%^tsB(+;Cq*HxFGNO9lcqur+r6nvI6=EstR*oo6zg*JFC`~ z9r`#0WTlq#pn%?rhWSuHANmeM|7IyfvrG@&=X)%w)I;C%J(}*@E)JzE-D=hH`!=rfxl@+0c3-Now9=0A z7p~jhh8$;B5Vw`~;eyefbkluCwEwwY)^CLu-?nk$-6><9_+ravQUae5IPQBk7A$@E zaIKo3PA5m=m>y2q+*aP;*xnBilP z)Ij3C$)o2r8=k5A!8YTSu}7_WP#Y`c7y#^LJ4ny+>+y-ykxyph^1<6{{qpA@hVf z+;@s>8?bb1w_l#x$M+y|O2gQFn66{@Q~OnY=C&`MF{|~_cc5uHo-*h4(JSB+-Pe%Z z^j>10L*36Fp;ddJJnoA|7Uhi}H}U+<;Z}d*WE;=#ug^bi+e*T3#t4!(4VieBY1CE!~KQ<8JpIBhlA%{r$|%HDqOQ zmfEs|^{7L1V#8oNi0;pRWaZkgHp@;VZYI1w9jw<Jq^53g*horr-#PM8 zr5ipUxaxRw`O3w*Ch@p$ADL0U`GOl3z5E>Y$>1=THw@Mf92PeX(a#<>9uIThW3u3$ zH?LdrN9AW3Mkla$Wa?XvpxHg3#~)!Eh#G2tX_fuJYyES-UU1CmBUACJzOlXoW&_<# z9sgwM`-dPXrS#kx;te@^>M=Bj4WIj>Sx2up#`)OY!}S(qVeacJS`}@3_r~-6&RX{3 zMZR(mJbIi#dt$ilkkFr&)$KB+uY60@mapPi@RtqOJ&zmFP2NU>>)?wo&?s8l?}eAl zD*WF79gu~`6FEXZah%57S8wc&s9UW<`^qL7%oMg+PoEKbD;kM|N7x~fGxgx@g*WY$ zA#H8f;l2-~miMOcp5b?GHVwY5vc6iMFhbYIL5c1gMF!4@nACRFuM(Qnp2!J``_7ST z;{tu_P5bsma%2_7$WZ zG~Bn`OnCiNlK0wfFQ6gw4&&@P>V$2`wNK!ZAB}k=;+<;rVyb-K%FsC)SNqab=2{ZJ zma(SGityJjP0Qr#*k5q&qLKCj+&}%po|#o&eV_K7#rvg^dgw1WchM-l0!_2cX#D|v znEP6rkD6YOb1K%cNQeE(DVX(A9W1N6X^!uk=_|xF!#+ihbuL#Tk+1wc&lI5DV80qbJp3W*topL>U-`WNIV>5iSzZ46 zeZ;7#_UVKBLY*$_2kXf-TNGMlT1zCluiTjuAKPF<^)ijDcH&~a1O;c9ze^CT9H?uZ zvwjficFt(+p64dGFXP!z^z@o9QhUfrQ*vw^f1bZz{&wjP&+#MJ!+IYzB~~r5-@;SA z=j7YRG(XnSG$<`An3A4YWIKkJu0=dZM_s?lYd-tq?*k~DVf;Y`eR!4*wj`-1_aU+3~#VrGKOR{JV9mVG`GO>#l|wZN7iE9&4Bl%_h_J zqlU?MMAPj_b9TaAC%=zeP`3uZ(%C1!l>EUkdze$F>v+?QH?O}(4>Qe9W{Vm6MUxuF z&d?v5W}S*%f8%F7KAX-N`nfV@TD*^6{rC~CWb&y_bs`R}URo1gF5J`S^7U-^%}G)4 z+>lW6-LbQ8M!)*g_@oNDURl#`4y&jKmNn})vi=chMzUq}Y_-eh7JGe|`8m@UI$)FLvwp#v6-hSL$opGrY`@38~Gl%s+F^HvG(8y3lL3 v(;L0!e%&a~3|+meoY}U#?q8YYvdU(TvASnfv!$_mS%_I?if%L8ocDhK30{XJ diff --git a/index.html b/index.html index 9e5fc8f..f815781 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,21 @@ - + - - - + + + + Vite App + -
+
diff --git a/package.json b/package.json index 5087cd5..afdfa15 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,16 @@ "format": "prettier --write src/" }, "dependencies": { + "fp-ts": "^2.16.9", "pinia": "^2.3.0", + "primeicons": "^7.0.0", "primevue": "^4.2.5", + "ts-pattern": "^5.6.0", + "uuid": "^11.0.3", "vue": "^3.5.13" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.15", "@tsconfig/node22": "^22.0.0", "@types/node": "^22.10.2", "@vitejs/plugin-vue": "^5.2.1", diff --git a/src/App.vue b/src/App.vue index 2ff1090..6e47dee 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,12 +1,64 @@ diff --git a/src/base.css b/src/base.css new file mode 100644 index 0000000..055870a --- /dev/null +++ b/src/base.css @@ -0,0 +1,3 @@ +html { + font-size: 14px; +} diff --git a/src/components/FilterDetail.vue b/src/components/FilterDetail.vue new file mode 100644 index 0000000..93773d8 --- /dev/null +++ b/src/components/FilterDetail.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/Info.vue b/src/components/Info.vue new file mode 100644 index 0000000..1a2fd7e --- /dev/null +++ b/src/components/Info.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/components/TreeNav.vue b/src/components/TreeNav.vue new file mode 100644 index 0000000..0a32ea3 --- /dev/null +++ b/src/components/TreeNav.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/main.ts b/src/main.ts index 7e48b96..076d25e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,8 @@ import PrimeVue from 'primevue/config' import './style.css' import './assets/tailwind.css' +import 'primeicons/primeicons.css' +import './base.css' import { createApp } from 'vue' import { createPinia } from 'pinia' @@ -10,9 +12,7 @@ const app = createApp(App) app.use(createPinia()) app.use(PrimeVue, { - theme: { - preset: 'none', - }, + theme: 'none' }) app.mount('#app') diff --git a/src/models/index.ts b/src/models/index.ts new file mode 100644 index 0000000..1a8935c --- /dev/null +++ b/src/models/index.ts @@ -0,0 +1,62 @@ + +interface _Filter { + id: string; + name: string; + enabled: boolean; + rule: FilterRule; +} + +export interface FilterConfig { + filters: Filter[] +} + +export type FilterLeaf = _Filter & { + type: 'leaf'; + show: boolean; +} + +export type FilterGroup = _Filter & { + type: 'group'; + filters: Filter[] +} + +export type Filter = FilterLeaf | FilterGroup; + +export type ItemClass = any; // Replace with actual type definition +export type ItemBaseType = any; // Replace with actual type definition +export type Op = any; // Replace with actual type definition +export type Level = RangedNumber<1, 100>; // Replace with actual type definition +export type ItemRarity = 'Normal' | 'Magic' | 'Rare' | 'Unique'; // Replace with actual type definition +export type Color = any; // Replace with actual type definition +export type GameColor = any; // Replace with actual type definition +export type MinimapIconShape = any; // Replace with actual type definition + +export interface RangedNumber { + value: number; + min: T; + max: U; +} + +export interface FilterRule { + class?: ItemClass[]; + base_type?: ItemBaseType[]; + area_level?: [Op, Level]; + drop_level?: [Op, Level]; + item_level?: [Op, Level]; + rarity?: [Op, ItemRarity]; + sockets?: [Op, number]; + quality?: [Op, number]; + stack_size?: [Op, number]; + + // waystones + waystone_tier?: [Op, RangedNumber<1, 16>]; + + // effects + set_font_size?: RangedNumber<1, 45>; + set_text_color?: Color; + set_border_color?: Color; + set_background_color?: Color; + play_alert_sound?: [RangedNumber<1, 16>, RangedNumber<0, 300>]; + play_effect?: GameColor; + minimap_icon?: [RangedNumber<0, 2>, GameColor, MinimapIconShape]; +} diff --git a/src/services/filter.ts b/src/services/filter.ts new file mode 100644 index 0000000..33a9d19 --- /dev/null +++ b/src/services/filter.ts @@ -0,0 +1,26 @@ +import type { Filter } from '@/models' +import type { TreeNode } from 'primevue/treenode' +import { match } from 'ts-pattern' + +export function filterToTreeNode(filter: Filter): TreeNode { + let children = match(filter) + .with({ type: 'leaf' }, (filter) => undefined) + .with({ type: 'group' }, (filter) => filter.filters.map(filterToTreeNode)) + .exhaustive() + + let icon = match(filter) + .with({ type: 'leaf' }, () => "file") + .with({ type: 'group' }, () => "folder") + .exhaustive() + return { + key: filter.id, + data: filter, + label: filter.id, + children, + icon: `pi pi-${icon}` + } +} + +export function treeNodeToFilter(node: TreeNode): Filter { + return node.data; +} diff --git a/src/stores/counter.ts b/src/stores/filter.ts similarity index 100% rename from src/stores/counter.ts rename to src/stores/filter.ts diff --git a/src/style.css b/src/style.css index 85d4106..25523aa 100644 --- a/src/style.css +++ b/src/style.css @@ -53,22 +53,22 @@ * should be; * :root[class="app-dark"] { */ -@media (prefers-color-scheme: dark) { - :root { - --p-primary-color: var(--p-primary-400); - --p-primary-contrast-color: var(--p-surface-900); - --p-primary-hover-color: var(--p-primary-300); - --p-primary-active-color: var(--p-primary-200); - --p-content-border-color: var(--p-surface-700); - --p-content-hover-background: var(--p-surface-800); - --p-content-hover-color: var(--p-surface-0); - --p-highlight-background: color-mix(in srgb, var(--p-primary-400), transparent 84%); - --p-highlight-color: rgba(255, 255, 255, 0.87); - --p-highlight-focus-background: color-mix(in srgb, var(--p-primary-400), transparent 76%); - --p-highlight-focus-color: rgba(255, 255, 255, 0.87); - --p-text-color: var(--p-surface-0); - --p-text-hover-color: var(--p-surface-0); - --p-text-muted-color: var(--p-surface-400); - --p-text-hover-muted-color: var(--p-surface-300); - } +/* @media (prefers-color-scheme: dark) { */ +:root[class='dark'] { + --p-primary-color: var(--p-primary-400); + --p-primary-contrast-color: var(--p-surface-900); + --p-primary-hover-color: var(--p-primary-300); + --p-primary-active-color: var(--p-primary-200); + --p-content-border-color: var(--p-surface-700); + --p-content-hover-background: var(--p-surface-800); + --p-content-hover-color: var(--p-surface-0); + --p-highlight-background: color-mix(in srgb, var(--p-primary-400), transparent 84%); + --p-highlight-color: rgba(255, 255, 255, 0.87); + --p-highlight-focus-background: color-mix(in srgb, var(--p-primary-400), transparent 76%); + --p-highlight-focus-color: rgba(255, 255, 255, 0.87); + --p-text-color: var(--p-surface-0); + --p-text-hover-color: var(--p-surface-0); + --p-text-muted-color: var(--p-surface-400); + --p-text-hover-muted-color: var(--p-surface-300); } +/* } */ diff --git a/tailwind.config.js b/tailwind.config.js index 2af77bc..f96f5af 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,7 +1,17 @@ /** @type {import('tailwindcss').Config} */ import primeui from 'tailwindcss-primeui' +import typography from '@tailwindcss/typography' +import defaultTheme from 'tailwindcss/defaultTheme' export default { content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], - plugins: [primeui], + darkMode: 'selector', + theme: { + extend: { + fontFamily: { + sans: ['InterVariable', ...defaultTheme.fontFamily.sans], + }, + }, + }, + plugins: [primeui, typography], }