From 590b7acfe912c44c8148f7c954e4b8a37bdcdeaf Mon Sep 17 00:00:00 2001 From: danial23 Date: Sat, 30 Dec 2023 16:07:24 -0500 Subject: [PATCH] v0.1 --- .eslintrc.cjs | 18 +++++ .gitignore | 24 ++++++ bun.lockb | Bin 0 -> 111729 bytes index.html | 13 +++ package.json | 33 ++++++++ postcss.config.js | 6 ++ src/App.tsx | 63 +++++++++++++++ src/data.ts | 195 +++++++++++++++++++++++++++++++++++++++++++++ src/index.css | 3 + src/main.tsx | 10 +++ src/talisman.d.ts | 5 ++ src/vaznha.ts | 101 +++++++++++++++++++++++ tailwind.config.js | 12 +++ tsconfig.json | 25 ++++++ tsconfig.node.json | 10 +++ vite.config.ts | 7 ++ 16 files changed, 525 insertions(+) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100755 bun.lockb create mode 100644 index.html create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/App.tsx create mode 100644 src/data.ts create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/talisman.d.ts create mode 100644 src/vaznha.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..2d6787aaaccc31c9480fb0e1cf9316005485410e GIT binary patch literal 111729 zcmeFa2{@HqA3nO(&Qzg7A!W=wSBA)#DVc|iW!UB^QwS-P2q_Yoi^`Y`&5;3QVJMa6p)j8+7&UJmi>wVmN4fp-~t?^mUv-kJK$u8pS?ImL4jZk4ZO@qON`dGUBB9WLFP6Yi~ykW&^0V9@K9Ed64IYv$pjCpLJJbFzY~i1R%_} zAfTU<4-WF}y>WgxcOP#r4_8-TPYfoX9D`v6_2K|-g*t?^DL^KWmIlZMkOkm2fD3Cd z7!H8l0Jj6YPrx*Qusnp2wgCwB)Bv&o^z`udvGw-GB;sjx%8bF#g7geP&?TXV2>DT<^XWi37$DU31A_v28USIu z>|pRAGJ-T{O6V<+hW&L7AoSM_@*!RZgA4g%0Ac-K=^#D_8$KSSqXXiC@hG$7b)^V+ z)X~WnOlypjH_jgiuo2|L_N0Ny2K{ zARpG>2oTPT0Bbi_5GLjYa026@1o==`mJhG<4dlc6gCGs_J>eh&YXNCEAErS$?ALxm zy-t9zo}&O>&&JEz7EBjRA4tP|Zb7`>QGn1N^6Tv6;{;66USgs{!U^1IM`cz`y2s$FPyJ83~>(R!}e8(;OE0CQT#Y?5$fBy`ayS?n}m36 z9X(u}?5w@O{$pq7>zDq!_UHE#gI6rsj&k>|yKkOr*4nQ!KLhW!kPa!97OdjCD`SRcE;jSc}mk!F| z{0;yJhCbBUTWEO*L0q2JUfwttkWT~h4+Dhb;^g4&;f2FsOh6j;AM9LfS8t4w3_fk| zhO<{eh*hJP^fu@o9TkYabt+9YzZH zf&GB<_VsZB@#4IX_~N_*Fz@8?esSKOUO3=^8`Oj2Y^H#3kF~9b7wl*zkPrLmgd#qF z4M@|2w4H~okC&4>&JJhe3rEro%uQ%uWL;eV_A24~53DC45Q~GgGk%`gSwu+ z?g6$QcDQ0?yj~(euvLXlN#NIO3qW}PCb7mDn9O80AZZ2 zYIr;Z5bhJ-0K)M)3FCCIZSCY8;Om63^>y{|0xRc{27W)c(8TkOfqGDv zeLub*83DrnrUnS}XFxrO&RTdL*c_}~t?h7@APxO%0EGPowhYV`fZq?`bp>?r?cG4Y z@7j3&06-X59YC<>BK7$Dr|aD=oTK&Y<<5cbO+fG{2q*0RoH1N=T00TA-j z0D>(sbi@!}&l~6Fhx5W<(ETI8+7%o`e3s{-4VZ7 zPcBVbyKU10;etZz)OW|W?D^(&+R*;oaMxR=bF~SpI*)`VDT)h>T#usd=pgshf1m4; zU{h?&i*=$?qx$B5=iJH75mS+GbzOVZX>%0gBfT#3youCUPdm^mCivso57s~(vZ0{% zPlcj^T9hXQ+OK%Ey4?ueWc-IO`h3cg|8n1k@dp*{cKR=_hqISD;_oW*Z{(FAi+-Qg znnlN2%R8!*uj*v!CC`(ZeIvwqijwq>V+cCOIVf|*6 z(exs}C!$Izhi;S8u1aSSz4vO=)@;kSZ({n5yK(w^TLiYUZn)M!p_`;S;#U3kZDm@% z_(SOo?odI22%L@P{8QI8(^m{D>O9w8KEU8Lre}LhH<~x(_|$lStR`c|OZ~QpnS;K{ zYrfhIj=eu4`f0Xc^!lO4F*#rS?F?w@*Xy6@DB5;VlRB_xJ6)5lP=LKj%oMY!_Pz)@ z3s={0vQ%&KbHTQkWc)wY279J{mO zKXmxr^?*eWiA)y7^t|)qj0`U$j9yJ}1$xk#vU2ouR#9=>H6u&yQT>|X`O}r`rYDC= zcY%jknd_8o`h=aC(Hq$+6>X8~Y^KHwP<|K82XhC;+xj*)*sVc zm_RyA8#lTda?-Xv(s!y^wfO3sZiwrH-jdRSCb!tHS9Ct9UKcd!HrP1Usld>8Nv4uA zn0nNNRX+3Vx0l|Pi|zWdR2?+Z?i(5QYg}fyJ;ogIz$IX&ysJn4LCC@eoXg_Q=gEgP zY}ay}G3xGLd|t%6bNwY=v7Ba>5#O&rsw5Yl;q>gnZsMBxrFHIJarW~KSTtu+2RaKiJ!V2<9$WL%<2k%l`TaGDcsy-{R z|HGGxFg}W$Gnt(H+Sz-fyqq6eYL3*lyBle)U;dAo5I(`xLAM@t)pOD`(sU0R*<8@U>!|gu^>-g@XPV4Uu zr+6=se(JvR^`A7kV)9qHgTgj2f6m>Qy6U|BIh0>1c)5Fz(H2d=0nJyU+A)^2T>A{= z69p}vuRG9YRzA&lnu0I=z?ECq_H0+T3Ouj5KiV##mq{p#U zVxtsy3s>5=^Pf}A=|1ecYZ!X0nC|+#(d&MJjobGJviWJ=^rF|S^1nMLxkg4KUxJeR zfQFWNl+;C`1ooPZPfMR3KdG=cB`YguG>aE*nN}tBQj;39>Qm|?j?NqyQ_1k*-=BIJ`BljeA{gD5^Qu@GyB?#Dz@h_HN;cBiMW~X&;O1ksH)bzLt<`Z zeJL-_MJ^%o$gAEbxtsSnGd_qEA1(@rHyJqc^-_XDZQGrLTV8*Sv%8l$ICD9f>(PM= z*FIZUv)8FzVw#K1x@Gh;xY;Pmh)-3hrDiHN470PJxv~CgS#5iHXPkQT`xByCj22z{ zYHV$v^UQi(=ykle{$NkzoK6CbLa(MG&-&1M3xTLpe0y!qNYbpad>y%Caj$tKRk(Z` zi)KrM+AXH-`yX%Oq>vHYZ^(S2uRu=QGk`UsT6S-wUiQKv*C56*K~wjQ1AWZLz%BA?b)KPPiy-sa7rO_V$H*$-xai&)|sU&qF@_9VA>e`JqOiFPBU z_XDH+qE)mr#y(R4rb`SpLChN?vpaO2&o^C|411DL(~~dbD{!%_{_O6;_Or=hbzg*T zhU$KJb2M07czgAx)f{S7R!PSg1iU29+Xg;P%MA9o)Jz)^sgj5TX;~Z`-(zk4R9u^ic|(3|Bn8$BugP zO(~`OJrHtwxyGwubZ3F@&9@Wrw`*#gIK(0&@8`bUadC;l=}&AGf&3bv6gX!=J$PXW`M(0hmjfj5s1XX&kV|S@ zh<^+az@tzo^v44(a`=G+L;MON|B$xQ_&*c)FmC7@A}NOai-Qj+{vCk0h7>ZWgZOUX z19+4UB{gm&kN9ce!)^i}oR{Id4U!D;Ux5!wfDhZfk{A%5VKu(};B5a_n@9-&@o|7J z0sQ|i{}SLU{6YLPfDazgLs!yv*gh1$03f3A2hU?98{!`UeDF#n6wMp(>_(CyeiPus z^$XLWDa#ir0*Jo}INnKUKX^V~@%(Q9i^l8^_#6}%40tpQh5i3K{sRI3PyDw5zWyKh z-vM6jAN~XWDZsb*1O5Qu+x-Dw6?D4QAMmgKA%7K^@PE>NE5QGg_#XiNpUgjc@bUw^ z0tx-y`Rfe$l7J6}5d$^Yz(tCo^?L{Kl>i^zw^07CG*G>7fDc|h{>A?l50xXn3V3+~ z_Ybu9faOGzA$}O(!~F}AHh~L-Ly{qW1bBf2UI~Um((mva0blJ8_#41WRgFL3n*six z#Gmnp{zm}+Pued6UcUZG{62vHC;j&j@WHFp-yVNzaA^7y{|11s^9TO30sl|pp9cIt z8Nc1&;Pof%KMweRGXAxH=zl#}^ncQSW`O@E{g(y!`~P74CjkFX`hORA>HjC~KMDAM z;{O@o|H=4o1rIFn{<8+`-{>9!_wrvE+W&0;A3lFVF1&w|YKVV?5r6-Md`?oypdR8+ z0=^z${NX)#J&78KzZX0-pyxM8UFq|$58w*||4@&DMBlI)@?Qh^u>WA}r1~c2uit`? zAB`P4hrl}jX2`!X;3NM~gH%KO6M(M-;)i1oeXrDi4d81M+7C5JokPe!D-#AI4*1|0 zxjcU%l46K|5%9rRu*>}qxhsu-8t|n6AC3J=QTIR|5W_BT~<>R4;QYK7KU*|IGN$62u<@e7OIjcB6j$&)Wa@6yghjFLTlU4Qs8G z?*RA;z(1U~P;;g8=PBUB=Py!uz{Rqm__uGv??0&jQTeYB@hu5_82?IQK>X`~uLR;p z>6P~1XTXR34|(u{agbujpD6gT9$de${iOPa`iSog_|QL`f4{@eCGdZD{tW=W0`L#d z570k~3w-=nL-j=2@Z%5nFPMk&|CLNs&z%jw|G@gBa*6BS0{p!oe%OAsbOH?LVZh0Tll%;KTbTN+X0m{>@N5ZjS%t{~L$6 z4Dn3>UzNx|ah-qrjQDwguSDqof2;rBWr#lk`0)PyyW_{jiC@2H{74-`l4}C+8mA3yg;KT7p zT%`M}AW*%1-1z4Q$On%CfBnLnRDLPo+Y|i%ibGtE{4?$NKl?u{N9&Nd?%#bzd?Uc$ z2mHe{e0EuB|D^!_P6Ge${QOfM^4|maN`KJ*tUTbin1D}CaJ16-a}w}X2>zi2itC@^ zM){~-3*f`{le%vHn~&wi`$zGwwExusAN&<|?=6e0eVaEbZ+ z{Queiu#6N#{>=bi7sLVd_N zo?l?>EA_8R#7AeKfAUG3kNk%KKHNWH8qFc%djIqp@m~SHCV`Lg{)t1JkLt35hga18 z-|2rNz=z|9#vSPr`}(`js9qT0D-!r9@9*mWcOI%+3;0%m56j`&Lvg_LzZv3-NMJC# z03YrfpdUy!#D5NMzHt6QBFZC01l6Si&Jmvq5LY_?P6EC<@Q?IJor9=;BjAH26bfU8 z{YUB?MEq|=@k2hThWNX|=1IJMSL)vj@ZtQ2JgB+S_CEl8xPQaAp$4gKK=FS9WVC;h z%7wlVUrO@-+<#FUVEL~M@x1_FjnIC`U;8T}p&apR03XdiSOhglF~na2d`fZE?ph#%(t4u1>SJmCEYwVzZCK3&?-+{M!xq@csv% zKcVJI*DtpmzWu1(2uY3K4e+6V$Xm%AMD0%leAs^E7v+=czZLL__dil&Kz^ve^~ScTth33{~p0V8h29TK>p_eAFV%_2hVV%7~%_q zhbL7KKU%*ij$dgYz7OC-|0umuejb4j+r5%K2>BZWe7JrgmsH=dZHT`^0Y86Xzrne) z(*Cyvd~HJi!LcVb2IRj4@WCzMulP|ukos3c^=K6F?+@Vf13Y`J)W0I&D**p!|3SL{ z>KqiJdQpH6<6lYJp*G^z0=_PR|0|!w<%mzOgkS%pwi{_6z82tvN4US@U+MY{0etWZ zFBIyLfeYy(KmUZNULN2h|G&c@1AG1B-+!dG8|fgvJ>Y{^K+E^v zb)ayi`)>{4!}|yH4=>mUq!{x5l@LEnuLjpj`68h6;QWI=f5-oEz_$Q==$};I&=-oo z2k>S!59(vFrU;IkpJU=uLt;$3-=FrjwZzre}ceA>6QAI12-S=2>;vf zKfC~60q~)J=o^k9DTd;01$?xBL;gzR-wqyr6@Y&@_uxgUA^-jaKB;jdeZ;>5_)5S( ziW?!S_fLrUtHI$J?%yj}J5Uqx_=iM8{&9d0#}Cb2l>aLk zRIeEDl>i@(9c(|{uZVERp5kjRNoZv;rfGq;TSlgf?w#MYWaW<@1HP!cm^lc5FZORU%39Df2e^YQ2_Dv zz|GV25BPb1$X^W_5AUD98^0mooBRPkAMg+T0iPNK|0n*f0Uw<|erNnD03ZE+?RWT8 zVDkQne=EQTQ~0;XFCXyX{DspN&H+-_0Ghu8fDc}Q{l!Q5Q19Oi)nf&n2X2AO=Wn`y zBm7qx;(r8uc>jU-&fnpy05Uj2{Wd=e@U8xU{~7QV03Y@}G&qMyG1PuVFnM+YKD_V1 zv4eXcDTesIfDiA#D>-{WeZ(&YeE9x^RKF-T#2*6uU4Xw96respb^Z+zpW7J!{7GuR zAx*?L0ep1-f@P$}fcTdHANJqxw*MvI!}9~wBh@#I6ZxkDn;($)?fGl}hkS~If3|*H z0Uz!kX#SEq4^jKC5&WZb7cJ}@5)APt0Uz9ge!KtVz|C73@HYaVP!l34hWv*DK5ReY z3zI?ybr8Q7@OJ|~od0nCkh%^Kei)=eAw@B4B$E@)i!{N z@PcE$8C)>_Ed*o&2#pwFIrDPv-y>{0E4X02Z3Ns75E?|7&jv0SqX4*|L4;>cX_x@^ z{{_N0!8_k&`#Xev0d8x{_Wx&O1TAm^7n~QK%dPoOg#F+RE;uee1oQ<6?e7rY-vYq} z=Ux!Fpb;a~2?iI$5O6_*2fIoui4o@KgA3mCiV5Y!2+K29Q=ViN<#g=Ls&#bC?^GBRcb`o-_>qN>CPwIwm5>h+euV!X0JPskS_Uxbh^O2{V#VSEyV`ou^D@?{D65TW0_ zgfv9>QJ#<{Mp#dgP_6_J#-&QA2N9O56VedjzO6$@{~bcU0Vs!Y8WZaM9YWoMpnN?* z9HHL-n+WHT3-AN|x)JYo7luwAhL zq5efeJz|9W&Sj7fi&DWK*k2ihdjE}}X!%U^zjG1niT^w&{qJ1#zjF~h4?%+nm(bsx zhhRC(hwCg8TyULcgA3Z75~^>e`m@qgzcd0L5S#ks{74&{>z zwL!!6CwiW`54JCS0758Uc+WzHUHwyJC_VUDVcY%#TlaAcTs%Qpb1Z=6J%_+vvWVbv z`nXHj#K%&&vg{251ZTSCx`j;*|(<8%PB>PxzVbqb$ z)~0%6;tpkCs4?4P8`qJZ!mtL}ix!-wxm#B4z8rAC=6w0NK|d|S_+ zd$aj%1$<|K;)Q2mWY{^}M0H@~?tp$Nj|KHRx%w7U1_$?XtI5955~t13KRT=<_2l#5 z!nMO5Z$@dJI1J>TRMl`Xm{Dz%QG6v?BB2J~(I8!TR!4?)OQ_RH8JEr1;o0(okK4yg z`I98mvF^{?a`O^(*Hn-(@aeJp-S8$G+ig3=aCcF=y5qjni`<$YCs}w_b?S?rhVPb; zE`0VuhPA3$R96NrhCR=9PbU}g<79QuHBNJ z+%`GA$yDHk-+`jqy@H1ItQJNwbWLqaba*O9$U zE>~QiWzqISS;!6uAzf-D3J^OIwyB7F$D@WP`Vww*d(v> zWU*`8YVrLvedCsf?6EsP?mx1RpZX0DLj3^uGGy3&FAYOXuy5)l_&NEN)~>p*9kF-X z(C4If>+MUf^JVWwt+qxxrKd!}TB)+N;tWyrxe>5JXnpbr4X8e4i zsL=TAUda<#_H149+pP?M5YnYZq5!d7OH`A%%;e__gTCt$%sys)Nqtlqw2pFQQ`(8( zj*m*c(c86?1jwU*81P)WvfHb~=S;}DTwCf)=>wFkju#$0fnx=A;od;}9V>R2d3Esd z43XR2WYXOyad9~%Zq?gcr^|Ci8}qi>-5V5|e!#kA+nqJ@tOt|R=HHuZ#U+1xdti4b z?s;aa#Kp~h$^>1wufykEWZ2x*FFx-o6^^KU5Q)5mA;K--8-snp=s37!WU9AJRF{=aFTs&yUoPU_@r*PWH)ngfbLme z)+Npway25|O(`>>dttVeE=Q_dlkIq|hi z>h@;aZQq!m^4)b@b*l!`EWJjfMhOU!fu|N2FZ_N98P=v?i6%PtxX&j3WX~<#)vVKxyEBelmttR& zkV6(DAEBLn{$0D$`vi`2%|B1?$dbSF{=O?tI=jdb{8KT*582}J?|Q)<9&`rWgOFjz zW?9#y6y}>4DTiM4+u#|VyMIJ`ZF_rQjQSM$cjia48k#BI(bx8`xu5v`c;r(R6=!)< z#?RYAe0KCao0sAq!r$Mp%kiS`yP!6<)#sArw?0!|<8LB)F=>1eFNz(?89D1ZB==$$ z58VrBb(^3-+GvVdW`LOczNoDC#Mq(PUfz;%2|BJ=GgYs zQ>?k~>9d%&XxR+`9jF@$a4SI*0(R0%%8uf+|}7rbjiM+;$wp%uLQY+ zt#bXSyd^;wt_%1*Au_CR$5z2td)-->c~_A?Hf0|SyBLvc9V7W%MzNInn%bi+C-uzF ztiRzwyMa~He_s>TVwl^?qgBA>CQf~ zsQfY#zgkV+DAsQZeIG2s>Y_7?wb7w`>EbXP)eo}37pO5JB6WHdz zKZ#10bAP%-KGj;!S%+k88vpb{{qih$k3jLVBT<0Z_8*x=;m;C|-5Zyx7&Y5Ovm~xc zRmSjSo7Xd;EAQD$(pLWf{}kNQ2b-!m%}Wi3j0{xYs@C03{*dXuqw;h^1y>A_E(fu0 z0GCs)BrSWs9$QtpK@Lyo(q@LHA7X1xDfak^iRw;tgr>~Zgv=gspG)jxy*0w4qStUz zv+Buua`T8&CuYcayNPr;iFLPT1hS5Qi8%f(I%%~D1%Ko@#fmYxd6P)4anm_ByVVzD zFx7gjs<@m}zCU-=R=+BX3R5s|Y|D;tT055>5pzChSr@as|8f!QK3rhG*!`Z8{M#$v zZbs%TjMdsLQWX+m`Bcnx_nOXq<9eq2O{NvQxvts5PNa_UQWiGuK%4XMC?~aHI< zd-Sp{em~(wWAdxjj*)eQJqwR7RDo|CyA*+VgS=0)pm2eEF;Vvxq2GNEVMqJu0~m5ZewN$r{x zyirzWY2Ebb+q;og>6rCLPQE+8pVn4!h^yOV+%lSa{j2nm;_LQ;)O-03$}Q_+C=~$m z5bLroopdxjhCiPXl51*kWld(Cfy_Pyc;5DvaQH*Kk+3}65lyqg_|8yH}4a-Mrc&0*z?ew26 zB-ilv{?ezMWzcl^u|`ecyUMu{!5Hbyl5ys}4jTtI7VpS)n9V&UQTH(CjXz&s(ZsO` zY@J&{Yu4#&PvBVu>cV}JABh6Qo~-yJZlv@eA*0riKCM^!l7MmP`4=5)xT_Xd(Fk*J zF}CL<@e3J#`D}5R`JD!n;HN#zLiFxyGp9`EpC298`XGzfT?KUoh;>(|TI!#@$mP8* zvG%OzOrpqciJW>_g`axmXFG?#yzK9JkHsDFW68E<_q_Jt`@m_2$-})bgRPw(*yk3e z%Z@bQ??d?eu^_STanG*r6DNIxl&SN!(IOO54tLznLtLd3eFfv*qWKFRW|)7@ZOxocsC znvv>GZbj9l%m%XEW9=LLZTll)i%;CWc=(XLSeL?)=Pzk)(Hss{qz@8P9P<0#3eV`E zf0uQIiFGMbgX5Gl&w3QMxBAg2ejPAdoNy|Bsnt0?=i@Zv-)2fH+L)sJXmtC{{0N8m z9{X^Auatm9H;00VY71@NxqXd9x+287xfk`-%boTtg6WmuUNc^0us+_2A#--GjK5vODV$ZvRn@4(?Cd_{Lw|ZSddBx-)~UcX zlX>L6Zl2=OE<1})-yg`V>d%ZfeUYJRmZ5HTkyn3N7k}OnC)VxdvMcT@rm{@pzVk6m zs<~`>Q|k`HWJa9J(Ao~!y;fPT_bR`$7rglJ=5$i`7^aUY>E4;m%9USv)>Z71neYz& zxvYz!gbPlBSa-)h{)|{m@Jv!vyZZP?7RBx@s|q)59K|tor;5cjQ>h*u-xzF{;HH>6 zD@vOfeee71_}i<$47))lXkw@FU4dY}miF^kuk)X* zV+|j_Ao%5b(V@84eOC2}Z%Wy}ov< zpGW(;@6 zqD_t0j#stND~IgpkDxWCH_Z)@%=V~xnJEAV#u*CM9(!{!h zLuR>!s}ggk`9Dj4+$uOb!6nEYqPAsE`9AY2z3#6<)?ZHhrYKI?f41MzY(V*5Q&Ci3 zs(!*v>Y8q|C|6^t%4OZq}n{`$ML<1>t083(@*NF`%GN#UD@O_`**E9qi`{0alp*mYzhdW^UfY53J{y)n_5_) z^>RXC|M-CxvP!Jwg~l7F_Z;wd(EhAn9dgyY>n?rX$E+VTxEpEZZ(qjKuJe6ua>Rn{ zmR*#1KxQkCIgu{hs3N-`4zOEX< z*NM)Fny-7!M=h54(&IE<*sQ&6&Lk@rEa4?q282+&@ZO9J`%$%>M&My&-|z-Ou>e73 zzDd@5$IRMnbG8kC(BPgCl`HM}u4R9&DR-`g`N>{qvFo!!Mb;YGbywr{np^gU?}X1l zNOvz11&Fo%lK=4TV$p-ITpT%{g}DqnUj_43EL!so8kP?3XHs9SD#xc=l%PKNf|mDC z?v5kU-4d~1m51ecB=sNm99XwAlt@>eShpm5VtaYIb=Ux{`+k~%)_rjU-?O^qqQ0>h zBqY4~ncX|6A*-4Gp>>XaX8-ZV3u%HK>(6MDd75Hc8k3cVKcBWI(p4bVZGNu0b80v( z41201>+|hfDJP^BqCT62XnA@ui56J|V{+zOI$u3oWxrDAr-Epqnz(F%sAv=oBn%6FcRT_2B2c(zoq%TV!2#BkTpqI8C% z{K%QqR_9zj7Z-a&qk)qeh1ZQ7Z|g)SULw*}BG%n!tj}(x&SFV%;pnyO?*2--O>?97 zyxAWMD=r--cjvzr6v0Ft!Bf5EG;LSTmKNoiwBD+nOfeTNI^@Z(F5I!&PoxXqogl+b z?*G7d!&vo==SlH7)sm7d4&x;iCi>HvIsL_U9(J)AB84n>hkTxRP>tnV->~v<7rHHc zn&~!2&QGar>u{{*T|fxU2Nfg=5L<9*lTrYEYOw2OT5+8meS@Hyw{^Mq^O?eIRcO7EC#zU*`!Gk<7QAxm5?~WeW}Vh>Y6b5_f&&_Rh0-l5MtzXFxhx#IA%Tw%(3w z)8sl|*N96!0ad&hyOTZ2oPuJNd5`XY0a~aZ;JY4VSaEfweA&kvFHAq7-_!QQ$3y?> zuu)luS=S>22@TcArXHI0oyStH+eFzVU#v_F#7GRKC%))233GAVwA4wy;Vb?;iH}zu zi2}sNL~R#*q3rD8H{Jav-gRu-*|sZZFUNG)Q&&Cl|8du3wr5S9)|nl8U+?T#EiCPP z{Q+emj>US_(U3p}9U14ZAN7C+iWi>MkYSfhxNW~@e-wPrYjMTz2kpVcE&S|87H*NR z>v!IIeE)P@R<%x&RK#~2`$Ofjj+tGz`O_Zj@n&_>hTU0UCZGsB&C9gcY$LV-NXHHQCIE`MJJU7UbS$?TIyZwSWUHu!iQ>#sQ zH)-2!H;s#t|B^za3+FO2td%F_L)vW;qpL=9);=i^RuW{m6*LjudDMJsd#{Qq#P_cj5(S8T8=kH^xk=3Ge)t=O z461H`(LK_~amTAi#pk*y}Xg+gmaZAVCTwuZ>os7qF~3j>uh-(M*%rq|HaUTR7I zL34zW;f^Wmb}e%KxeC+r`jiS)HzHkaV%_gXb}=oV6*e|!wdQlHDn#lR3*Xqmu^raulx)vF@IR-k97@ zXOmc#mX=rVHdxv#9$0AZw^hjBlg(8$loX4(ydkRclb=L*bKI7$KIz9)-yd68OnJGv zJ?@QoTH*|!SCFnQv97gVWSkT8rLqf8Xktn(jZkcUS^f0$(V0qW%yFp=8NEQeZ4?gleJq08ky6#@Q#$~Uw(mYyJ@lMndBZVK0hw+r`x@M zUepjbV5|%ollt&8=Os=|ks7{3MY;w^6d<;$;M_iHTb})t*9yZ6cUUqvG;zByUrX7r zn^*1B)TxO??WL{;iX8F4PmATpV)O34`y}66d$r>!PV^zyc+?K>MIv28V%=uG+~M&@ zHw8ADv;Dl@ksf1N!#J%AKAmpCaa?mXt?|Uo!3Gi+wCg%3ES7V^qnhScoX`Q5Ah*D%((zaZ>bTau zRO6j9r*4m=zU44@PK&+o^G3pIqYG8LzIFHrk*+bZ?(>_$1sn=GW<9ao${vo+yn4?M zKR8^WvtDnjY40gd+9QFxd(ABqR;Bx7x7`(+4;_hkHN==!(X&QDFw)8{VdF+3T@zy6 zeH&KoZTKEFJ>!u=ZT)NwE58%{>xsBUKWW2OzDE-BDLjYP?CaZQpDeT9bGUx(yLg(U z#-G|j{j+R+^=edE-0W72Gx;_(+de>fjQ+RV%g&N0urW{GOvo6sF-%p5qzkDP< zSlX}V%9Fl#)8fYIipSM5_CE{HijvMhab&VXP6kVEg%MOB(lsU4y(QdoFt${;@$P8J zM#e9h6|PM_wuM(Vw=VFMb{g=yece;xkr=PWb)lo5ni1L%MAF?9bn||%2x?<@Vl%1Y~w)#p0yPHXB${Av)3PFN@@Pc{(>QM z=cWXYhKKqB*sQV<{@3Yg{FQg?ju7d>Gb=J|#s%5oq(%?Bf}m;+dNYOsj2f2+U0D#r zlhM-$f3|pPo?wkkPv2|F%FF4&qSR{5WEt)Mxa!-BGHilGKjVkP`1fb{{nrAC0>p0f zdO^iH9aAssHnv{4lhYw%xIQ=~#1=bt(1qsqNq+xDyj^~l~;{s zx@i_TIPRaeb=A}U@qt#)idwQ%^}q>J|JPEdulc#jEVbj`6X4^uLZSe%oXwl86I18> zFR{`~Egh9ElIlCD-Y>#kaj`!#qCb3JsqV;!Jx^sXJNw*N?`JkE+^)NH@RH;fm*HFa zrTjPJ|b z>fB2x*<*%g=UpCaQTp%jhz=K)mY5gSY`;gOdze^Pt2#{IOXyf`pGR^>W%=A$#}9rSdVi(d)ot|~FP_S2w{zcS3i>$pR0bGz2hZDFJQ=Jt z!qc$Y^5q@pSeKXAi-~k?h;`4A#ON5&p^xi9Lbbf0|g+!^og`=WlFNY|EF7kf)m+tR??dphYMcOU<4 z+aivI0=~zA1zQ*y&ugBo@asHTy81is_acU}^Zl!zh?`j-xw66C@kE~H&d1a{8wOm7 zbnS?BRf4pHGjOR{^{hFJSFvnM|9z-J?5*y-ssMiz@F z!3%HSndMj2sD-)LZZ4z{y^mX+mAsQO^$6=|S-xdg_%qRB7VX#XBewXIWtnOv-M%2- zxb;V%8cQ1xLh(8vQGnQN>2yiWwC_TkrD8%^v9iU=Z}XEpMKvfBIEzMU4!t)$biQfx zo&1AETX?n44>z2qxa>}Usvu-YCb#R%%c?sn#P@keV%?nsxwBjBnkZ*CZztbIWjw(uETtmQ_KQds2|{27#UWrx>s%}Ioq;S?P>0IFDpKpb1LlSlm7G(hfEV3 z)dXEL-&5;EemS7<{$jYXb!~y{{iRO_N>w>yPCWTJ>U4w-|Gosj@38ISI#P3e$yzg_ZnX8J-mDr9$i|P%FKVS9s3Vo=Q z&zEoNYz=-Y7<)sRUtJ?9p3DZ9C!NHrY~vv?6YtXR!hKo;Wp-8AFU zy^O&_v<|`1`@OH;s2@GEYrHA)8Ii6Bv2OMo#x$RYAry9@r?<&X#czGR>mcpkl=t1E zwO0aI+dmfG&u>xeD64(L>NIiebF;A*S+n4%`SeF|anr>IZB;_Ah;%)Pbp^$}<@B(0 zpF^I-NqqI(x#5ktWhEbG>nXFi!J$*EHq-}ueum#1=en6PHf3;D?y71nN3>zNU5c|b7~IpzJd21VIPKnV4(7ZL@CeW>ZiXE@4s$--Owgge#C z1s03DVPvyo>zh7R{0KZ6abxyl@(nUc`;=AhG;-67HgM5+q<2%EejM{!RqKj+Xbtgv z@Fv!sJo3CYWb9C{>IWOqdUf|?8L=PL8+O%X(mXJ}`ONPs^_Mr+qa%&232*Dxusczw zEM^&$ZGI$mMt#Gq(^IjT3iwQn;`JfcEl}lBcu!BM%ziVsaXjCAgO0A@S@ZBWK{k8? zt1){l$u}7?=TnHpb*F0_=`Pr|>TJ)hTNg7}C(_ePWwr+QNW*7Lr0YwpOZRah-#n?o zLgOm`vs9j4sR3heSEr2ZR?MoRjEuS9#1=ZKd!}7US?v0%rZby&*KG-svve$85)z}E z-4f|uG6~y`bp42Rf9_u5ZfNYZblAm1p7ls;cMnh5t6h$qhBW+&Kcz+O4tmktt9@S< z`{ZX(mE~o3sjY8PtJQPLb&@9sRqHa>Ey1%i(mhJ7dr8y3c9vtP>|$j7#L2Ke&&BzR zbG~7v zx^Y`K#7Do^U0CTZo`VwQsQ)6TXzN1 z=!t}gIX##u*YG~z>+BshXkXLwsJzk4lZltpVL90uXYqVIm#PhR4vv#^i4a@Zy-ga%emcseH z@$$ypb;D)R!7t|dc6?k~+~}X2(p6?ee4mGBVPsf^!Q#Mq*NeRGY_Ug1S-v-2)7t#h zT-7z?E?G&>c#Zc!q&%EmHhW(b zTQwu}{kEIP8e_VGLbkI4XY_`1<(?LYYBO)TDte)o?*@E#h;)w=>)!1WB#XrRV+w5imHuu?^TT}->OQ&WbUwtuJs0&uII%AGfk}U#=dsqi4cQ}Je30D` zRK4B;d!039<~wC2`S~(`g@f_ijNUl5V}7)7%Pb_RSo%b}2?&d zU(1#d=|&RkzSqqTQI|PZ`zev%vRuYW$bkPLn~KTK$+Ba$DtqTU#~d80)>j_b`L1^V zdmn09Y0bIE#kD$0Bd zZ!Khv->a_2e}9ZW|3(w*){W}Bus`X`J-n&H_|(DsId1de9nX_$u2h~+Oi@xEptGbs zW<4W0_~i@p&C`o-jgqK|_#=7*6>ce-`X#Soh*44Om8S{Gm_<{E5$XfeF zIiVp9@epyAwJgt5c?&efHwqNqd^5~_+I&w)X~>2%qhzbEeo$vrm`pFyP-7}i@}D4n z4u~PvJ+zhbqjHuJCF8a0VIq?~FDqq^pAIAoDb>&pVEyR-v?ctmSEqNph4uTQZvpio zZFjWPrTZl63OC&A{nQ2dT4-dJMYtl<1RWV(-+UKGjim=5V0x^`s!>M}vhv7f?P z8FXn{EpGn+*;C5s@mkX6MQGxdi4P%YdKE0qp+^8d=HUs9I@`FqV|oesmxCX zl|N~h7h!w#%0ijk(t}JTZ*!$-GB2mp@RCnG?OJWBXcHDX$vw|>UL;9Svc0Q(|3yBv zto6LM43X|RVqMGtn+7I5m*Zg7&nnd;CEpVrv?oumIqmIgJ3ln=vE$pClS*tM7r_Bx|xSV444j^Hqf14$NSL%%R-TxCFa(v zPcxU>?aGwGvZf((WAeP+rFrg?Ue_xLXMmnOKXQd5T)fm?~^!+B!eGas)z z9a~-W#Lje&&CbMy`(ib>ZgUOE_VH%+-qADQxYzrGzHB-#lkW5gr;t%VN@BEhAHQIM zTzLOaiqjQdf`^IXy+EvM@cPMY{q5l9x98Y>lXTkT^?7dzM8uM8a$>*e&wFHdCWLfX*B-T|__~v6KgD;UpL!p& z-}KIY9M!$EaLw_;*-Wt(ERpU-V%^;zVl;{}60RbdwFB~1!5%R=F& zj^26x)$eyxGn*=TuKKi{qd(qmjmYL9=Bw*AR82i%50q>COr#5+VUS@})pho!l@?`I zDbRj7+vV`0lXjK)xBjEn9O>QDvHq)5L^yA{U)UlvQTP3BFXn#GyEaKaxdQ^tzDDgl zDS2O{=7A8}A1)zLfY|u}uiLysvNsx7>ZVjY7#|(hnPricf9SQq5w$+Sc>USkAm>~|1kTc!09YQMD8shnoLaa;k za3bic&RBSF%+E8)8WG%I6UFBq`;LfFs3$5XU4Cupb4TBh68k`EYqGDdxKX8;MekQ; zsaGfE?Sx#Iw6kR3oJIX`nOHY`uxz%QXJ)hejgJ0@G^TwwcW&UF$lsfnwt0I<4Sio+ z0OR1B8+?x@?`ZVA^k5q&Tc^n59HP8;+U<>uoDq{&6OnEzv98_Y4c6l_S7p;0`?LL? z+?RPgQ+{iYsY$}dv+vaA_Y}Sn)91Ui+x)ePPGeUCllHD#)9&iQqx%C)uo7=Sq_nBR zcc>`dG-BPel0rP67!)fUdH8t!{rasgWltX$`wOyd(*al$k_RRvG*qMP`&T}@X%0E*;7hHN*KE$Ys!)=B}*l0Fc`)<_K>Yo zXh9p&qD|UYZHSbmC~J$7R!b?-g5tUEGc)G2@cDlF|DONr`}`iq>+PI#U*~?`*L~gB zy`D4Yj7j;lnO_#ii~3O3MwGqfBx2S*Ix&jxWlV~C$n4Fh50nQx9y+g`W#c#PNX#hl z#v_eFtvjvc>+H`ARNh%gdsNqYbh353YeJytjd`EZJ!6)>`&gu~C+a4A5`Iy>pz+GP zjQg#eEuHrz=j1AHEY?_9v^;3EkJSl>6|y`{*#qu<{YR^G4prVrDwbGW^7NxqLj6L0 z=?Ar9INtquUhB&QqC}pzSqWk4l%20iiDnH&U*0YIyw+mJzCC$kBd;hYOgX7jsq)${ zCLF)+A((tIx={U`%F|^>t!$zuY@F_Vv@vJb%}UWU+gC@IWw+flxc1h?eL@!yvFw1x z?yQX{mK=GjGWAPFtQPhCruXago7PezjLx)NewQ-Z$XTl)rm=O;zp&<9on=M@(?TtbbdDV&$iG=r}R6FiWUU$KxK*Zub#3F?~ai;RI z^7N>roX?jYa0yK%hu_~Enh{yaFUk4!iirP<677=lzC9j`NUQ5RA_NnSgv6I!x_2q1 z$00gmak! z!do0&#Z^UgrTD6xuYW4;JN!j0pcU5yw7Y(GVO{(9M|pj?V=MnwaB8ARss0Dv z%q7o__t-QoKGD{2JlJ7|NMAm+gXcrdG5mb<7>gA4#C(%cdKXq?+e{{1=~;Mo>k+>C z-SP9@9G|#SlzaBTlh zHJ)=x@-p=WYvvji+6l{jZj{9F9>??UkLyY)OO4xl_mph<8khWoM#Waw-|zcAS1`kO zpha+cjksKqM|B5hWSr5A@A=JANqKS`ifJmDd}#|y=U%>DfWPmbi|5sHS#m?^U8ex8?GG>IChz8bY0t*J$L0auFd{24(%&9pg9n$+)m+n zf5?4kexh79YJOCL@lkz`)(u~$=vJRJXd^~>S+*FPTsm;c?x9?ef3aJU@GVO6er*B& z$Bz4y&xCjcIy^}cJc7!K#d{jhd;hpgPM~f6B~_l1&*zEj991veIJLuY;kcG!k9WO0 zKb#3j8soviuOrY~Rr^d&&N>^W78HY%M*0t}TLRW-XHUoRp272S)wfi%uDvk6a&n;t~-rihdIY0g*~zBgI&&>C!+K0yI)1EIJMz^0d{XJR1;#%6FUXRuGwfd^U(bvvBwiW-j+}~`f82Ou$kzzb&K(Co?hI2_c-Yar;x_)Wrieq$&&tH?yeMqlb+`#wlZQpg(Lne8Vfhs)i zZaJMN_`6loB~uKNA1B#H)?Ktd*X4a8&DkO6Hhx{>DxTNVYDq> zhUZQAV%GXb+E>`;+4ImJZXtp<$0%<%KgJ__#PLC&_VEX%jhw!BwGYPLeEwXw>ub18 z*QMC4jk)eN5zF?um~ctfEyM9%$Mcf1T`r2Gac#}NJI!6F%g_J#xN@7Vsju=~>GSJ! zp3;iU_bKiz4>u5d*3kcG-Tcj$%{RukMVK7f+4Au0x%9JF@a@A5Jg-Gudgi^4Q$`t| zO%3+9d8otl@nx3E-q4=ol=XFIWjQMK{HA9PXaQf!sc~7oT$S=D$wtC$`fz0+ve8tic;i9p(OB2<~&gNOY?|0d8Y}XmRmlxBe zTFnEcjEUuAE}vD3n?|r*8T&+gn#+nuINkz0?>kT0kDzmV&b@lX`A|NNeyBLtS#5e? zl6_v{r$+>ug5}{YZQ^oYT~}5$9+g_uC}V23y?Y+XB!9fejq_@x2lKgcyoGq)u^WjR zr`KOB;ZgJ;=guM>E~DjM;A$#2OWyu&(!&%3C$HxY92$Pmt>AT4}?x>=bnRD~1+_f5`SSh2te&BI3?`H$Q z?hg;2Z8;;#_u_Nx@-_Dv9GQ!t-X@1m3-B^C&vqWUB0#jEdI9 zMH0?NrM9L8#ELT;ztr+>OskkNYB|~Bk)ER6*bA-8FF)xG?o;DiV{E*CaqkSC&p6&< zJTHgc$ESwDYwO$E6RW981{o$V*DibfY3J=6^>=$h9!p8j&dOhqrn!1Xd*asGeP4H4 z*(eK#pJ@`b(oyc&y7nTcA&&PJo;R(2Q}otL3w8(?OrGjzxY1(NR%(dN?cf!HHbRu- zaUuqa9%fm!R>|ex#H+p}ls>%bUZbYH%eQvjthZIS`LBlb;do2%yu0FazN^#1H~%Qi zkH6uVZ~1Cgdx-hAZ;$%RBb`jAn;X}4=U6RXWpj3K$A?e++DR%GZ_aPdn{Cj&$|R8U z#=9zi9Pe#BZ))FdYLvdS-DL-zB%bd3TEWvK*S2Zqx*rquxu?=vnKt<@?+n?}6%S9x zXHH5{YrJh1%N1H~FF!FaXycygJXy#GSnc|qpLm}p{J5c$o1`@Hj_8%kz zYzeAa>&fYEe&U`Trk7Q!q>tO|{G^>!;$E^);PM37LdP?yWtNMMyq~0;svooe)c7PC zwO+gKySzhaPiGPzj<*cYn=N9pEpQ$Gt}kQi-Z}^`cF5WPE;Dwl3HN>Ng<{TM0_tRI zyOwQ^w6dNZb$TH0bn0w7LP1od>z2D~)74KU9Z$f|hsyE1%@@PCx`We?-Z$TqZ=YeM z+tBZpaUdbFCXWynS2pz|ea~U_fd%74jMfC)jP$6?KP>q2DJ{a!V~<<6&k<=aiA6Yl zEAYHcC(cfYGI`g$!qDzQzsjOL=XfmY4GhAbk9})=TYBc9hFh-p6ar0Bd)(DXJTK+< z_hq{sEWI=;%UsA_~pII!Yt1DhC6$??Zd+TEMWp&ro;L@a-}$0CJ2al6CR zoG?vIx$w@Jfx)K4*~_mElx8a2EUVT27&o?p+t9yFE_LPTnq~1uwb3$FeaqIU z?i$lby5^PLo@spuu1+-O(8_ho;bXU4qrr_$}a+eZoSs(Sp;_aJ^8RgLF8b(;1qmAuZ7 zbA$GR)src+@-*u=xW1lke`znT#JK3!ce0D3KFB%eyhv?NJVFfZ`=V=kMcuo4T{ zsm+cSU8SoZv_GpdZy$NhHvhM^Ed`OBblU{;_)+_v+`5 zPG%S`Nv#+dyUOxJ!0BnG*WZtEuI3GXe19@e)Tb!x>T!a0F8jJ`<&%o{M{-l7aJ+SR zUOD%2rQqHvuk5c6jE7Zv%ag83y_^%re$iNe>r(dj?>Aa!AGaA5bKTE&<$lNNWs#T1 z=!ur6t&9A2Y#No6c)A8}-+DZ+<>OWAdmBdSgovG1STVJXYL{(%Ptl%#&YH2}zRTY{ z+Qe5Cb2XfcYn0^NeHrihH#kM~XstLU?0D|f;$7w2cI=JD>Dz$kEmPX|hSbc}f1BGR zRMuDQ{c{Tq7h}?#_+svf*0QB*D!WeEjZ!l(S{3?Imuly3v*x|=-k@Cx6FhDtIo?S> zw(SXy_aUBFS7iOPS7}e5zc)zzkXf%SQ#S4L^6ty2r{>+H>wJF~ZqV~+PehJMiDakL zd9F68&ictqD`VDOo6=XL{?KXTxYgTnylCvh+K6YUe0N^Es6L8rDf!Y7ttl+9P+`d) z_xL=gqZ_pRPPbPq>z(s8-|9ix!JYaGYUE{3?!J)ppddYH;jJ6jG<1wN;`K#q_^ge% zKj%sOs_oOmZLYlgo**={)HrW%-Z#lts#itziZ{aR-oFFH;$~E#^`$rQXV(~VzNMTPDnmyL4 zTSHF0KHxDmI$APP`oe|7J`~gD=^Btw}#Xy^44VUz2+IQyEJu!MXbY=_P2Yvm4p^uNvBS&Q_bJU zKl_M5qH=6EHA~#b)^JWt%7)4LsVbTj^F!Qmk}rUWrSCHqDeQ?I=h7-jUl**({93-G zR(YmkqiBPb(R)>im9`hjk9Af$Iw#s>O`DaqasHi%uZfSkMCDI(pTCnSSGD?teB#WW zr}%Md6Q1`*;@Ty;HlID_HLO#JzqWYZSA%OGMx9Z5k>;?_CS-KqxV`>z7DC>HNa?*- z`jfT`tc=e$a=G~VfaTlSc19O_uTRA3`y9_(a;ZpSmm%45*~iPo4O0%h3yAm_)Zq|* zLONLe?i-`oUlxj&+a(0)&zkzG-FN<}+Zp{XQsTVMUq|uvRcbB#dKuqepuUc^5qFBN zD_otJ+BDiNzUY#zm&e-G8+Sb1tSaqk+n9Py%=$_CUdc}icipE6@8VbWl;H16zZJo^ zI5s`UwMcnK*OZSEK*X{yvNdZXR=#$ecz*2W=W+8FaNgsNYdQGkW9i%D*%3~DatUTP zbRHGNOV^mXx37}kSETDv99!bsXHo8KRaER?`?9e?z!R-Ov3OsyNMTR(o$}0neMG^| zDKA2}EOgs-WhWEc3{&Qo*C@)`+AbRS)(5$y)|;;Se;_GOFH&O=GoA0-UCloxN*5ImOR;C zq9Sjx=G$z`(8Kwe`zzy3EenhFOEfIH@cqSWJa2GcY*^H4-Uj>VJwGnL?(uAR6GKp2 z^7{B<$1Bf00yBUb1k}5F1*W;x7}!OilA*^=cVQe z(lLA@H7#n$FEytv_@F3tNESuvAkZJ?#*q~?Y?O3g~f}~U~R8WF;8ny>2j&R;7I<6&}b!@llu2TB>FXunF!_|4@ z;l>wjhj;Xpj}kMhoxM#(D4^x?o~dUilY4=KWrufoUj0HB&XNxlr5%zQV;Yv5jO9@J zutBK(l5k?mBH_A(V>d3pDRfJY(#w@FzuH54BmYT#!K%yC=9O^Xe|o4x=$Zl*$NL`7 z%kv?8(bJfUN3j|@!HH5^(oY5!cxNxQQL46?mF5!AaGdycpKhtuHiFud6E|bGO$hQk zVjV~C_;IMrR%M@3Z}t)#ZwH>Yp^wnqD1Vn$*~?=sKqZx-!z2sWBT z-L_qNiO#ac_V?5HZTK1_7LxsIveUy$9A-*1e!1M06*OqGhv0zg0orLk? z^1h8?n{u;=C1Lw`-&~xdO!7LFKxool`Ci}$K|VVE#<3F(PwUEcwwk;yfBkv%boJZ1 zc>8|D^IrQH^0IPlP08B1W~DB(kMh1ccdO+!nX~`#_XFaTsPFspZ4XbS%@20>?{0m* zHKz83yJ1wilcq=1M{YsY-JMJDyq$R7Ljh}g=X6Xg%&vNvxr5+YdgJE9fFh#P=h0ji zS2ZRHe#|ncsQY>$th?Cksd)Yt&JZvAMmJ8~(Q6;Z>C03W+{CZd!jJa$sv`%HlIfGmL9FfHDXMv05zvvkN)<*338nQ(3tlZwwq`vf536FM^ ze3-;>?tP(wqvo7lGxR$>E!ICv*|d*i?K`)|RWXZV{a-m}9_ByKJ?(+S*6!e7J+vmt z;zesGtc~dXc*c*l<&w#7t@p_6b=vxPs<-mvBA>Wyj=M2e#?}i8U2Wg)cT#$3iB@_C&YBrdu6Bg=<6?8f(2i_1det+TYW! zpw?gN5`p`QujUepME3!`@b_m!PA%EkAe+5oQ?dVoHXWHcW%=rPYE=PialBvgytQAN zUs=D|mzmcy#-en)?$&jEfu}SB*F-dZG2b%KHq&aJ<;N#mEO-x=?#VX2uv}c^&PnZK zB|nlkzpb;r!?PgtG>-Qhp7(+2)KlFviQ12*F5OEuIdDSS)Jse1LywJq*o=cp?N6hF zJ>49Hs}{WsUb-!zJ#n`iNPp2HWin6P6yO|k@xL9`R!Sj~9sp_&x_UlVN)b;h+ z+?}=cqPLRU??}-_!xyyO{FY?d@_l{(%G#WwAe-KU3gf;XdhoP)w~coCyv!C}+jh(8 zJ~&=fM_3y%)g<>Z*9_9Ygc{XN31i&0YnAQLE>-vHD<|C3y_|4%UCm6DO|EMXbc?5z zToV&qbXah!d6ZanrHAQGVTv?)*FGR(>D$L5g*~ytQCZ6?qAcCh$z{LsmcA7SZlzD; zU*lrXt~jUm(}~&Z?w~vGO^|4w&tAgn@?U^IQMDnT-z_RFYR;j(sse|e#i6H zM|G`8hzKL`em2h+DJ2aeWwZByd2HTs)a-cerC z?i<}4_QYlW9xqS6o`d84f#Iy6j5m?K^dw-tUwJW1 z!45k$9NKd9DCfL1+DFar6QEWcO?B8ggH%+ua4kInZxgCE!AsMvaW0N!b7bdFZ#xX-d#PawSV38S!T(}QyMpFZN1QTQfE@U$zE~P zHnQGJHGt>+O#N=5T3?uQrahowam&k-JAahNuAW7ReI1jgx$kE-i0;g2I~v5~3d&xeb-v}; zM$t$$<;1++rJKy+_q zd3QfB>utWLD^k6;yK+jD+KjhJyJ%u+2}aE)lU**ms)SeN@)_>m^G%J|Aagfqlfvik zlkaU&FPiH3aD%S2{^UbwtqAcVeL3;G`>k^8S8B)gz59ANYolw}u4kWvoAxNStX#V8 zXrpLx;CBo0t_&y6q@<2pJ;Wxy2&S!@plVp>vdGa>!zz z^ldw5wcgXRX52p>Lx=`_(f4Io8}T6hirgnoqZK|+Cg;8!sCzv3hBoE-Vw(+eI~$%@ zZcg`ToGEhel`-#PksHUy=%sLlrOQQ~IdsRI_nMUXE6xWpYk&you=i+j;d!^IMeOt; zt{tyfzwbc3V_D_K4KbdZ^LlE%|oafRe@?TSpT z`<)x(wwpJv#_@9FdHW5_17d<6c3bwZ66?(R*qn4wcCM&_Y2x*<$l$`DQ$8JZ7Zo z@wap*$2)ly@!e`_ZhJeh;E}}DtSekkDqn11@q5_^kD=`wx;Rr>n` z*GVK7&FpkP^3i1Miq9V=KHeZ>quI6hs(3rS`Z=fJ!8uKj?JH^$h5mH*~!+*R@q#G&}x6 z)A%$lh1HMUb_SjAdNkkQ_ITxu7%$^_TGo5$A&5ZCm{l9D=T23&%gT;pzwWeZ zZ?}```RHrSuTljTxCi?SJhcvbv$^BplOvJitUry8@A>g;bf)h*F}v~uT28j^B?S)} z5|244rjX9~6-id74D1rZ@$%yBAVE%g`dYSu+&X)QZkFc$MwPI;SrN&n(l_WD@An@) zkErA_wM95(;dPSvf(u`EJ$T%AdWC6gpOKDb@V0`A&_np~I_o<`n7;F;FHyX9=>0d^ zSGxkieHA&P4l`y38K0bcYQN)bJ+lg@>Z-dBNQ)GXZM-qwd$!y|efOw!mGu=1j^}7f zho5+U5v|3s`U~_uBi2UT@Ui63StaxI(O2szT?I)~zH0Fn%~NP0-m#<$30Kch5m}Z; zHVJLEFV?DTk@S9GSlpyHZK9n{u+wa%wcAN$2XMUT`$(*fXsfa3ssg#cw=YXJd~EO2 zBV-GOMJ+Z0LFY_fhD<*?m#b33CNVUCG`W7kv`Gfib3+I-&zB{ykIO%QO>Kuo&a6o| zUOqf;Va>GTHEOS(_#M`-b#>G7wCT5t-D_67MZZUGs=ctovH{ykCQmp+yPn^BL=)aA z?XcikuYk@dB}0i2ifum6EOd{MWe4=#Ce}u*JCh%Od$VY=&%<`9bBy?y_ls_cj36~Ob(+_HC; zCFdU5j>?F!i%6|YUmpqS?2hbyy*=pp&E5IoCvA8V3$lV&J9C z(MPS@9yDgo_fez-Jlo27I_`kNjms39g7s@mNN8@wvV#zwcZ;B?$GcDUx4%ovP4&FC z(=2k?7V1sADnhxaYFGH1Th$S{UOQzar5k6LxxC1kEK_vlIUn8h!W$!Bn_R28s-wk(qO^WF4*40(e`u9&Ut{q{RIZ^uu)`Y0@t-V?1Jn21fDEEjC(P|{z07p^dThs{nj=qD$4=q4uKl=i^}HelQQa7a zmG^9Q8}c5=bg2~<;CMyxyi;js_rH3$Ofsph!e;G(v9Tecf*a2ewsfg9v}w0;ZwXtm zo4@PFt+2xb@;`2ct~_<&OhN1YO;eNS6ZMIgC#@_+_nKICn1tuO|LkG6`qrTROP-ad z@Q(G$Xe=u-v%FHd(b=cssA{3!{>ASfo#!w;ayo9#=b9Os1Mh`+E5|4m-QGG-`nHVE zzcvxaI~mWby{k{I-=n#@-ms?Or2?Ps>C@f57jsudWa#poHnX>`J`vul7aeP&I6t#< z>Pm{2Ri{{Uk#O>K*XF%GbL5-4@#|cy@1a3b1ftcw`#Q&OX5=MC$>x@Eb`?KJfElX5T`HedukYO za3tm9rKGUarAhNfYcwr->lH)Wbo0Zr*zsShTkTD6_wF9kz2Sl5sJr27TRc~;3?s)? zDY{5MStVJT&3(On=F?X=-l=#yynS2sabTSA{rpig4f(`wKHf7~xbu7tS6XFS*45XG z^L<5B%H=gSoaR2xMHjs8J?@*~?YA%169roH3RRov^4wE#ysYoNVftE5&gFkgFm^eb zJww8I{>SecUrdcTJZ%^9c*+DhY-~HSf3{FgzuK(GaD!#N2GhMVK37h%nk3c}A<1b* zsLouSj^mw%*VjCAK}PmIj>ye2&W_4P%WhJqy`H5n)J@6kJUzMlfZ>4cEy6497GYLFz=Ka$)qLX)i{-$B!ZX{&ePo~t< zmtN66k;b`Z2d`XTnWJNeeSy*5NB#BY7B96YEtXhg6gAVB_dx8?*3t9xxY1mN#Vd*D zRdd+3tt{dsXTf>pZiR>5xq^I(yN`(ZDrim>?y!E#la^sMb8gvd4cp4s&kyz7(^D9b zK07tavZGot?|f|LnNj$4`{{Vz6)7)n%90B&xP>{LmuNmjYhKoxwIgLo!lg4WvPEVU zwC5?VzJC4a`Z77L($n1m4FZQ+&v4Enl6uaacNj(Q_QTH$rSQBlr&YfU_>{FI2B+)| zp1R!7++xDz4|%<>MQ)6*&w1oJ^|arjMbx!qQQPU)Wh2cmZX(WqHmAYeSAOFAEor%h zJF-yW|Nm^`g#0cU1>aXB5TadZR7Fqve{KL2H<%hoK{4E5@W~4t==j$ST^Ha>qXj{S zOyq)ZG!Ajyukl9ChqeH+sSnx5m+A`d2!+C%05(No6uNT|mF7wag|MN@V`$b9$$zs2 zpo(D|YmZLQF$J1x73|Vu2A0j96gA0wWd}vA~E0Ml3L5fe{Og zSYX5gBNiC3z=#D#EHGk$5etl1V8j9=78tR>hy_M0Fk*ob3yfG`!~!E07_q>J1x73| zVu2A0j96gA0wWd}vA~E0Ml3L5fe{OgSYX5gBNiC3z=#D#EbxEZ0&AG>+ndCEj~$N= zJ-|hg>O&7C(`bq`Ul%VoDvhFO6F{NpNvbMK(y8GTUpECwbxAUf>h9y~2JgBV-1-L? z8wx=0`9#0(b7%g@k9CfIp9w$9#5VNKP9%oczY&%*f(Yn+na;|8Gj_M;8GqY{OU1_UsV(fcJ)7; zfL1^opdIiI@E-6H&%9)Nt_ z0k8_-2ygR>=Q004mmC zfFEEvUYk&fP1W*Jh0h9qM09Ak* zKpmg~m;;y#&;(2agg{0fGUcfG~g`z#k9*h=RC!fKoW#0uYB|^p5Z=aC`)? zAFvA$1y~2515g`}+H};0qxKoK$LRgvS3wpHhzFo{HWl`1fJ6Xlrz>Dz0LTSQ28aS8 z03m=$0Q4?ubRG_f0mK600P6ue0Gk0xfE2)1z;?h!Kmq`TA)srNQDuPb1aef^hHLAP zpH2gyJRl!MzSs>wbszcH2fzV<1OWMwHh>Sn3*Z4j6s#Q_1N+ecZU7g66EF%uWMUlb zCjd}9bUdE9mxev!769-Am|g21cSw$WM;tH}fZ7Ey0J0^rAF?NE6GQ;0jX-UMAV3N* z9Uuvq2haj&0_FmcUupo5pCW%%1t9-b1|WY%evSMa`MEqm4lo-a3z!9%36KHI0PF|s z1Ed4?0CoeAPaz*p1fa6n1VCkq$~Fdo^g{WM1gr&w0+2rh0(=0v093a<0H}T%0So~8 z06oA0z(T-$fFbjI4eTudW&l%w2>{h+bi5c~4zL1P0#*T*0agN*0#*Q)0PFxL9EDi} zYymdRb9>k?2doC5_$aOezzN{UJa>jY8Q>0}09*jB05^a)zzg6BpfQjAVebd<1q1-- z090p#0LT`|M&W=k<}q@R2{0zh_CnXK1FQ$c12zCQ0ulg808|dU0NVlE09yg5 zJWzNVAO(;LK-cU5>;z;15Fffe6M(Ko<(C2A2cUHJ0#Fz_J_zUlya&7myaBudyab?h zUjUv09s`^K4*?B;dO$7U0pLEM5^xW27f=AW0!Rj223!JM1Y7_hea-{U0?q)A08Rr= z0CE9`080VcfMbB;fE>V40J`=t0EMG-v_AhB18xBF0fm4HKpEgB zpa@V3xC6KiKJMN?U0R-eOdv?E=b-2Xa}?b-T_d$sH_k^0XhNG0c!!lfG)r{z*oQ* zz-IuGM+1Sw4n*h{cWi2&4=0Z`8-3IR;)|bRCi--4Pek9qEL^P+ubj zm=2HxJSV|F*tnN7_B=Wcs&gEJG+_odXK-Au^79OA0$e{1ia<<6Mj%Fd+1)W5PAZy; zs*37rVjzLq7@ctKNcE(U2MR2S%3L{+NP?vFZe^R;5+_BF%u!TPS5(HVHW?&tkMz&k zk~CklB`y$W5=uuPcS}NBoG(b!6g42q;9Hu$kj_LedGj;`rK7B#gpM;iQoRDRgMQSZ@%#ViUdgH2<-05Jyu{1JP}SbdUyifgNEh21JTMqOLdx zrL!L-Q$W(2(w*tR|HcR;C>afCCw=LG@D5PIDspA{JM%Fy7@NAHnkrUHc_EJ3w=x>n zhin^=s6iZHL-mmdB>QBd739}boI#=iW>W=EXTDinmPq9{8QU9*Nt6{ep&h1>T|jxl zwzm(TP2P4Zjgx6>Wvqsc1-7-5w0o%=ZQR%rm`_vb-ejLN9y)JikkAw)QB+Y>XL#gz zh$D1e@x)1T=5tJf=|=N)CDT2iJ$VtVyI0Gy79?QKxr(aFG+!TgP=N5Dff|}k&d9+e z$|yf*%z`v9`TRUs;?2rwAW>FS(^OQ!W&+3toTT+ik70< zZ(aowP4FG?D%LyYm(ZS=@*SSP9VF`DJCGkYIwhFm6G+e77Av~GBjFj5BT7|K4af)= zi441KS6Z1o^P;YnFvmd%5dz(46mVVG(sim^%EyoTD9nNCC)x_(3RJhF@`C84nsute z$ahqc;pk*W9P77+n+3LegtFt%1H))Rz^9)@R-2%=z7Qt~awi8sv@7>qY74kZPq8I| zlmI$8;idx7G2+kmx3R+(r zc=w4%tXzgIi2@1q6VXf4J30*ZKj>#m_JU*@NVo&5U1^nFoNUQ8W}NdfL`UV8^+IgP zW2Qv&<65f;{2L#zB|RXK0=C4hKQb>%3$(E%Q@9!FyqPaE=JSGux7ZRbkVrzDxwB4c zs`lMCW=mFp1hq)|qnEk`B$T^B22Z?yN702s{x@fj!D@c$H_+C6vQTSf*oh`{_ z#z_dsnDsPa(Rj9m^;Z4WRuVI$is}==tH5&<=fZpgDjaI7=$lOYFC3l`0TOTm}2f&}@uvSIq_ z%iMfWrYsHAK!Va4FS@Wb>s0U^wqy}VkZwhU4wIR!oCa)(BS=tws8@83sdIb3VM~0O zah}Av8LRAke3LDS0}0aLU`~{0#~7Jvwqz$rkOsNNRL21QS($9f36O|_uYuLO5HpABq~ar&HAgHD&J4*bDxK zdQI>|asbvb5yq8BH7wn=R0@+QqyE&z!`F-I3i86uj#KoNu7U)O9MoWJ4s6J;&yJt= zYEyC!3G-g84|b&mqXv*r5bJtAH+``^CQ(6gu0kBt&#CAil8J~D5X0C|he0R?3F?`$ zHe6e9?8k&7Ac1iM(tt`QVXycPiFbRWXceRZ66j|U8|zKgn=vz4H%1q1WXql!R?r#n{?O*B%m3J^8qAC zx6J{bHyq7cZ?h#s*X>_NH4q2&KdNekUS>MVzEyj+i$&2g0xcU4zU%MMkpN=NkzF7;s`*T@Fx=d zcU?$~QH_e?9GFdqW3EG}wys^@xjbkA#8Fk8i`e|A0ciY5Sl7`Wreij7A2S`u=_6o6 zHLGo@%i1N0vQZ!b3n*&As1po;O78HNP}gM>ZjVPAFm%fW2~_WB>rM5irY$$)VYB5i z<8Xa-ebx4IlQKI_pa;c=>J~=$)ODiu*y@|foE#i5sD{Qhdgyelp!4B}D<%sH(rl#p z&}a}0fbz2%B*<=sVlv#oeIqDz;S$}A@ zOrV7MUi6BB4zA2+?`1LFFt6$a3Gz4lrL`80pURrCbgp`Lk zT7!pd1_`pkv9Nw$wf$3|g+=9qj4%$WVQVSnL98?t`juuEzoNv8rJ&Km6 z9p>baf)M1-i(rpxiMUj=bm3U3D-Z|#19`j$NRV!>D~gM<`1W&gax8-osBY20ut&DG zt$8;i+?Rg^rW;lYsUSgGtMGKT%NYw3IXTur2=b=KutyfPR4O_+xx82y;xPUC4_d7JbVIcfB-3H2fwW%9k@>{<>poPbFkwPk9|Z|Y=bh_H+ow8(3o+fWIOjlua(u#9 z31CAS0NVnlB;T4^%-LVF4J4@Kz&d{9Ko61^C9IlW&|hb*GZrMw+E@;8 zkjEQ{H0_>OFeVZt$Zo(E;z4zR=^Wv%_m;2OR-cTS5@4g!DWMdQ98<7=yiBmIfgNWr z3}8_y@U+^C>+etM#nQppj!82-vbq1>DOvULyFmh$M!MYq37R4I2vEHG)$i@WB;Z%d zgohx3DjOZvdGX;B{p*bOO%1hg1~V8QvSyJBuhb@6RDYQH8H!Dv5Fx`Tg>28@ps;=i zafkzbBkF`Vg9Ld<+!;!hoR$@;SxC3Ju$BlCH1_{qIJc*QvecC+0qb~>>AoR8uo|nM zIChiS^ZOVZmeb0a3>#$ZDHrqi&f~@6V0D}I#gApCk3JEjG*C{NejPZAq1!>Vddq!> zd*(9J0Y4bJH~Y1xg}EkLLQzrw(9R9g39NQHo!{34|Q0u zsV#o<*;O?IbghfVZJ>;vdGA z%wEQu65vjO9CsfP%;ZdQLoEf2Q&FuSVw?ybGQ@ZkwEhelpi$braTc{JFMgQK$$vKPGCf>n6`weQ+SHmVx|oshh(2HZ*riE$G4!Kc-!`ri_rR`mI5Td z`vFKWi~er6D5l*sA-5ACorQd7js_;*-wbTb@%8W4iDI_BzmKo6bTAu`U0taGeo_*< zCW}j1Ct|u`)){&Q5R;Kmc@eO}b=9ZOrNb8!%h)-!;HI9yItP8>~*8WOOg z8I>He8>Ev95>&G$a;*@z6pt(8CTjOVf;5O&p*LEAyFgGiPsZUL81j~(cm2vx_=NQAdFD2_PJ&J zd07fbpbQWjg&q`0rO^qYa?htk6y8E}K;%0h(S&qR&6-@geeBcqXL7N0usN*>NKl!o z($064S9!RDggM@Eqx!g#;PaIe-cToqU0g~B32GC;*1y**)@&EenaH4lVt$^Yp{i^( z#DTsU)_#=jAsy6?-ddsjl_%-aRwQAp^Pxw&0wAYt*0;+ZQjU0H>0o8L2I8Qxr4rv5 zXNm3S+du-ogZ%CHddezOFOZ_TEu8rHh3(yv!w?6R4_MTb`8Av^j}rNMvQKb=ggNdF zgE%lmh_(|meIU_!9=w<3i8M;E4{|HDF)|j5%pIVm01Y4(+=qlXs7!r&w7yw*TBEgf zbguwx{fGGvv#mM~aZo9U@SnXFzSV~@dIDdByNMt{^+z(;>`Z{L8CnZ~P8(_chY=*R ze2STIY#%kt3rZ{w$KqgiGlFIov7IklmtyFCLIxzLmVnl-6p9~-N+&#$z9$oJ`py80 zgZY6K#6h(_&tPBWV#4*$%s8Nd2a`>6Cn;@uu^_SzvH@s4v~>a?4)UtdE1&0b&0B>0 z4S6EWkcZao_jIC|=?op`4>LV9D}W|$=$YOXkRt1pB}YsU<*WGC?KowQ3Dv%%_wOd+YN#?(B2PCL`z&eka z5|ap_1I|uZYsqYP{7CSSBdi8ANb8JVAGUD=#9`JfkWjs;frQVFOOk%j%jH1A?9HmQ znRVf)Ug4Yd&S->>>H?&*Mu(A~JF{0uhcvtKG2?)DxWO&2K#D8j!TzS&Qf=EPpa#+f(%VEQHPu4914&@p z5cLO2!PmzH+6lO?ea3Ll?ocuh#s>C*ISFXM52a92(RMLvwYfiAgOC8SpC61NZ)HBJ zoD~t=$H@Ui*fuoV&~Z-dF>>lXdz$m{G-oSL4pcmd@wq;u6uflP68vi#ksmOY#Rk7_ z^yuqW*Q@(qp`KO~>NaS-(tzPryVDGA)#fdqgvG&nnIZZGNQm{VBo-S#M?0{%8RJA$dViRSGh5h3 zLq@A?RP5q%Z&nvtnM1wM5|D28l4(;!(oPem#eTu^?f#*FgbP68g^btntyeSIKWibqlj=sDp&rCia2^jSt$#NlxaCl|kbj zRJ96I-Cu`$1wl05 z04h8&ayRvT+?}*yqyfXz|Flldko;-Qn;{u`m0*<_Bd1AoPSz#ui9>Tu)MtSwvc3`J zySs`nD#3ggNYHE>7EyQ>Gwi08;u3yy?|x|ge*g zswJw8Xv{Z9S;dig#pOvQjrZ^OzXA!?)2a`C6Klzb14mbuMzCg-Drzvgbs^Kpu9WYz z;vW_cp^Tmh^S7b%^Q%SqIqD!~rjQ#pmrE6l$dD<}DU{z|)Z_i-Bs)xE{M1-W1 zhPEZ66pW7#fHXqNM+En$~*%CUQFNg6Xw*2!nI-Zi#|*^(0= zLE|^uajokqE5c3Kk`j=>Qf&16>ZamMha+KZ$qQy2aj|`^xz{A8u_b*VLA7L7YsI}d zA&bpyiGUTO?e(^tGcJ~H0rvq}`H^QzE@TumG``7BXG@GgG7i`(>~`L(u8my{_xPbj zM0K08jB)4NXIfW5-NPALoE$L4!RC$YL4vHa{mCMZa}U;RWJ~sf1QrgXbHtyP)}1qg z^&M86n;=2!e4LFNB6e?5gZU3jGDHgt4=h7#@W&Pjn-vTl=WldFZM-v# zUA8=2vrgP+02@7_rb2nB`H$M4W*=yk4+Mi>C=*%q+HQQxjF;fObD@~IRt zoqwp?vjwXQ*s$g{#6y0~dQu6kA25~)e!nln8uy05uXw2Npw*{cXX?cwrhfu9W*aYN z$7ri6U)}KAz2!4w^$Tl5VEqKUO-jF2@}y$N2edNB99aGFo+~zn9lD?UIFG+>�%{FBcb6 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..7506191 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vaznyaab + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..6dacc0e --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "vaznyaab-react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "talisman": "^1.1.4" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.16", + "daisyui": "latest", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.4.32", + "tailwindcss": "^3.4.0", + "typescript": "^5.2.2", + "vite": "^5.0.8" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..3ac5cee --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,63 @@ +import { useState } from 'react' +import { vaznha, heja, set_exact_matcher, set_fuzzy_matcher } from './vaznha.ts' + +function App() { + const [input, setInput] = useState(''); + const [output, setOutput] = useState([]); + + function ganjoor_url(vazn: string): string { + return encodeURI("https://ganjoor.net/simi/?v=" + vazn); + } + + function heja_to_unicode(heja: string): string { + let s = heja; + s = s.replace(/U/g, '⏑'); + s = s.replace(/_/g, '–'); + return s; + } + + function display_vaznha(output: string[]) { + if (output.length == 0) { + return <> وزن یافت نشد. ; + } + return ( +
    + {output.map((vazn) => ( +
  1. {vazn}
  2. + ))} +
+ ); + } + + function toggle_exact_fuzzy(fuzzy: boolean) { + if (fuzzy) { + set_fuzzy_matcher(1); + } else { + set_exact_matcher(); + } + vaznha(input).then((val) => setOutput(val)); + } + + + return ( + <> +
+
+ + یک مصراع را به فینگلیش وارد کنید. +
+ دقیق + toggle_exact_fuzzy(event.currentTarget.checked)} /> + فازی +
+
+ +
{heja_to_unicode(heja(input))}
+

