iaXrI${P-Yoro)aq=S+
zf`>Ugec1E)$?q24uS2Q~fN*i8&89-D2^*qHrw`y
zw>@53;Olk$;~v%=#vhdga6y7Ui@6`5g1tDbOFN{*aurlmVUdiMpOy}#;P1h@Mt``V
z7Mde?k=}!Px}yxt0;jo^Un7_qcGHfF&C*yI
z+OF$mb?cmzvSOWTw}OLN(SW;1XdL1rTIGkK=tbl+);0|X!my0Schh|(zaqh
z7i%pSExaS|M(9K@ntkZ2n)QPI_&roh6TNImHe+oh&U=_og@0c*-t4pVVB+9I)X+zo
zg_wy}o3QK#giJ1}elgnmI{Rt2dV&wD)%h{Q>-<}()%v0Qn#uWxqr#LlFsl>eoK2EQ
zwD+?A1?*HGmfZ*UyF9xr<*930(B)6s*nP5Mhdy-eSsXb~bU-RU&XH;}L@_-LBs0PRplL3fdkOy)ZabalH(p0GarbP
zGVGS8V8;QQ*(ojUn=*cV_}!u4meiE}|Lg~!a6k5`+t#T%jp`1AE~REXJV)XvUHfAtb)4kvjF}(m#
zr9%opZ-+jxnpBjL
zijWs%@eLn}-1U(m&DO+6nc9y*ZHPV=$?qHh+}QYiTI^hb(&>?RZ%@k1-ZmA4UNA8;
z$Y4!58UlH^CgFksNHV-F;39`UrH|G7aV*`!KfK`YV&;=)mu(fOq%z@D=pvg`hZV~DeFovN|e$6EDO!yfMQ|tt1PFhdpfDwE6-JE8hmL+??J)sOcd%y4hFV7~6JkoIiQZjq|
zPC+kEiD$pxxa13xZ9EFMj5Fx7eZ{Nkl`h*bt@Vz*--xh@@!M34q+V7pJ+IJ*o@Ydp
zTse&0l>0H$r7yIG7qd`vWA6_kc%qr>Qgkrsy2lE$xv!h^F0z$%fniIoFx%wnOTAkecAxkGA$i>C-OoJJ?!3Dv
zUt6(szO9k49ccnBTIUpogiST?B2d<>LksSm5!PRw!+B`dwWd|Mh?%%~&$G5HsPoVv
z`KvDvS7-Tc`g~>G5L6U0!@tw1Q^7c)I_Ybo+>HL2~kj)V3_%y=-o5A475d;Y<*uhyXe*<#Qzpgle5D
zC4#6KeIP6-a~mXC4lBOX^p+S0@%#S!FZ-c9p;y@=(3XEA@l@JwLOAL>aw9&GUnbuu
zA25y0KxrUK6n&NBc%5h9Llv}Ux)HL`@DgnaCCbOagfi-<*nle9f=BBPX3u+~s}Ubb
z8!E^9qevn515g$S_Fm|j=jK=E5S}L(G_X;kIW_R~6uLd!@&yu$Z4q}FIBJ7btCIYYGHWA~)Pzs0=X<;P=
zTwxm0RDI%#e(|xCY&vv6pvw3ydBjckDwa7~Mr(TIsG1$9+Y(3k=Z9`#BSKguZA~aw
zNyJ7MFFceI;mhwWr+-Q;U?kl0u>8^Z_nC=|Oh1Yi27x4={=a%E|70vhAA)Sw8X@)-
zFh}Jaw*@54xA63{Z1dr#b@N{u*5EH#eSXDPMIEykzzbCwL_ZsV4VJ`f2XUnm^5C=^
zC{in?8M%JL&XEB@fp0W$a-O)*tfm$D*k@rj{VSn1VON0Jhlz;p8KC!h{9bJ4(+!8y
zMd*|DjE4V?rF5Jqc8CX~4Q>uuFfP9&9*rBI$Oz$148Z=;Vth_a@)QkE=mT&PI6@q9
zqasw~sM{WXuDZwKW&NTDD+OEN*~ospdGXP2odO|B1Vg!9&QzaP#Tka#yxppT-(ikK
z1M3cjPnSlDI2GCrTbM#Zvm@{MgCyWUW$>BmskD7N1CSB%NA977z`_cw0^ms%L
ztoDb_=Slc@TQXx!`#j?TkLL)NH>X<(>hZG!A(8Vn29Dd~Mak9Bp~@rkm)ezhXhs
z4XD_}Z)8APk*_MCt!;fd`T0?!@$igl1#i=sTP5SjUsov@PdhbWdaKTzfym{t0l
zN|;EGhc`U+Fprb2P&M(xLdVdI@QD}P`?SpEU^UL;Y5rULFU70e*%8!oTW9Ur5j3~s
zpdJ8$l!Mt6%0@GoSnx=cdU|qkNeBkfkZn=|<_nBd5>Z}hm^PV&Mmu0hp)GKL$DK0k
zQG`pUp!?(q3*hd-70p-rBc(K1%GUw4(yi+)=DVm8Z5@gdYNlV>T*OjVpbYjEX_&8m
zOU1|(?{xEs?GbAy)peH00bM#srqeU>>;(vJB~}=1>K>FIO;BT(@93+Y?P4aEbQ3@2
zx%)y#D^4Tzty9mTx;KxBKDng;KgExBHnea4zq<560iSV(%r>0
zF~If3`2hoBc?MdJ)Iu)SgiXTl+O#G`H6_|-@AUGEe|Bx}0nWpQE&TNgrBC!+_OkeG
zRin4nz&wu@o`@rOnTMd-e8ta1Eyq8oFSN39mhb(}eT|HdAIlq>$v4lMe-&xw@YR`J
zvy|Y}^yXE5bpMH0GWddZ+*4Gi`;^aoEunu~4L4&Ly0H6TX}n)PEWash-X7HNXFJdO
z<#UmTXW2yH!jpwx&m*4lJ*ty!X221Rofwo?eQh!^0HsK5;s@lkB@(D859s;IkX?p*
zgwJ;;%dp*wT1K8MI8lz>qWx>*07m<}0E;X=J6&j{s&Q&@IvIw?y?;Pb05+>rX`r~9
z)1r+|k161C0S%4%P0P3c1h#+iS3vA+n0t*BOV6=5(3mWu&9RSGzIjsMZOUBMOytYU
zKO--EaRSiH5k{QtCb|BWO=*L@{esTpCVi2r<6bY!KX-HF320m@NTzxHrI?9o$L3kB
zsPf31;hTUg7cZXKlww`TzRh%_s;$#A$KY36;j@E=IP@h!>{G(K^By5Z9mSHP
zXp86yz0QUwa^JuTU||VJ$U1L$x*zdqq`iu$rD27mIBk!NPZV$YHh
z^Ier53Aw&LJ&w}9Klg>rsbePFBfshF1rfrPQpz%CS)<>LcKq;c{@VqPvRWR3B*o3XM3qr5F|3wKPO
zZokh4GvWw=QR`>Z!P(N<1&J}RfN7j7>MYpi6079mUR7ite|WkVQi}aM2SxZ@Um2*A
zB0S@d;v)8k1)2OV6I@g@8rljt6BUx2?8WsoPXRGrj#}(TB;o1x_?SngC&kqYTU{#;
zmnh4UlReSqG%bbP5GXp(ToXKE2x)@$!?{z3s`AvRaz1JHWQ){bHnWEDIEw5(QgThn
z9i1G-v#;Oztj_oW)qC=lqe-1RacTQ~C4GBs-=GKduLb-G^s^4#Awx?Ov<;&04S%$V
zliPM1?!|ibn3b-{{ypN6&`V@6;}~6g1tTBS@ul*mg?@mF>QZg+q-)OH@_WYVF%kBm
zA4&ZQ?27bHiHcsH>O*^?QO4{RJj)8)ul0aq&@?82Fk!Dna^7kP?>olf!|KlQGj0$cto
zR;kaNlQrZWqA})Srrs&
zUq+Xnojr4aFXq-N;`Y%LfquxW&UfeQo|`P^%btG}BW_(q{B2`$8KKU$h)4oVY
zc@^1o4}l@VeXLH>b}HCb{cim1(W~Tu*}DmeRPSq$emVXDKwnpX8+g5+vJ=LmR2Gqr
zt7ka>C!z*cVscBWPx{!&@wz3XF35{CWz2Vag9b2;X(FfJmVFz6z{qxUm^;`I-R%o9
z)2->qna+Icbdp8IjvwAceP;@pA&_i=?j3p{)!Zrt
z`{R85oU~Wncuj?$Qsfcj6TZ_@ZXIzFi4+@kH^d@~(69HTm+CvVG@C!M$ErU4HyujP
zH`guUOes5|JWB8Q?bP7uBKx^pH6+7xWE;gHXI1rtC2Qdn>k99dto6*t&kFDfQpH2L
za^}Yyy>`!cd{_i8byIB%mYkw4m9~7cb_PlH0q7RR_3dmd-J4Jzx_867zk}$mKjE|PQA9P42fiwhbvsKEZ2T7%k#t1hxz>IQ
z1qfbLz>wf?AN2A0Nyc0QfwWFKLUzyV{h9B7bFzb9EHagsB&)>9A_vd&Y6y`~wt5mr
zb0W9{P#TV`%zMunp?E3_EQ~Rih((>VUGW;ekT2B}aA@Mmh?hzV^9Stp(jrZ*i^oJM
z+GX^*8laN4I7+VAa4W%>&*@Q35^{O6Nfk@OT0)SgQA{wFG6WrrhyOhxJ+|ddkn{Ox
zBKhyTBW_0#msL}tpT14SUa)X8rr_CRrLJLk_sv54Y7LAwwx`_FWtUS}CQqIsPOj
z=vH+fk1DWWq_|RC%H&8h!RmhK9G5C~6(DpbpgyW*)7k&)R3#CUKyhw(d%7BLx>E2D
z@MxVU%g!Nr4qu+CrF$<63^WGa`SyNvv|xsPx1X9{hK+#W^EEHHScBX=^}5%bahQO<
z+LHPo9r3{X1!kE;-xFOMir1u#@U{q3U*~E(HC3lvfO@<1D~zIf9+(K=XV``vAGQw&N-uSu2)SY
zBmkTwCA#I@)diqKC4LH5-1Nc6naMBY$q@()etPUAx$zo{#*#zg^qkG1uNP)R<>XxZ{%z=(>P=5><<=D*&Qz`
z!hf?EQA!tj{%sXI^a5o;blqF3&fJ`%sR`Gqrp4C3m&hpxt
zw7*?oHmRU<%gXy5Do8RnqqM?uiY8#3iHq?^AKtoPuJcRuVy*M1kKL;oNl;LZ{0#L|
zTz3P?0}>9Y3jTTmI{C#Q-`aV@y&1U#$j|AWy7n;hyI{wu7ZQX)Tx1bzTQc%-)+%=3LRp8tUQfyNs5q04Q}PPmE!hJp#H
zNyqqFN3ktK*L@t(Q>br0IMUOzmlR*JQ(l&vP(7B`Z|Tz!Mq!i|Zpjw5hrP>M8Dp(t
zB>Z9jxBp4*DKR|v1#@D;&gXSpK>cODaS|?-Ma1hhS4B%}&(}Hkpk2rH{Oyg!7~RCL
z#$LI}4>i4}Ndy{ykT)s76;zi03}$7TMtwTEYj{7v0HNcWYOAM0Fyiz@3lcM63sWSC
znQ@iLKIIZY^##4K8s#Ptyr68iH+$}8|59boE$OwCAu)Wr^~FiQ-jDI9$d?TshNfToF)NshpF$w(4FBgm=?}c7z6{;C2kgL2Bddm@Ylom==3c5A
z1*dL%CP5A+CigCL@nY~Vx#(yfTFN=CdPPdiU_2QRWk?xX;Sm)`!iGyj(WZkKpfr7l
z#9`089D#!WC&Qv{lCmG%XVUdznv9cG&lcxN?G`b@f8DV$dv*|qkHWr8F)ZDFz+zmE
z^s+A%U9|p>yg}Axk{lX1=5SrHj5Cp9sb+QP@H(htez8N6uv@z-yL@pD=HbDhf&t5g
z^7d$bET*gyLf6y(SRJy4%I~>Hj17rT8+A@y^37TCKemUZ%T{}H!|DEUQ-#c{u3@1(
zc)s1Ss%nl9Ei72R<@3k{7C
zJtMYyTNs*10D!#B9)0I}WHO+wDbes;sL~b(Fb-I$Nbk7%3lKkEAV@erQM)|&oT}}m
zl!)KrrKk&W6NImUVjvu6H~=m%`6sky3ky%BfN&b$hB?avxXwgxzK`@NXFAEX(#7@>
z{=jGo;56Q{{{K-I>tBLadZ-*C6}2Ul6M4$shpmDfRD{VCvBs|DS|~%*_2%|PiY%H%
zXGn0)(k!E!acBmyT?^1um@J1Wc;JdHG%f^EkeCsF22N5rWQ2eEaQFVDFeORO?a;92
z5j?e~`msU^36A_O&_3(kSAlip@{gCa!ReywEMU;nL$%xzk3Ixj;iT~b5q^3(447WI
zE#D0fwu1a~So)(XKNS}jLZC6qOX6tbqdVX+pBan=9-(PlcBsbvF=;IgNKy*CK^(#H
z9s2hE8cl*)HHUs@--YL=8|@;}h?LB@MI!y#@e^1EzHL-|L36ES|56gTEJ2ng_5i+N
zx$54~W=(aeWhwYO*Dj#Q{Ji<6JH2}G>b=&va$-0(0?knf-Z!C%)zwiAQ|ZQg7Pf`~
z8wQ80+o7q`auw-XPetP}bhPedajMFdRAm+Vx*x`al?qB@mk_M@H%-}M(i#?FB6gE6
z`&jKFl>}BJ=ybcRh3>+fWHtvbNzq@9B}}I{e`=w@=puI*CHQ{ZyYbCrLB34(@~ER4
zG)6kXEr%9&beJEd@N%{(W3MjvbLB{2dnRx*T|)oR*8t7@ydI|c?)+*>8L0io-C(8R
zE_0wc>Tc5TzJrnM3sY>SJY{s|cOaQS0{P1gOet+xsh4f{z0Y>=HK?#x+ic4M!wEb!
zet!0A{ZcF1WVy9r@1uiD0o+h4R&51_#EHt#;4OxP;-O)WeZG0N%~(l4i5KJ^{P^HW
zbyFp8PZ+b+O|#=EuWfcGTs`X|(%jBBi#bQVFP2Zi$%oC+0oL?UojPJKf_lj%@)>@2
zCqS=t4v}&ZfqS@hMy=676M54mo2_HevyiPigsvA?dsq||kW!L(k8CR80AYGQu2VGb
zFJ9Giw;UnBj51InN(I0bj-FY#Xj5X?XwBu1&gMM$SRO^hxyNH^f_FFzUYN1lHvZD0
z&G26+823f%e8cKS{=Gy5n*QqRIr_xE>@Vp{jv4WF{~<0d?CA_>vL0xDAJRAOzPBBl
z&ycgM$%`_>rKfr%`1su@!PBW{xcP)%uzwi+4E$Z`^>QpKH<*#6Np7o)gCwdrAf_-$
zaYPp@05VFXc>PB~#Kr6v6=Bl?1mpzP1KY^JJpuXmHdqtBEKK;D160wSYBJwSKN^hG
zK4CljT7gU>UatPOvsb*%pLN2RH6Gk9kqJcKYgb^Zqbn4Pw$o%}SP(O%DfY;A
zk9TTbH`WY>LAVT4o{%w(1Z{pd8aO8WW@9l5v40`{IpRtr-E5
zT1Ffrs1#`S&x&}#L2NcE%3Y35F7Y3kpjk!AON?}~6w^RhiHpR7`Zj(Btq;Gzv5Y>9tLcBxHAeA|&X(VJ
zJ`!M_C3RTNt3dFY7+C~n*78%6cuOw4dUVkn&_Y-^_tm)QeIel=DRiZd?&NjlH_5M8
zv>ZW6(=p}Q)ZTx%wMCnLUGxtbaYMrb_9AYo~RPD|Uwd+%U;vILUX_Nsk&Gs7I8G?UB3
zF;G_+s3FWv<%mpdLfvKGq^oz@qR7*M@f{&C&wo)=;llS?k4HnR9<{(^tSb4f7w$rxIpNy`iNM{U}`@)pN0qt?NAb}
z7=hHj?Ar@r^tBRwfW4ddwwh-`Oh{OMSY;7Ijg-qc{M%3Vc>eM#4oRcn%Y45X&1TL)
zCWc#TC~#P6Q6>57pG_%>I2lWYr;>mx-6up}0Y=NWEs_ItC{a<(N}C}gyQFmRenURb
zId(z|9oqHJcmG{F^259i`Zfk4Ep1*`+OitO*OBkX&i-ApQ!`Ak>+G}oQ%**>?Iy!`
zrq8SQ8z=!l2Xmz8azjlqxu`D)a{5`Peco-YM~vQS+{@62TEJSq%U#%v-;hTbGio0&
z3_cfFUV=S#KOj?Qtoi}1fNYHn3`naUAAaQtPemJhN6?JR81o_3g#V3Cu&u+F;{IIG
zj7FT09n$+YbpiO4>Y;||>F1K3*y~4Nfvce$RTi)6sO`3b_SZaWV8nN8vO2tz{%kOg
zd`jdUqPe48bGicU3}j#d=)tBlGs?eW{D>{`H_kpFC^dm>e6E#4wp#jh;E~l|A4hky
z_zRmt)JpnZ^Tc71YPU7tn#D
z4KJZjB0+(FQrvq-FM;_6z1KMK=kQkCxxmW;yPi@{TP-_k0kesrw^RGHg&9Rr9>9r?
zmlmki?MOKynI-Uoi^lB1qn`L+lQu4vl~cBMjM>jF>We?rFb=@eSh?$0=XLv+*quXJ
z3WJ5d)a^c2F=g%Unuj@SrlOuZ`4XY7*#jT9x5;~dY_Zc4**t*z*E<$2*BytqXW$ID~of5(rBvUidXr=ce)l@40{Ar)qP}k;r9wppwC>!*IEl
z4l2N}+GH#9VXAk$J(>XubPjz{fAve!iuJqpImm_sv!Wv*`S`eWD$sk;Cv}1GX0N`D
z2VH|KQ>H2a(-JM~N%ZQ5z260gpB>zPMuVe|wGJb-!erj3nVTHVY{5HS%|z%JLu@lm
zcf46#{EV@?B>#F^g>uBpu&nJKI{#&hJ*SA!z|u0^y1+MEu}4J@q?#}no3AptWiJ0(
zFNRx({4&0{ziA+OsUXVH+;7QwK2qiW(ywOjuxPX80V7nP8LxTR)=`yR38%q>iq)Qk
z;R9H8qvc=mNJCSTA=_96;Jy$*p{uu6BOt}cZA|j=JJh?oZj}Ws51639GA>MzU+qG4
zYRK#X725bXSUq{2*iivZj1Tuha6isxS^lIne4A8)0J4ozNJx3uRB$pnin$6Mek7J=
zoni2Jm|EuPwA01c6Z7V@dZE8xqr~LtPh1?Ht?AZ)WEDS_iDy}kObIic8k$S*_C!@Q
zHU9A5EQfvrp9(7Q6z_h&QgQr^$x@}eY{z~B*5;12^5EcnS>FYY*Z1xI;Db>B+JI$v}Y#lG?FzFog{Fd
zqF7+R%@WST@QoZQFi+fkB_@cDk`rK|jVv(wJ}3YYKIPubYik=9s`j?FMCS(arM92!n7o)PkOwzX!QYKU9Y}UuEPeU?)?MGn=o*!=ya2s-Tsy5QCMR1k+s_#cC{ik4&m1*j`bL|q1u=Lp
z*x^`lg_f)G1#i9`0TDLM=ObN*leY;7bU`DnpL0Jkn7NK+Z0`3D40vIfX6#QxW_otA
z9LWYHSn19iDV%2mySrz*KfVs{1?iA#vlyP=ZI$-bbpfB4zoBZvJRk=WKZFr8f
zGc?L^j@6}nnU7Ycx%_UaRfxXrZ0e4E8(1OA{yAq!D2tY$_}t4AZNu`2Nf$`J?*1l>w@n^^oFQ8j1$JvcX+(*;
z%+j{_{%NdRIzmp0NYl3!eex70SzB4P#BOF)x@1!SN
zyZ(p}sL*P-SQQBJMZT3j^CoxyNWUW4Hh0{8LtM-K=jwQG$lL4Ewm5s-Mru#%e3g&a
zS^}anJj}09!?l;qjGAL2@^Jv6{wO6UHacD8+4lT^w$;H5rdkZglPWB@NxeV+Z{f#g18A+Y#}0FOid|JUYe3d
z1#`OfJF(|!x%?@EqA-Tb^?Cg0nNW+I*vzm8o#^J)XA-%)3ul^G3(rL#27VMR;Q2F-
ztDQnUiFn%4Zp*8rBtp?uhdvg2_I%0Olacit=#yB8j%QkK_whZEVe!=3==Am43WUpo
zG6zwu(!1>b0Vtn0u~jbh0eWNgLcRw}6fM4IU2qi=rHYK}#)*~vo7Qi13omtN?r!az
zwa&g1%4{?C58ofiS>OC@a64W$<;F109N`HmR6dZbu30B1o7qXi#%UngUVKNSluIm#
z6STNWaq`jsHt=ocq}vnQV|SrOGU&DEK{)tqfu_3mh2nX+WtHyc(3{wWBqu`IyF)UF
z+ik9{g5PdN#r;W$$iaHVt^v;-kX0u3$yYJM0}`G{!gx_4$FhhIM3=
zpK|^^48zynTl)O1Zg-!m{uT8495wpqI$Z|##PPw)H%9<+(_72kDM+
zqQ7Ku-SXg0ifsE&j9`*p-`s#;hb3|)+T0}!dbpGmBdz%IlUUw4R#CvF9h(bu6G2c_cjShR!S%X9mi$
zqQ!C@tG*B2MjM_@jMypo|1Gi3nR3~O|GshpKTs!K{CHl7p^Hm;OvCE{3zww7n}w19
zFhKell>$!9O?A~K%aYkhUh&Ogr$kszLhFm4=aff&xYV6D;@94MnlawAnV~0SV}h%cOa?q)*V^qW
zhVi8!B!#^86|6dkpf{G`e9xpd(^u~h!4WqNvUzpP!f)2vTmU(JKqmEERX2PUAnETp
za`W+NY%4FyFFiDBi#|MMTg=FHT#+P}e}0TbPj7kcOmAXWAMm%k!ufQAP&eDHqTPO)
z&V6sIK;q_2kEjq>da?5n{&E1%BI#(#<>{%*?Nre16fwz8w~>`WHF5h=>b=eXf=bmq
zI>yT{+t*q|v4p&(XZ5P7`%a)=>@I*Z
zyWl)jw#=!ZYI`JP@KxNz@b0WGO|j-TulrVAJ!X>Z
ziOjq7UusLeU%owGIv}e()`3EFsk@&7R}Z9p2diLI8S?xSE+e1`q!jVGtnbZ>pO0w@o!iH(7CXQ+OT?htSx_^J8Guo_H
zyBPc1Jj{y5i5U6p<6Rofpx(A1lf=Fw5ZHhtr1!P{;dRy}NdmV89x|Ys8)cYI(VsdT
zDv{=Mk`QaY@@6@Y9tybdadzhbnU_YZi-A$Yj37o2Aak<`vORv85Uv)Am&q%Dmw>g&TwaVs?NAkpVb5u4AcM+P^P|4HoIcg~
z5q)g@$166GlfgT?JRxPzI{m!mtKB-QwcCd~BTifpwrhfyXjl>fAWxeQnhN$jwQI0lm`YY>_
z+4pNT$d3XFC+TqRy7;Ru6{i&%nhj);9uHSL$MRspqinc$4-czonmO4?PJj0u8yOk>
z$@EZK^gB!;OOl)dOU?yTa~Cls%OBuB7purJQiv=V2xbtdTs@)VkwnYVG3YWR3C5oa7_zsx-^@R%5z%Iijk#w
zcIO3?gU4Vp*&JegZp~Gv;c<;Ax)P+oEx%_xJEl^&BGdi#63=lqro`w3OBhv69_lP%
zt&&bLfK6m(izKU{C1~2;n{!zEoaL}PuYWILX#8qT!Ca@Rz{rwt8FU!6QQDO?r~Mm;
z$;Oq=!^+5L0ll83n8NLbB+ODl)778vTSyx^p&aGDs2LR}2u^V*_-yBQan^KlRBB
zSct}yL@pqjGhq^Lj6utIuQJBaF7()}()Xl^FUYuvzHdXJN&P1seq!o==zM+ofp_VS
zjCh%d@9wx5Ux*;(jDDu35)LhKlaG
zfo7OcFZk;;?Bj0+N@!
zw5nOzxd!;rs0~LsZX-rw0b-Cph;n@TG65rZj7cMSJg?p7_*yf$XTh>dB41%t8;(Ez
z?n4tTbm^yK=?_~1XO+LdNxr+O3UIC2O8A}a;!>J)W?tui>n0}}((Vfi%nrqpCCQ49
z&Ltjw{bQW!`zyMoB5pF+1E{!vWeI5`_jjd&U|eJe6Z-OaH|`p`xAmbrV0y>v~L|@^P^C)R1QUu>KCRRyn9iH-EI1BXmI16XB`Q{=$G-&Y`
zYif%1U-vuhjr-!#-XJ5rmB(MDakbA_#R}y}r2XAL>O|j5q#A!!L$mwNZ5
z$DS<5)zr$=`}I#dScQ)lBIYIzzGE4=!Iyk3IERDxc4pFv{8<36wx1ZP?p-X*U6R}r4p`vl1uNjgnRmZy4dQA8A5p1pZ2FiH0BLNXg
z^)l9BmT2EF5gdR8^g@LM`v-rAPK`VAir5?p#bJr7PM04~nj$T@!wJ9tXMf43xqziD>beZFl<`4(_W>=M?BT8P#$
z=k;P7?uCg?)cupq`Oq}RRAA@khv*7y4=Y|BueC-Of`8T9M)Yf_+h}8cpwhjgp8U?s
z%j;h!qki{?kY?UOOvnFpY1}{|5HH(%9$y-$ES+w{HXj(;>ZYb1%p#lDpwS=j0tA+^QlMl-xG;&!-j6|H)uNDp*EY|}d=?Nl`5
zXT5$9GBhlT)WEh3@n?Z~WO~1d#tn2vix)1-wmayy)g2o2ye(?|Qe}p>O#Z5p->UBB
zReflAw}W+gck<4ZUGGr(>(@?QNnhWYo^BO@aFIe<_2jgzBr?Dkg|(typ!pq=goaVl
z{}+}$+KkWOpN4>H4pzc1EJyaQt^Rtze*-E89ZX&nw_j)npN^+&=4wzqd$
zc$1U#*2J+b@iE9?z(jZeCmgY*HpV5Ns%_zUX8~w73v%!V1=QA@FjVY3aGH&21+c$5
zhprw=qe31`G!WfV&-Y|$D(Q6)9~U#<1MMu@=LzC%Vd)67_A+LZB7)85pP8qgL}AJG
zLP;oDLic3|ktdk{N_b?q0`NMabo_9Ty`A8$3o_DDl`HPLp7(CcHgc(1ys)AoP#LR(
zQ!CSh0|kM1gkY?1ZZu9Nk)h?$Un-zBHVP2PxpzdyL!T$DH9Zfbrn&(XYp=m;jmZ%w
z$Ll#EiD*+ZF*wlM@eVx#61M+dDS{>LV{6089v2(o|zN4k`fWN}1d9uPvFyOiV
za9r-&K*)vTLkb|!9afe*%5VJf>l)ZZ;^OLSg0
zx(Nr9R=3Sn7F1>d0VLb8%^!x(V2EI)&5ZWjc9sXD^`Mu&nF|$QsZ4q;}XU=X$=mu2z2Q3N6@O62KI=+20<}N(#KISW}_HXnEQInf`7H&GYq?MvLcQM9n44UXJRrO5f#ikhC=y
z*VK&eosEeHsBycwhHQzycHt1fDVW`o>#z2k5`2ek8Ql?bQ}gzva-kaov3cJd!8~OH
zdMS)<+o2>|$A5QM!`(cGCfA%ja?V!ZvVe_cnyw`J;2&+T-t@uI>zug~@TsUO_d*`?
z?*3h}-8=y@!!6$N^~sV~rDZLqrT!lMc-hO(%luXcYOUD*p7cCaRQ5Dh)9?O%(!Dxw
z448_0z5`5US0DL88HC5k6G6tAAKvl7eMn1_wPMbTjj*VH9MZSj@-ifj0fKLKW9T^*dmEA;_4>yvgQ=_
z-IQ>VfdtNWBle2u&Jazl^JQx5MVpK;j^w1yf$ixGCA7JP)gy!!
zmh*uvKh-rlDnlQ3x$$GMK?q3Wkq8tY#BeR&Ymf7LIakev>JYO){;F&bThL$YWqGK0
z)3z7PmaeiiameK$RD|EvdoK0|vBr-hH$E*@?pUDn6mx;*ju?4aFN%7^?`m7{HDDmH
zKTpd=?!t)KbKi3Zs!{cui|t`ApIufp7>DYcy5*8mo@
z&sTy2B1|e)IUJhNuYGQ~IWe)u@ei8fDu=M8^jy0U{T&PnSZ|u&Qxc%<(LzK-L*iB#
zPUbd_4SY-7-AEnaF7QbO0TU9B>l%-rvI?r%j?mG3sU+A`-N*R$eM`Q%bHT9L=J^@z
zxZHZR=pGNgCH>B^P+Q2_E^}Jk8s^#yO6+vEVB97$J0V_*NftC%unUN1_WR2^uKki>
zCCRCWkuB;j$&aCKYJWPIiX|w-lR@Hz=Ad}#Tmu=O{M~!a8nGq+NIjg8!DEyyzo|Xb8f7E*_(6bwa;Vd#NOEWjPoA}4F+A#gSF&bGR@fa!;f-{
zA1pjUtx6M0fQP~%;9I-=pN9Uy;Yl^M69H~xN)lW>BF(l=q0oIAsd){me)G;7p%)4p3{P8Gb>wkh$cP~o
zDz1eNV+v)%UP1IVFKyzm8z#s6bY0+SI!}N14iB9;Vu48-;h`&l$dG7_hdf*W>vMk;C&BnhtIAv;7G`jpM3d%0ksA)%Z0fFYt_7g~cBR4_&TG@UaP^jWwfc+lF3I=drmp(}ZgwEaLCcB%cV+B?
zMYUx`NYOP)i{g6Mq;ympWeWx-&xTcA(j28(G)qxsa7e
zqU+CrFhwT81lPBuCGcnQ?kpAWJCMYbK1(Mxx(xQvvGVHC)haBAjmtZBc`u?=
zN+RYpK0Igi{XlFs$(t*=Yh{$Z$#I;(|8V-(V_U#(gkkzF1H3R`$KHlqhlaL3@{=-N
zBIm1P{73@qB)EjlbVzwu4Mj;yS65A2*Ie`baz>S5T|yDEwk0P`7~?>>-jzqkd>9|2
z#erNtwT1vu@WG?|@`2o#bL*AxZmz`c{r&Uo>+YerAR%AJZZBSO-vko4yvjwCWp9X^
zKQ4L0*_?-_B9c_RHNBv&+%*M=&0$zbs#o;A;P(Y*M22tzz&Qx>XUG+!2^Ia(4v|I3
z#htOhA7oy?9f<-x<)2uK7s|WB1>7Biy{43S-uJP^USwRi@MX?6d=`lA3
zLq5O)*6F$|n0j_UG&qO5G$r+G5~7^Ts?zLg*P8du04w(nW5BY#ACQYiMq#(PY}SY3
zgP^o`A~Aukvxu~r%mg&W+}Za$hH35tThj7kUx)M@)rq3RaN=k
zop#7#arO!J`kq(5OIe7;WD~!?hhM+exh3~)4cX!`F@KxDvQj&BA_p{|E+O|Q8t@~K
zV_Tbv)5tjGsia^2F)Mq}f1{r6Z$_duvucE)r0oGMdXl@W5QA>trlFQpmINZ~skN5V
zd;Zb-v>uq*hjQlNU!(#j(Ue%*WPL87
z;$)#|f0SYE`$s_>-e6DnaN{`_k#sg~o546p*lEGpAfuO`?Vz3aB?#uJ=jWoewv7p^T9Og;5D}^L4ZF6sm}m`nN%~%WZTyHnkflhit=maP
zGh=&Ge|oj7?oiDq__1WKe$FhL(44-*T}6~eg&Eg7jj^9{`qGjvtXJms;9yC4mq|VAmaGoC6MNC7F|U3_}+3X+BPWkPIa#d>euP8vm
zb0Rf94li@t>dA~+-8pmP#i8;^Are}UB8%_p{F6zwENiZ3T`_6(s-m6E3yv+`6cT_G
ze5%;`-jkcDH5(
zJO$LVZ)0>1izHiqFZv4(R-nZ64th`?CUCxQSjThq?4u7iPp+Np!m|wzwS2i!d|v_f
zFSEthS9!&EknR?X473{zZ3nY+nG(*pVBMZ8o(SLf{B<}s^ZK>I@<Fv0HckEXYCF&kmr6*r}$Q#W;;2dU~Y&d%&sg=L)9`W@9-5;
z@T1)1#lwE&nxAQlN`h8i`f~)yRXfUh5?irg%AHo5o`T5nK&v>>#y)Tncz7q%HC=Zp
z0kh+bf{^06G}ZZ`QMi-%~VTx{60^`yt$C~
zQv(^%3?|dn0#y|7>J5xoz3f-lf6CTB0}tst-~wLo8;hnUc#)lQz)AzNF)lCK&zhAD
zY1tw?Tn9!hq`-8N{(D70l}-=}@r?d#%uOC`UPxp9PAq6*k0n9*Vf!J+y?cYRRuV!ZXU^Al217;Lt{>e0u
zh$rqewliMpzpEylVNCLrOkg}EKx8VP({Y)q%I7*r(X-oqiuKxEYhZj7JzH}N>TZkG
zexQVLfWT!*bSfc$2rUpMs;%u}4JWJ4+Qq&iY>Rh|XDY-@F!cbs4J%82AYeU5Z94#d
zm3_=w(4T#7+Y&K$bLl@yZ_&YC*TZ78SL$#5$?C)FtK^6K+fl?gJ9pR%AV9A9=Gc6#O9~wMAv9rf^52UQ8g)>6~
z&zm@KU@*#x-gf4#I;)A!-@^@(e=im&vc|{9P1<}Y#XOfuUVzKcQs?)saGrzLMaO{$R*aE%nKTn;
zM_!0&wLlE`+I)ULVI0;(?TbI?eB@MZ`#z@eH5Ql<(zKKaD1yjc&ihxcN$#K5`1T&I
zXjk7B9;+nrFfsD?Gf9D;RJpnK=FER^M|aLN+)4vCJ{imMO0unNE;nL9Dh-23g+sLi
zNRU}i!Pp!BRxut(t=R_sFnp663cp)^!`N!1Y1%fQN*X(sS22R`Nba%F?MC~c$24mc
zcyhc%d~i+M5Sr=!^`&0_JX*6v4XJzVy}AE8X>fSa{rBU6mu46(1Z@cP?#9p$cSf^O
z6w6Yu;5*onMH-X3PYmDtoyLHGqd^TfeY3#xAx2bRRo%v| (dCF6_?r4UiM81}#C2I8&m1=8N|YOEtLNB#VV
zJi8uwrklpiyKx}=88;}NHo_CMGE`q3ST$6Dq;qm}EwUBkF3R4bC-s)|jt8)&;7GH2
zCFr~3_hw7US9g{uCYKa~3g|KFIPZ&^7;AnuE#gy(%A#j%^XUIUYc;SMddtLU9H&%f
zh(`EH@EC))rnEzCne1vbKNxDnX)DyU%#W_(Ssx@2#yEhSEd^#D3N4z|i2m5qF)Pcy
zD#leg-^3$1Nw$w^AoRbUO+|Ud2a!ND%_7*2tBT+=^SnO-^U_5y3Imq&OM{&U-wdF0zMvx*Ewx^W@C2GdV!dDZ7`gN|*Sboxqk+AX&tsGX;9BkdEXxUN
zI9>ZYkfqLxfp%BobnQlyj7L=B0-7x+HTzwBlWLQ@lV(}vuUB|~o+_AKJxV>*b4`Dm79iJCY@
zn$Xu=|L_=z8C0pRuI(+H>rApcKhODrPYy)anE7#))RvY4rCY&JXKqNl%>18h=97jX
ze2C}~vrFZS{@rb|Y5O||YeRRlHmZ&Sl>z(P35%<}DYm}{Gyl4ggS}`8%_TEAyCdRq
zpRvESANYiPK4)ksGgNedA%b>8jSIC2M8I->SwU~siV`!rZZhsb1%rX(snpVidKW^Y
z`Re{$v$c#8%I-AXe@0~Vy)f=t60qMf7JSe*b#x-BgU;{uu0mN^E2K||ObPYzHtLhm
z&Zx5XD>y=)65}a4T0ILTteAXCK9d?%!{>CpVn8)xuA~Q2z;kl2|GyD6FrfDimTx!x
za2#8HKnVq;fmM8ne5KpVNU^TD<2a&*S?SF{0J0i_I<_*Wjqk9be0Fui#g;9xs_i2t
zdph13vQb`>!u_Jde3&p^>WC2R5Ky%AH84B74%=HPfF^ePJs&sy)UocFf-YC}J6RIh
z)4y4SvaXjeIGDU_{)7iKF}59Ou_P>L6V4eK)fyB0!e|cZ7=J#PoGtcQ`xWk2
ztsze~m7n_nBB?I0(qrNG^azPiPa7fR7j;EXuYAs^xYTqc{v0p9mo?ol3~(hd5lbzb
zx8X=cAixvqVaot{PcrdnyzJagu5`qo(=PBM8*)lAQA2u`Vql8$L<&Zc6{a=<;~5UV
z%o9WF0I2TcS0jnPB2t2irC+|@wdImJfDiN>rz3?nqBr^vY$X=lk)g#^*|mbW~Sd3jSQZwv%s1-p^&~&$4MFK9m;MWr0#Kqt$;cPXJg(%$3Rxg
zW=X_aa}1G7!a1ko8vosxb+^SQY?dh|CA?DyJpO3x$ow4ASpBR1N1LjF#_BI6qLPi_-{EE|}PKw(fk
zHZ8u;0^-hlp6F7KPv(84W4y5{Wc$j+@W#dY9HX!m+M|tKU{K!=C=qwoM{B2#?EP?
zQ*+S-zo_n5>eP09>5f}pa*od|<7&{ZZ7gsZXBFqa!WGjE191QXb;PTwtn_G`i4*=A
z7)Q4Gb4$!IX)dN8h}o)(w{9`6OEE3@Va6x&nC!Wsr6)kdFd*s4g3_How~m-9lU*!-b}DUEj+(OciLsjNvlk(MVV@a|&aRd5Qt7xm
zI1P;rz+}!Nu!P?5nfzxsU4)V7N{r-``;YvhV9v1I6d$2XDKLSI-A4~Z5_rD<{Gvt9
z0(<=}(saqLj|01@vV@4}U5QcGGt@z#<
ze<$?4!{aV6;pWm+)&loT?0gd{GrZ#L^n9pg*zYgUx8vW8Df8B7C*<#ko
zYsv6$XM632iB;w2BoTi%-D@ptk;dc2X8|%vWk@lDR{ax}xHe)!*-PeB$->Ta&K|(O
zKk<&8%Qqn-KKyLVjh
zcg`YWRUKOK5HBM#hc?m|+$S00rAl#kP*qyARagpUD6pLqk+`
z#AV|6L(XzSY8-xj!E-s;vu+_l5(i;1*9o>LH9>CRTQu#Av2`rKd6k7%nKTI;Hwq}b
zi^!T>EQgHxXbfxLk`k~zWq0_T>R@^iRR0)HcLVC?$^rKd#Mkx^Snrt=rZwmdw=!FWK`sbcf8&9^VShdBVCN;sDVx-Y66uH_&UNlDa^9Af+sD)e=bV?KR4z{AIP$
zze-3aYPsS>>$KB@y+}R)r^gza^4yPkNr>kKMIAN49Y%`j??sV)W_Q@7oHg8FfublgKhuk$TXYb8
zXv65q3As+yI{{{g8JTy!%xqDQZx*lBL@4-hH%MOZvT`{Yq0hALdk(bsr8a0qLj1)<
zwc$NcB<-THWbC18i`SYW6qbMrmUhu@{g9Px({X*dVUTS#CHV&RvL}q7+?NC<*iFWM
zkEYaV{<_%{kMiOpmK6(MB6fNXjC<#DB8h3)>idpsvz0Nq{U4g(*{Dur
zT)dv2LY&f@#qtPOo;$j<(&)_D1$%Avy)jjm@yNdUrw9z3hXJPF38zRMg+weuwkNC(
znPRT&8&>2Sx!zw<6ks@~bwCG2lyF`g98Pd-5+J=ZG2TwS^#4ev!SSzlkoUual+AZ>
zObz@CuY(~4@AhV~aWa~aK{-_UWPSL0AQvu%FO{r2jH%!a|1rdoh)k_;7QWg;xgX9~
zac@-cir5#y#fB&{%nywk8vn`&t{f;QA^)-TF%2I*agnx=FDBInymztvdS_>AkX#{d
zQf;yPOOBdy6vPxj!AFc!K}AD@V=KL?7REcK-qJJl6djbKX37qKn6yyWVxEZr;#Wxy
z!#a)YM(t#B+QoZ=06Ni2YiBs=v<@pWW(s(h=>PN0*>JlFP=TekCr_%9lv~G_OoSsK
zkSYPVsafjLP0+&IVBqc`B5UazH9VlUyo(+ZAr?G*ZMYOKxuG6V`-Fn~b@pu<{F!Zqt8&VrW2$_eup$Q%V4T
zpZwvY6$IG(4GWISU}g+W)eriAqD%kKI4XcnmJ(=AlaiB=}e5VO-BR5xX8Fo+A6UtiE3No~Tdbv+2D-
z@F^-+^|?_kQeq4=B>?hV2e^LI}}=gsclg^4j2S#
zJ`cB9Q9APnEQO!uxkS7q4wXIrpn$glKrg{qpE~T5brP0$QNAMKA82n~-c>9jZbMqC
z0{iQ$K-Ea{Xfk#eJrL%Tj3ih=O8E(Gl)1!fP^+22YqI3Fn
z{p-T
zF-i=nlO7QyS_c_2+;#0|zRFIFmPv@nW-l
zUlu-k*iu1S3U7bS;p%0{gtR65z^yf#H560I#fs5bDrl@9JR7K0tRWIwOg~Zx7Ev$`
vz#T;hSbb8dAV}~ZLV@3v_$Aump&oh7Z9FXc4AJj1003{4wUlZVtRw#iCfgKt
literal 0
HcmV?d00001
diff --git a/Projects/Superalgos/Schemas/App-Schema/formula.json b/Projects/Superalgos/Schemas/App-Schema/formula.json
index 899eb3258..5acb5a1e1 100644
--- a/Projects/Superalgos/Schemas/App-Schema/formula.json
+++ b/Projects/Superalgos/Schemas/App-Schema/formula.json
@@ -28,7 +28,7 @@
},
"level": 4,
"attachingRules": {
- "compatibleTypes": "->Target Size In Base Asset->Target Size In Quoted Asset->Target Rate->Phase->Simulated Actual Rate->Situation->Indicator Function->Order Rate->"
+ "compatibleTypes": "->Target Size In Base Asset->Target Size In Quoted Asset->Target Rate->Phase->Simulated Actual Rate->Situation->Indicator Function->Order Rate->Social Bot Command->"
},
"propertyNameAtParent": "formula"
}
\ No newline at end of file
diff --git a/Projects/Superalgos/Schemas/App-Schema/social-bot-command.json b/Projects/Superalgos/Schemas/App-Schema/social-bot-command.json
new file mode 100644
index 000000000..dd25f533a
--- /dev/null
+++ b/Projects/Superalgos/Schemas/App-Schema/social-bot-command.json
@@ -0,0 +1,49 @@
+{
+ "type": "Social Bot Command",
+ "editors": {
+ "config": true
+ },
+ "menuItems": [
+ {
+ "action": "Configure",
+ "actionFunction": "uiObject.configEditor.activate",
+ "label": "Configure",
+ "iconPathOn": "configuration",
+ "iconPathOff": "configuration"
+ },
+ {
+ "action": "Add UI Object",
+ "disableIfPropertyIsDefined": true,
+ "propertyToCheckFor": "formula",
+ "label": "Add Formula",
+ "relatedUiObject": "Formula",
+ "actionFunction": "payload.executeAction"
+ },
+ {
+ "action": "Delete UI Object",
+ "askConfirmation": true,
+ "confirmationLabel": "Confirm to Delete",
+ "label": "Delete",
+ "iconPathOn": "delete-entity",
+ "iconPathOff": "delete-entity",
+ "actionFunction": "payload.executeAction"
+ }
+ ],
+ "initialValues": {
+ "config": "{ \n\"name\": \"Enter the name of the command without a leading slash\"\n}"
+ },
+ "addLeftIcons": true,
+ "level": 4,
+ "attachingRules": {
+ "compatibleTypes": "->Telegram Bot->"
+ },
+ "childrenNodesProperties": [
+ {
+ "name": "formula",
+ "type": "node",
+ "childType": "Formula",
+ "autoAdd": true
+ }
+ ],
+ "propertyNameAtParent": "socialBotCommand"
+}
diff --git a/Projects/Superalgos/Schemas/App-Schema/telegram-bot.json b/Projects/Superalgos/Schemas/App-Schema/telegram-bot.json
index 6a9829a18..809452173 100644
--- a/Projects/Superalgos/Schemas/App-Schema/telegram-bot.json
+++ b/Projects/Superalgos/Schemas/App-Schema/telegram-bot.json
@@ -11,6 +11,12 @@
"iconPathOn": "configuration",
"iconPathOff": "configuration"
},
+ {
+ "action": "Add UI Object",
+ "label": "Add Social Bot Command",
+ "relatedUiObject": "Social Bot Command",
+ "actionFunction": "payload.executeAction"
+ },
{
"action": "Send Telegram Test Message",
"label": "Send Telegram Test Message",
@@ -36,6 +42,13 @@
"attachingRules": {
"compatibleTypes": "->Social Bots->"
},
- "childrenNodesProperties": [],
+ "childrenNodesProperties": [
+ {
+ "name": "socialBotCommand",
+ "type": "array",
+ "childType": "Social Bot Command",
+ "autoAdd": true
+ }
+ ],
"propertyNameAtParent": "telegramBots"
}
\ No newline at end of file
diff --git a/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Announcements/SocialBots.js b/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Announcements/SocialBots.js
index fe7736edd..e334380d9 100644
--- a/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Announcements/SocialBots.js
+++ b/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Announcements/SocialBots.js
@@ -16,16 +16,15 @@ exports.newSuperalgosBotModulesSocialBots = function (processIndex) {
if (prop.toLowerCase().includes("Bots".toLowerCase())) {
for (let i = 0; i < TS.projects.superalgos.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots[prop].length; i++) {
let socialBot = TS.projects.superalgos.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots[prop][i]
+ let config = socialBot.config
+ let commands = socialBot.socialBotCommand
if (socialBot.type === "Telegram Bot") {
- let config = socialBot.config
socialBot.botInstance = TS.projects.superalgos.botModules.telegramBot.newSuperalgosBotModulesTelegramBot(processIndex)
- socialBot.botInstance.initialize(config.botToken, config.chatId)
+ socialBot.botInstance.initialize(config, commands)
} else if (socialBot.type === "Discord Bot") {
- let config = socialBot.config
socialBot.botInstance = TS.projects.superalgos.botModules.discordBot.newSuperalgosBotModulesDiscordBot(processIndex)
socialBot.botInstance.initialize(config)
} else if (socialBot.type === "Slack Bot") {
- let config = socialBot.config
socialBot.botInstance = TS.projects.superalgos.botModules.slackBot.newSuperalgosBotModulesSlackBot(processIndex)
socialBot.botInstance.initialize(config)
}
diff --git a/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Announcements/TelegramBot.js b/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Announcements/TelegramBot.js
index 2d47ba3bc..a5b34f5ed 100644
--- a/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Announcements/TelegramBot.js
+++ b/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Announcements/TelegramBot.js
@@ -14,9 +14,12 @@ exports.newSuperalgosBotModulesTelegramBot = function (processIndex) {
return thisObject
- function initialize(botToken, chatId) {
+ function initialize(config, commands) {
/* Telegram Bot Initialization */
try {
+ let botToken = config.botToken
+ let chatId = config.chatId
+
thisObject.chatId = chatId
const Telegraf = require('telegraf')
@@ -25,16 +28,17 @@ exports.newSuperalgosBotModulesTelegramBot = function (processIndex) {
thisObject.telegramBot.start((ctx) => ctx.reply('Hi! I am the Telegram Bot that will tell you what happens with your trading session.'))
thisObject.telegramBot.help((ctx) => ctx.replyWithHTML('SUPERALGOS BOT HELP\n\n' +
'• Use /stop to stop the session.\n' +
- '• Use /help to receive this help message.\n' +
- '• Use /balances for episode balances.\n' +
- '• Use /counters for episode counters.\n' +
- '• Use /statistics for episode statistics.\n' +
- '• Use /uptime for episode uptime.'))
+ '• Use /help to receive this help message.\n\n' +
+ 'Additional commands can be configured using the Social Bot Command node.'))
thisObject.telegramBot.command('stop', (ctx) => TS.projects.superalgos.functionLibraries.sessionFunctions.stopSession(processIndex, 'by command from Telegram.'))
- thisObject.telegramBot.command('balances', (ctx) => interpretCommand('balances', processIndex))
- thisObject.telegramBot.command('uptime', (ctx) => interpretCommand('uptime', processIndex))
- thisObject.telegramBot.command('statistics', (ctx) => interpretCommand('statistics', processIndex))
- thisObject.telegramBot.command('counters', (ctx) => interpretCommand('counters', processIndex))
+
+ /* Set up additional commands for each Social Bot Command node */
+ if(commands !== undefined) {
+ for (let i = 0; i < commands.length; i++) {
+ thisObject.telegramBot.command(commands[i].config.name, (ctx) => interpretCommand(commands[i].formula.code, processIndex))
+ }
+ }
+
thisObject.telegramBot.launch()
const Telegram = require('telegraf/telegram')
@@ -67,72 +71,28 @@ exports.newSuperalgosBotModulesTelegramBot = function (processIndex) {
let message
let tradingEngine
- let tradingEpisode
- let sessionNode
- let sessionName
+ let tradingSystem
+ let sessionParameters
- tradingEngine = TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine
- tradingEpisode = tradingEngine.tradingCurrent.tradingEpisode
+ if(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE !== undefined) {
+ tradingEngine = TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine
+ tradingSystem = TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingSystem
+ }
+ sessionParameters = TS.projects.superalgos.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.tradingParameters
- sessionNode = TS.projects.superalgos.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE
- sessionName = sessionNode.name
+ let taskParameters = {
+ exchange: TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.name,
+ market: TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName +
+ '/' +
+ TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName
+ }
-
- switch (command) {
- case 'balances': {
-
- let baseAsset = TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName
- let quotedAsset = TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName
-
- message = "SUPERALGOS BALANCES\n\nTrading Session: " + sessionName +
- "\nPair: " + baseAsset + "/" + quotedAsset +
- "\nBase Asset: " + tradingEpisode.episodeBaseAsset.balance.value + " " + baseAsset +
- "\nQuoted Asset: " + tradingEpisode.episodeQuotedAsset.balance.value + " " + quotedAsset
- break
- }
- case 'uptime': {
-
- let sessionBegin = TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_BEGIN
-
- let dateBegin = new Date(sessionBegin)
- let dateNow = new Date();
-
- let seconds = Math.floor((dateNow - (dateBegin))/1000)
- let minutes = Math.floor(seconds/60)
- let hours = Math.floor(minutes/60)
- let days = Math.floor(hours/24)
-
- hours = hours-(days*24)
- minutes = minutes-(days*24*60)-(hours*60)
- seconds = seconds-(days*24*60*60)-(hours*60*60)-(minutes*60)
-
- let uptime = days + "D, " + hours + "H, " + minutes + "M, " + seconds + "S"
-
- message = "SUPERALGOS UPTIME\n\nTrading Session: " + sessionName +
- "\nUptime: " + uptime
- break
- }
- case 'statistics': {
-
- message = "SUPERALGOS STATISTICS\n\nTrading Session: " + sessionName +
- "\nDays: " + (tradingEpisode.tradingEpisodeStatistics.days.value).toFixed(2) +
- "\nProfit Loss: " + tradingEpisode.tradingEpisodeStatistics.profitLoss.value +
- "\nROI: " + (tradingEpisode.tradingEpisodeStatistics.ROI.value).toFixed(2) +
- "\nAnnualized Rate Of Return: " + (tradingEpisode.tradingEpisodeStatistics.annualizedRateOfReturn.value).toFixed(2) +
- "\nHit Fail: " + tradingEpisode.tradingEpisodeStatistics.hitFail.value
- break
- }
- case 'counters': {
-
- message = "SUPERALGOS COUNTERS\n\nTrading Session: " + sessionName +
- "\nPeriods: " + tradingEpisode.tradingEpisodeCounters.periods.value +
- "\nStrategies: " + tradingEpisode.tradingEpisodeCounters.strategies.value +
- "\nPositions: " + tradingEpisode.tradingEpisodeCounters.positions.value +
- "\nOrders: " + tradingEpisode.tradingEpisodeCounters.orders.value +
- "\nHits: " + tradingEpisode.tradingEpisodeCounters.hits.value +
- "\nFails: " + tradingEpisode.tradingEpisodeCounters.fails.value
- break
- }
+ try {
+ message = eval(command)
+ } catch (err) {
+ TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_INSTANCE_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
+ "[WARN] interpretCommand -> Telegram API error evaluating user formula -> err = " + err.stack)
+ return
}
thisObject.telegramAPI.sendMessage(thisObject.chatId, message, {parse_mode: 'HTML'}).catch(err => TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_INSTANCE_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
diff --git a/Projects/Superalgos/UI/Function-Libraries/TradingSessionFunctions.js b/Projects/Superalgos/UI/Function-Libraries/TradingSessionFunctions.js
index d70d32fb5..f59315da3 100644
--- a/Projects/Superalgos/UI/Function-Libraries/TradingSessionFunctions.js
+++ b/Projects/Superalgos/UI/Function-Libraries/TradingSessionFunctions.js
@@ -156,6 +156,7 @@ function newSuperalgosFunctionLibraryTradingSessionFunctions() {
'Trading Parameters->' +
'Session Base Asset->Session Quoted Asset->Time Range->Time Frame->Slippage->Fee Structure->Snapshots->Heartbeats->User Defined Parameters->' +
'Social Bots->Telegram Bot->Discord Bot->Slack Bot->' +
+ 'Social Bot Command->Formula->' +
'Exchange Account Asset->Asset->'
let session = UI.projects.superalgos.functionLibraries.protocolNode.getProtocolNode(node, false, true, true, false, false, lightingPath)
|