From cf795bcc48c170cb9d868d822093f16ec6937959 Mon Sep 17 00:00:00 2001 From: David Adegoke <64401859+Blazebrain@users.noreply.github.com> Date: Fri, 16 Jan 2026 23:28:36 +0100 Subject: [PATCH] feat: Integrate Jupiter DEX (#2761) * feat: Integrate Jupiter DEX * feat: Enable internal swaps * feat: implement Jupiter swap execution api and enhance trade handling - Added executeSwap method to handle signed swap transactions via the execute endpoint. - Updated signAndPrepareJupiterSwapTransaction to include request ID and handle swap execution response. - Modified trade details to use txId instead of id for Jupiter trades. - Enhanced error handling for swap execution with user-friendly messages. - Updated sendviewmodel to manage trade state updates after transaction commitment. * fix: null error after successfully swapping * fix: Finallyyy fixed the annoying tx history issue for solana dex swaps * fix: update inputAddress to use toAddress in JupiterExchangeProvider * feat: enhance transaction handling and token balance updates - Cut down tx fetch/update time for transactions update after swapping - Added TransactionFetchResult class to hold parsed transactions and token mints. - Added pollForTransaction method to handle transaction polling with exponential backoff. - Conditionally hide the external send button based on provider type. * feat: add fees to trade object and handle null case * feat: add Jupiter referral fee and account configuration --------- Co-authored-by: Omar Hatem --- assets/images/jupiter.png | Bin 0 -> 200124 bytes cw_solana/lib/solana_client.dart | 540 +++++++++++++++++- cw_solana/lib/solana_wallet.dart | 109 +++- lib/core/trade_monitor.dart | 3 + .../exchange_provider_description.dart | 4 + .../provider/jupiter_exchange_provider.dart | 491 ++++++++++++++++ lib/exchange/trade.dart | 10 +- lib/solana/cw_solana.dart | 191 ++++++- .../widgets/sync_indicator_icon.dart | 2 + .../exchange_trade/exchange_trade_page.dart | 41 +- .../exchange/exchange_trade_view_model.dart | 17 + .../exchange/exchange_view_model.dart | 2 + lib/view_model/send/send_view_model.dart | 103 +++- lib/view_model/trade_details_view_model.dart | 6 + tool/configure.dart | 54 +- tool/utils/secret_key.dart | 3 + 16 files changed, 1509 insertions(+), 67 deletions(-) create mode 100644 assets/images/jupiter.png create mode 100644 lib/exchange/provider/jupiter_exchange_provider.dart diff --git a/assets/images/jupiter.png b/assets/images/jupiter.png new file mode 100644 index 0000000000000000000000000000000000000000..9383f3e54eb59d6b6dc8c9a217fe0b7adf97e050 GIT binary patch literal 200124 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–`3Cc@ACSzusY{nlV&zm=gY*25Rfl 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

1P1(lqxAK6e${3#C_XH_ zdh=Ls(?h7Jp~(a}tP%+=*JdQm5qWUrTS!KwWK`$IWsoSMRaH-%dN+)VFkjflp=eup z^s+lkjX{T7dl&==Fk3+z5j5W~p`JiH-Y)5$iAQ7P>uzZuhCbMfHsHCD_3u}UNmoxR zJN^^Z|6MopbB@aCSSy;vpbR|Tvmo^{K{iBKYRR*Mn2!I;w}z)5PPPR zNw8ZbSy`^<&sH+QNva$c-_QUHoxfyzQXfCm1FqB@Jd$AM&xd5Ex@_{|KpfYrX`Q{^ zpRi0%0{=r|nSP}9;oqE8pFdU={CCtC;=KxSJ_Ev|6)sV4Xd_#FQm=UIL1wG1E)2Vm zC&no@eW30z`e%pB(i*dyeZ9^lrZ*0Kv?2bo_+a(;^{5#sz>`=v`lh5RR7}ny2M>g} zUTR4Vv}!zw{5m$JHT<)JH;0tuk-zc->#rP;{r(f}5RiD?@>X+@a}NaU=O0H+@kFrZ zqSsjYnrh8t(fY~^AltuPy{=hfB?2m0pQVILd>1GJT9c>&3C!kiK#m*lG3fIvIp}XH zQm?h_xb6u9L%*qC%CIr$Lj!TaBfBWTQIoVCiA}lSJIM9P^Z7Ba^+Bn_T`D=uC+0be zx#F69B&?UZ2Cnh~&w6E*LTcIG$@%7|Y;LO?$Ujn}!@f$FBFlrs2M8c0wF} zbXCLUbNQvo+YP?&H0sylLawmR<-@?ydu%0i#gZ{Fz6MMXOga=XmmJ0cD4TVz(Vke# z8eh<=dCIxH>gSm9xxdhuw||6{6m$Y`(F|jxKQ~PCB1H4&hL8DI@Oh5+Z%6Q+s~Td( zWNWsqg6>EGy>-grrl{^7afVyV9D`)R-?d+a@Du|LVsSsA=KprP7VD=1`QrRp9=GIr zJU=ok@$7W+`vr&Ww^(i2iH&{KnK10PPaFF_C`(z{<{XDM@RDB&l@E^*MpAp;q)LcyoXP zMfX0CjHQ>#e5i0-vq4rWA<=KfO?al!-9=r+`qk+ZlZwj_J9JexQDWHeNRAoHIVu7( zEUZZ&mP|xk7R@0A`dq!f^X?!Y`}=u~`pGR;zoyRYM|Zjl=d!6W?dS;)zGpB-U|nP-BSo?eo@IK6(l6-35mysv+mzu{aWsU;cW$bN;8P z((g#GDQi`6n(3cgUYmTo%}3(F-8Po|EwlD=Fwld94czZlZ;6rU*qqkp@Qo^-J?q*58g_-oj6u0&vY+;yM*ZKJB3oF z%iX-G*JyF+g^~9|8+vqtLU)FG$Y_uhCzY`@56qmFx1EB$yKW8(1yQutcn{m#4M`wj zAEb94h<(OPkE%&{Oz9{BjSW~1yu{2;pt-WXh@x6k(UiK_H6jlALA>OMNcEM(g?4cj zYU}*94T$FI)onKKex#bCAD90c4OlU>O(xBieY_~hMCr-6MFk#N6J~A}RrgpiJ}=NZ z6UvR_@Hm}8=d*!uDqfzYLsCRi!ZbG=sS}>#4wVuyDo4VaAYxg88*lZ;z+2!xh1hho*{~pg8Wv$J?98$xj+X~(fTuffs zOVo=tT)EnC*~vY~5t&R^XOP}I=0wSd*%m5vbW5#rK#lPs{h3L51IKeOWKBx($+I^E zYzb(#D^X*VlnWVq8+)Z$BbQPy1nO-0{AD3A7?Gb8+L75B{nRCoR_$HQetI7y%&VAM z|H|K})`;>WSQ2OO101&x-c&V|n|6`f%y$~fUk6;3XKOi)-s2J?i_iAHL^4(yveu85 z%bT>@=m0Scl*I@!Pt_{Tz!VL?0iCr?_(j%Cw_g%|eqom{pF?|}J@77H<;lkLwh}Pc zyYnK1mkWo`SJp7fC_eLwRRkGoDuFb4+=#-wPOI={X?yJTUR*Y635bIP0OJH>MHTd7 zaJ!g8xMLOLF}Li%2SAg0ujWR>!`E~fwu{!j(Ij=>kfgEb@MS1ZBd96l83goZ@zqz-EW;uZ+d50?ngQxdES`za~yvgITN zM1xTZ=+)$4v`o0=N574q;Cx>3C6DF{zxqKVCe$Qb<=A*}K8NTLDpCDrmY=_2pNX^4>u*PTJCGIwk3Ku6YO1RUD-wPMHf$w> zkysSkpiXvrw(Hg03E|p116?`wr!9pnp~-_;7Z?}~2R0?VDP5apg*-c4_k|(z;PK`u z&0B1V+ck^CWyjO}pS+vwAwp9R^{6EF8od~u>pl&dW(VOM}u^F<6a)OwM_($ z#Dgg{^&){GziD~NJW&LzWsKmv)mF`U^-{#Cnr)N9m0cpF+2 z4WX-wC091+SxIG_qgKF^J`XtkU+7OJ%tTme!U^^XFPZANQ;dGHL@0eXa%t_SXNB*t zcm#tZD<_O8|GTI3Z`NbHQlFN7;iBog%3&`d?^kSIpzTi$;xp8T7znI(rPxqp%5 z5RD3fBkFH_!pDoGNB&>|Ak1>#R_+}o{4}_MP!c3;2Md@-Z|E@`;o5ds1!y^tm4d6W z$pSs4Fwv<3`{kvyPY|gta2dX9oc@YEbhI^wz6bf`mTj+MfgTr>egd7%{*an)vxh_B zMzn=D)_(uw&YL4ci9Yt{fL<`io1~eK{P<>U#KDr`VoNl9pVOK9#m{Pirt@BB{hf__5VdaGHov=<3+vhFSzj(_3&bOEp@uo6(Hs4R zM^?=&@=V|Ja+0M&H`?9`G+(gZAoetkQEacS60@7w9$DPT%~ z!7+RT)^@OBDQ~r`){JugE68@T*YZ1(e>~q0C3Vq>U z_tK)4T4N08uibg6WCFb{z8Bz)LITVuZdm3lK0YegQ56CEDL?*Y4lJG61Mbom_Etw_ z^wpseVqili_`PIteY4}7p(d_Pq8y2)Uq3JF^mEdi6R7S|t7KqA5DUClIeYPqZty4U z+r=%>lEQO{JdtFXLw_qytz6xYhD;#m=qSYAA7U2CO(@416>WfC}$~ml# z`A=fMg8}v)x_UH(2>Ifger|r-85HV^taI;`E{ol&RH$l&zUl0)k!~m;3c<5+{8k~^ z|DffBQ0q;i5Ns731FUtvErKTX;eCbSk9hqLXpqh<=Rb zaml|4qf)rOh0~ci;osk~*b_~OF4bT`s_@Z39gO7f`^rw=VK1&E!rzF+kOrl9VWgWp zHV{FdQ~FJG4lHkN13(8X`vC3Ucm&Pl*GE954y}ywh1a}wZjS7R;BrdwNw;|SCPF+x z5l!ZA+Fxj}7oP!MMt;6yDhZTt;FJHoPobULOB2;`OL!au(>z2bhBe6zjT6j+UW3Hu zM+0+_o~zDlgW^~wMnMZYySXK{zdev-uc+A}oJ0Tg+s1eU95~qK6e*9nr&;-ex*Z81 z3Oaw>gaLpB=dDxc#nyf4e#fJ4Ipc80RjE;ke20O(pJV#JcIp%+h|m>|lbw%o`tmwF zx)^0Wb=Nc+lH{nPh%F0L`MX9^dh>4Z)sh#=Ac8cw*p`XqRpol?_|*W0{W}bd=u^`c%k&b|`48``Li#{Jmi~r~CUHdDjiFV%jSPN@|F@>}uuhD>| z*7qW_M=mJzx>`t-Pn}b}MXn^n7}_MP4ekClm|lS#k7M@1wHr7Lfzx*7liH}y&%CMt z+9n*FYRJ(g6A5mp9I36N2xS)Sg|QL~cqTyE)V9T@?OkQ9O&jPRPDk(Yd9h36&CdXy zS{k}Ix3s&Df=$n0)z}j4tGuxQ{|?pw@JOm=Ff8_%Cah>p2LO}~%JPL7+RT`hW;#;v zoeHrWctJqd;h|8sf&aY<8yQ_d6hqcID?*`_Ob9Klq5B}orDLCJAr3BiA)sCU4zM(l zNx)|>8})h=HBB)gmlx~WK$Y?so-C`oJYjd8x-0Y)kiEhFZ-R=}81#L#)nm#P7RVZ- z?;j2L=8uDQY?}c;sE!`1?wY*9UYr%E#M82<4xcUlTloIJUQMUNq;@M#++h?Zcjzht zQaE(lTj5qSf)Ro<$Yhou!^%(i(_uj!u(H()J<))WaFEloxEDU)M_uM{;x1!{^4amV zR?Id@pho{IvW@rBJa5EEeI6aMV>8Wa8d043rX+U-Tbl5@a+9I+s2Lc!oMwg`qlu#j z{|kJ-FL%yKYt^vy{ErD|bZkV2uFP}rA2cbt|GqH)?^v%Yhqv%8EwG|AZen6qfSQ4r z%4Oo6t!6u3t&pq~{%2uW{Y#HAE7~b&69MKrVV?Oa6I>%T<*lD!(fK62H_OBoeW+<- z@UCSN#cxRVRvXe12K&%={OfGCJ*W#1b(dy6^xKk*U8rmWT5GB+;z+Hi6HRqN`I#P# zh=pEbk9yx+j_v6!?>w=c4Zckgi=^|I-~`v+NNqp+yVtL;&f;)7_;kaL#fDIRlrV$J zn(lsOc?v1Mw-|wla_0!u`X8EVF|^kb$gmWLS(TkOjtIjJ;(3hIf&!Al(;*4j9gSRo zbsc9pX5|XPdu>=V3_STXJiUs%x!Y%evNmY6bbXJ-y7X+9`e=s$%LNkjYshH^%SNRaOPoXxUshu~uBhw$N|al`jLX@W6s9h>ss%l@ zkFgoB1ceC8_>zgGML0MY5MB&|Y8z}t7Oz|RLTMllrjC6olmh0x6YxhGR3Da7P%*^e zF0Z6ML`*kpD(k(|tjti=@8~el!HH1b10M&dxK}Pc1|8WF@$JDfKbv!AyXTG3R_VJl zWjcLhlNV3z#WfR)DZvQ)zI=)~WmOAMHLyH#UPQ|lTi<@|8p(#p_4zxf;eLAUOo9D3 z)RIIshSu)Bn&Vx@9?8k?nA?yxoT!%WiVxJ*jX5X@n~Z7Op}a5ma)87L4FTT(!X`L& z!fmjn*)f10-2!3(of*E+QxqnZsi5GE#Q#KN8chJm`|^&6823EIIGz@d4ecn2>`&@O zhZjq-_rM=kfvW{RTFh?<0sM@TB0=~tqwYBCbt78y;)CngcTiVIOzsRZi!Rt~0^k_9 zwE_Qu8jhnFzH1%RQU#tHeR&+%t7T>$DC@#;h8D0FI=UF7V4%-rDMccQ9_FM1DNO+J zL;pJ>0sjmn!vAyaSBL3aS#p!9iT+boqc#3%s_1xHKB#tKpIe@F<+r<$ahAV2F(iMK z8*ML~2HT}VyY!Ge`YdbIRsq-p{;KC7b}PZ^v|ndrnm>d-Qa_p^``}JPWNtm9#)tvg z3>ArMNAUpb5`FkV^KLhc`#^!h2hE9=WCIf9*(K`sB6uOIjC~(dK1)3pI@%RXw?eM6 zw4O9uH$q*TQW_qh3uPlFnLGH6Sbh9ea*I9}`vU*F?-h=%)15bOj$DEgZqJxDp2VGI zgskgdD2Jjp@S;FaK&sB%eN|m}J4B=31KrJCBf@{zj6En70O*bY)-e>(vVE{m}xQi!oo8U+U< zw2Ki*$6SJdCcALDcKIj)n*qQAN9DZEnAl}3!MSETgQ5;3Z&^UXVRJ+1wxx$`@D>J| z_FEJT_~QCow)Fb3EnDlXUx0$YTs_2;M+=w%*!;5_v@E~vlHB9Ksemtw*{7c1hpP8Z zEUGaqbcT%fsW*utrsHU-2sb`bo$MhWFD4XN(?moIW&^I#bHA52Ac+g9a)-V+U<=SQ z;%y&H+Xx*b==kuHO-vcHo-XMr(jN?dzF@L*Z&Bc!iIsM~)QN#de+P1$p1(`TgbYNE zEw!Qg++P_fuI<&jUka+|ZnW0r9GBOzC3d3E0p-1J(J!SMkkeO}!9l3EVVIUKz^wkC zn>i>1dJ335E1d2HS~31whl`0Hzs$ucuzl01WRqVd%VFyUd>*j9MV$tKSiaZ0cH`6X zyU}?8wz=~9>V_!Sm$^V4HmVLeo3ax1$W$OG%!06V&1o(YHdFJbi@p&soB~0@6z)eN1C{UekPY?&24)JYTBwIGflo-pP-UB=^TI~-49TI+0|383 z|KC3b@u=ZcL4HwFEhYag<)>tC9NSrx2yJ!IDPh&WR}uc;IN+QQj7&i~r$B8NA1-EJ z`7s8pX<>c{;frqu0qpc|xZ)URfuK>FtxHoF!m0a8+k`Uk>)@3ue(R+cl^qZpSZJe+sn*DFVs0&Hf`Et^fX=JfeecA z^8nNtHa-RslfB*&ler|S{f3M_0K0%eRUJ(=O%HMMl6>&EZAKKrH>UV(wKwtd*i`}a zzA*cp?L=A)NRu+?CBj4}>h>5U08^9FK~XB8KH;2xd2bgfS?UAl74tpF%(YbaQ8j#Q zK}}5`LZiKyyu8^E6lO`42F> zCS4E+(l!$Dg@QtkzqJZZfjo|yCy9BERLwb4%vZz7uv`ZnJGx?qm*&*YQYgAcgP4(H zrO`s3ukFod+aeU#bpRMHbMOm^f%n8VezJ#^5=scOj;#6d^)JCM?(b6BmThrnowdSW zIR;8*Eozl)dXv(TLUs3;`{Q zQW;SaBKWYEztKV){kgC1m%Gxf0J|?80u*3IEMMVFS>$esn16bF;6!=<9EZcYbk5}(J>p*Q zFP0I#gB|mJeFiSg?cAb>E>b1Ep1DYW)@8 zqMSRzifBZi<~WE(w2bIh&|LXfMAN@tqe<8C=75|NeYrpeXY+S!mmoO5U^XQDcJt+5 zNMdl?%*lfkfeueTj+R-W2xfYbq%Iuz0-+?j=|5`qZjbKqjUIjp^K(xoen8WzFT&S-*ax-i+QHEDr zu0T~Ec5o<`f@Y2OMtxg(`|RXThC{;E{l*;;ebi(4m`E10*T7OFhs$4t(9?KT6OXVj z^4}1BTn>ni&3&-1tzI($m#Y?hJZLLj(PEYr4L$O290eRW00p57W%oiW-)c7+KfFA6 zrGUa0&mp~-jHY!JAKV~SIzSN#%G@hb*YKIZtI3Tu1}KpW8Ur9!)l3$?73|s)U&YR? zD;++PIy~iyVjt*Gk}bYnj!{PWbu;i~Iae2y(d;x|fAu1pzXSFcsgDKRK#Q*c_v~~K zDAK_Um6m3@fq#~6H849*B+Tp-e(oBlfB*hZK9Co6u^N5){d*1K`bVg)Uad08nIcqU z6vDUcQS8L{xBliqs89iXt+f40J3;q=d71`tRr^bTDz*(ppQE$}S84l#rHd)II{&LC zEZUA+jJNW&F8#Av!z^e)2W{gLNE#iXdsTCj0VTQ*t;LLlgZ+fK9M=1e9Z6y)+{#~x zwjh7@#whb_IQIrnM82dU><6ho(!`d-JdOZRfuDo&JdcNmDmVn{(|8_@gmMbP5z&8Hme<2Qof3|xk=5=GZ+z*}d<&w=P}gra~m0d5lkGr0}fQu_45@W;SC z%nI*y!5OCQM%d&&kM0pTQnz|;%PqE%H5&LiDg@HeWusSt{S@;`f@PqKy7M$+QY8Q9 zt__`MTL-Kn%f6_xJaK3JUfyLvl6#yS>l@{ma3$90fwBxbe`UdN^|L|x+`Oje^=Z*s z-3;iW8yd?mf_86;Tf5dlkWT4Ke6PYK5jnmBLn25Z;cb_`I>mz2F;;Ef#z4I$a6H4Eo4H_@4&wCQLfP#b4^LNJSSt^dSVM#zy0H5Zm0mzI&5EpDYZ#d z*SA3VpHz{1Qq*^u!0`=lRbwEo2OI1yp~5Nz1dNYJwO?MlrWe9~7=t3%=DDieVmo_f z>)6hDprU%Ce>D^8cRIXKtZ)v7LGbTF9uHd-Sv2jw!dyB#Kn#iL+fL{ewa^YcvFClV z)ZLI>y&Y_`MV~Bn?!PngC7^WJeM_4((A`pp`4Uam*$B6uce`$e(GPS^RXXn;Qqu*Z zZqAUR0VX`ne|ON2Lm+YQrj9>27wwY@dn`pWTwSvlP5(jJ4D*o9pectTZ^t<}hD&qU zDrlo3pd#yoTL|=@j3U##zFUn}df&gU=JF1&fe?*EJMH6bKf7KKVF|c-!$BzoOqeIt zyT)KSx2~4#jQpAm>xytRy(L+jyopPEGtDV6xy!aG`1{T0@fX(zX}?_klU!DbPyj>> zRfW9;jDw7!@WiUv8~=mx2Sg$cBD};ZpvExu7@fl=!L;If{oX#d+5KO0;+4Oq&Xj@H zEtGkHH7)_yAT*78B$b4NGi^#08@Fy}w_(#7sDGgehUpZOY>-~MHQ0HTZvWsVKFffE zqIr02i11HyVN{cS=+wA2#b+@Tt&u{p%O9<4(O<=@P|rX9<`Va{8ojEy4g(j~iY}-^ z)YwL`d>?;7NMSV+km$|7NFWoSEMNmJ_%rmuAA^SD4L$!ENydnRRnIEj3|7Gkucj&W zizfSMsINW5C>XShSH{cEq`aGY!Ny(8mg_TTDE5OrXYGikC0M5_#oehOTy95}#qK%K@o@>5$C+U{ zeM>y%ao?gBR9Ppm^94$5P+CG&ybfc-mctQrcFFF>6oqf2AM`4yEI!4^`*(qr>*x5M zu`pPr=g-?a$~LPu+AF{RVxNuW=@8gd{)@N-{7vyhooncm8KrjDUrmvlxHST@3HFb- z+y0A3l+XUOQ0sI=8bDA(;^Xk%OI_)t*~lbaPCez#WgJS;tGe2JTrKiLRMcK=mf& zDS*@qMaixPd+6)}4*mzeTPf<6n~T^s7vP6are6MlEQ_pPt@o0z;~*bam9N}p-WT4eIlyYV0pP!Evky84=;v-c|J)+6k7=sJ5EUGX- zE_n+WsHH)bdx8Yzwi`OrXO`;q@aP65)!=)8)G&vQ^0atbENj$~oLB1hn?Ap#&$r^y z*x9ax*9dJzxU1#%AZ`(1InvtT#;-Ho>|_fBcEnYgbNn;g>m@#CWy)IxJiBcYFYe z8$zTKJM4fm>i~8SbTZ({1PhY<)j5IFd(xx$YV(Zf6E{x3;BFm9m;LCyR`M*_M`_{9 zR+pY~g(9Ay8*kbRWkrgb)iw3Y0b{$@0_3gK`M&MutlhxofA;)=gR2bB%Rr*(aHz`% zOA;u_%9pCGRs-rO)ZLeU4(z2d3KR<)Iz#qNhGDPrn3w=;=sv@S?$OD1g8%M-luHq& zro&?a$fx$pXZfwB#?``rhX`7D<ni-SFEdDS&+*QY%2XhM~uRJQq_`bF2#&5h9D@I;iCtzMeX=7ri z&M?|HZ$(Ymm%dumx#gpCmVCx3*G2``StL+7kjwG~m!enp%{)(#tQ5r-92~IrN9Edx z0ehoUb`HTyd_VlP(sAhOi*5V7PouIJ-ZQW!;TlOH-jn~u-ivvKp z7#Y6P9N8nMGq*OY97f+B+5b$>(qMUqb-IvvUI4_VgiU=c4Wu3@O5G#s+g7xG`T(Uq z>Up$^Oso{i=`b2(vLRxwJ07R6?djPs!n%rL%26Xtn7^1G704=LoGW|d==k#la$Nt+ z`RIbG?QPlUKSJsr85eVHp5_fY7Fdupk2`q$_~$;)^+Ef!yT`|;bJ-XkXlsNDj{Cr_ zN}cV`c5fcdi^tHPiLD2ZIMB%e<$0C_;nko}ZYOQWz#ZcOkUkN6*sW+eWE;>Pfu5R_ zPX_idAathzcXKdKFy>udCUPvQN6O;aV)1910L89kf|ro&W6xU92lQ6y3S-mxl#J*) zapQ%A#ipysx>?EEMzd)AOhQ$_{c!gwG$%qr@qkt{GrYG6l$@2&Wo$M&#|zMdBx(b? zf`-6~h3B^uA!Gqv>>X&zz?m^GdNXUHgo~Mv5)_Q8rE?;Wj;Lsxy{mb4B!2OE9j6;D zb;Ul~IQ&iy?S!A5dqa(JU(1l<5VeT1IITe2Ay3dNfgNnMUdnlRPVc!sJ)#yoW8k1J z!aBtWuTaum+z;|0*Cnb8F@O&?8K47S8G`MF8bjB*tW^mF6IcD-W|v*_=GaH$fe!`u z%(|QiEu#5`a8Vh_FIRp^1~pRrQb+7|9b4fs{>%uSSly8zq{5#nSK2yEBp%;%D#lL% zkv~Oi3#Q&2X*!#&Q=6j3c(3*PvK?E?VEP1qOW-#cAYS3C)Udc%G(WE!vcOw1v7!s5 zdmI3mk0OK_3#0x6_NNIJj~y_L1EenKRR}|Jv%r!Ybb8Q$y~&p#eB{!QI<4#B_i=Ox zzZ{8c{N8P}&XzI&eCbf*(+3h>Jm+L;?PEr1in>w2f#i$CV z|4m52#kT8kQ5?vPKuSgee65rTXLEW({{CK;WT(tB{(R zE_qLbchfJ}GrDfz+5C%N6QViT3M4D1GeB*rsYKHVV7Z>>zmdKqmpa zTNrkO&E5rKicfhU`uvas)}Y%ih7p3)L zr6ZM}d`ok8GE=-5mOAuE3P0M0R`Za%Bl?BTvTdO+u-F)@`IZ&m><^K0`PtBX?#9Ta z6d#X#tPS_m^S30X`4C}oulv3-Fbfu^XTq%LC($U&4-e=nK~oMj7~&mX{y1p;+&8WI zd6U-l#O9o{>HrWi293|PnmXCr1lofV2s2pHKgu4wXW+N>Ch;>|P%`mrY;N zl!ddneW_L7^3RYcJqu*4j3TvX7?Ptln&z9uM*Y4Xy@sXy+z2&?^OSN;406P)c1u2r69c$8X_3u5_^~ zL{KJ*&Nc`sIEh{GVxZ&;SM%3J12%BGzBp$438@WMC_M1qT(ZYfeMrQqN2Oa6WircR z<^tGtg(XjVk_#^stnKZ>;OhLCSM1x{-6Q6`c1ji5m7efWk&#J~*6#9;q|jMzj09n7 z=p}$99?*Wk2iyQ3@NUbS^DcgaLg`E8jtCraka%Yx6L-wdp^X|JvTVWXMb$x;feUlT!A>MZfx1VF0e#F7fd8TfwUXitsVoq3{GjG z$=~H;o+w@0fvxaX+151~uq|Q<5J-g;hnt#}8rcs@y{Vp}gLm19`b?xfnlPJF`hw9x z7NF=XRX-lTFJ=nhp_I^124pF$_ECpE{Q2)B3!`abKEU4U0A~i}d*6hP1Hm361W*c{#y6|NoPDhwP5!LfK9?FpYs zXhndt5t`Z|)WK!Sd}l>?KwYG|8V;0QuLQF7(@Fay%;H`o2qmn6Qx7^-cA&`s@7Nx0 zc|gomkBpT?C$@#)#arI5UM*|VmuBOR-aF@f*=eiN4=AyYuS+vW)-D@aLruRR{t{lB zU|Q?cRfI*CfHMX!NawgBj+*m(|5VxaXDVA1u5G%+el`9F*qsO7ewMO0Y84T8u0vKA znXDbof}1cy?RTLAY284ida`X(sFBHVFPCbVnOTf8(GC@mfN?IN2=bXy$wae%$s@Mf zD?9H!mZY=O9P+BvZ?PXY&sINRxgOPDD?*c1r(PwX_As4z9aJOde~N4{oiooOiVMoS{QW(n{h@qcm+)~O{o1pl&6V2ZWK=lSw>&Y0-!MAJI8 zyx&2Lv>6%V8j*bLPUISSIq_`c3J0xFl>|$H3``&Xkp$}|lvN9=@+B)~@|K)UD676Mj9pA-Jv? zFP_monY9py?$|BQFWL(k?_C$R0WswR^%3yDrA0E?+@mmg2=Jf}!guTZFHHPSE5;dlvjGEu4g zYsT^LW!H$SdJM%TE_Cn)hPpVP3}7h*p1a zg6-IJ#@wsX#%!pp^%fL+OFx0MS`rQgN3U;SlzyJ`v=+BO|A{+evL+rAs?WorTA`0) zUmh~Kc&cQ0>?IN>9U4pC&5 z8QMu6Xi9%1`u`Wy&h1(PP87FZ1LC1WAq!$yI}ZqCi^t;8clVb_7aZ8u7lyFO=en6B z;peQ-(ho131HKMQY7fJE9ghW0`0AFtTuzwa9Jz77yp`qBPH4V0rx}POmJ155nJ(9( z>liOYEWUh+w14ccZ9T_{)jJ)122_B?!7=l5qxGUS!8IBic85R`&&QHD{4B0(gbIpk zM8_&M#&wci?7fD~CbFq>0n4~e%MOzr$=&&l*GI0xB0&!w524HNm~wSoek$-|nu{|m?a1LH{C+(7+@iBjfxUyPjscR zj-RMzW~%DY;#E5rZ=dn#RY)?|+$_A@99O+RU&^Qblu@dheRN%Ouv>oVu;9c2jvxsdsogfN#mK zsCQ1fG19MfRDbPDoup@*dF=tLw#WOa$PxdPm^gHmSYH1Tv1#Mykwy-Ux}yO7MoUCRJ6p-{1ev5519V@u*!n_dhMpY5vJzKQZLy z^eHsKjCZ4D6fP<1cTLKB*rb)rl^!NF8kwj-GO1lUR7QKl*LOr3tml z)6omU@%Oea|C&%aIpH-Web!J#UrXDQJ-jaVXQ&n#9TTjTshcgUDMn1x_bPnM+f$Sx zv86F4cCJ-oZSEBD=I}P+?N3sUZ>hL<$GmipJwGC9sa|?vT7(e)H*=6p@~%RI0xg15 z2M{LgCooor{RHKrkD4&SWx$I)FXm$hINE$4>oeME(RC8ZtRZJ?N)XDxSIpllQBWxD zU-HaA0A!Lf>M$ISi`I_`toCHvXCqJo{OxrfVU;Ao0b5P1G={u_&$BR>fcI-sI zaOcdh4~jci?rrK$-6f&-sYb7R=o!)G#2s7w-Z*=eTLw8nY?*`OF~qg+qjYQOKyb#! zg6AcDx?E;YQojI=t)JkS`KO91hFtr%L6gC!vq1*xh0%C3Ts7}`b%U4KSuMm20=|9% z2=}oDj~N`ujm*Ax7(RPP(;fZF_s{)r27qTo-5VZKl>lg&Ef&KtbpLE5jsl@rx{Rs!3YXzr%oNL)xjASamL1s&Omz=iAJN*>6+t zc@rWp@;{${9-@4bv?%%dimbc$v~=yKullrl-)MqI(czu~OLItxy^by4q5Pgdf4+N+ z@TbP%ZvNYlvIK)NNE87U^g}yP2buxHPKr+ZgYT6ft9r8a|qbv?@Y!b)lGOdiau22XB5P5f)#d z2=_l-tRFzN#~t+aWnlm*XBzrF2eAj*O!(K~eItc#nagh@GFt9*WUim@kyxA?=2iE2 z@MB#5jF`gZhvH=inyy?L4Z*%$#Bz44EX8HKNSDNP?{O@t&`ogZ+ULSWIAGb70_osz zZh0+|wbIV~yHF9v(<8li_gJf2rKqYB`bqW>Yd|;y^Cg2flf)Ko1PlY0w~Q{j9ZR?+s}q_1GPO;{Ed!PZ6s65mV#57$^u_Q0N;irS1=}9_y>g9kh^jg zdQ6`H2G@b~-5h!Olj=LRYM>mCXOzpWx#|S}cN_wWBc_v;aj!;}S_D-FMoHHY1P{UQ zgr7cFRsH7b)RZultD|uW1LVfho2bd0s)a?mRx!aby|^;KGNE$$j;)KD$g79#y1n1_ z@{;l+?nx@!pA(eP(QU8|`~H20Px1OWpDEi~i*qs!N^Vi_L#$$4M}fQy4Z^kD6^!UH zq+$lVt2E^Q5%h5)fVYGfTCDVDI%4oUaHweF%gp+f8{#frP+vo$^=Wb=Yt_km#mYl#8tN-;bP6FR5)RxsJQVrANE} z)f*(87;y1ox(i+p0unwKl;P*cB)rutAP?5Sp@zx1K*r2(Y^By$iMa{}8(b%L_;B;J zW9|oWoLHtqa#jfezwL@nQZ$^>iz{v$@>gLkCe#ac&W+@6r#6S3%dzuu|7thC${_dA zOxn;%c}7G}Q(J#z^%OB+VdwZw${Pyp7caPb(kt#1wR%R*hk zCC+Gv!+z{jHs-r;y7lBIf`gyjAM*nnD)=xy06l5fMy#NxxhEwH{hg7YPwCYzn7-4b zshkyFS-<2$5o$fQ@SNeN|N71;*OfD%uK3IK^8jio@?iR#gg>V`ZVU19^W}5=h;nCM zr--{R2%UNxyMMKxT}4gRkH>|^YX6$}ae3l#L;Tc^oQ$@03~_kKeSB@v;f~5A0HkP= z!J_}lQed|D_w*KZk6lAg#Xn*o_@=NiUJ2fN+{h1Khd+YU>=Y%MQd8stg+o?XT=HnFArrjtt!xELN3c{|b>ina>Zle5emMCO)IjBQ3 z9~>i!kN8~VR|~vAG;xjneMmvF%thG!Yx}4#in-fu0Zw#`@(=Aet_TsFr(fOIAPy)b;Hl zkA*N&)Z0&E?|ovJN+-woXDqh`M(@o0!8&gLuH~}DstLa!O@o-yy+7T0`twOlcJZr@lJ(+PnqW155(=KiNCw z?dYLoG%DcvP2*L!6T`>X&&&(2v#~LEYT6o&5>ac)kn?V2SA_S?x6Vke{B(a+Y@hSl z__=h8Ae-*>t4bZ)aW6h@Q}{wEjmR)g+H06%g%*5VaR8GaaO2z`Il{WXO;^(vZDD99 z!Ow@e36gHMCwL3{%;662>aL;;8r<$@T{R6bdR$-nu5zA-^d9M2_l#9GAVD8yKz_IL zkBI$3en0=arl{%SnR`QZhMYudCx9uNA~-UQJoYv5q55dl)CWS68w2~fHob|ckMEb= zmZn^MNr3RBMmb~P;fyZnBj+#v1oYOfX^A6`+}@$C(>OoQ9trz?V{aJKeS`M9r-&Y- zx5oYEEvr(zi%kXA(h~lr3-nxE-5#384`7_@_`re0CKvz+>guLbl5H`1Zuof_Eh?~a zpy84Er*~LLPQE{u?qfLOd7r_MRgR2N*03g@jjTjOq(K{EW0~ZekD4_KozxD7gi?HI z8yEYVh+|A&)wid@fpQxFl+kkLOvZpg4f+0XjD%QD9&^Z7_axM%Ega^YPl ziz$t!*@?eD$qwHivwz=`XjyW=3{8-IRi#*0*e$Ql zUR`x^@t7kucw#cM^{x0$1YeDS3v$~$}^vE zRoD%yc~#F*mUP=L>!k}|3VjPXl#s6?(;&b)e}Q7I?yO~LF#~7XwsUrCrW_!7j!1Cr zeGa-Fa=LEaIY&Xxv~9zWG@y3Q47a`~gt^n;Z zB5EWKzdAI^B_a|mc{s9!yq5W)cNtD$h?n}x9X;gQt2_4(PZ#*V#!z_*L*W5X>#1D- z8Ir8zKFJuWRkg9A5YaLYTO5OIpPdQbRDd8Yg)9Tgi=EUSxz3aV^EBwtr-?lN?b)f44fjH2A zEy#>YP)F}HHRo^IhH5+aX>0lWU#uWj8mY-RB|SZk0XD`k@>=nFUmtf!xG(JsBOf_) z*LlA5A?l}Rc5;3e}+tCIDCJ{-2sAU4Q}Z$1_jK;+wjV_-J-PUhw$<%k=OfFT+C=^mBOi8 z>pRo@w`Q!s2wv`M*-F5bBD>CQCnW;&&Zn?5KeRUoa=s=p8h>OS47 z<@;X#x5BhOw+&);%qmz+*KEyXi@>0MN? z9bA+IYN8SFrATlx)K}UDGplT?7npH1C$BE-O9sDJ8k{gyJE4H8(>8rW^@@7^x6b?m zR#0|3K~iF0uqPu7rj)K-s?bt)-S2o!T5o}KGP9@F2VQFrGHT_^KyEy0of0kl!AUyq zg7RI{s}0H}HUF~(+FPP^l3e?Y8PuJ5mi(QZ7GWpQJtXOKMnZ)MhC<%UTkpR;)q)(U zL(7bbhgdlvFXm5&cO4iHFQBk{jx-I+-WHOPu~YY= zz}!0f?`Q4jS!)Y~m*_*syAWE7Tl~=ijcZ%3AH*)q%8QmMc8`G~9p4`Qx&6!oLmcY!*byI%DM^#9@bSaP7Y_TPGUeoK#37QZG zSP-t+y_K-FpWVao^O??|1w@%ZVIk8XO>jzk(>JxjYVq|SEP(&?%jt~1jJ?t2b}^LF z0BAaYH~|wJgk}N-ib0&d)f+b#tL+`hbFMc)ls*HqI8@#4rSBl&;}b15eK(7 z*i@_TGyMcjT7chI5LJbcwFJ{fFy>5$&+$O1tbv|IbZGzG;s=tYkwhbcc~#3I{j2;6 z@xBMrrbYrIcdQ7hL&>j2*;xPTHZ`zd%yY)ZdoUsHaXD`3ZtH&eN5sus7|&z|a=)H9 zJ8w;UO#cCAQ-y?l&}ZCMdWFWRZNAWHJT!?_`Uy}HsHRrz1lF|aVnZfQ={d>X!hz#Q zYyEDB%sj-UWG8iNyiB%`uB%{gaZ&k;&Vg>BN}PqcWD)PAhdR>(!>%M#?@-rEk(Kqp z`JUD(8ZKo>-DmC3n;Q7}1h^q~s-AJXY?msu3xLzzNHz3_-)jXDtXlN1(eTWhK1#^6 zpTlnYeJAwk_TB#1%~(X~8D*aQq?Nk>rg82IFaMKoYg=Tt?@pAPR7*B>40R1xDk}r; zo?@x_UeuZ8rgMVi7;w15yI%t5vh`0}pU9Do2pIz(PZ8&4Wr-V;5l}#GB8IF$i_#G; z?7tA0egB&C`-6DL#{3RP`GG_1T;2<6n>yDfOG24<7hu4SjSPM;&A0wF>o#BKWx{?v|5tT=%>Gh-}r;3WfDum`wUYq ziK{kNOr96Oq~>*x@c~gC)N9#nkyA>ab^e|0C$?$}d)yBCY^yXt;C|yT{&hSqKX?#o z@VYI?d>g@0AYhl_rZOMvgHQc;pUItB?E{qBj^v^i7XZe%gsP2H?U2#+rm?pM_uaa3vv=Jf-mn6#Wql=xo=Wt%%0|@8rHs8?CMz zIMun+UD>(TU(m*rlg%sYONY-=4Mlf$nAN*;20orx)_0}}>idXm# zJ;PBo*6mKcg~3z5eU|}ECkQRVrZW7oqfbVeaUN}(+`aRTfz_Vk2;%iQ+stfn>G==W zZWI2~DWZbhYG|g)((ON8C>-#SM;SrZK%dTp`0oKdL{!z8PnOZ0`KmK6xbRW|rD!w0 z4)E~7fZTI8Bt z(LCt&uCaT=EXO2oL-|{bPHo__@X>?tPHxMV zT_F=*QSbC)_h=N7M-ghi9g+}UIYDEl$1)J%t79iZhb`&hsNVHy+rCdI6(#$RgLcg$ zW{|tnVI~0Du!NE+G{5%~?xd>yt$4wzT$vr4=pYfHR+WVS)Xl1tyT>uHtMO=08(8+> z$?+d6vuC5ry|0b`fI$|tDIt%KMh*y2%KO2k9iemAcVVK5uf%68ahxnFB%R`qs&wyb zak@+K7B}5fk_IQ67>Hie{Not1s=8acH3T_z;5nZ7TPFMmV1(=~pb90OjZWz{)^Efa zAAvpyhn4~uY2+JGCK}54uy0K!GVE?{Fh2P4!1zg4rTJ~N7F815*hF=ep$Gcr{I+Cn z6xQ?GAU$9`VPXQOxmQ(dLj2N2iSM7>_Z-z5701&S|IYJ{Ljv1@per61l84{5sCUcO z3Oc4U-HKIxlOtF9w(#R$T-zyZmv;XRptF$K>LhZNQuMZD6HA~*SYMcz7xha8L*$*Q z#ytwrql~!z8@Wcf%6s&M^%WHo^hX{&gUA#Q!)FmK;g^4a4fGlm?(wqjvGb6tJp`g4Qhg#YE#|N%NLPI2QqENzVthr z26jgPCtYkTL$-W$ck$>N`X9Nk|)iuYfL4j~yNcWM9)m6uNKYh;IX z74QdPo60cKj;miC+Y35@phkc+6u?r(nmSlW^t$dqw$zCFG165qZ1RGS9sz+UVT?JJ zILv|Ko$@MLIIh7RZZO&m&uXJMp!Y0V4IAxs+c#y)DlM%6sK?A)CHPC7iq|VsvfOo4PdP(+?g6UJKSi_;@f{eu&`jna9CS zIo@JlboTEuc=r!R?6NP92z{>-K$^Hcz|C0VNcR;&F_5ctB-Zz4^G9rC4GGh@xwzmr zyx-J%ZIZ6(_D;*f(eXGpu6l6> zae2=+!U20fT&yTdh!}EgFJhdc&mTOzrhQH_ka=%QV~$@D*hAh5QfHZVn;^T zyOzvp$-W?z!08M3Yig^*707f;VLB9#tQWf8`7*4x7$?@SQe1}CK=cDrB?-PZ;iS;@>XmXwy#Z4Hz}f4qE`MVQvqKF?xmM z#5N|m@e@mb-|J%Xl9!Q_){%~v0ZbbxtkBu^ns*OIs;WMRfA*?XRdvIGl&8vd8bfmNAlHq za85^h4PL7ckiEi3XW?!CoS8W6B70PpBXi~pbrpQAD|zU$n5usXDu9qOE?K>sL7lE$ z*UEwAEX6=3hIum5Wfi#M}Bs1V0UE;vNLaU#?sE5nwbFHsR6-w1d5?*T1~=Dwx zKl48(V0FboT7FHfTbA9Wdw!kqlEqrGpxxYJ5)3rquAG6}7N8EKR3$%Zux5!h!wv(N zy^aOzlad9bSRM#Gz-y&_#q)(K$R|&7Ge;sN@@v7=jkosm;(I{79mQywtzt>6F^n_{ zNmkykD-7s+*g&A*1mf{@(rcgqW@7OZaej`SchAlme-4`~-YW0nSUTQAW=!922rAe~ z-8mh<=AM3dq9=J}$C=dS>UIQueSvMf97?)kfm$?%kzx2OwV%y*L1sB*;~5h(tc~4q zvFh33=PIUtNmvyPkXZpRA)qWR&jM5!qU_(9eib-xRV+V3fH297mo8l`d?`QkaK9Dc z?G=#<&?+N0+;v(6)23`}5O7PAY^rf*)zY^OC=BY8l|y*}`6@g|ue{d5*LOasl&oQM`^yU0M3zvAQPWebB3 zn-}QPtd6+ikw??-9`l7G3Uh)EL}A7ll!#n!31I3=3DKR8n+jNR_Z`cuJgvUwj9g)u zXZ!y(h@#4C%_s$KqV7wr{+4xLb$hC_8)%eg_!G7JJ+4LF>o6KBW5VXcNO{T|Cp2}l zVSopD*%RzsE8f2di|r1!KZ`uo*v2*K&_~FTlKnBi zi?-jxys1d1Va=``lk-so*=OCC1v0PTZ}sNjy6T+IvKLJB_5x`zFwuMFaHV*M;H*z$ z=eXMGlA5JaWO39?@E1E>?RDGnrS=b~KW#@xXnmdnu2kEfDidzbLNauALxg;_(^?CC zXHar7VoDdKDlCUigu?6)faNa3U?#j42vP}cSrYHDQq+Am1!WC|c6E6w=gB#6yG<)h zR?ZI{&OiEdW|%LlJidd0mU8kczX$Tkafh5n-$lL5i8JVr=r3OX--B1G8bG{<>&^w9 zvF=kqacqt-jB?j8iDRcHOs-FWPnH#Da68GCe6iY=DUMPukcyud)hz~D8P#~}Ddtu4 zOQ%(5qTb0RIohNCbuca0I}~JLnt;AAz+dDC7Wm zPD-{EYc$uZa6p+P&gMOlN#{PWa1c=+(~7hL{3R*hg>q=czSl9v9nUD`aj)ENu3TZu zrk1>Z?UWMVT^)O7uWih77p;qev9Yj_cgaS05OT8Xx3;CeI&1~o&N9H*F;WeT;6U?p z0n(6Zu=2400l|8c6SVD6qrmt;2lGbL;^_X{c$D1N-A^RMtQoJ10_G65o5#Wn(@hazhLPwugf(~W&-$5AcJqGF-WwoH>*=EHoy0=)&4 zR54MUSF&`2XZ+_WSlRvC0|uSNlezxXam&&^T;MSmE!;Xk8#}C; z?UqTc^7_~WTCOm!hB2=(h-JtoAVNh*YysZsz9jFNLWd_>CB)kisNC&oI-hHsNei!c z17;Gmgb`-UInaNC**f;3oHtRv#F#;$C()?59&2}w1%?QK`&CnZ7;zu9+G>@;MB(Q$ zJw#u4%qf#Q-(D6Glm@DFf_F#HfA&~?PS83RRwUk9`u7Q=WHEWXJEfVF8eSjNQU;nk zUH$+_OohhVb+2C#qwcjyd-}t#U?4H`$-S|h)wJ;BF42%l&fm}Yxv0G2{9`dkPs5XH z;LR5kFXlV}+X8s9eMne=d|Q!D;vy9AV7h(WbdhGw5xK`y*6Nd@wCaXJ0>Z5q*qVWu z-xWiM`5hNPK3i>@r}GXkrU9^j%<9Vl3+L(?lfzd-_?tC+dR4?(qa z$Euc|zxsFYR2kBe5@0t%LocCwEQm`@QZZ&?p%QgzI3)6g>+U!1_6XD-lnv;K2^0m; zAm}lgYEa$$R4$OZtINbL)b)c>S;z_6%bA@9*Do-3@Xu!9ErTo#1Gt(sAsOEz1h=)DC^Og71?a#6eHSmF;ki}rb=mwJhx2wWsWY|!gs)^S16T1j5~^dJa~+0eK3%f zg=J0jTc}QL)s!^Xc6jbLm7PjSnMnAaEn3*YJU;Qi8HB^-HEiFfJ4kF;+Qu6t;~f$a>*_{u zx*n-^`Y)n990X{AfUEvBw|qkBSPU7L>9u#4zjY`=!+Q2lL~=tiY}aV*wPQEk7^S{n zZ`FF=Yc+Q!w9*jh6JwypmNQuT6&HBvngv+V?jO=XcCdd=>$|*ny=UZt@{?NCkX(a4 zQCj?a8K;;GWURFEK70DXS>1+#6la`mg4{sQPLzR^Y};MRM_FUN)2eFoOb1(2KQa_d z$BQ9T{l+r4@{1xb&azuvs~&MWVmY`4h(PyB*gUe4*BQ9U_{QvH#mX1z4JD+-ei!me zz@v20fxYm@pFoM+RA&5ph(&Mu`wuCbFezGrJAg?0=t|uJh^*a8UGB=%wz|(|3Q_*s z4u&a+8O0?(^;XtGjOYkG6?N*pdo}IDi$cwUX=v&JEi_E|=xw2_k35)iYrtzfCV#-NKh18sTS;XZTW`@u zS00ad=IHF%U`JSeBI3f58$|0PNL#YHD!8UU$!B8-lVVQ_`A7TUKS^<>>bk=I*s9OP zHyWH(Qw!$?y$tZu^Rh6^p>ytUw1>YY$c@$^n1QZ%r|ndBu2h*JMnWmz=6AxkC773J7mao^E-l8f zGx$xpa_xk*HoXz{2>GgawP~HW{F4E%NqGT*6u7ScMd(CSGTMq-%H1sXLDSW0lp#sf zZ*IGp`4x~^7r=nIkBf`f3iO5ivA1eFDqP8i)e?l!rF;>M;?Z1{lpwCo?!vEZV@4e( z|14?Yqb5xlzJGOh!1Ny2uRv@kf?(1d6r$3I*yt@lM1t&k(_KoEX|A5=DXxX|M^?+x{O>0Ie=yb)LnrS>Jss*GwYj>xe9XsB<;y0q69%Q2M zP*Gfb$V;^~zvlSf-a>{n7!_BIP zAzajNrrZ#jlCr>S34RaGzyq-f zZ{>C~D6MrDW(_d-(K*u`@C$w_H+H`|7f6&CUuXfri6;ohL>coRz3sM5(9GQ{_|V=! z_x5r8H14sm?ftUMjY0($F3PFcsYkt)^XW9o?B1@~v4C|^+=lbP(z>Jp@r;@t{66P&?uGLI=1_t)2f{7G21cs= zF3OUWKa|wrt#Lk7?PlE`O(aKepzkVE!Hm%=wJI;y1UR;%McDNg$AUIc;O;IYV@8&S z5*U>z-^7bHcG-SSAF{?KGO@zaXSSLqHWFQ%?03_qeIx$tu79$KRC+PG3=V+@_C((6 zRjNp4I))WR%Nen{1Xi35bq)B})~YY_v8*0_!DJuSl#6a!e^bE^Lt>Eq^m+8lk8x=M z6KNKqla#-057IWrz1C9x{v>X)A2KxL0FP#v3w=Z0Z@>=TWD&T=Bdulx^X2~s z12GZGYr^{dcTbPTb+~CP-Zf0JeKxz40CnSF&)5o`pL^L87%F)U#MH|IWSweepO?L( zl}FoZcwh|aUlmL!eT)k~vd8=6-O~Z9@zLr-8-uCHeZFf!GvbtRv(iOLHfeg*XNS_bmKd?o+?eM zS^Q02FxWd}<$42+%x}N_1eyN{~|)mNZJh&uSN+|qRX zO&|<@&iDM^E!77u%<5Px-k$l=c%1&(+Hv`{srw)&K$ioA3y;q%JG{?xugm%BSo`eO z{e@g3&_x0lU}bULz+c4U`NB5BO$oxODi$nzkbwiL@RV}nlU~j*@=L_Y{eT#6^d1b-PZQQHf2OGar!X5SkZ% zK%nxn)rnBo1~Y1&dOif-}xOl6ZGq{+Q0pD7JecC3B1sz zLb8%udVjWzRv>izpcMn&pdpG85QX>PJ8-Wv6YhuGk@9jA@N{jQy=;8#Pgw^@ zu_SesE9tbSe|MWlPDQGXEiUqIHBM#B=8caL_ry=l9?_x~^`r_j9}>XN-Q*Cwp8Mv5 z=Hsy|IiRZ9lGmo)biL=PGh1i1_?05(1ff(mHfa#DRi9EndJ|drJz}`gLkCN5b)kg8 zMYgUssYas+g}MBQ?QqnHifu0~_?bw8%n&%D{hE;gEd<#`zvAFeCEN_#KEG_sx%!>3 z%7e)PseVD|s{bluXs4o)CjO>#b27`HDu=6)6LU!cVX4?hCjX<3h(L0oCxl2<_*Gd| zXfr*?@Nq#ube(!-68gul6VM%EP=_n}0P!zf;lpm5`;E(_dhYq1#|}`IqYUlvpC^01Hv?Px*~{w*%ejrB?HdG)I1)LP*&*- zECn>5CtsAQPqwA`BMo%bgAg0p#viJg$wrYckTt7qKD=;!=5K2b^h{vEVfdB?5*SPZ z4cXmYO!8EJV>+IOO_xw| z{;0ZXmz)IfHjV2KNoXm{>ZUCCsda3AQ}XlYu|wY(DR17qsghmR+(5H&Bj1k}PI*Ms zrlq2d5g;321^+hf{*J4$KPCYNQXC@T`5R>w!@yF;H@vd_-?x_TSSMlT5gHK}xHbn7fj8t+mt$SG4AT=1g-S`?+PAWlg+0GJF76k&N2vP%8Nv4Pi}~$ zRkpYr%XSTxefP#j8p`lT6hfStFZE=Kv_Z&=B3@Ya+I-)ptK@{T2(jqNfCMwgBh~ekUQk(%^~!CPcDlOg3L#mYjRP zHwgD(qR2@s5i3Vi)Y@1c;K4iuXC#IGoi{NkSq}FGQ=!z3P43)7vq%u=w6xWK|L#(` zKC86~jP2=Gh>$)H($iNU;0gN=;7StT4|(r8xS-m1(RAKe%}h!Q6gZJO4f@6vN=VOc zirXYqT>g$f&%w^-HqAipW=>ZmAh?whPToxlIL>WzQIhI_UgV_we0rEm7?#CVWw)h1 z8*-J26YYNvE-zOh3L)tw93dy@$eF0( z(J5U|*v4}Ld&M|cyne1TZD~)vrqH$8IuW8tNdZ_5#0R0>iSl2Yr2k&kt1 zh1d5Y1q}*kz5a$^$2R`^*8#d9 zqGgZGsCH0mfiW&Zp&|F=`umFdeK0jP$jdlPR0N{BH z>AfHwj&_eA%2F%a%^3z(=U#>4c@)?f``Mi+lNAqgX1sJ(cj_>P)63xo+X19=gu^X! zjx-<91C;_lf={SYncfM%WI8Gf+U(FhnsAR)BNI7zJC4V9SXN8qIc$lSEKV-3o1kYT ztcdXVDb{x_rkE-{-bAH=KBg^7S4N+{*7Sn0(Y;(&3-0Q>>)UyI^e^Mqvu2-e`m?6S zHeMlVB+pfo?x*Ynz9$t=S2NuPeSFZ~2bGagYmDW@;&`p|0h?%7S?PE5Wj*52<(4KK1 zXH`U`O7x*_ENjeyU3JaOp~?IJ2vUI8gpvvH#fF95W63Pz=d1kBC!FU0GP&R8>+46Y z``45kO3_+@jpyk23}EoX2(X{Mg-z|~9a#KQ-HU0v!Yqce4={LP8PhY|)Xcz9CYZ4@ zmo2`uiw}9f8X}(BS-R~MNBOaZ7`SfeGJDXayaqgT&=EUxSm*AiU$+S?TSh`dW1`S# zf0zaUeACMFE=3p$=JN1lQZW-%$mUHgn-s+7Hf|#H^o*Ufa9o$je3F9s>D@@roOar2{Mh{=vXP>t=>fuKWC~UPU`2D@RU@+_s3kMM$@h!6>QT z%%{kOl4-5FzbKkmLPas1l5Tq2lI{4z(JQ<#f$dq6M9xHK!*cv-J+MYMZlq|=V=>T1E)wYsp)=aox(jYIn=KWgWB@z08v0+~qTubaLgPlpTn@_tIh z(u#C>8X3@ow8nn`ukR|+Iysv3Zp4gKd}U$Rz#hMsP)l^y@<0qG&(_|xCZ#)HIPpLc?*(<%=Mqxib{Cs{+vQN8a7ap z4nv_PY|B{bM6yMY_EcN>v5!4mf2fja%MWL(el|w01qaf#$xP2BT#?1*g71T8L;U|f z?(324Cvs-3S+%K6Y9Pg*i|ipp6o(0@q9a=!l`wMnJlqG5EUr8;4eBUz=h!{#(H5Q^ z(jp(NZnieRRToVa#vcaz)0+aSQbj@z+?RC2c{-FPnE`y&S|Wpd$)BYMeaa4-6`Z+m zp_-S0GzREFrwYWBpe_M@WSG3RcVojR5PTUg%41%DAa58 z>l5c4%e@I(R+gUEAh4oif5d-I0_5?Ci`TZEF~Y4}9vzAE)wnC_0i51-KS><=njmuF z<#v*?Mo)49SZz&f^9$3Lz%f0dbjCznqm1C(J*aM8f*^aeOHW*GZt z0gTJN*AsVw9H6!wV~xgZhgz*El>yA8kX0`2{wKw{2b`28i#^ajzGabj!ClJM;P#qD zSpB$M(XlPD-2`pD`p5wH@PxhYG4Z;qv6-2?!q(z?94T^V<@N?Q=}t_zWD+0v7!VB6 z>rQpD=K}j%tfw~$Z3T}l=9n7CuJ%8Ub?Xq->!+M7B_{XDdYiiKe_~#8BAPEh=HBk$ z=!3p*OLQ7|I+_Dswfel%^4Tp{)J;XNZHNM|?p~%MUr5fKBNIPhk$F^CCO~# ziGk+(KNu;GZn^XsrvK)b4*<$1?AA?pRJFZ+WwqyLJ3TEEl`yAPV<)OGI^TUk;!2~F zo;mGNMsC+$M*-_-imFcLdfkk{NE8Qg_OmJR_bQb*l@l0eZ@R7%7MTBj#K&SS%gNb& zQJ6rSpRgv(8ocUN*;pv7(ke_|Jf?*ajjZQF0aIs-2jNJ#g`29JRepNY`- zwJA17TAySsc3kjP)%a08Sqrq@dA^7KV-l}gF(p6h$0b0`Cv%damm9^?i9m~Lql4v# zCLDp61Rp2mEa0L+se@i%i93*b_!{=QT$$tF{QEb?SL^ws0PkheADY0ExytaqjWG9K zH{2Z>A6J~AI-XGXREf4NW&iLEhPs==?_6=@N0#+0j40tFq+h3RNJNzqGL~?9yvjvq zqD@@m-zDi}d`MA`(oR{GGt6Jj(eV(v3N|ZvC7L?e)@_`d=2XZ3t;V@C_E8EwB^}KA3nIjxlaX(wIBpm1Gtfcq-`7p1tQ`rx4r}al- zg5J&Rd#GZl-_J_8NEtPk(WXG$02cR<65Q8xw(cJW2iS37mhf90whIe0|9*YTFRp(5 zM!DR2-9o}$FK0RtT20sbckOxJas6S4G(@EC``x;Y8jMV5fw~ZnJreK9A}7{4?&Q{m zQay5{rS=ry#e0T))E*vxJ$da{LdEIm2UG*vhlq@U;2z@d?;CP8RTpcYB6(n-b2>-_ z_v0Hd=7HGr36Rnfw@_KJ`YYHF49+V$rdoWi1OO~MK={&}oa zb{9z`08=b&UKx%MH!pB=sui3Svv91q#i*w5*kiskpm^pEvWDB=dDsQsw1{q%M1RhM z%}@7V1N|5RH<7PW<)H#g?m2U>AMES}^XWrq-xv;-pBoM{s_7Z~76>jQzRBK={_P9N zp7!_hCv>Oazfmd04^oORYW1V{@CUP=;*m_hdsOGN%p*o#=Cg-HMegE6((Y>MJ$U4B zywTVD$JT+3TgpEVH^2DUML_auc*YGv%K4n8mQ@}CQMC;juEj5Ym1C1LRNrY8 zbWFwCmv8Lb&$a6HI4J(wbFB>kEZ+~MY?#OpH=K4yS?!*t?uj>XR*$U6+G#L2?(@*C z`O>SNvc%g0^W3@6LiJU0e0m^nq%le~L|xvyon)p+dtWU9@9M=vFD6O&|JP8;fWS^& z3w-^6*n-3&(*S>CYf zIGe4>tVIL_D{n^ax$J#PTJM7WogXub=Bvu;BI8X}dwqqIBX_a^_|8VMtW+$CpF}7m ze|SLgTpbqc#(L=olwdl;r&nU`!4q?Fnr7yTXMgs>qY-J@q>5NsLkLt`++YR z^(gJrSlT{jznhA**o)hIRT<Di0DK*`+ z^OtW5GoapVa>TId_jC6jE`qq7#II@*Wt9ev9R9UE*VHXVD@|B>(F`A#KVo97SFA4>($O!qO)sR!=ROnPx;n&&b2An;#l^<5ji0(vRuG*?oQkwe zUV?o0^f8J3aaDWGd{m|M(%oWdEUKT+t0#fr9**_6_xa56AwBuAhx-AOAV&(t* zF?LJ~d?5?TKgI^aDAAZ4$TjyP$nY8z|3J5THxoG7H4U~{&C7%P;zSxvrlcq9NRR1)igxK zhQu2*uIOZR-LXE9?i+qjj2L(h1Wd*08lFk!=^;`?4(^n)(Dyw{x`n~AlGhs7qK|kT zSAcfmW^gW+noha>jXA6`hTrl8Qcd|Pf@Z8D(k7aapxyg~HyBJNm6|f%J3)$-D|MtQ zDC)xY(R|fH5+mj$d8i+^=6^W~=%!s-DUNH5JYyFhQk+u`jCeCQH+8A6zg-u0?izso zt@>Gj6=m{q(rw@3%Ht;)J;_mzOy3){64dnznKrWTS)b$?H_C%DSoyWKTh0pv$!N9f zu5Oh^*12P3RjE9yewm|GbxW(94wtT?)w%<{p8$s_`qtBUe67#P$%{$L4~oFAp??nJ zi-(lS2*TbjCYnbI^QNGTb{E@`C_dTvu^({lgzP2OXk}e*6l!q&gUneE z>C=(UO95xn5q^($hbU18QO1QoU}+j|^+Y%2_UeAeV@{i>dboqv<=@2Dt1Ww=c$4@M z(qXnmn)T7w+#S1dCv3g1OB!QVGiG#yl~IpVgrnl{72;+- z$Hmq~uSqK5leDxXJSa7=-}2+FugsP*sY!FPYB;|8xN#7_8mbTd<1dNrS&qeYne5FRmG|KrF98I zu2sLShD_Rl;e8gG;mLUV+7p_Y(byRe;&uOLDq(li;^DO~9fZcn2q1$l9#$H$`Bjc30yXuQ!XmWjS6 zFcbB)u2_%ES9L+WAv|*IRyOpF#+RY2eT4*y!1lG+0WpH-j_o&o>v{-djH0!TZI=X5 zshjzSierTE2lCIRi4%cB2AjPQwt(tWe!^($!sl%<-w0bpn9r%ak9k(ZXD!k4swL^z zWaSwE11-o0e6Ys+BG@&6I_=J8OrZ~yp(v`dlHWGQPUw2ghM#x!=Vk~I}~lwGo`?v|lR_R5+iWUCOy zT9jlRSt?#K6p^E9Lgc8NJQ6>esB*KgYh?x&nzdE>M0K zU}X}Q<&Qbq1Rbz1yfR1_((D-_V)nN^xo zK1FzE7R4cunOQ6IgK-j(ypt2R+dII$`vL^k@Wc;U*!(TQ_;PETnlnl;wTLOs7IoQ% zMD@KJ@JL^J7ANiX#kZcdC|lpn?tUXO*R(8rq8$o0N4h`f_YZeKr1d=lkv73_!>DX_ znqg*f;Lzpz2Z0#}zPFo649wj=hq%gC-qUS!phB>yL&Lz!j5wf){Fk`kd4Um(Y|=NzfYWWnXi%Jclf&l$$K*^D@&5CPvL(_Rny)*4a3In#mL# zwP@J7vVWjzcI-!01THpJJQqsQ%@yFj+ za=CQBQI(;Wn#Yosh*3R`xKawN4O6}vKiGDo@}nV1>*an;s@S<6yWDntSCxMNR)A$mN^CD&l`j-rIX~NR zWfQHyhlk7Z)Fb8hsy2^Y?#FAgOK^{pvQDIo97~OpX`2SY24|6=Uf2n030WS2QDIu) zh(W#0;?p#fM9G=%+52~BQd(P)>Un`}xmkrl1CKG%Y7!_R!O?TS6YQ1KQ_Ahi>6}`r z^RC*PuMOzXr@vtH z!$QR*$}6*83eh%fSUS{;Lxg)W2S5ziAsw;U*c~xF--0DfKh^ck6aW?%DerLF@l^FJ zJUbCXy@vI@urct8>6t~J^faUR?K5YtMBmB8X(=Ps&(r7=vaFYtZ*t0@&#J6$oE8gF z&)a~cb&2XBFxWC+y>h*j(QZ>-;IFY!(v` z{sqhYUJ<5uiCa6L%eJxQ)cjCq)BdL$X?sb>d=e14>u`wN06R4%Aq>_mTpo@zZzo?A z)_cGzJn#RbNxE(E`vn0_k?_R29KX#H)Od`h&Ea2JAbDMQ?@<`$BnubIihKR&kO))% zbB>kbmV$|xTQ|)NaBDp#k$#bHLq#!p4c5tcWi(|+dr`}wy0}l1EM7GK_GHLSeA!C- z4#oG1HL*>6r&H7&Is=}=bZcQN<*{By<#S6LWO+EXw5XAtzd}xk7XExUANL=2-tuMQ zMVghouv#Vd6RXrqS=x@b(&YP&-Z+qNnKpuv=3EX=+6A;$8#BF(7Jh@J2s7!TubYVV zf4mvtM?NOOfd6&kJ9)ItO@7@dAc(++`DGSNq!ufNGtHYyR&Xync*+0V!;;H^*k3so zj47F9`ofiRte@evUH`@;tkf_uR&VA`Th;UrCi2IZo!x8bu#Y?7?6;Z}_7&h>TwzOn zS{TxBI1B*_&iv$Kf|+@$nIh+Am2na~*b>gw;u9Vf{-bJCvc8P1H#H+J-Mf5?zXDfq zfbd;^^S0S9eiuGc65!V0)UaetCpxK}7EPcJgvCfuxUNe*)?4%N%8xh6Qe<#@(qK!m zmd8^~PW!35^H*>C#@yO)W5pzykgPq`#41-p9%YJ-Zna}`Yl7pCTV<`iAgm z?yZ@D&v1`kKi5Lc{uXdoy>C;0B`+mClBqX-_WnQ(5nE%d=END2qmD2xEA9?=W ztIIGo`zfdF0;-`|>e%{GLC8AZh*$0Adtu?q=2>|?rTZ=KwpNHpx+yIM7f6*mb`!P6 zrt74h9L02P3g(KES2Of;c-qJws~O^ELH759jL^QEm(LK{VBM$RYl`@V&-I5O%Y0R^ zO!GlURA^=-3ho`XDkz$O7lU5eu}+%sbhKx$2jR@_GctNLZ}ramZ%R6g*oLjD{T_3y z(0@CY%*nH^K!i~nvsR#Z+@~R2YaZ>WT5F-Dc%C>Bg9*sHg`wsZOqfvvJAYI>@-uC`T7dE^!SJ-~q{27T^=b196_unb`_;Xpg> zB$2+4ETSQkYgVz7B-<2KQhvohkt?`}NH-Y%5e|eHhEX=|ng&VVS_iyN&BkbHbT5);q9BMO|dob!;uJ& zk(#zlry$}TN{R=vK zrV;M1-|Czz2~ajUTa&cVzNxUCb8i;bSNDCOaz)cqW$DX{O#;z9f3|2L z&z3=M<=(N7e>64jOsWguF)oks%E@?dAZ2+af&b!uvo&saSLMR}#wB}RtnYd_SH}B` zs%f&YKW7;u=yN=8+V9c(zN%camfcs0bx{cB3o=PL8*_ewx%U#$xtOylsAHT#@hM2o z)WLs2)E+_&J0>^0-AQ))2QD49#~+pP5Z1wKL7Ec&)PT7>QpL>Pi_RBCn|=B}Ef(Uku#~Uv=ez}-eHqQsAHU1Z zUs{F?K@qP%`@rc!tFQ&oPQCu2cwkuB4F+_)5xAdgrYgB5*L9Thew6@BRcFn)s9Na* z!{|cd!k<;f91mNWKWW@+i}*#n@Qi!RP5p$rn5XDzP|u{YV_!pt(@qn1ONsBh;Ja=g zn3g~+jcHY_sX4mgT(z(GV)0+28gNhId%WEwTs^a96jMY00&jd zri=p<)_37pR%~ySpNI}$ZEZ$Ft!T>$35uC%>Wb|Ys@7Ow9dRV>tgk{B=;c1%lG9i< zE-Kf`rf1w@n=@}Ol9VykxBA@g8As6hEB6|qUr>N&>w+f|#FF_?lS2y$skSmPHJQt& za^=}gbV86=QUYRIsY7@l`C51wE=-wjnlOMs-seeyDZ7Y}q9kLPnYoI3)B}lvHj#_#nXe{QOhaFY#Jr%wjo5(L@#zU zdS`B+O8{pJuW_>^9tQr%EVLx+N8BO_y0AR84s%tXXj{HE=2}uGYR%{{+AJ(n<|dYj z@9LmQYFqC1I-VuL<(Ojo`aa;lDiT%~NJ}qXV**xTeWkHXE9l|vynMz(6Yh-YTxQIN zu$5txM|=N3{05Aix10MJ%b|4&yfY%(76iu*{@)Qz3%ojL6Cm{?jI=NeJ{(Dk##2{B z*^nQgw+mBg<%m}S5jiUTtX&AsGVk!MY((`wcD*T;GNXn#KKK*M2P&hLTcAhRX#@J||OgSDmrMd=r`4q)+L!lB>e}UIN8ja2o zB4Yw*Wox8lv~Db5bg+fHC&ZI=07rR(_l8=H{;Bwr8uB`S+lR~{fw zX~~0Q0Or>|I6-GuG@z+FqHGPD+Q;YG97lKQi76Rt%wVP;u0hTU#(l=ARnZMQ1Xv%n zQ6OB+o?5J;pB4t>S1lOWS9T8*(7M$`@BEDe6HZ7+tM^j-HYwjs32F(3Dqk>hC5uv5 zd1Y(Y1|XhCXY@$6RxE8Ohr!ry;@T}=%*MlQ8AmrgF9qMy^;asX5#Fl@KRCe=GNS0V z`42Fb?)7B)^rtmQ3<^D)p{D0tWX@m|-l02L`{_%JWw@L0WPa;&9EiB^{nnB5F{9|N zMq`^G2MNEJkmMrIpz7<&^OtoN&+=sD<$*Ui&n>en}s<{3sK;Jgs-G@?R`jksE=xGq7Vf}_tzgHygfCDaC!4(%(Mgt92p&wBNlZ1bH#>2Xhu%j+g z6ibHIzv3PGzR$Vcp3VcBd&62Bkd+~g;i(r|dz)aYI}B(KP5sr%8H5AOeo9f--V?d7 zS?A>OjG5yX7Gq=;BWR8|GF*IUnv?=QnR`0bLCC9L4OSAmlK$u8JV5|ANCU7d-$}|@ zrRT?0FCQd2-$vb(5Z1R6vVE}VcG@rzUOoh7u63$S^4K*+Y4#^=7>9OHU_(N!0~T3^ zqtb`l#-p|4r2fNLqlom^Wf^YbJek}Zq7ve+9kY~zz(|v_$I%YONDL9>)#Ob4Pd{yr$NE*+B>O&L&%s+FpYbGTI4;1(mh006pm7vp&XCKnYSDy4`W&@3 zZ(FMwy#M+quFC2#$vNGe@!eUp^cK)Sl~*{G&SZ{H$@inHc&=L`zx%JKKAC~%H&2VR zPGv*=7mV&w85l`nJV9~a(KKOEwOzR}c>+P~@Drnm>9om4tczSlpZS(&IPu{UOh6f! z0vPQ}3>8#YxiVoxV#`f=c@pEy({cPqAahf^LeEhbQUkXUJny`Tc0-j5`EE0oR^{FJ zQvl8SGa!!$I(;au7@gXJy0AP z&?uWlsSz5LhU1erPffaN_Q*#0y5D9U>3>p+EXv6{bd;1udP*rEU+G8f^fK;hK!BB8 zE5z|59s-C;a{EKiD*0t(ra7YzG6I0F_#Ejs9uw$QM^U!`(IgwsuF%)M`sXfD#8K+G zfeB16N%)3(gGUa3yU&R<42wB9so#A6T2B?SYkO(3&Xc6mr*d&-l5Mf@I9w_wpfN<% zQX6E1p#@?lJTCIe;$9K~3#uECzwJ}HV+#45Mi3S!f{R6yagudLjJFiUe4+`OOS0@tUp@eRB8dq2$}J5OB@_!0Jj% zXqFl|FP8I^=mgx_`F?$uLEsPTX3q{$@g{H`j@u zg8nrzedagNoZ>y_-o9!v`tlj*fqdMWUk-Myq2D2}JL1JgsrPRGg`>%MfiN{ zv=OKEqnyuEY%|%paa7hy9^(14sl)XT4jfKd1e5$>Vi)0&K5fvlOqz0A6+Ca=Gkl*u z%oWEM!!-1d0r|vyFN+B)BzAq=gPoDu7Mq{_Wtg=&3+0h(q_r}3c7ar8$0pj+M4m7$ zJbY@y1&i7E^@x%zS}n3azZIZD`T2hv>Z5G>qQlZ|zRxrL9%4vfKI285rQ8ihz&miK z4%ExmsY#joDOHp2F|5xfW_mT{{u35R?EOy#p^a*#5(qKRyOZjRWgde7W@perGwZW? zT?FF5UGp$>=?N=q(~;aW>56ZijaMQIf*A@Y3GyZ{vJL}XdIR1z?__5o=-V)*qx;v1`hXq1C}g= zV?HB=O383d@wiePPG5R)xBJIwv}*NUXd+krkx7_T^4r)2GOZntTo_Gn;*+#B5^L|p zZ$z56UHGzaZ$0fx2;CAg&vvwD1()_IL|qPypWF-MpI9WfU9o#TgG`1^1 zIX@k*d>X0%)U=x6$*19&j5ijF(SDnB-n8V~%U}2wE`3m+9u2wN5CGKrp8FlB4x;{N zQodzyw&Z$}vB9Mqs@g%dZ{IFijE4T)FS|ULmDOEbdz6!qL1&%QIfDuswrIG8oOEnQ zo5{YhKEIh5v&o3Z$h%)I;-RNXjRR z2cG}@7UQ?6TKnSheK`B&@~v5vakJE|`^S2}Ft1rELt3b${kE=-EjPS4(04E>R*UF92p8b4vK%q zk)Bm1CeL2AHE%1ZTEn~c4#$cVNwSWs>_y@azW$yey0bOG3bieGxnRYS5RlBGrv|F6DRXD%lZ@DtMEwPQWpH~Qh` zzUer#LmNlsV2Z(yoH7d5cd6Byvn3KsW3YlvG|H5D{ARF{T^TpdPpXgE!hWFNy-k;_ z%E<%ZGp8NtS0Ej&0u&`F1+Scm-l49(n6KNrLS%2%pGK6Ao^mKcAr7%m2SL#A7v^q3 zq+j3C<&n>wsbe3euy1fI`Yg)R7*`%!vLi?Y47~L#wTE)yK;E6ZCa)gY1TH?NznNbn zyE1q`A;70BmDjgKLemU{X;`u-TGT^~f^h?QezP?1{ioAno5~!FDy&ijUicUzt{e1p zE7IA`j7*9V0IU$upu343OVkcLz}OkQ+Ourz)-*Ru=JK3Cr}udNV4+w{PT|4_=m@bO$o za=T8V%YxUzw@}xKhR1})=-+rr^>IdAdBOwhIcZRDUNU+Vx+E<;r%Q$Qo1hU8D`G9D zcQc{n2v>YvS5CU2I@3K}z$$@YlV_TiokNM;l|yNQp^4t^;RhNUIg2|tHMhdmlA$bmf}CVReOSJVGop>h<7Km6^RiIp6sX2U3&V53Ng_i^;60`M+t0W1{2 zhoK3bpxrBPe%vLNV50ziwRJL=t8KT;&C57?M&f**FGu~%q&eg9B-=b?a6iluiaMq! zZ}vpwY8HklRtd*!W|g{Cu`R#+rFa*J`!>%MI52GAIjQ9RsP*nY&*i#q=7_O(k&gE) z2hsbc3z<9m^#JlDd1At*x1$dsxGeS`B;KKWR6x@F zv3-`g26jbcYHEsohH1yDUd7XYe>9)DC1QSxpWrD6^t0_C_-v;+!v>j=@=n2p0-pvk z$fL93uJi4Cge4C}{hBM9S6?Eo+Y%q(E^47&#}_a;y{?7qa-}E759Rd~IMKBfwRUWv z5POmk{VhKhF9}LR?Hy2hC>&zEjbj5wGu2~79t;Co87tn6|>;WYe-8lo^!x0v(<%skYmSkKPtR8vW(P>iuGw zIt;0e9b0DE9b1@FJlMZ`o71}$7o3j-r&Ro0Vk{kQ=>^W%(HKGF_ zB5Op>z(!8wD}+COFU1LxfPfFeHrh9niy!)GGNgl#?ep^te<*AAXgB;!fC}PZ94%u^ zw{4GHm=maI4%J1P-rd4a_ijBmaL&M{upnLqI;~#w#JZ`5wAp)}kJ$)s3!~MDOPyE{9%4MedEh}VJY;PrPfE?ke z6TQ`e>euTg+68FTpN-v&DohP%WP>?@6P zf+G9+lb2mx>mZ2&E34eOxm5o6DVLpaKFDpk9`q#wJ4-NDlwY9u7kG0p-!v`g zHn<<<61?_VN0PNd8{>Oqxw?21t#DW)6!{q6UdeNze?UJv=dU>n zt$d+Ui^fEfy5=^zNX|!qe-_p(F3jwwH)si_^Ol01>b9#dVxbI#8AL&^VlL zo@T>pov{SOYW-TLJzutq0fP1_UI%GTaqbhSRe`pfzGv}&8EmdOV;@;`@z^6xW?`+p zWEO@#DAAY6F0> z%gM6{H5W4K>_azp(S{^gtsClt?6>Qx1(WJGs~uWC-u)Ei`auHl%h@RAQMwJ&Uo49a zdMGDz^ldrgv^1w`YXDd52J>z*vrF-)1h?Eeh{y2i)%_C|s^Lhy?qYl0`T-7V4zGy7 zPvUbx@r1Z-Z76gId5&yb85o-C9Zy7^Q%m_ycC>W;ZbMNwIGF=ASm1TzZCl`yq>vO-0Y&(jryM=a z+G!&=-+GF-RFTsL#&%b%Xoij1O`T!`Qss3F^-qlEb6u@27(&s$tu?^gwz@_L?HwD- zAS2<6J!-g;2K2L<1i{~Ra2$ zaM0`mn^y7m?;aqB9STNU1UTG$R#%AlNrQiKyKW8-ytp{A;cKx0iZ-2WA+v#o0V(9a zJZjq%ywM`TqG^ZHcYjku%GQrJL?|d$xjsbOkX@WvXJxjX0o6_>p|T1${nnSn%qoYi z(@E}z8N8~1-@!0vjE_(k$TCm7k!UPFcm$Wm-etT48KKzrSk@||AGMuGuY$&B2uwl7 zl2=Kf=pd8~rJUX9)Tlu|o?WM?cJ!x9oc!UiKoM)wfA#)u#L_f{dn}f8-6jt9ceW%9 zc#H2fPw7T)4vYI-S8sh0q~|9o{L`0P-QEaIv5zvZFTK~}?SIzy-tqpVpX)E=5vXaM6pCdQaW0QtT0Pmh@0{-MF8HaVja2kUg&`fPncTopEL2N zk#&n}I?Hdabg`!j5j~+J@Vn1aggPU5>YEMrM*<hEd0~B^g`(Vch2_I8kBnm{Aioh>?Ek)x={Qi@Hv6M z0T(t~9U;=)Aiu7Q(-_m5pp`|m zmC7;1T%~&-NR>JdF5UgyjS8ml7r^x|7ej=arqb>~uv z{3@)ptrT!TP8yhlUP?KR|ANSG0!Svb!D%nXj-!wnnt#0HdbSI!Tg~SMWTMACNY1xm zF!O2$s`mL#Dm-y`Znj*8&;5bIa_@+bO#O$xi_z;j$!I$8$c8uxugAiVn-T~zCtH*% z5V5CMMx>~sQZn8aX_kEXhsyQt@c-<_3rjEs-LAqoBHJi!m&^nlQ{A`kcgN)a-<|8gHg|~%!VSVCTpPbFqMa@RK~)=u zlBP6Z)Cs>P;#`F4pSEfIl)u;c! zF?VweCw2|pqKa8iJKt8S042mX9CPB0XWXnhZ7Nr_9*NguZTPUh8^}|MXuZl#d4^{b zF;*667=x({E&ydz=lGQpf*dN~MXCCNb-}#EORcBXv=*)w3Bb^0bXR`K0hWhbC*UT3 zLge+Rj!t_yx$Q&cnVGU**e0Ai%z@TwskkL$MQSrN~N zEYe;M0$1obXjkMo+Lg@U-^^<9M=+Q!|2~DHL=Ux%Laf%Vw)^r(v%XmLG-U2ZgNGozeFs~PS ztOCRdr?z+}Zls#pSmzq2IXGcNdk+g}T@{8`jhLzL3;&b{G>08I6cbKU5HbfyV4dDT z4la{5k5p?%vR>B3umG%K(&NAo~3r@g%y6b{8M zxwXoJ1^hin?DL(YS9>m?sRmG?y_5VzyLgb`P~x2*!geJ_S_6uS! zwZm#(UgkL70Bx-AI|(Ws!bo3m7_6&+Bo-u|&z3WHuT{P-Ck%)31enOPu zZHH}0w*ONnHLl#Wqw20C7^k2@{>MF|G)VTLx%5B*; z2N)0K?Li7`n8>IVOn5f~GZKuKPRU6R+3e}j-{skN3|(2XUwTnYj%G&qNALsklxdNZ z|6##?MgqTjH{J!hOz=761rLtTam&(J!*%-4o>hY9--RcDPz-g(XtMFUg#%>6Y%>jo z#LZFyC84K-o)~^!I94P;bw+c*SE2MA=fx;NBv^f_>dvQAvaJhluenrWYwJ3<*{1>R@0n=`v70yUPBm5LxL?1EkXGp!~!ux8?IM9qi zU3n~37-|{tm#7ye0UKyCu0CM7<&lQHUF|zs(P8w59usVaADA<)ne@Fbf=zilKT8M_ zZ+yAynsps}GF_3`5`PtGmU^nIT;J=x$<2r)mWGCZ-M_>rBrLNSaOC5t4v_v{*S8z% zqF=MF;;IZRh3`yZWTkkeP%y3!681hw*ilf6T8{E*T$HYCWNdL24iDTy{$?F1O-_WX z53^0^pN?$O^Q<|L2Su>=l*hvlZ!Tr$w%Ux;^0+GKwd5W?Q&x#SK8V*gLeqcvX_*|C z;mN`>-D;$Kx8!b;4=;(A^HJb#H7ry#2(k8|h!BB57e!FC@1$-HNBiKbQt^ta%)GQK z@&j5tc@kRrH+$SYeX5~fhvp=&+G)A?nV~Zfr-fE!@BRFZmq{?zKvu91TQww}pxvQA zm1YJydP)LbgF--XujiqAvN44IJ6j-c!TJ{S+)f{5h3P>%tK|rS*||_Lti+&hNk&8C ze+adT0mzu@?MgprtOdIvBgNVl194X zl1qFrvTlj`=H}K79dO}JrH-gR{hKHB62tOy^jy;kS20e$O%Ak!v;Nxw#S%2J+|@!r zF!dOZgtc1b`)xTDS2GwBfVCC4DX9MVV+fw9o)dffG39&p+^J78uE(I{A8$ueU@4($ zW-K<%*?m(NH`wZ&yxM286{)$YhZu9cBg>Y#D(vMolg!GZ$VJ2NRS)cP zMy|M?;}oC3hUj+%0>ODnXTG^buU%Z^0b)9g7Hg-yfqMf0EXa@;=06Fe4sl6-YfElL zT^T?B*)02T1a0<#m(8mjKde9n_0NOo#!T3X%2@Q>UEo7Egl*7aV6ncP(@m3TYs#Wb zLu-#CdSRbB3sY9mFl1dsaACadZp(be-=Yu1=GYJV%yKqR2m^p~79fiyUq{Vp(24%C zxVM(YYpENy!X^BotWEUj5YRp@b_RTpW4OXZ&5~eXr@B43WK@S@CDE0u98@=O#T#6z zbGrWl5EqmP#7RScnuP+^Uo>FS;FI}ax7qGdApziP6q}SO%K}$kw5J;7bHGE8)2#WGbP@qM8sh+N@@?69l(O&46PU0hi47Dz4Q;L+ zGTC!yw)oGbCQCC-IZ_;ux`xmNA|0qlF4=6~yR>^kz8|w(zG6%Qg`(9R>8rMieO+9E zxc>An>+;^e++uo4*5%kPS;^pOy}&@tLys_2JM=~~;fZ$FG=k#4TJUjtSl{`{)ck-W zn3t3F(}KZv0%}(x0W{oGh32k$9GxEsnEbY3nH_RT8%+!)7@J&q`8*!gHyttCEJGRJ z3%(Q3q-AHTjh8zP-^4 zt4nU(+h1ob0}ZnT?Xh03&dtq1a1Jk4cwF9cEzwmN7BH>nPd|w(4Au3``;9E4{hL0x z5_X*^`7RphGbLZZTWKyxIeoi4Kr|RKU#+ttoUbi?dSIjj)Z6rAjuJK|o8lxeS}J+l z-Gw<#S^K%ovtL8!627vVX|DpWhPywL+PVH#3|FkQsD~G4$1QPP@p=-rj zRSX&J>4WuhG<0j>joIhtZq`Z-xteg9wYt2@?O2T_>A92G0JAU8!1@LTVTC&KB8zr_UnEia-zq0vV$fM?g?;pKmknBykE{hvI&Z*x13}r z22FN=>ECh+*%k7d>&AuFSL5IQhP+}WW$qKyQf8}1eqt37S;J#&0U*wvl8>0F&5*^P8^cETQqZzeUdpG|8*I!>no!YYjT>4 z8qpJ4u{97+`=z~ai5DX|piarL%m0Vavhk;c5$9%uBD7+o<2 z^j2LmaK!*U>gJB5g+PDM*HuE(`>W}MZ2$G3tBi)sV)2s_Xp3h*_6|yj)|?b;L62vx zaZKqMPwf5)Bstu-tLM%oNDOWPnTvzW(SP@07-;B#%KNWIj126!ia+j=_Uv7p^zc+X zudM{7a`)&<-}*^`fIGJ^oCXYF7Z0&a)o`te2JhM~vL@_@Mm_K43*XGLZ$!Y)>n_G8 zl{;19aQg<=A=Uosw=W(^csJJ>p9U-i`YScBPwQ}C9{_(GB*5bfSh5AMZBL?j&+nF@ zHQ=a|Vj$4;VvIDBc^=%ARnq;e%{tBdn_UAaI>$_3!xO*H18&yN?JG?R9vq$japK_> zccWIcF$Vo$RhdrOPF^$jULNElYtlEdcKCs#Q%gxu6LEEa#P#$GCaB9wd5EDtL7nGQ zM|#Y!unc%1sH{G9f~-$u?^tjDdx^wi#Bg!nrRmWR(CK{tZ~JT_Lj=FWQG9b95sbUP zU67%msz?C>4|Gf{E_YTeh)TyZ5ai0+LG`2XSgCe$mb^b;Q)0vCd0qLJZl98P0CI0Z z&Uu;i5vZ zw4w2ir=S#b%Wrn!6%O|n5X19h7?xaj7cD{ivvmE9x*t8fwgP(8{D^CQ+U03@^eI*# z4O|ADvMvP33dgsiHi{&_nPDyNdomL56;peC$}LksZf+(g#4*dVE*dfSj2n6s3`R?w zZDwu|IIXUryMmjlH4p55c>6Sb`*tu+@-cvrpf3&gvM=r3Z&UDg-L+JyGo%*crn|h8^Q_?(X+m2TS&H&tg@-S&4 z2F5^ReJSx{DkEITB_ezC^th6$e&4eN)w5idxDzR9c|A8zJi+syPC@fa$)SsezmOA*4g{$Pa;HhNOvP z^!rbuKNUERU9=#M>xerrR_S$Hihpav{>{O!a7u*OW<|xE6DdFqyUpRK!D3Av=?W&j zuQcHoTe`nA{LKEz(JDgG*aTB<3jCXWV9+k_y-yD=Zfz>*nq}T|9pEkr{qvKFWF$07 zLOAcCpl;zdJUUweVoXs9t8UJD3qpK;r0bilYak^P+2^=ykAR8ci^8C9M{h{~gvAJi7~CK$sZi%L+RLi|>oHRx>bmXc7qIkFc?y+b!x>al>B22yZIgQ#7`g%0HW$0R|y0^1wPp`G0Jf@jwj5;elOHWQlv z9J}z2V%2d6TKaHYY8(g~`lWyeoJ3`_OI-J)i=LT231m3}`ty{7{+x57|5-j94}ET> zS7SzoHH7Y?DSiQdD%ZGrZnM9fTzUSP6Q?(7h9G0!QiFe=T%!&wH9%2PAh%(R|C4;zXrzzZEJmz88JmKYS75(xbbg z>=wYsocb!mIKO{-{Pc0wb65?N!A4fm!dz2wP`Q=Kdr4s2G*zi?V-#jy7e^^*Y+C= z*lUwimP03=(@X;2%IOqlqTP*RM^f+12hFytiyMh|?2LuCS$^?DJ*`)SXpLP?QHjiMh4fP*C3lvQ@Fa% zmMC_QApQg;(}9(vazOohB3}e0UlA4{MZCQF>u`SOpSwXnlnZ=Z&9Poj9g}7c1ThFC zHWhE0{(fKb^_ci8J-+@47in3=tNcgT%KRcv{I5o;oyGA`CV)#qt%|~rKHgf}dYPjd z*<61TaGoia^ZgYE^*lujCYrNwuc>0Nr@@3C7kYcWW$^4oU#i} zbeoNxH0|HCXyBeMLCU`gUfwIeoH4hsZqSEs+uBEli6Uv7>A~x|n#g}^tlWuO{o^+W zh(oftYM*w4hUog+W=jeb7f@T69Jfx*hb%U~{ZwjS`6MsUR^1bMkkg?_9LX2a=gNtj z6Be+!{XhHkFIh{OmjxXXxDg64F-NQ1kM6%W8gXEjOxVMHW4(4u+(iAx!H0a?aPDto z-t|k0TU4U;>Mv1XzXMghS2=EhS0!S0|66M*lmHKemDf27+S0y*#-gfqV6tx-HapxF z6*D>HVtfh7RCbkc-^}UK>!h*o{2~qf3oWT2OajQMCtrEZK`D5>-c}Xda?#$$nJDho zhzThCr8IchwYEQy>t2n8vabG>-Q|YBxddU{jyN!L;`;r9`#J3*wr%;+j5V$zJ~#66PCymX?bjJFFgqXLhaj7_zaCp~ zdg!F9qVD#VI_MV_DS}9(L`uyJjo&$IYRZwdfMEGAlK#IXEoo@~j^{LeO~Fmg^ZmWK zz!lui;nh$uXxT9&5m2ojI;ZIgy|chAm9vyx(&WA9{2QhmBnCnU4LpN9D(O6kEs@z1 z_hZ|WPmhm`1Eow>6^Ux`lPre8oFRlsSBBw)P=C2l#Fg=(nEb92a(~<57~uWc zc*S_7N7FETWA#}(oWIPIPxV4%9i6=m!ya z+V|L(9KRWXfZ47F05FwCl#yU#jmoWi8`o)n1EoZ4<)s)k#GRf618d*(WhnF*q3 z>qPzck%^O)XA~$kf}_R>X#dT{3`ke$cz&G};l_ur1Gq(W4gJYIKi<4ZmIAwNk_d=_ ze(@S^)+1qiH)kFM9#&|4VX+IwFb5f5MKbA%=DB_bpC7e^zv}NdXM9)<1viETgUXmD zzsLSLMbJb!AS)ov+4&T~g>@ra)@{>C8Q7oRJ=PEuOS=JodiWR4p$Pq%i6~6K_vd^O zofWc-RjwO(BSTx((7S5Zk2-A(p?BO%@&dP=+q*oi!Ux&D_GK2ugR=z4V&r~{1^x>6fN>N*U~6F2bb_yLJrJWH zXI+j2aatPK{b)T1%kk7c#C2E-Q)A^kf><5 zXEiXXeitr{PMUtjfzk5wUvvdPivka1kSafTVVQq`fk8t!-+HDHhdX}ty2rb%?Pegl zPp$$3)ODnr0uMo5*43H^+2Jj<%EUIx>Ix1w_fvJAYn!PC$vti9ew>ugE5C>$hVs`v zrwjk?l5o6rIeIsze-mJ^OYq>v8tHvnp|F}qiIe9d(rd2I!z-I`dC_QNaj~;vrjXbp zS$*_u?K5RDAj5w_DO8Yhg!TPY899Ii+vWXutNdn1*>k}EXWh79PTCv&W7F;rC#r%T z9tdQtyuNw2`mb02R5@eqlFYqt|AnahWxFR+y_vSz2fnw)jVJ{_3TyzT$7->FtO9NJv&X0A$)G}r0Ze^%d;)8U}NxeHV zwv1rm$!^7z`Pr_gC&&0do;O?V$zBU@BJ4So8OyTwU2L3>04k84O_1daMuP6<8%6*< z%Atg;e>vW&41BRIdg(t&RJap+S^Z~$&S&Oxpb^`lKwS&*m%4qjOmyz8HCY*q=tubcp$}(-fh#Df2m=tG6<8iJpnyitM?vw@3dW6 z)W+i>4#=3`o^4;(y;NR66B*IGM}0t7@XCFb?p%TzPEm8$k+3OfLOkad*}sCJ^*BI=R2JiuhAiewd-CL8Gc; z68pRL&%;P<=T8OkADa(L<#oUN`Dxzwu#18)gOpcgfuYiEOG`{j&QVm|*k89sEH3)$ zS(O@q;50qn8~4BK#d0kHoh-z=6nLiNGO!~)tCH1-TIcXZ0+5XX5D0V6psnh-Q|p;A zX1Hje7rB@0?0CpPHKy$IN&0g*fQFrpwl{f9%pTCmTUYdgjIK(yfhPAutEyKc`3P zKPG4s3Cdac$)EKO5h|`5TMmHi`4W?kNRi*b02~5G?f_)5La0rZ+i5(#^93lLtQ;&! zJ23gykr#at(@a#p4YV8izMiW`U=Dcc;`$BYKiPKoRULJ4OzZyZK&y97tjzHZyVzG% z?(X7QqdBDO_i0%GlQ|esF}eFi4}gXLDJ+AG&IQ^kMgMfteTP8U0`6$n_BaRO;9Y<0 zn}33lCZmXgw=##B!Xr4!>yhDRgB)2en53Zm-D1;qT=5ms#7lDqQCz!Wel22aA24Bb zb(2Tq(LlInYtT0kHm;gwZW-eBqgtO!d-bvV4e-b#ezt9@|M(L`u@4RD5_#4d)ZTud=E6Ti*zql3?7Hse(y@G z6oIwt0u_}_Dqi^+Ua{otX7u=W&Xi6P9`4uO>Tx2c)n#x1RNk|@{VntNj>vowx0b%> zq!pV()!yF5mrH4ZZYPSC{8#_-DW;-^%y%sRq(h=QvMZ9Nyj%f&VTx1yhXTqDB$A34 zEd?(L7VOb%;SMp&gUPqgq*g)xn2WdBdDtegp%jj5d3fcg&FAig0_vJ_)PJ(AW=~rCr^d0U5<-aowj|A+#BNV3d0iudVG4R=_QWEl6K*KB9$p^%= zc~!Yhvv5fpp*)+*@#7`_ixL9z(uz+ddwT?{mu%X?jH3ql6G6q(4R5oaJQ7N`UB)a_ zjJ+eP^l*9$QhmDFS7VB_=dDPrsFy}1qf`e$L?k+oTj*aJ**;{aIdyGl=#B5}2-~*P z>MZ)&9y&qv@A;?4Q!P;58}(9npbx3n@rxaizW2i#*PYjvWXR3Gt=Xk>S6ja3V&VbE zKxxLZXPT<4g?CX6%gFOsraaX78O>yeja~zm%aJ`Xj6H8eqFYM*{BNMkh+mYSPV39) zZwNf6i3a(~B^50B!e3xi@UOxR(i$&PZ&N=8O*RDjDzsbpL5QjDX17v+I)Iw|FRd9F z5XY`dmJ*328z)xTP7}{mt@WFp+9mZ%sueo%pxOt{XvZoZbOmD1pFd}x@{L$j7G8w} zm;E^KKK#KfD=6ujiB;wC7g`H9F)-5d|IdWiqn%AK;X44SjPM4B2(WJTb8xZD-?$ib z7sn?aG_#OPCi-VH+^+>*gW-1aXmQ2V-%|GFX!ALkcRN?v7;YD$`gBR&Gi-9N0!&bW z9$^gai4`aH3G6&RROE}w0(XQbX8#5+l+j*u_r-s@o!ha#-CeyAA9Ff2#E}#6OBG8n zHONCIW#F{YDFG)z+;s19R8$_dL_BzWOX0W2K#PZFOh*?j`!0wE^X`+gKE>A| z$a2$eDCllINc~(hIHf#n2So6vcMP56-8AtAHF^w#wn!HO^Ohh0g*lWs6&S&U3VtD> zH$n3Y!26EF>aKQHj7_w>>2q1u!i@;MBj-u2{ha}c0)hoYe8nrLPZIUseGNoj%9I|y z4dxQyK(+A#`54T*d~>G~T?l@6p|AhwX1jZsu(rqxD}><{k7Zh1NvwtcN7tLjL-~IH z-4gDfFU$*vM(38j*qh*0*W#+H;CYj(0`ZyDNz(U7!B(F{>BgfLPgHH>Ze zo?EZ?>;3us9-rTTJs#w`?(06+InVPv&vWk8;nc+%Thrj5|Gz~gv}bWhj6CPsalIna zRd<;~8OQW~4NCaJFQ^AtQThU<=w2pGUiiZopn~-7`8pB?Iu9Rc)zqHopUe@>Yk{U2 z`xCTOzbrr@{Rn~x42+5u+olqANO~ZAqqCvtnl}> z{)zpAWLB9^d{THnXP#Wx;s&)!`=Y4t@6dbmPh)ST4eMTWOr6Lj;#94VqE#baXDtEX zap8BE5McehAh_^hXo`WsoJKMS@?3zv#Gmbw^lUX=V!0`+0ITOW2trrNF|yCV)KKoi zW>ko%*h5ty81fDer^z}H4_mrl*fhc|NORs2w= zv|&(n#Bo#|0hdY$XiJs;O#JwJbZ_Ge&n47GCe+(q?&F#cgDvHHF<*3_-+zq*IXHGr zO)gG!bnPtEV)b5Mg(m3o$OaWnQFIGBNh{-YVjMC|HCnf~x3&UEU~6FbQEk_v*WxBcz- zfke*N-*p{}P*VXqz>6XP`-QPCHgKUzn*%48{#U<%$ zMIX7bqy7?TI@MEh&bKKBFYB0=PT6tGgbmmLN=RBM5d72m69);&f2mX<44xHpP3F(2 zM%Oi@>{~~!9WX|y^+rGkrGKLCXxj#XfrqY7@FYUjz`m zZoJjt{k8mv)jxP5V|+=sBBCQNFmfzG>>fN>hb4p#A3mDCQDLo#;HI?>`X8EglP)LyoV$9RH#$8(zoxt4E!)0_Jz(z`_+Wr# zW6WUBDP5X>8(2HZX{IVzs?TzID+3K@j|St~QY+hAUTFQ)HI57+y7?|gV>N3SvE>xI zowyRMvhI8=DYAx8hwLvAFbl)x6hE8YiV(~tOK6y^arTK~uIp@ncMWavuobK@c zF(Wl54esl<_kcyCDfuuTL0s?A!xO`jd)^WNk$qr^vaXD zV-5UFaJ+0n{n+@%#c<(*oj=|6E+iRPZ>L_9uMCz;tSZDwc}Lr_o~T=R@Lf7Xc)#;T z8{aN%)8Yw5YV|S837=XlKDnVhAd&<5esy_Ps-(01_3AwbEUve)Rztu+e%LSgl-Y(- z>GK4paMGRNT0^mX+fX)@Ubdb}S1=&G#m={yu-@J7R7|VW&T4KIAhYv~yi(|0q#g{# z=#xTXqpm6ecHY46$@ITwZF`{eFq(4SNV>m4eF->kM}>C4Q2nC5xWiOJVN zGBKJm*5%=|H|>vR8K}cw4)&sPnw6-x%70y4g{(Ho))V1;hh21_D=)jFA@7p{zfkU6 zZ&;VdyQ4p{EG`ekQLpddph#t8@qB$`v=Q0*wYb8J)CT$Stxrve9f2!E1 z!lWW=tb04f7~OHWSj4?{PiAU^uQT_hGx7~%H%+1)9~smhgo-2>*ekw4n25RhmGC>2 zk`#T5EiG5UPVJUmdYt?W4@NW`>4YN|&oK18wJnj6zVd=TlF|%&YSCauPSqVZDX9P2 zx34H0JO2CoQ^4~#vGXTgsdO>)w`!e<3r60U8Y7huHqk`;o$)In)jz4c0L`C^n1_jhq+Xb{~$n*6l&YQ{lY)Iwlt{d}bhjLbjq*D%E$ zCzfiWrP-ziq=zfVkqj2Er}SRxf|>n;5-}KQb0$ixUBc08JA4RQD5J@ z*BvptP;Gi)RrPOVqT<7exF9M$n!xm2C=j%EllBlnib9q~Ln@Z}Mzbi&R~g0^Zp4E+ zHHjVLd(w^|zSkjD$_DdUyb*gI-3J@QZblzTc01rLG(>tbk8ybh2}wJg0OXwOjUg3r zc3AsiT>3#e^5Y{S16H%w7=9j+zA8o6@Bpzv(vxY+Ou#5QyoeTjD~gVl8t3pD(;v80r49&CDI8|_nI z%j&rutQSMov-sM#3h8=2$0$9Xpi(k-r7ps|-Wh?Wnspm2Qr|pbW0rn5$V|_L%6N?F znW0PmpO!dp{M)y|+Md5v+oIXupnPvy|3qfbq2e_3_h+%BOlfxUPg9JVeDVU{6O&tZ zdWk+wwk%2;aFQH|*Ygp(#PKsse!B9&ReLoERGL@tX0ZmrlCn$Uh1wJBad!*Uo{yuB z;aV9bc+8@JRx@rw64U*-i0sz2?t2fr(HjOWZK9PBR?vG81zsL9KSQI(Tya z8@VsyKE`2EC+DEkvAYK9Mq=y@uPZ3kI`a<=WZnE=6EI44=|HxlVHP1Vk$tGLm&GLl zBG4kqy=7eaGD}oDnKO(pR^vg5RQej!z~STvYZy-AJE={j-3~Uy28T|%5pN1T{|V#9 z6-LZOpUcD7y}M7&pLY_uZxCwo*KA1NvH14;+hHqi>m%L{s+$`J{ULxQo@kZoiVx&L z{FDm|gYsY#wd;Zxd`62wad&?ZRn0px*lrl2gDp~&|?U$VMHA+70)-+^TP#H zHyk=hJKczWCeR&UpAA-I;DVMw0`FSY68g=7JoQ^lz7kBd1EjW`m&)*yO zSj&X(!w7lNM8tMdr;STkPea8#gpsdG2m63Hf0|Gg7>YUZ6ng!;XC2$7=ZnLYA7eAE^B&n*AqiN|V7qS(Q<=p4OZ!=K1m`e6>-EZcr(& z?v{I~xBGislQ*lnb$q*U44qR+J}mZav1p$$EGgKV=Gys3;}L=^yGgod?RFCjdrGYH z1N(P3t^n`1Ou&*3psP)rmelTbg&`!itfUpc;;lk$`0;7iQe?|T*~=v$B_!BixUeAq zt^jN=!JwxS4e0e=G?g!hGqg@6*X5yO*otA)u@IH+yI(fZ@d5>DS3;gm-YTB>My{`YuH61x$+dYERK558WYxO4O*i%kymg3qXmdT-5Q*x0!Uc5!MSUBGGpVI z^Crxy1wNDRz3P_JJW0iK8`Sf*Q)=PY?se1NVCUCxcG4$vWT9X;cdhP^vj$#gpOtd; zQHYQ}nOOY5=T41k1ZjG}RnoRa^OnytPFWJ};i??T0u298Zrt+(BTV4PHQ~F#>S~Eg zG0~n(!BR>_8Rd3xwP|q{02o+@jPsrQ5kEBL{%7lIkFQgv6E>l3U)PuhDZ$icU zI_p|?lM-$Tii*xT-SQa_vDb$Ks<|Q(lzGMT5hh}g`vlB}xr~P9Qi`|&HGah}SpVZ0 z`OJ#5o|4Urc{G3h;Jg;@qI&d;-tGk@g1MN318NmyDm~)_!}EB3ObvbE-T4YGP0ye| z-K4NTJa8CagLIR@6>u769lddoMSI5uecGyg1qu78Zi^dI=YMFW+ASq-!@$bly=YA( z=<5c!)WN#~7LG%L-VP-+y;Kj${j02x-wAS5tv*%^*QD{~Gwi(k>oSUwBCdp6f!fd! zaY>6W^LfvmQ_6azx;TSScQINYglD;p!%tUTDp}{h;Bh)YROat(JTxmP0s{=6h1UuG zmhqvFq%OV@Pi>f}xP%Mtgc?~m0>cwD{QpO}c zEw@DnyP$f=V9{ z2Zse`9fQR`Sb0VBWoTGd9B4TxcX;3vhj@MnyjOmi8}o!?G3;( zcv_jiFobghP6EE+2Osuqy`5#yQF}s+%?;KshbvJu1w(brGEg~s13b8cR*K_8e7=FY z%HZ6ZCvpl6SDBxmlHd&(5*HTMbd!9+UHOZVdmo_&vgP-DOu*c0)0oZUA;e&(vkEB% zU8D^jLP*{ms{?K@Y(s@YYb4s^&}|G&nY#H)O?Bk$`0TCMt@H0CJWNbH;wVrr zs%SnlKF!l>+$1siQ5ry-wa|F(?cg2_$Y`!%@!emW`$F&Y=IDgw3D8ZAOL8A~lW9UF z8h4Se&zeH#`(O8|m1kSlMq#o9z$AvQ$Sh@=HI1)py~x^9!{8t=1>qT@jED_~y=m`r z4VT}6;q9i<@f8$UcmI_uA!pQ_JIVtwq&-x+9hj}JEPNS6jI5cW8?bPUfGd70aj)gN zP;x$sCUc415p>hqKy!{~7smrFo~ypwU*De-p>y7VE4;l=?!KjO%`ZaBQMo3&IB?B zt76W)k@&9F zu%u30a zP~tbECLVfPjJ*eL-fLXRM8*nIsrrjl9HVv0j(}6V`12*;RMh@(CB3^6mngQz@)PY2 z+@_Y==bxGpPZZh7BsRVQyPb%|G4JZyZX28$&$B}AFHf#fj@n+Hxx3mRbm2+BQ2| zf#J9MPpYs*iOO9aak!6iyDwN($7O0<&9mdO2|>4pLx3g^XIepd6c#+3x9ZaS-rM1m zu4hH9EGm2TQrqAt5V@(+8iC1gb~4^098@~=xDz-@axbbw8k>PC6CN0Z-BkXKSp2Cs^l2(~CSIE%->I1aUTn zyC|;uC_!fQ@~_#-xI+s&L`2{Wyjt?@cTNdbWxeas^Mil{Ax9b#HOQN?|Mi8o6%@X$ zsd*DVX&>$z6c{;c1*qgI#PI#x55Gu6E#j_4iHJElU2Eg0FQ@01gXLRo#Gn9i5I&*; z5vpfz27N9jEYOhSS<>PT%nOm|oHI&$5^3u?{GeWrY_ojMqe<|6)sot^3JaQX%%ckfsh|3U`}|dP z*ac0d<&jT+Z2nRX7mLral$9MUG$x4r=m{GCtwTsTqqJ8!OOHJCYw0c58t}$=_E+%~ zrQPJ$Cf{A-WttYR#8Bxq@o)lY{DBbD)XmP0u3;2r!-sBw#;G<4y^+4u7AJoX+71gYj5iAs2Cs5pbAJC6cc^!;p7q- zSFj|uH_ddQS84ZQiHkFr$dO6c%`@7oJM>H;i-~+<04XHklKK+EfY;4TUI*rNLxBi+ z&mh>=1DkM90puK}gVuN^`_!wOt7vH-a!k?hTi-nXRDGAwa_}RW&=yz>uvV?*4MXdr z6OQ-(xd`O6GH+V)mQ$dFGC(zeFS367nBD)}!Dl>24WucE9?$>l6I(m!pabC_QN*Ze zBx`Lfm-TQ4{Wl=R8c*g`YWO##T@Lv)#`CD^g@Boo>&LmQxI<6V;?X^PIq|dtXSPg8 z-4|MerTr;+?@fa|OGJJJEjz8m1r!e7De9(?Jegm;X>Bu-H@@8(zR-V(c)itkM}*#m zYB3b7wxKBQRXGd~j8tcdzhj5lT_{elS-uBjJ=c3O4+BHzR9$N@>8~<*fE#Hj?GSuY z7hT}d4r#K?&&knH50e~pogd!zBp$2}L@FA;G& z$CWu*=WnOeHyHn$WJM&zO6w3qofzubH-)njs}2`UtmMHVuNrl7AFV@XHbGUuWy`5o z)ZuCT@}nWug#B( z%JV7KJ*u%PP9O4mA9U?{Z<^hJ--b|evm>wVs?z19RPGu`5gOC6c%8#|_hhwpS>)8s zO|_E>?-X6*=bGN6^C)bb4z)iA&#S7Nu@sVVob(9H3*`q^s9i`6ECA>%XJF?=rOC9o zS{Z5bbq}6ToXJjKboVVl12YQU70W3WYV%)hr=Fa9O?pcW`ax$MpZ^2&Egw-JlV{zvgETXI3T;CHfgc8R-$k0p zG6Wc9y19##r2sJBX9Z}Li9azhYirlGdL~>qOfBn;QwIt&Mk&j1z};Cag2yxHj3@KU zVf=thhsoJf(kyW^(`q?ija?tk=NR@JD4obLl=}TPKhG4oA21&-{3_!?mcDNu{qFw0 zCckEMD>e!`Y9~(5TkOv_2@Uz@(QXIV9wRoScrr_3OQA8eZ^t^C%D0QFo@`Snv7A3= zBVGqL9i00C=?JqMHH^98*8#Q7k1@ivdPYUSC1=4^i8p8pUk>*_{HshHxsTCnu&Nk@ZHz9FmD ztEGN5qWF7jdB%g=`m7Ou^l_gh+-APB-gj)m2WZJ)&mdQCGzD}d zlWnfE*|uEs^#T#xp3Fz6`Q8CsmqE{$Y|0JWP%h(P*<`gU;v%O3=_&*ZK+>gTWu#I`<~gdd~c&*+h2@r1)wWR zCeiW0plb*2>~Vz-zWdr&)oI5o{<^diRJtd5A)vZB&&htHMf&cE!cKjl>iABU7Rpn? zbp3XX2_W~TxB4$+ojxUMm)w?d>iHRH#YXlF8_RDVIKeXMZzx0)DB6dW%pbTb|4mQ^uIts!L^S{TJeQ-%DUyt+3+Suz2H&I{}&4257#h4j+9gbDbQm% zu>!4noK2n&b)KR2U*#}`_&hB*ZpC_^^-59?eg5Z$?-Yj9#aK)BC?|9OBsq-FxPJ1C zr)^|kF?uy10_dRBSMILF{-X!PXp9<$M1Q2U^h4X)p-nP41qq?ED&SK`59wC8|T`+Y67 zGPtXjl(Q*$^0YF{l|oL<^j4?brn=FOx7r?K6xp(dyGVBTyJ_j3K@#u@MSv4%#j46e zjNJJo!1EY2cWm{kn+Zon3I*s|#wFf6sn;N*xd0i}FJ}feJ9X)g2YgWrNcmmVUPq10 zKWmYb&RD|?|1NY6@vWh+%NcDjW(+wg_b?*LI4mG%^N%@h6gmYTDG`Af{YW>5ZbR=GDa;-@*-!U+*|CFR0qf&I;{zy-~DD$sq4sx3rmr2uebRTuLB=joh-sQ1+D8?bKj@a%%C{^>1>~kfWz_%)(2|mpQ@DOfr*K#QS+F&kaO8i zhQz{NX9z7}Egg|LbW62cHF>CwFO^<+1L7th{vAI%J=T5eUv0PCU z3QbQyeAuCOo@g*1-I5wSZC1eJZ1Y^;VcEiWA+(K~cK38R{G9cylU|}5ZZ!1U4t;d= zc0Jbb(Sz-W1q-m_4prmMUXUK+N8Y_1XxCDi(Kb^U{^a??q%Pwy`sh#0PUhh)@H25b zD~Rdtrt$L-H2z~?N&r~<&p*Oo6ZG0I?ir>8auu%&og}{;03` zlr=RB$S?lo_?PA0OGX|<3k!VDQZX!13@0C>GM&x|HY7_$X{*pkgN>w4g%!&6KyYs+lDoe?yy~OKmzr^Ci+TFP@QY8ZZWuZ)uqp~Q;WZ3DcM%B8hf|Nt zaDnXK5PB?d>PUmp@7i!fnP_=I_? zK>)T`#4sHL{0V~N!^lSlBQ%bEd`sS5 zp)6NP9`wa--9>fXBNO>NIJIGB2a0{{9(U6&VM!aoIRiDUrIYALn&TuWE1Y4)jNrug z-LZ|XBI0Vj#Uk$R7C`GoTICd#dB1$D{MiDz%;?M_A=w8)(qqD|}KO;{uOVZZXm!N9{ zvBjr`VIBV1@?gti-XTPlv#DUx+~j4tn%R4K=2az>dAKy7xFHP_@>M3a#;txxA3|T3zbUTh$t~>sq(uS6t>-CGAMUxQ4Bo zQ?D7ZA;0slY4xCvBgL>blo*!vn>_S$-wg*S_(+%CW`1Fs!)Scl(2uBR?=c-1`GXSE z4ZP*sYfN+OLyi?KCq+v~+yU--PZ=fRFi|50DJoEnQjSe``EGuz+Svs??c)|fW7|{f zop-G8P5&AenoPZgV+_;V9MzQa2#>%qmZnB6QN*l&=%Gfv+1jY z{FB;t@)W2M$E2X%+0eQ`de>y2;NjO}rGT@U=Trsq`8pbZUq_2w{m(&hw zuQOFG=Cy+F!yBJ_|9j;Kl5tYoL_3;FT>no-J=C7K5S@%UKa}w!IV0Y;E$JE427H(&~DJSG|ANuU4l4)AUn6c9)61p9_fUuc(vCM9f_^%edz+4zbN zY~Kg^=(6ACslC%_%(0W;hkR3fqOtRh&Y1auf9U*v0HN){wU2t5)eOdJQgwUP3${~Y zj+9I|p?+Exbf_scjH}k>gBxQ!ap&v;V)dOqU&79>2Z-FJly5j0^yfINTX|YTHr?fN z_NLnEU7%D2_GZ?L^-N$KIMhPb``v6UFIvV&Qt#fxr5reU*HZW_p!0!LJYOb<6k|V> zz`)is;iBtoBIt&X-Ff@{978qx>Mg~BO2cBi+HNRVG8ue}gg|b@i#q1AZrAQxyn^S} z(?;yxgCYm2yxF*p@IeXGVX32*1*x$}<~Pjh-I@0@6Hyiv$CJe zV-FC#z;c$mdM{pgBa>PUR+7AwRX|Lmuj%moZcx3*l?#qT-mf0^YaM6+P8Y^-rD6%x z!K-6#`XGHDz|L=5q1CPBDA#(G6CF=La|GE|S|G5##d*E9zo%LxYoZ1hG*M1@e+oW` zonxmFia2Xa`YNKkz(PHj=yGdi7l+I`D5;MwG~9xzpew`x2rKNoXx~x;)8ffDJ-rX&}{LSBW5{c@PA$x94L;F z`4#+KhRt`bIvtIxz*GQ5_0E>XztD|4ZfnI*$zByT5yG*S2|27as<(3gj-9{J!x(scmRmKY+p0wS1Q8e1z!n5(2J_d?B>TZ?`q2!PR~OV0 zM&*N+?Uc5l4=1twK`L!~V{0vLX|&_W4Z~`OQW2=utawPL(iO`4v}TIqz{&&aUkGSq zetF8+N~i*FgG)of@<(Il;69U*+WHYqhH|!R)GLoSFWB*lGWbIVBn|Kjw}YjU^tq7| zzq$TbL23yb1;xHAo^C~#rY8g6Pl$>-GOuSo$+BoKt z{S`AH7DB0j-llHy$aGJDZ}VnM=#OxdqGhXM@iarH!ECJNDhY&lD3})(u^E;e?I6~j zZF-2(NC@vei+7VdJ(HENAR79Yy$1VFpeC{ZqXhtrF0%e34Z2}`&<=0f$5IME9dSmQVq@`- zRP%UC78*W8@SNI@?%|c-i9RDWCtD-bJ+z?yDb27NlD%J39^e4Iq&sh#P7)`A)99Rk z31Y?zES|#j?6Xtl+NDzHm#Ob`CdHO@W=$MZ=0H5tC0_Dd9>=AsD|G^nFV3kYa0E7L z$=3`~+0TbiFKBrP4e5{Et_}Sq3!{M@1}lcD;A`H^<0w_lor)UqXX78c_1A1ws?{ zv)h*8WAu&(XmXEiK1qp{GhWOdPhDonk>Z&LAy5Na5CltppJiBUM+|#pv~<~k+p2T% zRqmN*w;U=|!_c?=NQRW=May-H6b%(NJ5XK0s62p{tbF=ySsZ^D-x4@3MMi1;o-KHO zRxKe~Q0!*9rT<*yX%3D{w)6EP`^W!s%)KB}Njf9K=%~_M?6U z-&El<2%C0Xqz7Ca-hGqT_1Bd;cHk*}q)5GLw$CIw;@FkfNly)js_Tpdd?IaA-BmKW zvi6z2dV46fW=_0SdD$jl=DLfUua0ugWTf)ADa-gfkGR6}@~lt3V*g#K8+B8AWZZvk zCMbz-cX>~`uC=`oKDrU~I?Wc-8mhg6tHFHdz5n4LBT-o$Kv!beZNP$$%FvkWUaYph zj5Tv)I`ywxn*hN;1~6=;>-uagmtU4Z!S)OD7#Txid(pDKOH;#iG}HF1K{N-WwxqSH zt{;7Rzcf3}be7X}ErR9O8z;(yy!e>v_w!IH^Mg1HmzXix?NhqB=R{r9FLG)1{+;rF zy5pm|S528mof>-OXg&Ax(yzicsXF`cicDX4n>$}HDg-hEk`x2YD)OSg=pUJQ(u$jve|t26->>iEe$K} zKt5bfn-uN%!b~iY!5_&p8?M;ZcQnT_x#`Eu+ixVfyF{oIX#fHV{CN68>WgHO;qRX1 zk0Jl-ZUKC5j!2#ge)K67d}gZh7jv4L-nd|@>ua$UA6Q2HH}M^_QxPH z0fim_;O)d={KRcn4LhW0??Ao1zYni$OJycqa`~qc2Kf+I$taQW=uyG_(SJE#?u!Xt zS{Q2hsX-8D%Mo@m6mRVo&67bYFZbpu8mnt7aE-hMJ;u?}sCe)=z@M(%Y&_!#>wa2u zUQ^7sC#kwHYd9(qMo0qq%U=<2>;hU@W&CXf*U07s3Hhw85s!`)gELM8M?8^l=(`WU z)`JImyuqq2Lfu7K^wsJ=P5gxILRr7Xg$0qbhZjdecf1yVUge}PP+P$KB~2&{s4xf? zmtmw!w+kbQca2r51|!uZ8ZsFl5P4GR zH~-R*bK}?Q?-u3#n&r*$a~_u`EV;-0y$EY$sDa!wgXcIdWiI|)mbOxUX0Mjud5pfU z=TSDIzejt?WG5g6JA53_zeK7|?!R4D$^ z`2L>EcWuk>l-F2MXH+cmGf^7hpCI59kDVU`P4eRnp+f1MKOfiuMe&_V&w>nd;^;(y zJvAke3;8nm+v4>pwFJWG;-B2b2SWjot(R9J@9(&u-Xjw+CHbPZ;K$MlYL--Gcr`xF zzsJ;IqF+EP<=q^o-`fJ6=}2a|c(S}nNsltrvwG2zbr{fkB@pzzQVJqJ*ZerG>SPtK zXMy*Lv=)RzLa_$q+3%&Py|h3c*j5_MC$oW4G5`(yxsW~WLde+@w569^A{UnVTw7IT zbJ5yP=4Rw9L8~Ou?fmR|%K2@dd(Cm*O>z6BT>)@Xf5{{0jG zEim1o!ndM>_52J{jhtRduIU_{?6#PfQmU4wKv6pjXn~4uHuN5jps=#X*x;CCs8HAX zo2pIrk1s|h3OIO*u`3-tnIoh!3XO6*PZ9aBGonCM$O`tgwN{HArJy{%TNrk1eEjoT zaJr)P#NQF$<5|}yyXyt^T!_0swF^|{IA>zulH=BH=luXkTL{4at2i)vFL?6dKOu@tsfENr9_LcWhY)084<{r=gon|8lpkq9`w<$LVN{zO^D%4yZO?oLB_4%6h*A zQY2J(<=VAn_3~5~GgK}pqoja*xG9^}ANywC=Z3B{NgJgHCFMK1IL_fvkl!$WgZN)t z27ucc)E{;#oP6y;RP*t=;$vlPaWXeegF3;CH4_`(Kf}%oo0e0qowKv?H?*p|Ta;e+ zRJ#7#n>(6l(InWInR2)An>NQK*((>qhj*v*x(-d@$;&qWHhQOBI4*T#`u9j(Jbz5B zf3fnn&i9OiIz*u{p=TRw5_XFY6^0~l{;}A75Ovo?^gRGIgTD>n;l4Dvv;WZ0Pu*-b zPr3Ayi(2Cip?2^t4vR$;tyD@!%}P8rNVV&5jquttPa&&lpmc!>1XQNDpZckLtV6KR zqGn5TTP)QQS}TU0C!t%BRFgYDXnv)J3+F_t{w?wSD9!LhB-)xWA&}W?PF;TZJblF( z{?lMU67-^JWlUz(rS|`DR29;&DmPv})DWCPFJIv(jm2nZQ~JF>^Yk6HG=CJYvfi=? z(3o*)XyYHRb^!#tI63OGy!IWY<&^6Zafr%r^M}L8yT{XkpX9;RT-`snH2?Uj7TSTb z&X;mX?3zqKCWn&kL;)lw8=)@fEk^r2gvh#k{r?*8R|9-oYl(&_@HrrSk)}VB6nxoV?O&JOd_iDzWo_Vjpcnjz(`UeNY>Pm|8 zBrRw*7NGE2$Z?xyv}&xn6x&@J`Vyy>Fny=b`oU8uj1Rr)Ffi<`WYDx+pBOxr+Lovj z*{*&GWYLd$3rr$y%Cf9yt?R4_fvRX zYc`W!XF2&3qRym%$;?jT`8m$l2F=f_ywvlKHelsqs$@Us1tL6Mq_HYpw_DixbyT`A zYBEr-r2UX4x6JPnNNJbKXx4s=|Jsa)W&_Wa><*M~P&RQ4lwk>`4<+F;cWVvohi@TD zCpso$=fAbYD=x89_ZuObu*z9Yn*>``yN}%JaD^=>58RJ8N$cY3-P93s=CvMXWPGoH z`iv%sn}*(TW(SMBc3V6-;kcAPjzZ3r8W`wWs~Wq>7hr6w@f(+c%Nm%Y_M{*Ow)J`Lsk11cK*#r3;#%@X#4n|tlc+wT?hRe*#1IU zbKJsW2>rLwy>ACwPyJc<@U#4h$xcQZVCDS_z^XsJDAIbfsh?w|rYCNPn#Tz-+D*{S ziYSX%pVMprJRZJKMV)-sjyDbZ*-0OPyBfMufaEhP_289!%U)emUBB~ZKqip;I1uE3 zNU>0$6gR0c=HAYStZwTNx$v}g3oiBnKBGZvP!ipZ?D;s7@yruJoI7{QR5w4`FoZTK z+!`$1g_y;>Ryh)Do&j;mrm~y8zlI^aLf|-os;-lM)uQRm9x1a!OUwzcO?2?SfHR

IA_y!Irhp+G6MjqJLvn>Xo)y!iLem)uHbyHeS$XPKkJB z+Fs>!qirMR53S>6)N5^mf_Sr3H^)2b#-aCVrMaWHN3?-nZ8UWf_5{Thdj60#PRLVv zB*P#6=41Y_v2@H5P1#u%@0b=@V}c5_C)YZbPUQWkg4Uy!*k5Y18_b3pGWu9-HCzFZ z!2F0L1D4ywE2n(@m*Hti(O1gyLCMP|!r}#w!n7TE8qN&U);+QCZ+BgO$D- z#!-}Axsg-G?87xB&Q$lkWei_vhFYxiq{=Jh(+}gJDa-tp8o<*P+BQAtK5&Wl^22Crd45LRo zG4ktm%!a}@K3vmHVOL~KUUR8H$IRqD)kH^-i9$Eq9cdl!*|iMWon!jMrD5Xa6!c@4!b?S&=Bt^bHr}Q1Zl>>e6KwhI2-W8|jV4Bi@ zJG|*d&9LZ3*~)-IwVzv~eUc#_z^4>iK!$O2Lefl(Z2admLuO~$fFfUyRZ%awJK|!E zv<}(Zx}68qM*Cc470?m^04f&3jI@JZ%)VWgYvWgP?e9P^_&yE26-{;BnGMK+{ zCOP0FQlz^mHZ(QjA}so9yWr4FhszYlCH`5Ti)-Y052TRU+{Spf2Pgw^YtXn)4v`?7 z>#+_v`6ERC|1w>OAWw%RrY=1CTv3$%qt)7^=}?$Ce}cild1o~Q=hq}9*r!hsA422FbBP6qn?VA{F;(Cs!66GW_9COb!od$^OQzv<2gO)E!geTANdrV_`b$M9HO2X4e=0S?|T4~C_VKjoxPo1Qj!I17XjmsZoqBc&qXVOGd9 zFq=X#5ItFUek6Ge_=$vV?mAiT6!H?yeZchvn+6fRY4Ps%EfK5Bm>1>?ytwd(ylKP& z!zMqz})O0UA{oi`Rs1 z&~G8r?xjIpVVoDORge5rWJW82wbsP2?=PR)ZQdNYPD$ygiSSc<6@m|Y#ZZ8I$TF0= z@0oKYw(||g_cx+ybtj`4U08hXU6sLbL|^|(-Quw7b>3mRCwo$;ttjv6TEviFi)qsO znXO0_VY>9Fr2b}#5g6*mVn*cwW60x8{Da0#Wt7lGhoi)Wb)4R4e-5p}*deJ%1(=T7H$?u3c6uerRVh`TIQZ4uJ$fPG|}Q6~T^ldaFa2ztjOyMmAQo*7st* z0C~G7(|A3VzCmcb@#J|8Da2A;d4OS<7_h_{^+wg);#Nbr&Z#)W88g-Cz8!xcR82i{ z*E)6W?JgH3>O&DRR9W)SvDXX@g0xQhdBBvwzW3@R_WLjB5_~8G_PV!kNN!%cRsjQn zaz}R1-TZM2!7&jxsTw96%AZdCNzmdHKx-pX4bx{le@q4LL$)CTBqJ~wDfrxsW6n%Q zY~%Ml{KLZXqA#&9?{Z&8tPXaXA$Or=oYeZ5d_Sf1N5nt`u8%DhYA^B=uN2Rq^hVlm=&vO>Pta^3M*_Q&s~0$cF93 zMQLs-eZ>&d|J#=n1-^rA3R#~i6bcie9{6Zc!vFP-8~PhkY<87e&+Qwx`>S3H`zZig z$bvnL(+ugIEkYU6uAwT#S_4R5bV@|3PeAkN+<18CF@;w*T(T89KmCl#=30luE~$xR z$$0XFN{2LG2w7HW?WiJ#ThF(u1o}yFh}|$$Sx&NLi5(_!{ZEq(A%;;NRUc>YhR9WJ z3#4uy5A(ACLItRJ2LO{Rl_5tRnh5!s&g!zDoQPaAZIULA;8Td5pLO7QDbzZ-gji~A z_Zd(!+uou&mhgIb1M!rA)1#dn&v1S6hf^QSyIxVQ46~jmb-W0h<{UCV-<-dC?d4zY z`7#UBL{d2=7vkYxwJ^}?^B%Bfviy;fu>qaj{B>{d^qC4b;%$p_ElP8%(HQYWTBoWg zyJ78H+$7CNcB_Mf@h@riE-2wBIKX%dBcCB{MBgEN8l|DK55~IOL5|0#GS2_~Tt2Na|_=YI!<$nMdV7+~&s2==7eAR*=Yg5ZRygMmtU@a@VfTeRd`EH7PT$gT0c+mVU)8kGlir~`et(k#By8Nt1G!v z&f`rPZ^{2RyGd0|X_YJN61t{yJ5NRg+G{8Yc2 z0ons7XPy-!E2l6N$KUF#KI1ksAt#u0uj)W?^^*uO@{c9){oIJ

  • g2Qd0JTSeI2d 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 literal 0 HcmV?d00001 diff --git a/cw_solana/lib/solana_client.dart b/cw_solana/lib/solana_client.dart index c4069c266..31e9c3ab2 100644 --- a/cw_solana/lib/solana_client.dart +++ b/cw_solana/lib/solana_client.dart @@ -19,6 +19,17 @@ import 'package:on_chain/solana/src/models/pda/pda.dart'; import 'package:on_chain/solana/src/rpc/models/models/confirmed_transaction_meta.dart'; import '.secrets.g.dart' as secrets; +/// Result object containing both parsed transactions and token mints +class TransactionFetchResult { + final List transactions; + final List tokenMints; + + TransactionFetchResult({ + required this.transactions, + required this.tokenMints, + }); +} + class SolanaWalletClient { // Minimum amount in SOL to consider a transaction valid (to filter spam) static const double minValidAmount = 0.00000003; @@ -156,7 +167,7 @@ class SolanaWalletClient { return estimatedFee; } - Future parseTransaction({ + Future?> parseTransaction({ VersionedTransactionResponse? txResponse, required String walletAddress, String? splTokenSymbol, @@ -180,6 +191,26 @@ class SolanaWalletClient { ? "" : Base58Encoder.encode(txResponse.transaction!.signatures.first); + // We need to check if this is a swap transaction (both native SOL and SPL token balance changes) + final isSwap = _isSwapTransaction(meta, message, walletAddress); + + if (isSwap) { + // We parse it separately, because we want to extract two separate transactions, the outgoing and incoming side of the swap + final swapTransactions = await _parseSwapTransaction( + message: message, + meta: meta, + fee: fee, + feeInSol: feeInSol, + walletAddress: walletAddress, + signature: signature, + blockTime: blockTime, + instructions: instructions, + splTokenSymbol: splTokenSymbol, + ); + + if (swapTransactions.isNotEmpty) return swapTransactions; + } + for (final instruction in instructions) { final programId = message.accountKeys[instruction.programIdIndex]; @@ -206,7 +237,7 @@ class SolanaWalletClient { ); if (transactionModel != null) { - return transactionModel; + return [transactionModel]; } } else if (programId == SPLTokenProgramConst.tokenProgramId) { // For SPL Token transactions @@ -225,7 +256,7 @@ class SolanaWalletClient { ); if (transactionModel != null) { - return transactionModel; + return [transactionModel]; } } else if (programId == AssociatedTokenAccountProgramConst.associatedTokenProgramId) { // For ATA program, we need to check if this is a create account transaction @@ -253,7 +284,7 @@ class SolanaWalletClient { continue; } else { - return null; + continue; } } } catch (e, s) { @@ -263,6 +294,401 @@ class SolanaWalletClient { return null; } + /// Detects if a transaction is a swap by checking for both native SOL + /// and SPL token balance changes involving the wallet address + bool _isSwapTransaction( + ConfirmedTransactionMeta meta, + VersionedMessage message, + String walletAddress, + ) { + bool hasNativeBalanceChange = false; + bool hasTokenBalanceChange = false; + + // First we check if there are any native SOL balance changes for the wallet + final preBalances = meta.preBalances; + final postBalances = meta.postBalances; + final accountKeys = message.accountKeys; + + if (preBalances.isNotEmpty && postBalances.isNotEmpty) { + final maxLength = + accountKeys.length < preBalances.length ? accountKeys.length : preBalances.length; + + for (int i = 0; i < maxLength && i < postBalances.length; i++) { + final accountKey = accountKeys[i]; + final accountAddress = accountKey.address; + + if (accountAddress == walletAddress) { + final preBalance = preBalances[i]; + final postBalance = postBalances[i]; + final balanceChange = postBalance - preBalance; + + if (balanceChange != BigInt.zero) { + hasNativeBalanceChange = true; + break; + } + } + } + } + + // Next, we check if there are any SPL token balance changes + + // There is a caveat though, Jupiter swaps token accounts might be intermediate accounts, so we need to check for that, otherwise we might miss some transactions + final preTokenBalances = meta.preTokenBalances; + final postTokenBalances = meta.postTokenBalances; + + if (preTokenBalances != null && postTokenBalances != null) { + bool hasTokenDecrease = false; + bool hasTokenIncrease = false; + + for (final preTokenBal in preTokenBalances) { + final mint = preTokenBal.mint.address; + final preAmount = preTokenBal.uiTokenAmount.uiAmount ?? 0.0; + + // We find the corresponding post balance by matching mint and owner + for (final postTokenBal in postTokenBalances) { + final postMint = postTokenBal.mint.address; + final postOwner = postTokenBal.owner?.address ?? ''; + final preOwner = preTokenBal.owner?.address ?? ''; + final postAmount = postTokenBal.uiTokenAmount.uiAmount ?? 0.0; + + if (postMint == mint && postOwner == preOwner) { + final diff = postAmount - preAmount; + if (diff < 0) { + hasTokenDecrease = true; + } else if (diff > 0) { + hasTokenIncrease = true; + } + break; + } + } + } + + // If we have both token decreases and increases, or if wallet sent SOL and there are token changes, it's likely a swap + if (hasNativeBalanceChange && (hasTokenDecrease || hasTokenIncrease)) { + hasTokenBalanceChange = true; + } + } + + // It's a swap if both native and token balances changed + return hasNativeBalanceChange && hasTokenBalanceChange; + } + + /// Parses a swap transaction and creates dual entries (outgoing and incoming) + Future> _parseSwapTransaction({ + required VersionedMessage message, + required ConfirmedTransactionMeta meta, + required int fee, + required double feeInSol, + required String walletAddress, + required String signature, + required BigInt? blockTime, + required List instructions, + String? splTokenSymbol, + }) async { + final List swapTransactions = []; + + final preBalances = meta.preBalances; + final postBalances = meta.postBalances; + final accountKeys = message.accountKeys; + final preTokenBalances = meta.preTokenBalances; + final postTokenBalances = meta.postTokenBalances; + + String? decreasedMintForWallet; + String? increasedMintForWallet; + + if (preTokenBalances != null && postTokenBalances != null) { + for (final preTokenBal in preTokenBalances) { + final owner = preTokenBal.owner?.address ?? ''; + if (owner != walletAddress) continue; + + final mint = preTokenBal.mint.address; + final preAmount = preTokenBal.uiTokenAmount.uiAmount ?? 0.0; + + double postAmount = preAmount; + for (final postTokenBal in postTokenBalances) { + final postOwner = postTokenBal.owner?.address ?? ''; + final postMint = postTokenBal.mint.address; + if (postOwner == walletAddress && postMint == mint) { + postAmount = postTokenBal.uiTokenAmount.uiAmount ?? 0.0; + break; + } + } + + final diff = postAmount - preAmount; + if (diff < 0 && decreasedMintForWallet == null) { + decreasedMintForWallet = mint; + } else if (diff > 0 && increasedMintForWallet == null) { + increasedMintForWallet = mint; + } + } + } + + final bool isSplToSplSwap = + decreasedMintForWallet != null && + increasedMintForWallet != null && + decreasedMintForWallet != increasedMintForWallet; + + // Parse outgoing side (what was sent) + double outgoingAmount = 0.0; + String outgoingTokenSymbol = ''; + String? outgoingMintAddress; + String? outgoingFrom; + String? outgoingTo; + + // First we check if there are any native SOL balance changes for the wallet. + // For pure SPL → SPL swaps, SOL changes are just fees, so we ignore them. + if (!isSplToSplSwap && preBalances.isNotEmpty && postBalances.isNotEmpty) { + final maxLength = + accountKeys.length < preBalances.length ? accountKeys.length : preBalances.length; + + for (int i = 0; i < maxLength && i < postBalances.length; i++) { + final accountKey = accountKeys[i]; + final accountAddress = accountKey.address; + + if (accountAddress == walletAddress) { + final preBalance = preBalances[i]; + final postBalance = postBalances[i]; + final balanceChange = preBalance - postBalance; + + if (balanceChange > BigInt.zero) { + // The wallet sent SOL + outgoingAmount = balanceChange.toDouble() / SolanaUtils.lamportsPerSol; + outgoingTokenSymbol = 'SOL'; + outgoingMintAddress = null; + outgoingFrom = walletAddress; + // We find the intermediate account or swap program account + if (instructions.isNotEmpty && instructions[0].accounts.isNotEmpty) { + final firstAccountIndex = instructions[0].accounts[0]; + if (firstAccountIndex < accountKeys.length) { + outgoingTo = accountKeys[firstAccountIndex].address; + } + } + outgoingTo ??= walletAddress; + break; + } + } + } + } + + // If no SOL outgoing, we check if there are any SPL token balance changes for the wallet + if (outgoingAmount == 0.0 && preTokenBalances != null) { + for (final preTokenBal in preTokenBalances) { + final owner = preTokenBal.owner?.address ?? ''; + + if (owner == walletAddress) { + final mint = preTokenBal.mint.address; + // For SPL → SPL swaps, we only treat the decreased mint as outgoing + if (isSplToSplSwap && mint != decreasedMintForWallet) { + continue; + } + final preAmount = preTokenBal.uiTokenAmount.uiAmount ?? 0.0; + + // We find the corresponding post balance + for (final postTokenBal in postTokenBalances ?? []) { + final postOwner = postTokenBal.owner?.address ?? ''; + final postMint = postTokenBal.mint.address; + final postAmount = postTokenBal.uiTokenAmount.uiAmount ?? 0.0; + + if (postOwner == walletAddress && postMint == mint) { + final diff = preAmount - postAmount; + + if (diff > 0) { + // The wallet sent tokens + outgoingAmount = diff.toDouble(); + outgoingMintAddress = mint; + final token = await getTokenInfo(mint); + outgoingTokenSymbol = token?.symbol ?? 'TOKEN'; + outgoingFrom = walletAddress; + // We find the intermediate account + if (instructions.isNotEmpty && instructions[0].accounts.isNotEmpty) { + final firstAccountIndex = instructions[0].accounts[0]; + if (firstAccountIndex < accountKeys.length) { + outgoingTo = accountKeys[firstAccountIndex].address; + } + } + outgoingTo ??= walletAddress; + break; + } + } + } + + if (outgoingAmount > 0) break; + } + } + } + + // Parse incoming side (what was received) + double incomingAmount = 0.0; + String incomingTokenSymbol = ''; + String? incomingMintAddress; + String? incomingFrom; + String? incomingTo; + + // We check if there are any native SOL balance changes for the wallet + if (preBalances.isNotEmpty && postBalances.isNotEmpty) { + final maxLength = + accountKeys.length < preBalances.length ? accountKeys.length : preBalances.length; + + for (int i = 0; i < maxLength && i < postBalances.length; i++) { + final accountKey = accountKeys[i]; + final accountAddress = accountKey.address; + + if (accountAddress == walletAddress) { + final preBalance = preBalances[i]; + final postBalance = postBalances[i]; + final balanceChange = postBalance - preBalance; + + if (balanceChange > BigInt.zero) { + // The wallet received SOL + incomingAmount = balanceChange.toDouble() / SolanaUtils.lamportsPerSol; + incomingTokenSymbol = 'SOL'; + incomingMintAddress = null; + incomingTo = walletAddress; + // We find the intermediate account + if (instructions.isNotEmpty && instructions[0].accounts.isNotEmpty) { + final firstAccountIndex = instructions[0].accounts[0]; + if (firstAccountIndex < accountKeys.length) { + incomingFrom = accountKeys[firstAccountIndex].address; + } + } + incomingFrom ??= walletAddress; + break; + } + } + } + } + + // If no SOL incoming, check SPL token incoming using ATA derivation + if (incomingAmount == 0.0 && preTokenBalances != null && postTokenBalances != null) { + // Collect all unique mints from token balances (excluding wrapped SOL) + final mints = {}; + for (final tokenBal in preTokenBalances) { + final mint = tokenBal.mint.address; + if (mint != 'So11111111111111111111111111111111111111112') { + mints.add(mint); + } + } + for (final tokenBal in postTokenBalances) { + final mint = tokenBal.mint.address; + if (mint != 'So11111111111111111111111111111111111111112') { + mints.add(mint); + } + } + + // For each mint, we derive the wallet's ATA address and check for balance changes + for (final mint in mints) { + try { + final walletSolAddress = SolAddress(walletAddress); + final mintSolAddress = SolAddress(mint); + + final ata = AssociatedTokenAccountProgramUtils.associatedTokenAccount( + mint: mintSolAddress, + owner: walletSolAddress, + ); + final ataAddress = ata.address.address; + + // We check if this ATA address appears in the account keys + int? ataAccountIndex; + for (int i = 0; i < accountKeys.length; i++) { + final accountKey = accountKeys[i]; + if (accountKey.address == ataAddress) { + ataAccountIndex = i; + break; + } + } + + // If ATA is in the transaction, we check for balance changes + if (ataAccountIndex != null) { + double preAmount = 0.0; + double postAmount = 0.0; + + // We find the pre balance + for (final preTokenBal in preTokenBalances) { + final accountIndex = preTokenBal.accountIndex; + final tokenMint = preTokenBal.mint.address; + if (accountIndex == ataAccountIndex && tokenMint == mint) { + preAmount = preTokenBal.uiTokenAmount.uiAmount?.toDouble() ?? 0.0; + break; + } + } + + // We find the post balance + for (final postTokenBal in postTokenBalances) { + final accountIndex = postTokenBal.accountIndex; + final tokenMint = postTokenBal.mint.address; + if (accountIndex == ataAccountIndex && tokenMint == mint) { + postAmount = postTokenBal.uiTokenAmount.uiAmount?.toDouble() ?? 0.0; + break; + } + } + + final diff = postAmount - preAmount; + if (diff > 0) { + // The wallet received tokens + incomingAmount = diff.toDouble(); + incomingMintAddress = mint; + final token = await getTokenInfo(mint); + incomingTokenSymbol = token?.symbol ?? 'TOKEN'; + incomingTo = walletAddress; + // We find the intermediate account + if (instructions.isNotEmpty && instructions[0].accounts.isNotEmpty) { + final firstAccountIndex = instructions[0].accounts[0]; + if (firstAccountIndex < accountKeys.length) { + incomingFrom = accountKeys[firstAccountIndex].address; + } + } + incomingFrom ??= walletAddress; + break; + } + } + } catch (e) { + // We skip if the ATA derivation fails + continue; + } + } + } + + // Outgoing transaction model + if (outgoingAmount > 0.0 && outgoingFrom != null && outgoingTo != null) { + final outgoingId = + '${signature}_outgoing'; // We create a composite ID for the outgoing transaction + swapTransactions.add(SolanaTransactionModel( + isOutgoingTx: true, + from: outgoingFrom, + to: outgoingTo, + id: outgoingId, + amount: outgoingAmount, + programId: outgoingMintAddress == null + ? SystemProgramConst.programId.address + : SPLTokenProgramConst.tokenProgramId.address, + blockTimeInInt: blockTime?.toInt() ?? 0, + tokenSymbol: outgoingTokenSymbol, + fee: feeInSol, + )); + } + + // Incoming transaction model + if (incomingAmount > 0.0 && incomingFrom != null && incomingTo != null) { + final incomingId = + '${signature}_incoming'; // We create a composite ID for the incoming transaction + swapTransactions.add(SolanaTransactionModel( + isOutgoingTx: false, + from: incomingFrom, + to: incomingTo, + id: incomingId, + amount: incomingAmount, + programId: incomingMintAddress == null + ? SystemProgramConst.programId.address + : SPLTokenProgramConst.tokenProgramId.address, + blockTimeInInt: blockTime?.toInt() ?? 0, + tokenSymbol: incomingTokenSymbol, + fee: 0.0, // Fee only charged on outgoing side + )); + } + + return swapTransactions; + } + Future _parseNativeTransaction({ required VersionedMessage message, required ConfirmedTransactionMeta meta, @@ -278,23 +704,33 @@ class SolanaWalletClient { String? sender; String? receiver; - for (int i = 0; i < meta.preBalances.length; i++) { + final accountKeysLength = message.accountKeys.length; + final balancesLength = meta.preBalances.length; + final maxLength = accountKeysLength < balancesLength ? accountKeysLength : balancesLength; + + for (int i = 0; i < maxLength; i++) { final preBalance = meta.preBalances[i]; final postBalance = meta.postBalances[i]; final balanceChange = preBalance - postBalance; if (balanceChange > BigInt.zero) { // This account sent funds - sender = message.accountKeys[i].address; - totalBalanceChange += balanceChange; + if (i < accountKeysLength) { + sender = message.accountKeys[i].address; + totalBalanceChange += balanceChange; + } } else if (balanceChange < BigInt.zero) { // This account received funds - receiver = message.accountKeys[i].address; + if (i < accountKeysLength) { + receiver = message.accountKeys[i].address; + } } } // We subtract the fee from total balance change if the fee payer is the sender - if (sender == message.accountKeys[feePayerIndex].address) { + if (sender != null && + feePayerIndex < message.accountKeys.length && + sender == message.accountKeys[feePayerIndex].address) { totalBalanceChange -= BigInt.from(fee); } @@ -401,6 +837,77 @@ class SolanaWalletClient { ); } + /// Fetches a specific transaction by signature and parses it + /// It returns a TransactionFetchResult object containing both transactions and token mints extracted from the transaction or null if the transaction is not found or cannot be parsed + Future fetchTransactionBySignature({ + required String signature, + required String walletAddress, + String? splTokenSymbol, + }) async { + try { + final txResponse = await _provider!.request( + SolanaRPCGetTransaction( + transactionSignature: signature, + encoding: SolanaRPCEncoding.jsonParsed, + maxSupportedTransactionVersion: 1, + skipVerification: true, + ), + ); + + final versionedResponse = txResponse as VersionedTransactionResponse?; + if (versionedResponse == null) return null; + + final tokenMints = _extractTokenMintsFromMeta(versionedResponse.meta); + + final parsed = await parseTransaction( + txResponse: versionedResponse, + walletAddress: walletAddress, + splTokenSymbol: splTokenSymbol, + ); + + if (parsed == null) return null; + + return TransactionFetchResult( + transactions: parsed, + tokenMints: tokenMints, + ); + } catch (e) { + printV('Error fetching transaction by signature: $e'); + return null; + } + } + + /// Extracts token mint addresses from transaction metadata + /// It returns a list of unique token mint addresses (excluding wrapped SOL) + List _extractTokenMintsFromMeta(ConfirmedTransactionMeta? meta) { + if (meta == null) return []; + + final preTokenBalances = meta.preTokenBalances; + final postTokenBalances = meta.postTokenBalances; + + final mints = {}; + + if (preTokenBalances != null) { + for (final tokenBal in preTokenBalances) { + final mint = tokenBal.mint.address; + if (mint != 'So11111111111111111111111111111111111111112') { + mints.add(mint); + } + } + } + + if (postTokenBalances != null) { + for (final tokenBal in postTokenBalances) { + final mint = tokenBal.mint.address; + if (mint != 'So11111111111111111111111111111111111111112') { + mints.add(mint); + } + } + } + + return mints.toList(); + } + /// Load the Address's transactions into the account Future> fetchTransactions( SolAddress address, { @@ -431,11 +938,11 @@ class SolanaWalletClient { SolanaRPCGetTransaction( transactionSignature: signature['signature'], encoding: SolanaRPCEncoding.jsonParsed, - maxSupportedTransactionVersion: 0, + maxSupportedTransactionVersion: 1, + skipVerification: true, ), ); } catch (e) { - // printV("Error fetching transaction: $e"); return null; } })); @@ -448,12 +955,17 @@ class SolanaWalletClient { walletAddress: walletAddress?.address ?? address.address, )); - final parsedTransactions = await Future.wait(parsedTransactionsFutures); + final parsedTransactionsLists = await Future.wait(parsedTransactionsFutures); - transactions.addAll(parsedTransactions.whereType().toList()); + // We flatten the list of lists into a single list + for (final parsedList in parsedTransactionsLists) { + if (parsedList != null) { + transactions.addAll(parsedList); + } + } // Only update UI if we have new valid transactions - if (parsedTransactions.isNotEmpty) { + if (transactions.isNotEmpty) { onUpdate(List.from(transactions)); } diff --git a/cw_solana/lib/solana_wallet.dart b/cw_solana/lib/solana_wallet.dart index 68e2d4be6..7a7c2ccb2 100644 --- a/cw_solana/lib/solana_wallet.dart +++ b/cw_solana/lib/solana_wallet.dart @@ -80,6 +80,8 @@ abstract class SolanaWalletBase late final SolanaWalletClient _client; + SolanaWalletClient get client => _client; + @observable double? estimatedFee; @@ -225,7 +227,7 @@ abstract class SolanaWalletBase final hasMultiDestination = outputs.length > 1; - await _updateBalance(); + await updateTokenBalance(); final transactionCurrency = balance.keys.firstWhere( (currency) => @@ -299,15 +301,59 @@ abstract class SolanaWalletBase Future> fetchTransactions() async => {}; @override - Future updateTransactionsHistory() async { + Future updateTransactionsHistory({List? specificTokenMints}) async { await Future.wait([ _updateNativeSOLTransactions(), - _updateSPLTokenTransactions(), + updateSPLTokenTransactions(specificMints: specificTokenMints), ]); } + /// Polls for a specific transaction by signature with exponential backoff + /// I'm using this in case we make the call to fetch the transaction and it has not finished its confirmations on the solana network and been indexed by the node networks we use. + Future pollForTransaction({ + required String signature, + Duration initialDelay = const Duration(seconds: 1), + int maxRetries = 5, + }) async { + final walletAddress = _solanaPublicKey.toAddress().address; + + for (int i = 0; i < maxRetries; i++) { + await Future.delayed(initialDelay * (i + 1)); + + try { + final result = await _client.fetchTransactionBySignature( + signature: signature, + walletAddress: walletAddress, + ); + + if (result != null && result.transactions.isNotEmpty) { + await addTransactionsToTransactionHistory(result.transactions); + + // Update only the tokens involved in this transaction + if (result.tokenMints.isNotEmpty) { + await Future.wait([ + updateSPLTokenTransactions(specificMints: result.tokenMints), + updateTokenBalance(tokenMints: result.tokenMints), + ]); + } else { + // If no token mints, still update SOL balance + await updateTokenBalance(tokenMints: []); + } + + return; + } + } catch (e) { + printV('Error polling for transaction (attempt ${i + 1}/$maxRetries): $e'); + } + } + + // Fallback to full refresh if not found after max retries + printV('Transaction not found after $maxRetries attempts, falling back to full refresh'); + await updateTransactionsHistory(); + } + void updateTransactions(List updatedTx) { - _addTransactionsToTransactionHistory(updatedTx); + addTransactionsToTransactionHistory(updatedTx); } /// Fetches the native SOL transactions linked to the wallet Public Key @@ -315,12 +361,17 @@ abstract class SolanaWalletBase final transactions = await _client.fetchTransactions(_solanaPublicKey.toAddress(), onUpdate: updateTransactions); - await _addTransactionsToTransactionHistory(transactions); + await addTransactionsToTransactionHistory(transactions); } - /// Fetches the SPL Tokens transactions linked to the token account Public Key - Future _updateSPLTokenTransactions() async { - final tokens = balance.keys.whereType().toList(growable: false); + Future updateSPLTokenTransactions({List? specificMints}) async { + final allTokens = balance.keys.whereType().toList(growable: false); + + // Filter to specific mints if provided + final tokens = specificMints != null + ? allTokens.where((t) => specificMints.contains(t.mintAddress)).toList(growable: false) + : allTokens; + if (tokens.isEmpty) return; const int batchSize = 5; @@ -347,12 +398,12 @@ abstract class SolanaWalletBase ); for (final list in results) { - await _addTransactionsToTransactionHistory(list); + await addTransactionsToTransactionHistory(list); } } } - Future _addTransactionsToTransactionHistory( + Future addTransactionsToTransactionHistory( List transactions, ) async { final Map result = {}; @@ -408,9 +459,9 @@ abstract class SolanaWalletBase } await Future.wait([ - _updateBalance(), + updateTokenBalance(), _updateNativeSOLTransactions(), - _updateSPLTokenTransactions(), + updateSPLTokenTransactions(), _getEstimatedFees(), ]); @@ -478,9 +529,11 @@ abstract class SolanaWalletBase ); } - Future _updateBalance() async { - balance[currency] = await _fetchSOLBalance(); - await _fetchSPLTokensBalances(); + Future updateTokenBalance({List? tokenMints}) async { + balance[CryptoCurrency.sol] = await _fetchSOLBalance(); + + await _updateSplTokenBalancesInternal(tokenMints: tokenMints); + await save(); } @@ -490,7 +543,11 @@ abstract class SolanaWalletBase return SolanaBalance(balance); } - Future _fetchSPLTokensBalances() async { + /// Internal helper to update SPL token balances. + /// When [tokenMints] is null or empty, updates all enabled tokens. + Future _updateSplTokenBalancesInternal({ + List? tokenMints, + }) async { // Remove disabled tokens first to keep state clean for (var token in splTokensBox.values.where((t) => !t.enabled)) { balance.remove(token); @@ -499,12 +556,18 @@ abstract class SolanaWalletBase final enabledTokens = splTokensBox.values.where((t) => t.enabled).toList(growable: false); if (enabledTokens.isEmpty) return; + final tokens = tokenMints == null || tokenMints.isEmpty + ? enabledTokens + : enabledTokens.where((t) => tokenMints.contains(t.mintAddress)).toList(growable: false); + + if (tokens.isEmpty) return; + const int batchSize = 5; - for (var i = 0; i < enabledTokens.length; i += batchSize) { - final batch = enabledTokens.sublist( + for (var i = 0; i < tokens.length; i += batchSize) { + final batch = tokens.sublist( i, - i + batchSize > enabledTokens.length ? enabledTokens.length : i + batchSize, + i + batchSize > tokens.length ? tokens.length : i + batchSize, ); final results = await Future.wait(batch.map((token) async { @@ -527,7 +590,7 @@ abstract class SolanaWalletBase } @override - Future? updateBalance() async => await _updateBalance(); + Future? updateBalance() async => await updateTokenBalance(); @override Future checkNodeHealth() async { @@ -581,7 +644,7 @@ abstract class SolanaWalletBase balance.remove(token); await _removeTokenTransactionsInHistory(token); - _updateBalance(); + updateTokenBalance(); } Future _removeTokenTransactionsInHistory(SPLToken token) async { @@ -626,9 +689,9 @@ abstract class SolanaWalletBase } _transactionsUpdateTimer = Timer.periodic(const Duration(seconds: 30), (_) { - _updateBalance(); + updateTokenBalance(); _updateNativeSOLTransactions(); - _updateSPLTokenTransactions(); + updateSPLTokenTransactions(); _getEstimatedFees(); }); } diff --git a/lib/core/trade_monitor.dart b/lib/core/trade_monitor.dart index e28be8ff5..f97b47c3e 100644 --- a/lib/core/trade_monitor.dart +++ b/lib/core/trade_monitor.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:cake_wallet/exchange/provider/jupiter_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/near_Intents_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/simpleswap_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/swapsxyz_exchange_provider.dart'; @@ -66,6 +67,8 @@ class TradeMonitor { return XOSwapExchangeProvider(); case ExchangeProviderDescription.swapsXyz: return SwapsXyzExchangeProvider(); + case ExchangeProviderDescription.jupiter: + return JupiterExchangeProvider(); case ExchangeProviderDescription.nearIntents: return NearIntentsExchangeProvider(); } diff --git a/lib/exchange/exchange_provider_description.dart b/lib/exchange/exchange_provider_description.dart index de2ff28b4..14d2b5e28 100644 --- a/lib/exchange/exchange_provider_description.dart +++ b/lib/exchange/exchange_provider_description.dart @@ -40,6 +40,8 @@ class ExchangeProviderDescription extends EnumerableItem with Serializable< ExchangeProviderDescription(title: 'Swaps.XYZ', raw: 14, image: 'assets/images/swaps_xyz.svg'); static const nearIntents = ExchangeProviderDescription(title: 'Near Intents', raw: 15, image: 'assets/images/near.png'); + static const jupiter = + ExchangeProviderDescription(title: 'Jupiter', raw: 16, image: 'assets/images/jupiter.png'); static ExchangeProviderDescription deserialize({required int raw}) { switch (raw) { @@ -75,6 +77,8 @@ class ExchangeProviderDescription extends EnumerableItem with Serializable< return swapsXyz; case 15: return nearIntents; + case 16: + return jupiter; default: throw Exception('Unexpected token: $raw for ExchangeProviderDescription deserialize'); } diff --git a/lib/exchange/provider/jupiter_exchange_provider.dart b/lib/exchange/provider/jupiter_exchange_provider.dart new file mode 100644 index 000000000..3a91a1b56 --- /dev/null +++ b/lib/exchange/provider/jupiter_exchange_provider.dart @@ -0,0 +1,491 @@ +import 'dart:convert'; + +import 'package:cake_wallet/.secrets.g.dart' as secrets; +import 'package:cake_wallet/exchange/exchange_pair.dart'; +import 'package:cake_wallet/exchange/exchange_provider_description.dart'; +import 'package:cake_wallet/exchange/limits.dart'; +import 'package:cake_wallet/exchange/provider/exchange_provider.dart'; +import 'package:cake_wallet/exchange/trade.dart'; +import 'package:cake_wallet/exchange/trade_not_created_exception.dart'; +import 'package:cake_wallet/exchange/trade_request.dart'; +import 'package:cake_wallet/exchange/trade_state.dart'; +import 'package:cake_wallet/solana/solana.dart'; +import 'package:cake_wallet/utils/exchange_provider_logger.dart'; +import 'package:cw_core/amount_converter.dart'; +import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/utils/proxy_wrapper.dart'; + +class JupiterExchangeProvider extends ExchangeProvider { + JupiterExchangeProvider() : super(pairList: _getSupportedPairs()); + + // Jupiter only supports Solana tokens + static const List _notSupported = []; + + static List _getSupportedPairs() { + // Only support Solana and Solana tokens + final solanaCurrencies = CryptoCurrency.all + .where((c) => c.tag == 'SOL' || c == CryptoCurrency.sol) + .where((c) => !_notSupported.contains(c)) + .toList(); + + final pairs = []; + for (final from in solanaCurrencies) { + for (final to in solanaCurrencies) { + if (from != to) { + pairs.add(ExchangePair(from: from, to: to, reverse: true)); + } + } + } + return pairs; + } + + static const _baseUrl = 'api.jup.ag'; + static const _orderPath = '/ultra/v1/order'; + static const _executePath = '/ultra/v1/execute'; + + // Wrapped SOL address (native SOL) + static const _nativeSolMint = 'So11111111111111111111111111111111111111112'; + + @override + String get title => 'Jupiter'; + + @override + bool get isAvailable => true; + + @override + bool get isEnabled => true; + + @override + bool get supportsFixedRate => false; // Jupiter doesn't support fixed rate + + @override + ExchangeProviderDescription get description => ExchangeProviderDescription.jupiter; + + @override + Future checkIsAvailable() async => true; + + String _getTokenMint(CryptoCurrency currency) { + // Handle native SOL + if (currency == CryptoCurrency.sol) return _nativeSolMint; + + // Check if currency tag is SOL (indicating it's a Solana token) + if (currency.tag != 'SOL') { + throw Exception('Unsupported currency: ${currency.title} (not a Solana token)'); + } + + // Use solana proxy to get token address + // The proxy will handle both SPLToken instances and CryptoCurrency + // by searching through default tokens + if (solana != null) { + try { + return solana!.getTokenAddress(currency); + } catch (e) { + printV('Error getting token address: $e'); + throw Exception('Unsupported currency: ${currency.title} (mint address not found: $e)'); + } + } + + throw Exception('Unsupported currency: ${currency.title} (Solana proxy not available)'); + } + + @override + Future fetchLimits({ + required CryptoCurrency from, + required CryptoCurrency to, + required bool isFixedRateMode, + }) async { + try { + // The Ultra Swap API doesn't have a dedicated limits endpoint + // The /order endpoint validates amounts and returns error codes: + // - errorCode 1: Insufficient funds + // - errorCode 2: Top up SOL for gas + // - errorCode 3: Minimum amount for gasless + return Limits(min: null, max: null); + } catch (e) { + printV('fetchLimits error: $e'); + throw Exception('Error fetching limits: $e'); + } + } + + Map _getHeaders() { + final headers = {}; + final apiKey = secrets.jupiterApiKey; + if (apiKey.isNotEmpty) { + headers['x-api-key'] = apiKey; + } + + return headers; + } + + Map? _getReferralFeeConfig() { + try { + final referralFeeBpsStr = secrets.jupiterReferralFeeBps; + final referralFeeBps = int.tryParse(referralFeeBpsStr) ?? 0; + + final referralAccount = secrets.jupiterReferralAccount; + + // Only enable if both are configured and valid + if (referralFeeBps <= 0 || referralFeeBps > 10000 || referralAccount.isEmpty) { + return null; + } + + return { + 'referralFee': referralFeeBps.toString(), + 'referralAccount': referralAccount, + }; + } catch (e) { + return null; + } + } + + @override + Future fetchRate({ + required CryptoCurrency from, + required CryptoCurrency to, + required double amount, + required bool isFixedRateMode, + required bool isReceiveAmount, + }) async { + try { + final inputMint = _getTokenMint(from); + final outputMint = _getTokenMint(to); + + final amountInBaseUnits = AmountConverter.toBaseUnits(amount.toString(), from.decimals); + + final params = { + 'inputMint': inputMint, + 'outputMint': outputMint, + 'amount': amountInBaseUnits, + // Note: taker is optional for quote-only requests + }; + + final uri = Uri.https(_baseUrl, _orderPath, params); + final headers = _getHeaders(); + + final response = await ProxyWrapper().get( + clearnetUri: uri, + headers: headers, + ); + + if (response.statusCode != 200) { + ExchangeProviderLogger.logError( + provider: description, + function: 'fetchRate', + error: Exception('Failed to fetch quote: ${response.statusCode}'), + stackTrace: StackTrace.current, + requestData: { + 'from': from.title, + 'to': to.title, + 'amount': amount, + 'isFixedRateMode': isFixedRateMode, + 'isReceiveAmount': isReceiveAmount, + }, + ); + return 0.0; + } + + final orderData = json.decode(response.body) as Map; + final outAmount = BigInt.parse(orderData['outAmount'] as String); + + final outputAmount = AmountConverter.fromBaseUnits(outAmount.toString(), to.decimals); + + final rate = double.parse(outputAmount) / amount; + + ExchangeProviderLogger.logSuccess( + provider: description, + function: 'fetchRate', + requestData: { + 'from': from.title, + 'to': to.title, + 'amount': amount, + 'isFixedRateMode': isFixedRateMode, + 'isReceiveAmount': isReceiveAmount, + }, + responseData: { + 'rate': rate, + 'outputAmount': outputAmount, + }, + ); + + return rate; + } catch (e, s) { + ExchangeProviderLogger.logError( + provider: description, + function: 'fetchRate', + error: e, + stackTrace: s, + requestData: { + 'from': from.title, + 'to': to.title, + 'amount': amount, + 'isFixedRateMode': isFixedRateMode, + 'isReceiveAmount': isReceiveAmount, + }, + ); + printV('fetchRate error: $e'); + return 0.0; + } + } + + @override + Future createTrade({ + required TradeRequest request, + required bool isFixedRateMode, + required bool isSendAll, + }) async { + try { + final inputMint = _getTokenMint(request.fromCurrency); + final outputMint = _getTokenMint(request.toCurrency); + + final amountInBaseUnits = + AmountConverter.toBaseUnits(request.fromAmount, request.fromCurrency.decimals); + + final isInternalTransfer = request.refundAddress == request.toAddress; + + final orderParams = { + 'inputMint': inputMint, + 'outputMint': outputMint, + 'amount': amountInBaseUnits, + 'taker': request.refundAddress, + if (!isInternalTransfer) 'receiver': request.toAddress, + }; + + final referralFeeConfig = _getReferralFeeConfig(); + if (referralFeeConfig != null) { + orderParams['referralFee'] = referralFeeConfig['referralFee']!; + orderParams['referralAccount'] = referralFeeConfig['referralAccount']!; + } + + final orderUri = Uri.https(_baseUrl, _orderPath, orderParams); + final headers = _getHeaders(); + + final orderResponse = await ProxyWrapper().get(clearnetUri: orderUri, headers: headers); + + if (orderResponse.statusCode != 200) { + final errorBody = orderResponse.body; + ExchangeProviderLogger.logError( + provider: description, + function: 'createTrade', + error: Exception('Failed to get order: ${orderResponse.statusCode} $errorBody'), + stackTrace: StackTrace.current, + requestData: { + 'from': request.fromCurrency.title, + 'to': request.toCurrency.title, + 'fromAmount': request.fromAmount, + 'toAmount': request.toAmount, + 'toAddress': request.toAddress, + 'refundAddress': request.refundAddress, + 'isFixedRateMode': isFixedRateMode, + 'isSendAll': isSendAll, + }, + ); + throw TradeNotCreatedException(description); + } + + final orderData = json.decode(orderResponse.body) as Map; + + // Check for errors in response + if (orderData.containsKey('errorCode') || orderData.containsKey('errorMessage')) { + final errorCode = orderData['errorCode']; + final errorMessage = orderData['errorMessage'] ?? 'Unknown error'; + ExchangeProviderLogger.logError( + provider: description, + function: 'createTrade', + error: Exception('Order error: $errorCode - $errorMessage'), + stackTrace: StackTrace.current, + requestData: { + 'from': request.fromCurrency.title, + 'to': request.toCurrency.title, + 'fromAmount': request.fromAmount, + 'toAmount': request.toAmount, + 'toAddress': request.toAddress, + 'refundAddress': request.refundAddress, + 'isFixedRateMode': isFixedRateMode, + 'isSendAll': isSendAll, + }, + ); + throw TradeNotCreatedException(description); + } + + // Extract response data + final transaction = orderData['transaction'] as String?; + final requestId = orderData['requestId'] as String?; + final outAmount = orderData['outAmount'] as String? ?? '0.0'; + + // Extract network fees from order response (in lamports) + final signatureFeeLamports = (orderData['signatureFeeLamports'] as num?)?.toInt() ?? 0; + + final prioritizationFeeLamports = + (orderData['prioritizationFeeLamports'] as num?)?.toInt() ?? 0; + + final rentFeeLamports = (orderData['rentFeeLamports'] as num?)?.toInt() ?? 0; + + final integratorFeeLamports = (orderData['integratorFeeLamports'] as num?)?.toInt() ?? 0; + + final networkFeeLamports = signatureFeeLamports + prioritizationFeeLamports + rentFeeLamports; + final networkFeeInSol = networkFeeLamports / 1000000000.0; + + final integratorFeeInSol = integratorFeeLamports / 1000000000.0; + + final totalFeeInSol = networkFeeInSol + integratorFeeInSol; + + if (transaction == null || transaction.isEmpty) { + throw Exception('No transaction returned from Jupiter order endpoint'); + } + + if (requestId == null || requestId.isEmpty) { + throw Exception('No requestId returned from Jupiter order endpoint'); + } + + final receiveAmount = AmountConverter.fromBaseUnits(outAmount, request.toCurrency.decimals); + + ExchangeProviderLogger.logSuccess( + provider: description, + function: 'createTrade', + requestData: { + 'from': request.fromCurrency.title, + 'to': request.toCurrency.title, + 'fromAmount': request.fromAmount, + 'toAmount': request.toAmount, + 'toAddress': request.toAddress, + 'refundAddress': request.refundAddress, + 'isFixedRateMode': isFixedRateMode, + 'isSendAll': isSendAll, + }, + responseData: { + 'tradeId': requestId, + 'receiveAmount': receiveAmount, + 'hasTransaction': transaction.isNotEmpty, + 'requestId': requestId, + }, + ); + + return Trade( + id: requestId, + from: request.fromCurrency, + to: request.toCurrency, + provider: description, + inputAddress: request.toAddress, + refundAddress: request.refundAddress, + state: TradeState.created, + createdAt: DateTime.now(), + amount: request.fromAmount, + receiveAmount: receiveAmount, + payoutAddress: request.toAddress, + isSendAll: isSendAll, + userCurrencyFromRaw: '${request.fromCurrency.title}_${request.fromCurrency.tag ?? 'SOL'}', + userCurrencyToRaw: '${request.toCurrency.title}_${request.toCurrency.tag ?? 'SOL'}', + routerData: transaction, + routerValue: requestId, + fee: totalFeeInSol, + ); + } catch (e, s) { + ExchangeProviderLogger.logError( + provider: description, + function: 'createTrade', + error: e, + stackTrace: s, + requestData: { + 'from': request.fromCurrency.title, + 'to': request.toCurrency.title, + 'fromAmount': request.fromAmount, + 'toAmount': request.toAmount, + 'toAddress': request.toAddress, + 'refundAddress': request.refundAddress, + 'isFixedRateMode': isFixedRateMode, + 'isSendAll': isSendAll, + }, + ); + printV('createTrade error: $e'); + throw TradeNotCreatedException(description); + } + } + + /// Executes a signed Jupiter swap transaction via Jupiter's /execute endpoint + Future> executeSwap({ + required String signedTransaction, + required String requestId, + }) async { + try { + final executeUri = Uri.https(_baseUrl, _executePath); + final headers = _getHeaders(); + headers['Content-Type'] = 'application/json'; + + final body = json.encode({ + 'signedTransaction': signedTransaction, + 'requestId': requestId, + }); + + final response = await ProxyWrapper().post( + clearnetUri: executeUri, + headers: headers, + body: body, + ); + + if (response.statusCode != 200) { + final errorBody = response.body; + ExchangeProviderLogger.logError( + provider: description, + function: 'executeSwap', + error: Exception('Failed to execute swap: ${response.statusCode} $errorBody'), + stackTrace: StackTrace.current, + requestData: { + 'requestId': requestId, + 'hasSignedTransaction': signedTransaction.isNotEmpty, + }, + ); + throw Exception('Failed to execute swap: ${response.statusCode} $errorBody'); + } + + final executeData = json.decode(response.body) as Map; + + ExchangeProviderLogger.logSuccess( + provider: description, + function: 'executeSwap', + requestData: { + 'requestId': requestId, + 'hasSignedTransaction': signedTransaction.isNotEmpty, + }, + responseData: executeData, + ); + + return executeData; + } catch (e, s) { + ExchangeProviderLogger.logError( + provider: description, + function: 'executeSwap', + error: e, + stackTrace: s, + requestData: { + 'requestId': requestId, + 'hasSignedTransaction': signedTransaction.isNotEmpty, + }, + ); + rethrow; + } + } + + @override + Future findTradeById({required String id}) async { + // Jupiter Ultra Swap API doesn't track trades by our trade ID + // + // Status tracking options: + // 1. Use /execute endpoint with requestId + signedTransaction (requires storing signed tx) + // 2. Check on-chain via transaction signature (txId) after transaction is sent + // + // Current implementation: We track status on-chain via transaction signature + // The txId field in Trade is set after the transaction is sent and can be + // used to check transaction status via Solana RPC. + // + // Note: To use /execute endpoint for status polling, we would need to: + // - Store the signed transaction (not currently stored) + // - Use requestId from routerValue + // - Poll /ultra/v1/execute with both signedTransaction and requestId + // + // For now, throw exception to indicate status must be checked on-chain + throw Exception( + 'Jupiter trade status must be checked on-chain using transaction signature (txId). ' + 'After transaction is sent, txId will contain the signature for status checking.'); + } +} diff --git a/lib/exchange/trade.dart b/lib/exchange/trade.dart index 9485ad4a9..4147eddb0 100644 --- a/lib/exchange/trade.dart +++ b/lib/exchange/trade.dart @@ -29,6 +29,7 @@ class Trade extends HiveObject { this.providerName, this.fromWalletAddress, this.memo, + this.fee, this.txId, this.isRefund, this.isSendAll, @@ -175,6 +176,9 @@ class Trade extends HiveObject { @HiveField(34) int? chainId; + @HiveField(35) + double? fee; + CryptoCurrency? get userCurrencyFrom { if (userCurrencyFromRaw == null || userCurrencyFromRaw!.isEmpty) { return null; @@ -257,6 +261,7 @@ class Trade extends HiveObject { 'router': router, 'extra_id': extraId, 'chain_id': chainId, + 'fee': fee, }; } @@ -310,6 +315,7 @@ class TradeAdapter extends TypeAdapter { sourceTokenAmountRaw: fields[32] as String?, requiresTokenApproval: fields[33] as bool?, chainId: fields[34] as int?, + fee: fields[35] as double?, ) ..providerRaw = fields[1] == null ? 0 : fields[1] as int ..fromRaw = (fields[2] as int?) ?? -1 @@ -390,7 +396,9 @@ class TradeAdapter extends TypeAdapter { ..writeByte(33) ..write(obj.requiresTokenApproval) ..writeByte(34) - ..write(obj.chainId); + ..write(obj.chainId) + ..writeByte(35) + ..write(obj.fee); } @override diff --git a/lib/solana/cw_solana.dart b/lib/solana/cw_solana.dart index a4cd8eef8..daeb3d926 100644 --- a/lib/solana/cw_solana.dart +++ b/lib/solana/cw_solana.dart @@ -4,8 +4,7 @@ class CWSolana extends Solana { @override List getSolanaWordList(String language) => SolanaMnemonics.englishWordlist; - WalletService createSolanaWalletService(bool isDirect) => - SolanaWalletService(isDirect); + WalletService createSolanaWalletService(bool isDirect) => SolanaWalletService(isDirect); @override WalletCredentials createSolanaNewWalletCredentials({ @@ -135,7 +134,29 @@ class CWSolana extends Solana { } @override - String getTokenAddress(CryptoCurrency asset) => (asset as SPLToken).mintAddress; + String getTokenAddress(CryptoCurrency asset) { + // If it's already an SPLToken, use its mint address + if (asset is SPLToken) return asset.mintAddress; + + // If it's not an SPLToken but has SOL tag, try to find matching SPLToken + if (asset.tag == 'SOL') { + final symbol = asset.title.toUpperCase(); + + // Search through default tokens to find matching symbol + final defaultTokens = DefaultSPLTokens().initialSPLTokens; + try { + final matchingToken = defaultTokens.firstWhere( + (token) => token.symbol.toUpperCase() == symbol, + ); + return matchingToken.mintAddress; + } catch (_) { + // Token not found in default tokens + } + } + + // Fallback - try to cast (will throw if not SPLToken) + return (asset as SPLToken).mintAddress; + } @override List? getValidationLength(CryptoCurrency type) { @@ -161,4 +182,168 @@ class CWSolana extends Solana { final solanaWallet = wallet as SolanaWallet; return solanaWallet.splTokenCurrencies.any((element) => element.mintAddress == contractAddress); } + + @override + Future signAndPrepareJupiterSwapTransaction( + WalletBase wallet, + String base64Transaction, + String requestId, + String destinationAddress, + double amount, + double fee, + ) async { + final solanaWallet = wallet as SolanaWallet; + final privateKey = solanaWallet.solanaPrivateKey; + final solanaProvider = solanaWallet.solanaProvider; + + if (solanaProvider == null) { + throw Exception('Solana provider not available'); + } + + final unsignedTransactionBytes = base64.decode(base64Transaction); + final unsignedTransaction = SolanaTransaction.deserialize(unsignedTransactionBytes); + + final signedMessage = privateKey.sign(unsignedTransaction.serializeMessage()); + unsignedTransaction.addSignature(privateKey.publicKey().toAddress(), signedMessage); + + final signedTransactionBytes = unsignedTransaction.serialize(); + final signedTransactionBase64 = base64.encode(Uint8List.fromList(signedTransactionBytes)); + + Future sendTx() async { + try { + if (signedTransactionBase64.isEmpty) { + throw Exception('Invalid transaction: transaction is empty'); + } + + if (requestId.isEmpty) { + throw Exception('Invalid requestId: requestId is empty'); + } + + final jupiterProvider = JupiterExchangeProvider(); + + final executeResponse = await jupiterProvider.executeSwap( + signedTransaction: signedTransactionBase64, + requestId: requestId, + ); + + final status = executeResponse['status'] as String?; + final signature = executeResponse['signature'] as String?; + final errorCode = executeResponse['code'] as num?; + final errorMessage = executeResponse['error'] as String? ?? 'Unknown error'; + + // Handle different status cases + switch (status) { + case 'Success': + if (signature == null || + signature.isEmpty || + signature == '1111111111111111111111111111111111111111111111111111111111111111') { + throw Exception( + 'Invalid transaction signature received from Jupiter. ' + 'Status: $status', + ); + } + return signature; + case 'Failed': + String userFriendlyError = _getJupiterErrorMessage(errorCode, errorMessage); + // Even when failed, Jupiter may return a signature for solscan + if (signature != null && signature.isNotEmpty) { + throw JupiterSwapFailedException( + message: userFriendlyError, + signature: signature, + errorCode: errorCode, + errorMessage: errorMessage, + ); + } else { + throw Exception(userFriendlyError); + } + case 'Pending': + case 'Processing': + throw Exception( + 'Jupiter swap is still processing. Please wait and try checking the transaction status.', + ); + default: + throw Exception( + 'Jupiter swap returned unknown status: $status. Error: $errorMessage. Code: $errorCode', + ); + } + } catch (e) { + throw Exception('Failed to execute Jupiter swap: $e'); + } + } + + return PendingSolanaTransaction( + amount: amount, + serializedTransaction: signedTransactionBase64, + destinationAddress: destinationAddress, + sendTransaction: sendTx, + fee: fee, + ); + } + + /// Get user-friendly error message based on Jupiter error code + String _getJupiterErrorMessage(num? errorCode, String errorMessage) { + if (errorCode == null) { + return 'Jupiter swap failed: $errorMessage'; + } + + switch (errorCode.toInt()) { + case -2000: + return 'Transaction failed to land on the network. Please try again.'; + case -2001: + return 'Unknown error occurred. Please try again.'; + case -2002: + return 'Invalid transaction. Please try creating a new swap.'; + case -2003: + return 'Quote expired. The swap quote is no longer valid. Please create a new swap.'; + case -2004: + return 'Swap was rejected. This may be due to:\n' + '- Insufficient funds for the swap or fees\n' + '- Slippage tolerance exceeded (price moved too much)\n' + '- Network congestion\n' + 'Please check your balance and try again with a new quote.'; + case -2005: + return 'Internal error occurred. Please try again.'; + default: + // Check for common program errors + if (errorMessage.contains('SlippageToleranceExceeded') || + errorMessage.contains('slippage')) { + return 'Slippage tolerance exceeded. The price moved too much during the swap. ' + 'Please try again with a new quote.'; + } + + if (errorMessage.contains('InsufficientFunds') || errorMessage.contains('insufficient')) { + return 'Insufficient funds. Please ensure you have enough SOL for the swap and fees.'; + } + + if (errorMessage.contains('Blockhash') || errorMessage.contains('expired')) { + return 'Transaction expired. Please create a new swap.'; + } + + return 'Jupiter swap failed (code: $errorCode): $errorMessage. Please try again.'; + } + } + + @override + Future pollForTransaction( + WalletBase wallet, + String signature, { + Duration initialDelay = const Duration(seconds: 1), + int maxRetries = 5, + }) async { + final solanaWallet = wallet as SolanaWallet; + await solanaWallet.pollForTransaction( + signature: signature, + initialDelay: initialDelay, + maxRetries: maxRetries, + ); + } + + @override + Future updateTokenBalances( + WalletBase wallet, { + List? tokenMints, + }) async { + final solanaWallet = wallet as SolanaWallet; + await solanaWallet.updateTokenBalance(tokenMints: tokenMints); + } } diff --git a/lib/src/screens/dashboard/widgets/sync_indicator_icon.dart b/lib/src/screens/dashboard/widgets/sync_indicator_icon.dart index fda425303..ca6827be8 100644 --- a/lib/src/screens/dashboard/widgets/sync_indicator_icon.dart +++ b/lib/src/screens/dashboard/widgets/sync_indicator_icon.dart @@ -23,6 +23,7 @@ class SyncIndicatorIcon extends StatelessWidget { static const String finished = 'finished'; static const String success = 'success'; static const String complete = 'complete'; + static const String completed = 'completed'; @override Widget build(BuildContext context) { @@ -39,6 +40,7 @@ class SyncIndicatorIcon extends StatelessWidget { case finished: case success: case complete: + case completed: indicatorColor = CustomThemeColors.syncGreen; break; case waiting: diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart index 545c78d03..29d6c6641 100644 --- a/lib/src/screens/exchange_trade/exchange_trade_page.dart +++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart @@ -163,20 +163,21 @@ class ExchangeTradeState extends State { bottomSectionPadding: EdgeInsets.fromLTRB(24, 0, 24, 24), bottomSection: Column( children: [ - PrimaryButton( - key: ValueKey('exchange_trade_page_send_from_external_button_key'), - text: S.current.send_from_external_wallet, - onPressed: () async { - Navigator.of(context).pushNamed(Routes.exchangeTradeExternalSendPage); - }, - color: widget.exchangeTradeViewModel.isSendable - ? Theme.of(context).colorScheme.surfaceContainer - : Theme.of(context).colorScheme.primary, - textColor: widget.exchangeTradeViewModel.isSendable - ? Theme.of(context).colorScheme.onSecondaryContainer - : Theme.of(context).colorScheme.onPrimary, - isDisabled: widget.exchangeTradeViewModel.isSwapsXyzSendingEVMTokenSwap, - ), + if (!widget.exchangeTradeViewModel.shouldHideExternalSendButton) + PrimaryButton( + key: ValueKey('exchange_trade_page_send_from_external_button_key'), + text: S.current.send_from_external_wallet, + onPressed: () async { + Navigator.of(context).pushNamed(Routes.exchangeTradeExternalSendPage); + }, + color: widget.exchangeTradeViewModel.isSendable + ? Theme.of(context).colorScheme.surfaceContainer + : Theme.of(context).colorScheme.primary, + textColor: widget.exchangeTradeViewModel.isSendable + ? Theme.of(context).colorScheme.onSecondaryContainer + : Theme.of(context).colorScheme.onPrimary, + isDisabled: widget.exchangeTradeViewModel.isSwapsXyzSendingEVMTokenSwap, + ), SizedBox(height: 16), Observer( builder: (_) { @@ -188,7 +189,8 @@ class ExchangeTradeState extends State { !(sendingState is TransactionCommitted)), child: LoadingPrimaryButton( key: ValueKey('exchange_trade_page_send_from_cake_button_key'), - isDisabled: trade.inputAddress == null || trade.inputAddress!.isEmpty || + isDisabled: trade.inputAddress == null || + trade.inputAddress!.isEmpty || sendingState is ExecutedSuccessfullyState, isLoading: sendingState is IsExecutingState, onPressed: _onPressedSendFromCakeWallet, @@ -213,8 +215,7 @@ class ExchangeTradeState extends State { await Navigator.of(context).pushNamed(Routes.connectDevices, arguments: ConnectDevicePageParams( walletType: sendVM.walletType, - hardwareWalletType: - sendVM.wallet.walletInfo.hardwareWalletType!, + hardwareWalletType: sendVM.wallet.walletInfo.hardwareWalletType!, onConnectDevice: (context, _) { sendVM.hardwareWalletViewModel!.initWallet(sendVM.wallet); Navigator.of(context).pop(); @@ -308,7 +309,8 @@ class ExchangeTradeState extends State { return ConfirmSendingBottomSheet( key: ValueKey('exchange_trade_page_confirm_sending_bottom_sheet_key'), footerType: FooterType.slideActionButton, - isSlideActionEnabled: widget.exchangeTradeViewModel.sendViewModel.isReadyForSend, + isSlideActionEnabled: + widget.exchangeTradeViewModel.sendViewModel.isReadyForSend, walletType: widget.exchangeTradeViewModel.sendViewModel.walletType, titleText: S.of(bottomSheetContext).confirm_transaction, titleIconPath: @@ -338,8 +340,7 @@ class ExchangeTradeState extends State { }, ); - if (result == null) widget.exchangeTradeViewModel.sendViewModel.dismissTransaction(); - + if (result == null) widget.exchangeTradeViewModel.sendViewModel.dismissTransaction(); } }); } diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index f3637888a..58a170203 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -8,6 +8,7 @@ import 'package:cake_wallet/exchange/provider/chainflip_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/changenow_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/exolix_exchange_provider.dart'; +import 'package:cake_wallet/exchange/provider/jupiter_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/near_Intents_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/swapsxyz_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/swaptrade_exchange_provider.dart'; @@ -86,6 +87,9 @@ abstract class ExchangeTradeViewModelBase with Store { case ExchangeProviderDescription.swapsXyz: _provider = SwapsXyzExchangeProvider(); break; + case ExchangeProviderDescription.jupiter: + _provider = JupiterExchangeProvider(); + break; case ExchangeProviderDescription.nearIntents: _provider = NearIntentsExchangeProvider(); break; @@ -118,6 +122,19 @@ abstract class ExchangeTradeViewModelBase with Store { isEVMCompatibleChain(wallet.type) && wallet.currency != trade.from; + /// Providers that should hide the "send from external" button + static const List _providersThatHideExternalSend = [ + JupiterExchangeProvider, + ]; + + /// Returns true if the current provider should hide the external send button + bool get shouldHideExternalSendButton { + if (_provider == null) return false; + return _providersThatHideExternalSend.any( + (providerType) => _provider.runtimeType == providerType, + ); + } + String get extraInfo => trade.extraId != null && trade.extraId!.isNotEmpty ? '\n\n' + S.current.exchange_extra_info : ''; diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index ac6ba2d6a..d487b3287 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -21,6 +21,7 @@ import 'package:cake_wallet/exchange/exchange_trade_state.dart'; import 'package:cake_wallet/exchange/limits.dart'; import 'package:cake_wallet/exchange/limits_state.dart'; import 'package:cake_wallet/exchange/provider/chainflip_exchange_provider.dart'; +import 'package:cake_wallet/exchange/provider/jupiter_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/letsexchange_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/changenow_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/exchange_provider.dart'; @@ -229,6 +230,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with LetsExchangeExchangeProvider(), StealthExExchangeProvider(), XOSwapExchangeProvider(), + JupiterExchangeProvider(), // SwapsXyzExchangeProvider(), NearIntentsExchangeProvider(), TrocadorExchangeProvider( diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index a4697587e..3d9c9b480 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -21,15 +21,17 @@ import 'package:cake_wallet/entities/transaction_description.dart'; import 'package:cake_wallet/entities/wallet_contact.dart'; import 'package:cake_wallet/evm/evm.dart'; import 'package:cake_wallet/exchange/provider/exchange_provider.dart'; +import 'package:cake_wallet/exchange/provider/jupiter_exchange_provider.dart'; +import 'package:cake_wallet/solana/solana.dart'; import 'package:cake_wallet/exchange/provider/swapsxyz_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/thorchain_exchange.provider.dart'; import 'package:cake_wallet/exchange/trade.dart'; +import 'package:cake_wallet/exchange/trade_state.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/nano/nano.dart'; import 'package:cake_wallet/reactions/wallet_connect.dart'; import 'package:cake_wallet/routes.dart'; -import 'package:cake_wallet/solana/solana.dart'; import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:cake_wallet/store/settings_store.dart'; @@ -136,6 +138,10 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor PendingTransaction? _pendingApprovalTx; bool _isSwapsXYZCallDataTx = false; + // Store trade and provider references for post-commit updates (e.g., Jupiter trade ID update) + Trade? _currentTrade; + ExchangeProvider? _currentProvider; + @observable ExecutionState state; @@ -516,6 +522,9 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor @action Future createTransaction({ExchangeProvider? provider, Trade? trade}) async { + _currentTrade = trade; + _currentProvider = provider; + try { if (!(state is IsExecutingState)) state = IsExecutingState(); @@ -608,6 +617,38 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor } } + // Jupiter (Solana) swap path + if (walletType == WalletType.solana && trade != null && provider is JupiterExchangeProvider) { + final swapTransactionBase64 = trade.routerData; + final requestId = trade.routerValue; + if (swapTransactionBase64?.isNotEmpty == true && + requestId?.isNotEmpty == true && + solana != null) { + try { + final actualFee = trade.fee ?? 0.0005; + // Fallback to estimate if not available + final fee = actualFee > 0 ? actualFee : 0.0005; + + final amount = double.tryParse(trade.amount) ?? 0.0; + + pendingTransaction = await solana!.signAndPrepareJupiterSwapTransaction( + wallet, + swapTransactionBase64!, + requestId!, + trade.payoutAddress ?? '', + amount, + fee, + ); + + state = ExecutedSuccessfullyState(); + return pendingTransaction; + } catch (e, s) { + printV('Jupiter swap error: $e\n$s'); + throw Exception('Failed to process Jupiter swap: $e'); + } + } + } + // Regular flow pendingTransaction = await wallet.createTransaction(_credentials(provider)); @@ -738,12 +779,33 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor state = TransactionCommitted(); - // Immediate transaction update for EVM chains, Solana, Tron, and Nano - if (isEVMWallet || - [WalletType.solana, WalletType.tron, WalletType.nano].contains(walletType)) { + await _updateSolanaTrade(signature: pendingTransaction!.id, isSuccess: true); + + if (walletType == WalletType.solana) { + Future.delayed(Duration(seconds: 1), () async { + try { + // Updates tx history with the exact mints involved in transaction + // Also updates balances for the tokens involved in the transaction + await solana!.pollForTransaction( + wallet, + pendingTransaction!.id, + initialDelay: const Duration(seconds: 1), + maxRetries: 5, + ); + } catch (e) { + printV('Failed to update transactions after send: $e'); + } + }); + } + + // Immediate transaction update for EVM chains, Tron, and Nano + if (isEVMWallet || [WalletType.tron, WalletType.nano].contains(walletType)) { Future.delayed(Duration(seconds: 4), () async { try { - await wallet.updateTransactionsHistory(); + await Future.wait([ + wallet.updateTransactionsHistory(), + wallet.updateBalance() as Future, + ]); } catch (e) { printV('Failed to update transactions after send: $e'); } @@ -757,7 +819,38 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor await sharedPreferences.setString(PreferencesKey.backgroundSyncLastTrigger(wallet.name), DateTime.now().add(Duration(minutes: 1)).toIso8601String()); } catch (e) { + if (e is JupiterSwapFailedException) { + await _updateSolanaTrade(signature: e.signature, isSuccess: false); + } state = FailureState(translateErrorMessage(e, wallet.type, wallet.currency)); + await _updateSolanaTrade(signature: '', isSuccess: false); + } + } + + /// Update Jupiter trade with relevant details after transaction is committed + Future _updateSolanaTrade({required String signature, required bool isSuccess}) async { + if (_currentTrade == null || + _currentProvider?.title != 'Jupiter' || + walletType != WalletType.solana) return; + + _currentTrade!.txId = signature; + + if (!isSuccess) { + _currentTrade!.stateRaw = TradeState.failed.raw; + if (_currentTrade!.isInBox) { + await _currentTrade!.save(); + } + } + + if (isSuccess) { + _currentTrade!.stateRaw = TradeState.completed.raw; + + if (_currentTrade!.isInBox) { + await _currentTrade!.save(); + } + + _currentTrade = null; + _currentProvider = null; } } diff --git a/lib/view_model/trade_details_view_model.dart b/lib/view_model/trade_details_view_model.dart index 8c034cdec..788cb1992 100644 --- a/lib/view_model/trade_details_view_model.dart +++ b/lib/view_model/trade_details_view_model.dart @@ -6,6 +6,7 @@ import 'package:cake_wallet/exchange/provider/changenow_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/exolix_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/letsexchange_exchange_provider.dart'; +import 'package:cake_wallet/exchange/provider/jupiter_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/near_Intents_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/swapsxyz_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/swaptrade_exchange_provider.dart'; @@ -82,6 +83,9 @@ abstract class TradeDetailsViewModelBase with Store { case ExchangeProviderDescription.swapsXyz: _provider = SwapsXyzExchangeProvider(); break; + case ExchangeProviderDescription.jupiter: + _provider = JupiterExchangeProvider(); + break; case ExchangeProviderDescription.nearIntents: _provider = NearIntentsExchangeProvider(); break; @@ -119,6 +123,8 @@ abstract class TradeDetailsViewModelBase with Store { return 'https://scan.chainflip.io/channels/${trade.id}'; case ExchangeProviderDescription.xoSwap: return 'https://orders.xoswap.com/${trade.id}'; + case ExchangeProviderDescription.jupiter: + return 'https://solscan.io/tx/${trade.txId}'; case ExchangeProviderDescription.nearIntents: return 'https://explorer.near-intents.org/transactions/${trade.id}'; } diff --git a/tool/configure.dart b/tool/configure.dart index 37814836e..68a7eb196 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -904,15 +904,16 @@ Future generateSolana(bool hasImplementation) async { final outputFile = File(solanaOutputPath); const solanaCommonHeaders = """ import 'package:cake_wallet/view_model/send/output.dart'; +import 'package:cake_wallet/exchange/provider/jupiter_exchange_provider.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/output_info.dart'; +import 'package:cw_core/pending_transaction.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_credentials.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_service.dart'; import 'package:cw_core/spl_token.dart'; -import 'package:hive/hive.dart'; """; const solanaCWHeaders = """ @@ -920,9 +921,14 @@ import 'package:cw_solana/solana_wallet.dart'; import 'package:cw_solana/solana_mnemonics.dart'; import 'package:cw_solana/solana_wallet_service.dart'; import 'package:cw_solana/solana_transaction_info.dart'; +import 'package:cw_solana/pending_solana_transaction.dart'; import 'package:cw_solana/solana_transaction_credentials.dart'; import 'package:cw_solana/solana_wallet_creation_credentials.dart'; import 'package:cw_solana/default_spl_tokens.dart'; + +import 'dart:convert'; +import 'dart:typed_data'; +import 'package:on_chain/solana/solana.dart' hide Store; """; const solanaCwPart = "part 'cw_solana.dart';"; const solanaContent = """ @@ -965,6 +971,52 @@ abstract class Solana { double? getEstimateFees(WalletBase wallet); List getDefaultTokenContractAddresses(); bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress); + + // Jupiter swap transaction handling + // Signs and prepares a base64-encoded unsigned transaction for sending + Future signAndPrepareJupiterSwapTransaction( + WalletBase wallet, + String base64Transaction, + String requestId, + String destinationAddress, + double amount, + double fee, + ); + + // Fast transaction update after sending + // Polls for a specific transaction by signature with exponential backoff + // Falls back to full refresh if transaction is not found after max retries + Future pollForTransaction( + WalletBase wallet, + String signature, { + Duration initialDelay = const Duration(seconds: 1), + int maxRetries = 5, + }); + + // Updates balances for specific tokens by mint addresses + // Also updates native SOL balance + // If tokenMints is null or empty, updates all tokens (full refresh) + Future updateTokenBalances( + WalletBase wallet, { + List? tokenMints, + }); +} + +class JupiterSwapFailedException implements Exception { + final String message; + final String signature; + final num? errorCode; + final String? errorMessage; + + JupiterSwapFailedException({ + required this.message, + required this.signature, + this.errorCode, + this.errorMessage, + }); + + @override + String toString() => message; } """; diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart index a6b4f8be3..35cf46870 100644 --- a/tool/utils/secret_key.dart +++ b/tool/utils/secret_key.dart @@ -85,6 +85,9 @@ class SecretKey { SecretKey('kryptonimApiKey', () => ''), SecretKey('walletGroupSalt', () => hex.encode(encrypt.Key.fromSecureRandom(16).bytes)), SecretKey('swapsXyzApiKey', () => ''), + SecretKey('jupiterApiKey', () => ''), + SecretKey('jupiterReferralFeeBps', () => ''), + SecretKey('jupiterReferralAccount', () => ''), SecretKey('nearIntentsBearerToken', () => ''), SecretKey('nearIntentsAppFee', () => ''), SecretKey('nearIntentsAppFeeRecipient', () => ''),