{display_vaznha(output)}

+
+
+ + ); +} + +export default App diff --git a/src/data.ts b/src/data.ts new file mode 100644 index 0000000..c933b2b --- /dev/null +++ b/src/data.ts @@ -0,0 +1,195 @@ +export const ARKAAN: { [key: number]: string } = { + 1: "mafaa'ilon", + 2: "faa'elaaton", + 3: "mostaf'elon", + 4: "mafaa'ilo", + 5: "faa'elaato", + 6: "mostaf'elo", + 7: "mafaa'elon", + 8: "fa'alaaton", + 9: "mofta'elon", + 10: "fa'alaato", + 11: "mafaa'elo", + 12: "fa'alon", + 13: "faa'elon", + 14: "fa'oolon", + 15: "maf'oolon", + 16: "maf'oolo", + 17: "fa'laano", + 18: "fa'al", + 19: "fa' lon", + 20: "fa'", + 21: "faa'elo", + 22: "motafaa'elon", + 23: "mostaf'elaton", + 24: "mafaa'elaton", + 25: "motafaa'elaton", + 26: "motafaa'elaaton", + 27: "motafa'elon" +} + +export const VAZNHA: { [key: number]: { arkaan: number[], desc: string }[] } = { + 1: [{ arkaan: [14, 14, 14, 18], desc: "فعولن فعولن فعولن فعل (متقارب مثمن محذوف یا وزن شاهنامه)" }], + 2: [{ arkaan: [1, 1, 14], desc: "مفاعیلن مفاعیلن فعولن (هزج مسدس محذوف یا وزن دوبیتی)" }], + 3: [{ arkaan: [2, 2, 2, 13], desc: "فاعلاتن فاعلاتن فاعلاتن فاعلن (رمل مثمن محذوف)" }], + 4: [{ arkaan: [7, 8, 7, 12], desc: "مفاعلن فعلاتن مفاعلن فعلن (مجتث مثمن مخبون محذوف)" }, { arkaan: [7, 8, 7, 19], desc: "مفاعلن فعلاتن مفاعلن فعلن (مجتث مثمن مخبون محذوف)" }], + 5: [{ arkaan: [16, 5, 4, 13], desc: "مفعول فاعلات مفاعیل فاعلن (مضارع مثمن اخرب مکفوف محذوف)" }], + 6: [{ arkaan: [8, 7, 12], desc: "فعلاتن مفاعلن فعلن (خفیف مسدس مخبون)" }, { arkaan: [8, 7, 19], desc: "فعلاتن مفاعلن فعلن (خفیف مسدس مخبون)" }], + 7: [{ arkaan: [2, 2, 13], desc: "فاعلاتن فاعلاتن فاعلن (رمل مسدس محذوف یا وزن مثنوی)" }], + 8: [{ arkaan: [8, 8, 8, 12], desc: "فعلاتن فعلاتن فعلاتن فعلن (رمل مثمن مخبون محذوف)" }, { arkaan: [8, 8, 8, 19], desc: "فعلاتن فعلاتن فعلاتن فعلن (رمل مثمن مخبون محذوف)" }], + 9: [{ arkaan: [1, 1, 1, 1], desc: "مفاعیلن مفاعیلن مفاعیلن مفاعیلن (هزج مثمن سالم)" }], + 10: [{ arkaan: [16, 4, 4, 14], desc: "مفعول مفاعیل مفاعیل فعولن (هزج مثمن اخرب مکفوف محذوف)" }], + 11: [{ arkaan: [16, 4, 4, 18], desc: "مفعول مفاعیل مفاعیل فعل (وزن رباعی)" }], + 12: [{ arkaan: [16, 7, 14], desc: "مفعول مفاعلن فعولن (هزج مسدس اخرب مقبوض محذوف)" }], + 13: [{ arkaan: [9, 9, 13], desc: "مفتعلن مفتعلن فاعلن (سریع مطوی مکشوف)" }, { arkaan: [7, 9, 13], desc: "مفتعلن مفتعلن فاعلن (سریع مطوی مکشوف)" }, { arkaan: [9, 7, 13], desc: "مفتعلن مفتعلن فاعلن (سریع مطوی مکشوف)" }], + 14: [{ arkaan: [16, 2, 16, 2], desc: "مفعول فاعلاتن مفعول فاعلاتن (مضارع مثمن اخرب)" }], + 15: [{ arkaan: [14, 14, 14, 14], desc: "فعولن فعولن فعولن فعولن (متقارب مثمن سالم)" }], + 16: [{ arkaan: [9, 13, 9, 13], desc: "مفتعلن فاعلن مفتعلن فاعلن (منسرح مطوی مکشوف)" }, { arkaan: [7, 13, 9, 13], desc: "مفتعلن فاعلن مفتعلن فاعلن (منسرح مطوی مکشوف)" }, { arkaan: [9, 13, 7, 13], desc: "مفتعلن فاعلن مفتعلن فاعلن (منسرح مطوی مکشوف)" }], + 17: [{ arkaan: [8, 8, 12], desc: "فعلاتن فعلاتن فعلن (رمل مسدس مخبون محذوف)" }, { arkaan: [8, 8, 19], desc: "فعلاتن فعلاتن فعلن (رمل مسدس مخبون محذوف)" }], + 18: [{ arkaan: [9, 5, 9, 20], desc: "مفتعلن فاعلات مفتعلن فع (منسرح مثمن مطوی منحور)" }, { arkaan: [7, 5, 9, 20], desc: "مفتعلن فاعلات مفتعلن فع (منسرح مثمن مطوی منحور)" }, { arkaan: [9, 5, 7, 20], desc: "مفتعلن فاعلات مفتعلن فع (منسرح مثمن مطوی منحور)" }], + 19: [{ arkaan: [3, 3, 3, 3], desc: "مستفعلن مستفعلن مستفعلن مستفعلن (رجز مثمن سالم)" }], + 20: [{ arkaan: [16, 1, 16, 1], desc: "مفعول مفاعیلن مفعول مفاعیلن (هزج مثمن اخرب)" }], + 21: [{ arkaan: [9, 7, 9, 7], desc: "مفتعلن مفاعلن مفتعلن مفاعلن (رجز مثمن مطوی مخبون)" }, { arkaan: [7, 7, 9, 7], desc: "مفتعلن مفاعلن مفتعلن مفاعلن (رجز مثمن مطوی مخبون)" }, { arkaan: [9, 7, 7, 7], desc: "مفتعلن مفاعلن مفتعلن مفاعلن (رجز مثمن مطوی مخبون)" }], + 22: [{ arkaan: [7, 8, 7, 8], desc: "مفاعلن فعلاتن مفاعلن فعلاتن (مجتث مثمن مخبون)" }], + 23: [{ arkaan: [16, 7, 1], desc: "مفعول مفاعلن مفاعیلن (هزج مسدس اخرب مقبوض)" }], + 24: [{ arkaan: [10, 2, 10, 2], desc: "فعلات فاعلاتن فعلات فاعلاتن (رمل مثمن مشکول)" }], + 25: [{ arkaan: [], desc: "" }], + 26: [{ arkaan: [8, 8, 8, 8], desc: "فعلاتن فعلاتن فعلاتن فعلاتن (رمل مثمن مخبون)" }], + 27: [{ arkaan: [2, 2, 2, 2], desc: "فاعلاتن فاعلاتن فاعلاتن فاعلاتن (رمل مثمن سالم)" }], + 28: [{ arkaan: [16, 5, 1], desc: "مفعول فاعلات مفاعیلن (مضارع مسدس اخرب مکفوف)" }], + 29: [{ arkaan: [16, 4, 2], desc: "مفعول مفاعیل فاعلاتن" }], + 30: [{ arkaan: [13, 1, 13, 1], desc: "فاعلن مفاعیلن فاعلن مفاعیلن (مقتضب مثمن مطوی مقطوع)" }], + 31: [{ arkaan: [8, 8, 8, 20], desc: "فعلاتن فعلاتن فعلاتن فع" }], + 32: [{ arkaan: [3, 20, 3, 20], desc: "مستفعلن فع مستفعلن فع (متقارب مثمن اثلم)" }], + 33: [{ arkaan: [22, 22, 22, 22], desc: "متفاعلن متفاعلن متفاعلن متفاعلن" }], + 34: [{ arkaan: [23, 23], desc: "مستفعلتن مستفعلتن" }], + 35: [{ arkaan: [9, 9, 9, 9], desc: "مفتعلن مفتعلن مفتعلن مفتعلن (رجز مثمن مطوی)" }, { arkaan: [7, 9, 9, 9], desc: "مفتعلن مفتعلن مفتعلن مفتعلن (رجز مثمن مطوی)" }, { arkaan: [9, 9, 7, 9], desc: "مفتعلن مفتعلن مفتعلن مفتعلن (رجز مثمن مطوی)" }], + 36: [{ arkaan: [7, 20, 7, 20, 7, 20, 7, 20], desc: "مفاعلن فع مفاعلن فع مفاعلن فع مفاعلن فع" }], + 37: [{ arkaan: [16, 13, 16, 13], desc: "مفعول فاعلن مفعول فاعلن" }], + 38: [{ arkaan: [3, 12, 3, 12], desc: "مستفعلن فعلن مستفعلن فعلن (بسیط مخبون)" }, { arkaan: [3, 19, 3, 12], desc: "مستفعلن فعلن مستفعلن فعلن (بسیط مخبون)" }, { arkaan: [3, 12, 3, 19], desc: "مستفعلن فعلن مستفعلن فعلن (بسیط مخبون)" }], + 39: [{ arkaan: [2, 2, 2], desc: "فاعلاتن فاعلاتن فاعلاتن" }], + 40: [{ arkaan: [8, 7, 8, 7], desc: "فعلاتن مفاعلن فعلاتن مفاعلن" }], + 41: [{ arkaan: [16, 24, 12], desc: "مفعول مفاعلتن فعلن" }], + 42: [{ arkaan: [7, 7, 7, 7], desc: "مفاعلن مفاعلن مفاعلن مفاعلن" }], + 43: [{ arkaan: [16, 4, 13], desc: "مفعول مفاعیل فاعلن" }], + 44: [{ arkaan: [7, 20, 7, 20], desc: "مفاعلن فع مفاعلن فع" }], + 45: [{ arkaan: [4, 14, 4, 14], desc: "مفاعیل فعولن مفاعیل فعولن" }], + 46: [{ arkaan: [14, 7, 14, 7], desc: "فعولن مفاعلن فعولن مفاعلن" }], + 47: [{ arkaan: [9, 5, 9], desc: "مفتعلن فاعلات مفتعلن" }, { arkaan: [7, 5, 9], desc: "مفتعلن فاعلات مفتعلن" }, { arkaan: [9, 5, 7], desc: "مفتعلن فاعلات مفتعلن" }], + 48: [{ arkaan: [16, 5, 1], desc: "مفعول فاعلات مفاعیلن" }], + 49: [{ arkaan: [5, 20, 5, 20], desc: "فاعلات فع فاعلات فع" }], + 50: [{ arkaan: [4, 4, 4, 14], desc: "مفاعیل مفاعیل مفاعیل فعولن (هزج مثمن مکفوف محذوف)" }], + 51: [{ arkaan: [25, 25], desc: "متفاعلتن متفاعلتن" }], + 52: [{ arkaan: [3, 3, 3, 20], desc: "مستفعلن مستفعلن مستفعلن فع" }], + 53: [{ arkaan: [9, 20, 9, 20], desc: "مفتعلن فع مفتعلن فع" }], + 54: [{ arkaan: [16, 5, 4, 20], desc: "مفعول فاعلات مفاعیل فع" }], + 55: [{ arkaan: [13, 13, 2], desc: "فاعلن فاعلن فاعلاتن" }], + 56: [{ arkaan: [7, 7, 7], desc: "مفاعلن مفاعلن مفاعلن" }], + 57: [{ arkaan: [9, 9, 9, 20], desc: "مفتعلن مفتعلن مفتعلن فع" }, { arkaan: [7, 9, 9, 20], desc: "مفتعلن مفتعلن مفتعلن فع" }, { arkaan: [9, 7, 9, 20], desc: "مفتعلن مفتعلن مفتعلن فع" }, { arkaan: [9, 9, 7, 20], desc: "مفتعلن مفتعلن مفتعلن فع" }], + 58: [{ arkaan: [13, 13, 13, 20], desc: "فاعلن فاعلن فاعلن فع" }], + 59: [{ arkaan: [3, 3, 13], desc: "مستفعلن مستفعلن فاعلن" }], + 60: [{ arkaan: [16, 5, 4, 2], desc: "مفعول فاعلات مفاعیل فاعلاتن" }], + 61: [{ arkaan: [2, 2, 2, 20], desc: "فاعلاتن فاعلاتن فاعلاتن فع (رمل مثمن محجوف مطموس)" }], + 62: [{ arkaan: [16, 5, 14], desc: "مفعول فاعلات فعولن" }], + 63: [{ arkaan: [3, 3], desc: "مستفعلن مستفعلن" }], + 64: [{ arkaan: [7, 13, 7, 13], desc: "مفاعلن فاعلن مفاعلن فاعلن" }], + 65: [{ arkaan: [13, 2, 13, 2], desc: "فاعلن فاعلاتن فاعلن فاعلاتن" }], + 66: [{ arkaan: [2, 20, 2, 20], desc: "فاعلاتن فع فاعلاتن فع" }], + 67: [{ arkaan: [1, 1, 1], desc: "مفاعیلن مفاعیلن مفاعیلن" }], + 68: [{ arkaan: [3, 3, 3], desc: "مستفعلن مستفعلن مستفعلن" }], + 69: [{ arkaan: [4, 4, 14], desc: "مفاعیل مفاعیل فعولن" }], + 70: [{ arkaan: [9, 9, 9], desc: "مفتعلن مفتعلن مفتعلن" }], + 71: [{ arkaan: [13, 13, 13, 13], desc: "فاعلن فاعلن فاعلن فاعلن" }], + 72: [{ arkaan: [26, 26], desc: "متفاعلاتن متفاعلاتن" }], + 73: [{ arkaan: [3, 2, 3, 2], desc: "مستفعلن فاعلاتن مستفعلن فاعلاتن" }], + 74: [{ arkaan: [2, 13, 2, 13], desc: "فاعلاتن فاعلن فاعلاتن فاعلن" }], + 75: [{ arkaan: [9, 9, 20, 9, 9, 20], desc: "مفتعلن مفتعلن فع مفتعلن مفتعلن فع" }], + 76: [{ arkaan: [5, 20, 5, 20, 5, 20, 5, 20], desc: "فاعلات فع فاعلات فع فاعلات فع فاعلات فع" }], + 77: [{ arkaan: [4, 4, 4, 14], desc: "مفاعیل مفاعیل مفاعیل فعولن" }], + 78: [{ arkaan: [5, 9, 5, 9], desc: "فاعلات مفتعلن فاعلات مفتعلن" }], + 79: [{ arkaan: [2, 2, 2, 13, 2, 13], desc: "فاعلاتن فاعلاتن فاعلاتن فاعلن فاعلاتن فاعلن" }], + 80: [{ arkaan: [8, 12, 8, 12], desc: "فعلاتن فعلن فعلاتن فعلن" }, { arkaan: [8, 19, 8, 12], desc: "فعلاتن فعلن فعلاتن فعلن" }, { arkaan: [8, 12, 8, 19], desc: "فعلاتن فعلن فعلاتن فعلن" }], + 81: [{ arkaan: [14, 14, 14], desc: "فعولن فعولن فعولن" }], + 82: [{ arkaan: [8, 8, 8, 12, 8, 12], desc: "فعلاتن فعلاتن فعلاتن فعلن فعلاتن فعلن" }, { arkaan: [8, 8, 8, 19, 8, 12], desc: "فعلاتن فعلاتن فعلاتن فعلن فعلاتن فعلن" }, { arkaan: [8, 8, 8, 12, 8, 19], desc: "فعلاتن فعلاتن فعلاتن فعلن فعلاتن فعلن" }], + 83: [{ arkaan: [15, 15, 15, 15], desc: "مفعولن مفعولن مفعولن مفعولن" }], + 84: [{ arkaan: [16, 16, 2], desc: "مفعول مفعول فاعلاتن" }], + 85: [{ arkaan: [16, 5, 15], desc: "مفعول فاعلات مفعولن" }], + 86: [{ arkaan: [4, 4, 13], desc: "مفاعیل مفاعیل فاعلن" }], + 87: [{ arkaan: [9, 9, 13, 18], desc: "مفتعلن مفتعلن فاعلن فعل" }], + 88: [{ arkaan: [25, 25, 25, 25], desc: "متفاعلتن متفاعلتن متفاعلتن متفاعلتن" }], + 89: [{ arkaan: [13, 15, 13, 15], desc: "فاعلن مفعولن فاعلن مفعولن" }], + 90: [{ arkaan: [9, 20, 9, 20, 9, 20, 9, 20], desc: "مفتعلن فع مفتعلن فع مفتعلن فع مفتعلن فع" }], + 91: [{ arkaan: [4, 5, 4, 13], desc: "مفاعیل فاعلات مفاعیل فاعلن" }], + 92: [{ arkaan: [8, 7, 8], desc: "فعلاتن مفاعلن فعلاتن" }], + 93: [{ arkaan: [7, 14, 7, 14], desc: "مفاعلن فعولن مفاعلن فعولن" }], + 94: [{ arkaan: [4, 13], desc: "مفاعیل فاعلن" }], + 95: [{ arkaan: [16, 15, 1, 14], desc: "مفعول مفعولن مفاعیلن فعولن" }], + 96: [{ arkaan: [3, 8, 3, 8], desc: "مستفعلن فعلاتن مستفعلن فعلاتن" }], + 97: [{ arkaan: [7, 15, 7, 15], desc: "مفاعلن مفعولن مفاعلن مفعولن" }], + 98: [{ arkaan: [3, 12, 3, 20], desc: "مستفعلن فعلن مستفعلن فع" }, { arkaan: [3, 19, 3, 20], desc: "مستفعلن فعلن مستفعلن فع" }], + 99: [{ arkaan: [22, 22, 22], desc: "متفاعلن متفاعلن متفاعلن" }], + 100: [{ arkaan: [16, 2, 16, 13], desc: "مفعول فاعلاتن مفعول فاعلن" }], + 101: [{ arkaan: [5, 15, 5, 15], desc: "فاعلات مفعولن فاعلات مفعولن" }], + 102: [{ arkaan: [10, 12, 10, 12], desc: "فعلات فعلن فعلات فعلن" }, { arkaan: [10, 19, 10, 12], desc: "فعلات فعلن فعلات فعلن" }, { arkaan: [10, 12, 10, 19], desc: "فعلات فعلن فعلات فعلن" }], + 103: [{ arkaan: [3, 3, 20], desc: "مستفعلن مستفعلن فع" }], + 104: [{ arkaan: [2, 20, 24], desc: "فاعلاتن فع مفاعلتن" }], + 105: [{ arkaan: [15, 20, 15, 20], desc: "مفعولن فع مفعولن فع" }], + 106: [{ arkaan: [4, 14, 7], desc: "مفاعیل فعولن مفاعلن" }], + 107: [{ arkaan: [5, 15, 5, 9], desc: "فاعلات مفعولن فاعلات مفتعلن" }], + 108: [{ arkaan: [3, 3, 14], desc: "مستفعلن مستفعلن فعولن" }], + 109: [{ arkaan: [16, 5, 18], desc: "مفعول فاعلات فعل" }], + 110: [{ arkaan: [5, 12, 5, 12], desc: "فاعلات فعلن فاعلات فعلن" }, { arkaan: [5, 19, 5, 12], desc: "فاعلات فعلن فاعلات فعلن" }, { arkaan: [5, 12, 5, 19], desc: "فاعلات فعلن فاعلات فعلن" }], + 111: [{ arkaan: [9, 20, 7, 20], desc: "مفتعلن فع مفاعلن فع" }], + 112: [{ arkaan: [3, 3, 15], desc: "مستفعلن مستفعلن مفعولن" }], + 113: [{ arkaan: [16, 4, 9], desc: "مفعول مفاعیل مفتعلن" }], + 114: [{ arkaan: [9, 9, 14, 14], desc: "مفتعلن مفتعلن فعولن فعولن" }], + 115: [{ arkaan: [14, 1, 14, 1], desc: "فعولن مفاعیلن فعولن مفاعیلن (طویل مثمن سالم)" }], + 116: [{ arkaan: [1, 1, 14, 8], desc: "مفاعیلن مفاعیلن فعولن فعلاتن" }], + 117: [{ arkaan: [10, 19, 10, 19], desc: "فعلات فع لن فعلات فع لن" }], + 118: [{ arkaan: [4, 5, 16, 13], desc: "مفاعیل فاعلات مفعول فاعلن" }], + 119: [{ arkaan: [2, 2, 20, 2], desc: "فاعلاتن فاعلاتن فع فاعلاتن" }], + 120: [{ arkaan: [9, 14, 9, 14], desc: "مفتعلن فعولن مفتعلن فعولن" }], + 121: [{ arkaan: [2, 2, 2, 14, 13], desc: "فاعلاتن فاعلاتن فاعلاتن فعولن فاعلن" }], + 122: [{ arkaan: [21, 21, 21, 21, 20], desc: "فاعلُ فاعلُ فاعلُ فاعلُ فع" }, { arkaan: [21, 19, 21, 21, 20], desc: "فاعلُ فاعلُ فاعلُ فاعلُ فع" }, { arkaan: [21, 21, 19, 21, 20], desc: "فاعلُ فاعلُ فاعلُ فاعلُ فع" }, { arkaan: [21, 21, 21, 19, 20], desc: "فاعلُ فاعلُ فاعلُ فاعلُ فع" }], + 123: [{ arkaan: [3, 20, 3, 13], desc: "مستفعلن فع مستفعلن فاعلن" }], + 124: [{ arkaan: [16, 18, 16, 18], desc: "مفعول فعل مفعول فعل" }], + 125: [{ arkaan: [16, 7, 16, 7], desc: "مفعول مفاعلن مفعول مفاعلن" }], + 126: [{ arkaan: [1, 1, 1, 18], desc: "مفاعیلن مفاعیلن مفاعیلن فعل" }], + 127: [{ arkaan: [13, 7, 20, 13, 7, 20], desc: "فاعلن مفاعلن فع فاعلن مفاعلن فع" }], + 128: [{ arkaan: [16, 9, 16, 9], desc: "مفعول مفتعلن مفعول مفتعلن" }], + 129: [{ arkaan: [3, 8, 20], desc: "مستفعلن فعلاتن فع" }], + 130: [{ arkaan: [9, 9, 16, 1], desc: "مفتعلن مفتعلن مفعول مفاعیلن" }], + 131: [{ arkaan: [14, 14, 7], desc: "فعولن فعولن مفاعلن" }], + 132: [{ arkaan: [14, 7, 1], desc: "فعولن مفاعلن مفاعیلن" }], + 133: [{ arkaan: [16, 1, 12], desc: "مفعول مفاعیلن فعلن" }, { arkaan: [16, 1, 19], desc: "مفعول مفاعیلن فعلن" }], + 134: [{ arkaan: [1, 1], desc: "مفاعیلن مفاعیلن" }], + 135: [{ arkaan: [8, 8, 8], desc: "فعلاتن فعلاتن فعلاتن" }], + 136: [{ arkaan: [16, 1, 18], desc: "مفعول مفاعیلن فعل" }], + 137: [{ arkaan: [16, 7, 15], desc: "مفعول مفاعلن مفعولن" }], + 138: [{ arkaan: [24, 24, 24, 24], desc: "مفاعلتن مفاعلتن مفاعلتن مفاعلتن" }], + 139: [{ arkaan: [7, 7, 13], desc: "مفاعلن مفاعلن فاعلن" }], + 140: [{ arkaan: [22, 22], desc: "متفاعلن متفاعلن" }], + 141: [{ arkaan: [9, 20, 9, 9, 20, 9], desc: "مفتعلن فع مفتعلن مفتعلن فع مفتعلن" }], + 142: [{ arkaan: [10, 6, 20, 10, 6, 20], desc: "فعلات مستفعل فع فعلات مستفعل فع" }], + 143: [{ arkaan: [8, 7, 20, 8, 7, 20], desc: "فعلاتن مفاعلن فع فعلاتن مفاعلن فع" }], + 144: [{ arkaan: [10, 2, 10, 12], desc: "فعلات فاعلاتن فعلات فعلن" }, { arkaan: [10, 2, 10, 19], desc: "فعلات فاعلاتن فعلات فعلن" }], + 145: [{ arkaan: [14, 14, 14, 14, 14, 18], desc: "فعولن فعولن فعولن فعولن فعولن فعل" }], + 146: [{ arkaan: [14, 14, 14, 14, 14], desc: "فعولن فعولن فعولن فعولن فعولن" }], + 147: [{ arkaan: [4, 9, 20, 4, 9, 20], desc: "مفاعیل مفتعلن فع مفاعیل مفتعلن فع" }], + 148: [{ arkaan: [10, 2, 10, 13], desc: "فعلات فاعلاتن فعلات فاعلن" }], + 149: [{ arkaan: [1, 14, 1, 14], desc: "مفاعیلن فعولن مفاعیلن فعولن" }], + 150: [{ arkaan: [16, 4, 14, 15], desc: "مفعول مفاعیل فعولن مفعولن" }], + 151: [{ arkaan: [2, 7, 2, 7], desc: "فاعلاتن مفاعلن فاعلاتن مفاعلن" }], + 152: [{ arkaan: [8, 8, 18], desc: "فعلاتن فعلاتن فعل" }], + 153: [{ arkaan: [16, 2, 16, 20], desc: "مفعول فاعلاتن مفعول فع" }], + 154: [{ arkaan: [8, 2, 8, 2], desc: "فعلاتن فاعلاتن فعلاتن فاعلاتن" }], + 155: [{ arkaan: [9, 19, 9, 19], desc: "مفتعلن فع‌لن مفتعلن فع‌لن" }], + 156: [{ arkaan: [3, 15, 3, 19], desc: "مستفعلن مفعولن مستفعلن فع لن" }], + 157: [{ arkaan: [16, 4, 1, 20], desc: "مفعول مفاعیل مفاعیلن فع" }], + 158: [{ arkaan: [16, 2, 1], desc: "مفعول فاعلاتن مفاعیلن" }], + 159: [{ arkaan: [1, 1, 1, 14], desc: "مفاعیلن مفاعیلن مفاعیلن فعولن" }], + 160: [{ arkaan: [16, 2, 15], desc: "مفعول فاعلاتن مفعولن" }], + 161: [{ arkaan: [27, 27, 27, 27], desc: "متفعلن متفعلن متفعلن متفعلن" }], + 162: [{ arkaan: [15, 15, 15, 19], desc: "مفعولن مفعولن مفعولن فع لن" }], + 163: [{ arkaan: [16, 4, 4, 1], desc: "مفعول مفاعیل مفاعیل مفاعیلن" }] +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/talisman.d.ts b/src/talisman.d.ts new file mode 100644 index 0000000..2c26015 --- /dev/null +++ b/src/talisman.d.ts @@ -0,0 +1,5 @@ +declare module "talisman/metrics/damerau-levenshtein" { + function damerauLevenshtein(a: string, b: string): number; + function limited(max: number, a: string, b: string): number; + export { damerauLevenshtein, limited }; +} diff --git a/src/vaznha.ts b/src/vaznha.ts new file mode 100644 index 0000000..a0ede4e --- /dev/null +++ b/src/vaznha.ts @@ -0,0 +1,101 @@ +import { ARKAAN, VAZNHA } from "./data.ts" +import { limited as damerau_levenshtein } from "talisman/metrics/damerau-levenshtein" + +let match: (a: string, b: string) => boolean = + (a: string, b: string) => a === b; + +export function set_exact_matcher() { + match = (a: string, b: string) => a === b; +} + +export function set_fuzzy_matcher(threshold: number) { + match = (a: string, b: string) => isFinite(damerau_levenshtein(threshold, a, b)); +} + +export async function vaznha(input: string): Promise { + const input_heja = heja_special(input.toLowerCase().replace(/[^\s\w]/g, "")); + const vznha: string[] = []; + for (let key_vazn in VAZNHA) { + const vazn_variants = VAZNHA[key_vazn]; + for (let variant of vazn_variants) { + let vazn = ""; + for (let key_arkaan of variant.arkaan) { + vazn += heja(ARKAAN[key_arkaan]); + } + if (check_match(vazn, input_heja)) { + vznha.push(variant.desc); + } + } + } + return vznha; +} + +function check_match(vazn: string, heja: string): boolean { + if (match(vazn, heja) || check_UU_transform_match(vazn, heja)) { + return true; + } + const vazn_alt = vazn.replace(/^UU__/g, "_U__"); + if (vazn_alt !== vazn) { + if (match(vazn_alt, heja) || check_UU_transform_match(vazn_alt, heja)) { + return true; + } + } + return false; +} + +function check_UU_transform_match(vazn: string, heja: string): boolean { + let i = -1; + while (true) { + i = vazn.indexOf("_UU_", i + 4) + if (i < 0) { + return false; + } + if (vazn.slice(0, i) + "U_U_" + vazn.slice(i + 4) === heja) { + return true; + } + } +} + +function CSL(input: string): string { + // order is important + const L = /(?:aa|ee|o[ow]|i(?!y)|u)/g; + const S = /(?:(?