From 9434240ad345848bb0c5dc1469cc7aa431e22cc4 Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Thu, 24 Jul 2025 13:33:21 -0400 Subject: [PATCH 01/12] chore: update WASM Bucketing lib to 1.41.0 --- build.gradle | 2 +- src/main/resources/bucketing-lib.release.wasm | Bin 215612 -> 223167 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d53fe565..138dab85 100644 --- a/build.gradle +++ b/build.gradle @@ -84,7 +84,7 @@ sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 def wasmResourcePath = "$projectDir/src/main/resources" -def wasmVersion = "1.35.1" +def wasmVersion = "1.41.0" def wasmUrl = "https://unpkg.com/@devcycle/bucketing-assembly-script@$wasmVersion/build/bucketing-lib.release.wasm" task downloadDVCBucketingWASM(type: Download) { src wasmUrl diff --git a/src/main/resources/bucketing-lib.release.wasm b/src/main/resources/bucketing-lib.release.wasm index f3c33d6a7c6e51c40b6b48d90c106cded59f9595..80994caaf48cfdb6c52d2eee9d4df25d479899fd 100644 GIT binary patch literal 223167 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�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%0ADN1zpb0M2W#O<$Qu$YAZdxp)&QP?x_n|x-xY|~ zddPKwlLAIFG2dDs#{40ngyoavHn)PSVG%*VOZllHuYK*dqF5k^d~;Bi8qJod-J(XX z-I7zk>c1;`HRIGMze|z_t-B$XMVa(1S4+#hEipewA#^dYDr!H&S{GOO}mxqVG z6efQp$?`?|njJ46uWjhiZ~x*UFBVY*OMHr(3z>lum{0fAM?XNTJ}yV8N{=?yXRSGN z5BX;bo@qkx9!+Wz%FjNe#eL1Dk^h~Ga2OZ*qPFnhWNg(gM>ayMA>Qs39w)91qjqF; z{&*%nYC5WDhp{L&T1!04YV0-c-Ltrg{vnd1CRaq8==#H@DegZ_H+k@f9@Wc_vBVY) z)QZkcN13x-BTDYAbyeack)TX%RyDOz>yh3nusS>E3d!ggpva-^!=pzyJc%KiBDz)1 z4>75C7hhLBMj0#tyyM-_nGWZ>FQMw$Nq3siyX~NaW)CV#y^vxvXi1H4Hc}n~qzWf80JWLc?9Ro1-abj9D;ZN|W+b`b)R!@h!}vvG3>NEMVl0u||r{ z5^qaul#{0wS!?VPER)=qp|nJB5qoBa%qJu!GfYh_tADTs7?XIsI^Tm4KYr_x;-(|z zQ;z(L=5Js4!vFQ{qO(cfE_o+Sh-R(%@ADy|Wixv4XoQ|c#)2G?yd--1%|pUl@)vT6 zEVT-xU!oz2uVk3aM3}~!SvmP;k@-2{3jkE!TDZU#a^kFlK+S0K_T;kZMH(-hKV*ln zMk4LZ#hBIr@CPr=#2hXx2Z0TT+SCigAZkP8J&wsDJ^T1al4mo)JSWVHVe{A z>_ZF|k^bnSRr(1P$qZR6&?vdW;D4JLX3v1O)3P;lI;1{%p-6$%o9g;WvVw2X0^N~6isSK`!XMSsjH zKA=a$2MAPmxf84N5ru0vSiyH_X-kW<>GCzL5_G}C_-CWH$wSLS5(FORVl=Tb`cSP* z$FHjF$!F7CY2LE=LBtyitREQX01nA2(kb)#*kR(nV7~*8eo7(%;cN$i4XMvDfEAJ% zTLB=Mc?kgc7J;Zp@&KS-kdZd}%%TV#CCw9=bpPBG=bdq)LfqZORIa^`R))rMdq(-m z=O|;t1HTU)8dbL!EKw~&gC#o6 z$y5&KV|Aibwpw4@(kn-!0eLhhFEmB)tR5QkEb9o+y{Q6pLS3Ui!dyjG&G8?hLM@+@ za8M78BA+(B6GLYgia1|V$hd?$shLC^U_T;7{T<8r!>puDiBu9FnN^SrZLQBzO+`i! zvp4ult_pLAv4Iv$@@*{y5kT;UU31 zSoGB8i1ghIh?628Zj8v%P)c&ip#X)5LqN0$oL{oQ$5q%bo?NoA0Zq~KLdTlw#yhN6Jkk7Dm+QVUs7H8_LV*anc%)Kns!cC;?~ftLr0qFY%dpmxQD> zoz#7dxY9TgDP=^*-!u+!Crr<+ebjFmn0 zA>gv4B7kLhp&@ZXYGV-~Fb%c43g=pCyNltJkbp35zuIa~QJ)k<8HYR|m=mB{I3 zgK?macB9D>U_f>m4z_xO6X5qXmj)$YP^q!eB|yfQBouuw52st@hAV7PXV^~Pg%n9}HB(4fSgTkMk` zxW}}zMVjG8rfwvM!_UWn86&;N|_C;WZ&?p{<)B#XC@_m zC7ulZQ(FJ1c}aSqAtAhAG>^3jKW6WrjN6-4T1sClHa2GwW}z3rgH*zu04Hx^0*6T5 z7{WYTX=uvkY_$!{Rx62eG_bI91je*b2aP;&Q2;z~(Ja7+<_)`xKt8l<1aK;WJ2eMRO-&mB<^gt%TQL3!lp+qUp&JG5}?ZqebbyU}4NyrcLX zTKKeb&_c#Pwi;{L@TSDSnu~Upy2Y2F2TKfkus7SVRiM}p(Zlmvw(PrIFfxT`H!=in z`XU>GCESN$^2HkXLCv0-Nk?xuB7qn3@TW6Fs7GJ0HLwS%SB`xdA_zWdOz{rxt63Y! z_w&vKx@L@JIf-6mdIoR{?fi9$h}Oj{NXKsp+cgBd+aZ;Uw8cuR9?BsPavX)yb*fsa zW+?}f=n>PUw6Nq>q8#fLU0;321Hnhby67sm%39jU-mnECAqNnZCkAQFK|@Sdh!lDd z^Nw^QwC0qnx@=l8LTKA~Mb})Ha%iy*)JR{}y?{2n+cGhk*7fCm9)nqh`)%iBWrclW zyKP|G2nR*=gqGp#TN_Po+*7W`mVs+*MbXMudyCSp2}<*bj}S1{Jl9AgnMxwK$dN}v z)MD`sZ&*F7HB8WW!}^(sV&pg!1y;-(HR_rPdKSY$mKP>_g^9|E6AXeJswcl89HV@w zo>eG_NgmNtPF594jt@#^=Ew|dqX<&2gFrV)7l9tqKvmBuTj@zM1(<(1+4uP|UwcOB zDF9z(k+S|o&Ebo^V#pfH;c`vhVGtp|9?l9_LpqXKvF1dy_^MRH)i{mafRwB`Aq}9J zZonqVsy>&N!d%1gihO4Y7z!7M2J&QKLZD_zERNx19jXs)&hRS-m}TKH9npb;JNZDC z|7ez4;UVC-v_@AM05pA}LBBy++$(zVX_Q^o6cw{wR_wKr5tU)rX)ABG(agAy>2DQD z2*4Nu5ur)2w_KhtY6+L(NHx=zZ<5CkgovethPD~*q&usFJF}1lhq8v%DE=>oBUmtk z60{n+TGEuE>s%Nrm?r1@E!p~rmedP0mq;l~S-CAB=Pbf3eTCDtzI$yShF^P<0`zq^ zW<2UBU)l5_l=IL{!|^db(fn}hIfH*e;^A|Hq$t%6Wm7zOB=T2rkYWF!vuL#G5EUh& zSC*<7Z-OB4VsrdfroW?$_Kv1|>OJ3Oo|l4dMtjH0^`4`n^zU&N$M(Ldf}RO@qxB}1 zY|ec4Av2lJn$t1HF0AG=zilS-$z-{mtlG>LsHsst0m1K@!60Qs5SlY;t8T1-HZHDldTwx->{CM8O>9Zfotm+vsh>*1vDqrj3w7>D-1-l zrVB;&^isxPk(Ddu#q^Z-swxWjrh(}&xp9egV+}xaMaT4u8cmb0kQ7fYhATSZohG3? z-fLe4wp*-e%#_dqJX~kX=x{Q!i&ZdM`%qJB0AahJ-=O-Frd~Yon{o-*l;ZriV zHjy0c%MQbP;S*>Ld<`Q*I{E8yISvKBi^nTDE-c#7z>*2eOodFj?UX3_?(5Ox9MRt9 z(@X~nZ}Lp1&G%gwVzNTNqmUAI;e=(-mOTxpt87f=;Lg&LHw@9_ilLkO4JzRxaPfiy zt8er;X3;C(^~3`kctFL>**kCBh4}g*oF(gE!zm8~WhtPnd{>(Jr!GrMsX4)lG=1f9 zV!XDw5==@*Fg=tZBK^Au=_eA(PG}bC^#43am#i}UHvK;h(od)K)1*IaA7oyye2>ij zxMw+>V9e?jT}GFa!!+w>2M4jOqPNNlQHDWywmh#&uKbtzM(nwqccuZH(An>mP^Y@ z8$k%XRL?9o+44oZyTkqpVZJ;p-|~hq`bL^G`bN$bOdVF7;$VW1foV!%jFbywiQljuld#Q2l#=&ln<cf0S-^~>N_=C-$&>6)97LFIjiuL&aLklhKIp3_oBIH;J>Rxn9?8b~me%!|#D4tZQ+35LKH z2p)V1XJ^@4_W9YK1RFI!No-GuFa>IdXbwEmei0iV!O@mrEMOu zoAQX=IP5yIXzj1=5T?;qIp`DFd zJUKHv7`%61Geh?7+ht5YP)lMa)RK25!g9hi^P593Fhd5D_0}7m)$5hC`A`~xY=`>z z0fFcEfqC#=Ic>q8`Kmh)KK5dcv=?(8JR(r!nOcAHJiwpi&;hmnKTu9-rbT)iM}h?1Z={-dmgGvWBn_FxPVFHU|o z-Ac7(^&siyc^bf^ayn2mX9)?|Z}%4O$uIgwkypDg^h4?oWGjx!#KJrvoDYmI_S+rMA%QLy z_NtFlywp~(lzauaYJVb~7YAYQV~p^^q{%FU6D&66o}mqsrR5i2n0X3=3+AXq4tSYDhw!pU~5V%q2c)?{#ZUS{0DN<8R$8&!VOs zpRE0ESZ9m?!jEv@pq{|W>EzwFZx4ue%ZkEAco>EJF=ySR_sfF?fuSpJs5BpbqC}EnJ>^9;%gh zZk|upm4^44#=8=zHm?H&9j*o)aw4+mkkX7niiHA(!l!ufhgs7;AKVu|72>2m^lLR$ z)Pq{ziR4J+e{R+ONNLg4-`}B|xOw*|YO&)*`0*&~-1it| z&<(%`wY_1K2lTuu-gKpkJ9MSV>+X;PQ2@sQs3K=#JtZ;$^crq`fHhKx+aHaZX%eHP z1tC9D+NAG*nc}7qEDSWWKGCPoFk1}tG?W#TNde_#E{`3~OOub1};A3#6_ z*A5FD!Yn#2;g>Mjg;8!& zQ`=F?3aPMe<&2iJ@qx`+gDsMG*WkCeij>*H!VK@~t3MTvm>c{8PIi=%1-+r12{{sG zMz2oF9{SF1A90h&|!*qg*~BBz^mPIS7 zI$8$!Oe<@>5VI*JokdDXDaTlU*54R}E27^gbu?v|bVNLBtVUNJT z@uZQq#|fmVS8L^Ai|8;h;Q*|gG?P|@X&JVX*RCZcyHrKFD1aC07fqWXR*sJRk9AVS zmFnM`<_jYD#??FZ>VM+8q?Bzm`p=H@4S56%db0skyJ%(|#?w)AN=geP$zs~8hk6e> zmz080`q*ac`9<^VTv}^8+bBUz43;UwHZH3Fj$6PJ14+&{a*w(H^HUu>aOpn3U`QX^ zocf8Pc^an*814f3^SN^*q;U`u11Sm`!)nhGt04=-77_`36oCwWiL1Iaus!vxMz-r% z8)kaN$r+%7K_pgTsLT@61Sc_!5d@t$Q!$?j4ouN75U(?pIa5Rdjdg0YH!5ng26)`o z%m@1LsLoK@?p5+Aa%0_EGx|n0pZkL>C_e4AdSVc`v-2A_n2&C36jXF}qqP8pD>%^` zBQ*C}CJ3xKIaRi4$%|-(5a)XN36_mzbLu`a@z6qFCBe<_pY)JN!a@C{v8V3iiBP0b zp)yCB3eKdlFuJC4p6#Ey4;i>1$y<|a4;F~rqy>!3A?&d;QJ*KM2lWft9p`~Wiu$9< zl!EART{$HtWC4WQOv5rEEr2XyWLKb6q-uGHL#X`wG2? zo~<9bnv|&}ybcmwlsU{Jj{N3z9uks5nRvvJ---+AY?Ra{+bFiLFR?n}bv~0!K_Kxs zSj*bsbw1OoHe7-L@RH)>CO>7(@fxbLOvDFp{lM0?EAgngQbY9N0}HAtduU zpQ)U0>#v<7L3nqS<_>PnN^_7Sg=woSK?uS~lJy#?9YHW}?=^$mZCkl|C=&#)^O;N# zE3yTGAb6e6WP(87WrC3E>&7}&XM#wRYNmW>q&`8UOeP2dHYFcqpYS>lY2~iO-!uPz z{2`Fuy{D+O)bfe>v*s8jKFf$-s{X{&FG#KWQz9%NBi{ZjANE}Rd7%jv_ccO_5STeX z>}JLu1%Xww-tzz<7a|q+rPK!-&arCvkrp>K8|0TJd(dby=4*cO8L3)UKh}CwSgE8= zcAN;3Z$dbzhh#9j(=~0-q0f-gM86M}hikU6HClJl?sbX~nmSQjgT4c4uPUx;HiN1( zr}R`m?ufLh&UaQJ=h_#!_6de^O|WfT2g?lvYI5z}-g@5wmASg!%aKWKK^C_zQxTl} z_mNb?!H6QO`N{|0(H3eNm2>Y|ay7^h`t7p$%H(QD7=3=}9$iD5_enxlR7%rpJ*1gg zL)agmzCAvTrua2=BOkfar==-tc}EAI)}}1oUCSrhu3USCNy6VBHTYz&*tZTotxfOt zfb!e;1WLZWzOb(9i|UIR+q;3BpTP4Iy+V%H7l7247yL#Qq>7gJ2@HOHSC70;(g-k|FB0Fb#wMla0!mP6{Q2FnyFJ#E6 zZqyuq0fevkJ@-B}PJE>lo86*{kCyq&`soF7jaBp!IJF+40Y-N}?+o}+J=8&3dzg0+ ztWQQT=s8NuFQ|U9G+Ow55Yqx+F-$-k}$Ly1*2(51N@&FDRA&yZMSb&=9FpdSt@p-H2JHn8*S?${|madR_19 zDY6%20Ux1(xoWe_5!&r1Td>;13J29ZAj!i#z~xaM)P60B9IXoh;Fkcw#5q+Ym;*(MJsztZeqGS$03mmSti&Y7}j=F47^=JINDqFuF_oX~HJ9VU^N zn`Pqg;z_>lz89CXaQZWFm%xdP1L)?8EIO;nD!)DR+U9Dl;G(yBUI2GcF7;jR4!r|o zaJAN5btl44+r^P62O}rliE!elpc}3!c<#UEoe1nY|5DtEu+@&YB-QXvgtw-XJ9_$a z;qcB(ykdCs46Aw*(yzg7(u^KO1h4pvW8H{;z&XJ-D^mFX5$xIGxBkEO0AY?C@|Y8* zOV!~t-r-1Qu;E|!h}q8>3lHMxW3^9grXo86i^;o|&TVqOC(MENKCVN}i!_%&xrq~a zVA5unQuj+l+5HlYbiX9RyI;vFN>IeCU7F;2_e+|$`z0OO{o2HmSa3HOqsH`Vm%G70 znKKo=IhY~i(GctTZm{rB@j9Q$^FrSZMi`hOF`Df`7OLcV)IsXntklQFB<5@PvbGHWP6g%EV)H_R6pz zr9G3MI!_nGa`RK23nDq<6DdK=mVTi7!6U4I_+^?-UZ@z_1?~x)5h{`#B<17nSo z{h>Tu9!8X0iR*CuJx#W_{| zLdrL)?hg(OFq%QBX7vfxRbeT{=`Y3P#x!ufWxbt6*n0EgZp7L#YTfN$KSq-E1}=Gb z?Gx{(X@umSUXvkKei8KZlCCvvwH8cm+rD`EIsZFSw$wV2OpN`%|^9M(0@T=7r?~Gp|hU^h*_u+oLE$D6~8b6|4#Ob6(~=siX6%^?Gvh_9)mxL{nAKBXF; z(W^=?ortTA8ZW3woT{a-^noNv8%vsdt{(`1`4n8!cIy#Dqu!RB{{XGDw$@g%Jp2OdK9o^_uWr) zpnc2BA;K)CB?*!UyK(~r4))ey5HJQ_Ydn`RAbU^HQnV!|x?H__R_3x)Fo(VvA4}eK zdc^tD7c7m6a_mE?+A|j2V2RHwA?&@&8oBv2i`H$*eGN1kBDr4<=LT|I5ge#dW)6B( z)~38BIo?0ce7!HLwPh1rV#rsZSi8G`6XS@!mQdFR2#7y)+g=s_g#Nmn(VWex98&YV zMxE*&VQ&5&F(~B0XMk}Dh06A**VwveH_dvK_m>we>y1sa0T){_iJCL6S;}kO%J!1Fvc59Y8rOWZsca3{tFKUd{kO z)(rqGsC8!mh@b(0_4#J+3?MAst_y2-7C@}2bpRZwwipN1mFoUL{Ich~-J}vK30yL5 zYB{5CuhA1mH0-rbaEz)~ICiclb|d2gTWv)$aDlCccGGBD6iPLXD)?U^v1;C28ggT8 zV3Mu$89~!Bnh!uxNjnALHBrgRokcN0LxVxKI9rV3#bkDH27qPW4gh|3mQL##07lH6 z0kAm(pf4oHee79Cve|WZb@`U%F#hjSF(MT{yuC|C&}{6*Ma>IkB8lHK_d}$!zofWr z#n^rkPjM1)Xo|yYpYnGr1lJ4-ncDk> zz&>F^5y|C0E z#_G~cLyAu=`0(VjMNVg)d0y zS`8}fG}<=%wTUfUHY6R2fvIX>Jgn(h)KZl58fSqo&lN5ojtX>-2^M7xhlRDuO3e=S z)_NC!I2C*z%D98#_*{2`{!~Bjvu}Fsz@yLJgLI4Y{o@kn$wW(|3#w05GAz~4b1TkR z>rD9shP2M~PYNF1BNxGnd#BddUYmqd~{~YT}5Ue>mI9?YcrXdz8v*A?-QZtYBIOS zjU27Znat2U9}SsT4x(}+z|PTneC24(lzjcsk^kL(gS>x{M)dS#16Gb83X$aoVD)IdK9e~5z-H{o{oHUXc!146w{s# zvheiLq3#OeE^|o0&Y4n3fQ~8ka)fI}2}kUBzd3u=DsUrGS=6+dP%+VP+PSrvc5aEY zz4;|Kt-rl%K2vHMB6DOFCIr|G9u6#4_2TH&v!33qut_6w;NOdOI=ByEWO;V_LEnPrCg{=xd^m& zl+7XDL99M`4+Bgr@c`QNiEBuqbO-(^YJ#tDxRmUiJ(HC*L5{a{Hu%)z1Q9VpY&D>v z!nxXu*aq70mpaj<$zc`VYJGfAq^W?1G$Ca)v~;EhKo+l^XTv~iO;~K%9O^QeqP)KY z-g2fi^P_5?%Qc=i9a9qOF>f{KnRW|Z`9&<}6_@R?ZIFo)TO4wUh#ZzOwnUIAO}|Ke zY;$I-Xztk(!XgNSUVxKixJ{l`p4$rJjC3K|^HaL12YdhwoomD-rnOiBrQnCx9ul3& zn3iOs`7oL@^)a0?L7U3thb9fY&O*Y!{PkS*VsaE;L#QgkgI$>}vNT(Syb6{NLJHY2 znmjJ7%AP=7I4Wg~3e8YGo*2PG(G5SshAgTh)ltQ;3(ILk#|zJI@$IsGF(*jSc}U0_ zZ%}9TMk~%K18+=9wJ*7A+84AYTWE38`lR2s+s?6Vqv$^4sqS-AQFHdLyMg`8X#Vnc z*7q1h$fX^`)E&+Wl0-bCn5QW&*K!XP)=rN9&9P4MtK9l z1FPHO->kF1R3D)rc&|^@${Cyw;%D1d&LU^ZdZTI%jEHclYN`wi4)&A z(mz`brOh%{yW31xQ}Vlf62zP%OUBLkNzM5Crfbb5kJo30PAZw6At7)$cU`FpHVwndnXgx#_%b;DW{{D_vjev(qb);S~ zVNEBLQ+7vQlbxH?HaKo>Ls0ESd1<9tQNRzgaQ)@vt}WXZtxR| zaVrY0u4B6`c|=8K*>Nc#;(vtYip{F#1fPU5A-r9dQYG9qaVndP^TD4jQJ{lqoPBB0oVmqkmh6jA zf54bDcqm3x#vf(OC(Lm*l@Zpq&!kz^O1?VC_DNq}?<*)gYiC~4{9R{f+RAJyX;Znl z;5ONNJYvn1*Onzo&?qlA9_;wlSPu_Nat|VGw6G)?+p8e!fa8w$f98yTKC+6#x_ zDVh{+M60|DH#~qL3k5S-3$eygLLLaGm7u&uUOzzy^Ic1TJ1B&$%pok#6+*=nm}Q?4 z!czS_QbbGJ?V>{%uRVk*FPxVU=8{8%xnv-0VabHB1ScV^`_&@M9y$dIs;fMN10LjL z3Xd%EYPA-X=rCeU!%L8aT2~rTp(oK8fYj2tA}ej9^K{mVy>!q5xy7CMEVeWcIU& z4|tbkcqyw%R@hjkavGCF9*?Y^LOBIBD-{3~QZ*2Qz#(f=P_~>YZ?!=5REBOgCpBuK zH(qknXA}ADWbj62xfcRi=TTUG#?%GX%P%!jkG7FTG_pAj1&KyZ7IA~Nh6^$PFLEg) zAi~lN5DypYP4u)KV0jfa9ME8NnBNpdrR#TEZy5F}N-(_6p`qtXs+GqK_NAXg%FnK< z-d4t{>Y-gMV$7I07z4-}MIP1bW7VCC8Bs|Ntg_zJ(z->*Cs?;EHCtCVTmL?t=7FaT znR1KwfLce05F(?X@!``Fm6LNyQ2-{eT7+i!pe-{6siwG&Qhywu2uXS!}KNhO-7oWAxb`bH}z%u#Nat(M1MoT>;^Cx|gp4MS_X}KkwH46J-P}31LE6v$k z8T`F^K)~%i@#s5##>GJgHn0>moZ4Io^VG>Mv%^Kug)kn}eMk=hXAm}d_t81L3z1#2 z4^2^W_G)aZhuZX2L>KH<4sE~ygMar*j4SH}wvxp{t+vZ8+uo)n*Eor6Jo&S8bZpE_ z((p&Vtn){z8caoLS4rvam$<+C#n4S{QF_{?29Be-a)R;Ns@YV?L!?Zg10m>4#e62C z6d^2tgOzi7Y1?Bwxov!I4!ren-w??rVC&7H=4aGP)-}{G9^BE8ddXD@-EVJ(ZBy0H zF7?49cBiJiM@Q+OTypuN0E$jKa8mo-uX^wcrp&{VYf!22%B zbNRTc9?<3a+L=75(sZzLMj)6qg0<8JuR0K=gYn=N2D0pdd?$;toAtq0^$xU3YE<>0 zR+o`aV^s@cQlz=%zdrh+KyJ$GhkB7P&mezi4rJ<-TB-5x^ql8u<%}~t4bq(=xQp9f z(2kBey|Hm_M7JG&3VL)!%4VCkQ${BKpGDq_&n5jm@3Wif*<}}mnU7&1#zEvWFmsDp zxsX%>BHn_O@w0+(Nq0&m2`ZO*Q;HtalA?!2Dc*(IrPu=+n1Xz07v)5c*>Fl>GgK>u zdeJyCsX-v77c%3pqugK(qnyERw;xb%dt?kLfT|AXC>c~-Cti8Y;tK1l17L9K7m8X1 zv~Z}ml*h=S5=Yt0bZ2oFf)e}Jyt)fTU>PAL{J|<~8<4Z_5lED<=-{vaHAL8M9_>7> z4&a>c|4OqfhYr26sD7igliX{KqsiO$lbFfX}k?ZKFWpwsy0d z6{FbbFn(D*I*4B}5s^znNG=DgKz7__<7Qp&W*JUD2WJz|vABC@{(c*p^($qwKQ${j zfQwK`*be}NB8`qi>|dpZ)@QkqWQS}eDw4aYR^$;g;( zpYCKZjr&H1?UDB3{#ec-?UEkS=I>shg}>H~WkT8q<1i6e4BKk)aGpAt+ji>UP6PT! zscjife>gSZU#;=hbfV5V4#g<>1iVe&vy5~}O$1Cam&8PXNm+7;7?D<56=$S( z1rn@QZ!cA}7heGV*;$G3%$`_J?Nt)u#YZqFo7X~BVQouJa7I@m?#y$RtBqHn+B~z= z7I{1$ZS%y4kK6H%Joa+5c>?pezJ>S0Y8=`~G>$(&5(T+sRiIzYv>w}>W{iKajCi(2 z$2M<_$<6$fzTu3d`+H@xV=yvhX6ki7QueTZ;p9p`$!L$))e0sq*zV|M7=|r5K@!6D zD;Di25?Hy}M53Q5haDa1+Hl?PH$u=qRDe(=YKqbsmuoa;NO-o|AbnpXl3&z|v>ZxL6ih@{no%G@puNuEr91^*58*_*ur9S+clyOhYqq!l zxGdU{7BIqzh{~ycq0E|0%QPjM#Z^%LJYZ>}0<6&Sypxiq;wi-kw(f`Ubj`5}DEpeW zbwWrAr!3_(VaI zQtsn-(Dh+%D|_W8Z6^20dDtdp)b`AiK5&yOZQoJeLjyrWG5@AeAG zg;Z33T-c!C^M?bo89s@~U)#!ftKp(ZIoGdANW=mxZNh z487Ga4MX%@za%HRUy>)?F9b&K7or3m?Nm+uZgF>0Ka)%YSfhJ9=o`=KL#F&NyXm~} zEmsh)J?lFG^Z+qS56xGY;qT#`$0Vd$Jpv& zd%SwDN3$c1blA$)tC18xtED-g&YsL=khHgC9K%G$AXwqf2(Z2!kB^Vy`N{NrrZ1!z zaq4D#e@=S-$fBzzRNJK?LSYvTM-U+)0M&a+PhQgbH+Mm=Ibwzy=6n5`==DYas=dDW zoO=CpJ*5V>Z5!%ehUw@>vRP$>&|R2N3MkzLhcfDmq5kz@qK^LkCv!72>AN2rH}?oz zB~E?t!irxpxZjf+yBlF553&!=ggI#EAK20f6Df-z&Gb{wQFXbbJ7m(F_(i&xB+`EU zY6|-4<;Jio% zXF+*R61gvDUuw?G#bE}zAUS(NYEH6_mw8#mSnnchPUiBw%$MI?QXl{MR6j5C<#(3V zNYduSFHjy=o?fcc=4^FM&!oahfJT%+L-`58L zYcP?rukXpJvb|W&p#mgPepcAoyPdf@uZxO6`@>uvTxyx zZxnjn4~ep>IX%-kK1NrknUeL}W}Y5SO%`SPrI}HUyTz=TW@%~8pan+_kQaLSn@vwR z)IbyC=3h-MDcb%b3zU)!gUR`i-$!S<7=d(1Wwp)I=|xR!yN~xQcRvE@h9yA;y0YK7 zwj>^^B&!pu6uT517gBrC`X4+;QwI!&sbe^*G@@$+SFbY5+$l#S_7sP+ZKF8eka);> zP!4a9;t((^j+Cl)M_T4R^7VO-pILEW0LNt!#pIoP;*=u=;|#qhvf6wv4c>5EWUWSS zl}s>P%==7(3|RL|gx3AiJhc0T6_E8h3c9Dsm4%!lEF|8n4KyZ+!4?JDV~Q%)YfH3! zWiK6n@^%2phT=sw%&@Fdo$btSgJwRaqbl_iE{1ZY=0@-rAs4ry$Jz;tFByHTTqlD7_02XRt;bMF^XpW&{ z$9ut!cTbY}sa9%03--Lz*19}QNiQmKl$K}At1)9xa+QK+ z&a2Jh8S@*9<_|{A)yZS*>kBxGYj7ZzLdpr_2%ps|*J=H(u*-Udu*-uu`b0CmUoyl1 zq*NYa!d`(G2QlGUX>f3)7cr6O$MGSY^Q<9KdfsuQRn=;Rw5W!9g)UsWol8k%uxg7HfU+D|IhHBg&;# z7eOOM&`6PJq)0SUBpN9ajTDJS6dw$&H0jz;Ii|PXj-dSIqPbV|HHk#rPpO{%9EbK% zXI4&-$RCJALP7Mba}f+5@0_iEHp@v~=I4qa7A)@M6+H7xCNUP9?%m_a44zbarBJyo#*u<1FXX;hR!KbIGzC=h;GNNxeDBmylsDres1q~`p!OHIZ`BYUc$nN` zTf~icZm$XJFoDfsOvow`Cg964xG?IboZj)PrpM*x)LVJc*%oA~$#O+DA-HSltzH(* zANH#dIld!*05I3kdWj4@O`AqY0R!4(C0$ESNP%X~=e9-s|L2NuOh)5~$d;P{+hY)C z0^(??h%a!g@Mz*$*!zOyV>iYKL|+R8)vO$>4IQfqF-*g!>=Mv|3g>Vvv;<~4;yz{; z;7+BnpY({0%e=sIeRv-C$A2y1 zp1d_#u8?7&mKTHxZ=TGDv+^8*<{?q)omOT;tM`A@;)+-qiMzi4rH(waNsxG z6%2Svgkj6;i{rpkke)0-u#`l>kOi+^NCxvPs0DkCkRFxLBl}8UuIaJKTu6+D>N#a| ze+^Y_pNecr1mDy*EMYhT?IS&CM|;rbVtxeexkG61#LSTETfS|jceum6bC=Uj!K2R@z9B*`VOGvH)YbFAF3IC_jGEv3m9EWwzuJ62n;>Y)9h&Px63G5~lG^9;2MQc24t(hGC*`KJ0*o)N{!WkRr?;54D0Z z@T;B`D!7&juj~LnWG3<2>b^c~`B_f?3V`HWKh7mDGAj7MJNYpxhQPwVzZ0<5=GtNl zuz<Ju#s%nG6CM#pGq{vEg>d z<*BviH_ywgPZC(P4EoQ$neL(eQHJ7EU zV6b!x)2wqvGT2cC$ zQpR`3hW16lfbcZ0c`$Rq!@`1Aj6ygt+I>Gzp@g9$SfmVt#KZ!=(MvCc0E{)KW3LEL zMfBNCVdyGm(V=3z%oIDpB~}t{CoYIUz{E7wM`a8qu0eSgFvq0V=3N?df_aaj?g^;T zQGMw#^FG-*qs+WSi4hu?q<8S1@&`?ZnDs9R6Xw-trE1emUr_EQgwF&kBJW^jTyu9; zZpO?G|7*!4@x0lMFEb(9WDL4fWQt=n7Mv*c`E=oK-EGQPD6wIP6h6s} z@HZr~(12olIe>-0*xp<5%fHd!xTJC`9sZf&14)McnLL%x&~t zuTY7ElR_=kI$B;fzYR-~!q^XiVp)Ny)+cQnn6fa76kW9cI zu}W|OPL8DI7cFmdFU3?`<(nx=9PA(3j;k^sm1%-88tG;X>#M|i(r_IkvQm+YkV%7~ zSqoWs^adjYBh5T6kppo-#&iGu|x7q3zhK&DJ}-+bVKM!r%ak=_Tl3lF7*Ec%A_( zOZH>Opb4VqX&ng!7=>zlgeLmph2{CMkw3okLZE6syqgfn6cD6(4wB)_n-WFva%Vl# zqQ5N#OJgs=e4h=H%fXnh`?3-j&o7#~xqK)s{;cdvi@z$0RUL)YBh-Z&c^vkpA4%<_ zA!9~2hH!67gbM|UaD$LUxJxEn&;?iL0{A)WAm*^(~5@Y*r4BRmNSvQn4Gw(R*UV*zqy^8Z9s{cf^+luT<(k5_m0=9IyfRM41n zzNb1AJdljg;V*EILX`S8CQ2NRkN@*rKpK|NWusgjEkBmEc6TUt|WPNzva3< z-Thp$1bgQGBD%}QKW;O|zPQc~t9s1y3D;??pHPnv9NWO3PwLvEEeN3)mKDn<;n`B- zj3h`0suIO8J>1Zt#=IgEWwY#!ht8?s<9;9EE?Wvmn9hvn>cj+gEK#aL%L2N0LM_F0 z8|&1~Jv(Hwe-V|$aRk(^x-G6b7)aX3zWso%oktyX#ZE^NWz-1=g33YvlS!LEed^p&=50o;y)5KPm{N$g~9Rj^&`$dD*`lQ2y#-Kl3 zsEhS-*4`jcn8gap=rP;I7yOWHp$)955grA);(d7@1(w!5%1e(hr4wU-LqVe~MQ4+P z++OfqSpMEmPPE_MZ(J{JltyZ44Vqgv^;SUB2P|l*#L0D_QKTH&P~uC!;G^qeQDnK_ zwxVsDsgCwgFwO@QZ@6#L!2;^Od0`H|?Aj*ON0`Cn)d~5#N$7lbvjmClH5xZ%Bqdm} z##h|c6}l?bejQ6dmbNH;*hRxZD>dfs$XMC1A-D}xIL>GQ)2Z8OEyys(!5}^zCy$}L zG*}ueBIPg8wgL%AkdeZ#y~YFQOBgf8gKACmp^O>9;wf1*c%=1_=F^=8mdWIkE9E3k z)7;#7f{9q!%Ey&rvGs@;NWanC`15VmFFy6w%+B0T2}}b3$lYeX;~+`x3&|Hj0U`cHPF3m=m)d z2%KzlOj=gNHc8gc$_698fv$;+YDI^9HKB+m2pYqY8X%7Y*i-{VZ0o53gDUq{Tzy+f zAZ?-xB*pzQ`L1&^Yo=vbQ^^Mxa~YX&re$U^9Q$g6J<(wG*K#JO0}6h(h?`87=7JB$ zb^+1kussk=8@4Wm6zUMv;TjnH7ezp(28YL!L06y_Y=Ql6lCn}`grKR9elo|$x$y8o z{;W#UI$}3F5?-`ao*s*~3u9~huGn2{9?#P+(Vg~26OZQjZ%A?Iw_dAHMNGE3)Y$ai z;$zGjXYOE8MA~J^E)<3tY%N&fC)!BfCcCSpLM4hM31-|k5YCx*n%L6Il78#|+m-GT;*vc6EO7bJ6?dGNc3ZrFU zJm`jI?q5tyDZa4g~ui3t4y%w6~i*x%bE{!OXc}6EFW_MHDc(%oE9OiSdtSXNK!Mrbm)%? zO?|GC^MkQN0jX2YEOd~B&&lY3PvsYh1s&(YC&}T^Wb;#twp*yKaGp#Pfg|44ol)=~ zm$Ox$E;WS`&|3R|I_Pn6uAsH zO{Bb{-!3G|SVLCt7m&qKX2MkpG?9epe#x%teu<*GUq}cn2mj_F*QIQAvS=zv6=R}M5y<+rnsWq*hN5R3c~$$yB^5^W9Z zuJa$VQb!k^YB!9|)x#!gXd_m{MVJz9l4>(Df=ANPYyBM@LTE%yc?(w6_n1c$t=Kb3_5bdj=w8jf) zh#3uxqz$ydyJ$h5cu==!;Y@fAOT7&C4A|gCT+tg|+upPwRi5uBw016j=VjoFPU1t@ z;5C0xfnAE8+^73QS z#yRfx3OH&!QcZ6haV=@u(9T3}mhw5(g(yrTuN$C5PG}JgP}sKh zf-8gn&+|LaFk?V;MK7Q%=-53^p~RZyr)%~+;U7(&lP(s&;v7sTpU_%zsm;5;w5C&H zRUrv01V%CI@(`o&E_%|Zj;y{ILrRPi>qWe5-9HQ}truzu?*_aj!NzG zpkkHf2y|WsTuUKQ;e2@y5u1FqyFp~Zi^2iaL4=%Sgk-k#1^B4`FdI?T2TO^=+SD(u zV^ZAP7m{~pK#W?dh1568!#La`=Kn5Tsy)NLkj>`G`aWF z)HNP_lksf-skB0TlCvFW&Gy?Tj7npa0h}3;);a<^;%6QaGAvEe2{I2GGDe(QG-o85 zWK8oSW4fRr5>_DZGwm-yi;u3dSO`tAE#7jjWk78?|GP5FKuZ@_uUlRYd8$Q^DHSh0!$pY?v z)q`J~*3C|};iavW9tz;ww|KL)>HJ@dWs%fPtjxRDSB*uarD^n*A>n0joNqw zn+qC>&z3qF@`?^4UL?X1Z<~a+i;eguj#;-aTP>!|RePzV_L^#3$ptw^t^{8N$&7a! z%SG!0V_^a< zwp|OGcVmbu0z+`KmL|O1Fm5OBNN2uw8^DtIfY`jsXA(A7ckVbZi)m1jV}Zw}&ytZmOMxhk4QRr}exj1M`xiO|G4X!hmu zHe?qIo&pFvjSaog*x00&vgCD$cCfwuQ3MQ(COF8JZ)Xtx!GrKv-ahB4&UeNeDF1Ho zZ*GZ!9QCI=J_tZFZxGE0(1-u>r9{`$idMEzmFiusZudF7j~@=MP-od9sY((9E}pn)N<$IRhW(*vGg)3i+FAgW9^kbd zuQro~HDs}?$Q$iRolO7?rjcqO^h6frd3Q7#ogM1RaF02ZlI|f z$03d;|1tW%Tl`9yysI|W>hiLSv^3H~1JI>NM9m@!M`%pG=lmQ)z!Kzw(fhn*oybdA z=iz!(%Rgx`RBoZkT`+|2jg$0%zi?WA9X1VoxB=awSRjVL98S7AMLN+$2p%!bDX8*NK& zPW}$s>)l-3+uTc3X&x}=RPca8$EC){p&Q1b8^%dDjFWB{C*3ekx?!Aj!+5c7P;L8~ zOU(nW2}6S3x>aR!_T7mKn613Ks5qF8@n$RHP=E4GSDlq?9tRy#94&xT?`Z+>ngG;0 z0$3jaIPtqJ0AABklbf1xxf&8R8Z;MPo%7t645vN!&SCEBw(6>j4fqeNHgj8bb?n_+ zi{`70nvp`jEVk;Bfue3EDry?6rP`VAbX!pODv1xAWDbnCr4x`CYY@dBw%oqb5+$|; z7}xYUkrZC0D0o~MzN^Bu%@f1>GbJ-P5f$W$|Y~{5;RD* zc?5kEW)bLPCN3=U2X)5Ztj;<=lC*S;*wUBm0I&1!+-JZ1JNK$Jp99j&FRo%?I1)}; zO=B>M8&tP`3(Ih;Xzmy1fWbNA%l6pW5gE13a>R@zomN2V`hrwKjm2|oK(CrL%!>PW|UWlN4HU(#Fz{q!;NHAK~*@_sbuC%okXWJRUrYvgMdB9l9 z@Bu_ZA)jRp)7h|wX{ivQ@eEw=iru}FK)B@pnff%jv^ht?awT1*E+0)-*+5c2R4qEgckreMC= zV-0ssi@KD|4Osg6Zg?LGzHZhNVF!%_+ z2@!=~Vdm_g$gPolCHgz4Zh@`vh5{t_kq$=A{17{$Zze8;zGEkgN<#$u;c8RuYDrLU zbLPG32WBEK+~?V86fmMt1V++mYfik+{oo@&^sCh_kwSCQ8ME)R(Q}d&GmC z_c9^4d%rfjB4kpWMYQd*iEI=#B-LpyFyo>ssyCJo%aNSQvxJFu`U8c`0gtdU`z9=j zqrjaadN!2LM`<@DKsxwApo7J$eE0g zs<>mN`h{YnoiR8sj{afZFg3+wqQKl3)8CpK1I4$)qEka!xM?P*mXary%XrO=0I+ca z;ONeX+cq_N?RQv8g?ZFom=tMe+1+OH0Jw3!U0enDw5fTqUULD*eAVO0JCiQnjR(u2 z*NSb6pXj7f7pmi?r#ZE1LkYatb389dc`HnPRmCSZZspW^Mqm_ql6nPHW znUNdyyQAiw;p`CcRob&x{aG=+i1oBF#l?6s`5s;G$xZ`*;TuazkC_sLjK{!Aod>@d zIjDMq4JHI!%`f3Z4~+zl@&{p4tQs^wkkWu&&7l27w!|u+FZS|HF3vB3Ual_|Xs-D= zoW$VmH*9Eqn=jN7r@?O4dwqO0^UJ`15~0?Ux<(3iNy)%r*p5 z(>b%7EZRgeg;_GZR>#vC$@~Bg0a7=OwHW!Ru$+L+5B|{0okUDsjfYjGC_y5iU1p(w86P8Xtc#a%22J z3naAf0p;UcX^byd4bAQhP>sz5s)I z4^zx~O)dzdzK1BLdO&$|LDdmu&96~iQT2LMeb3roctA*xncnjO<+A~A06h4)S>L0+ zr)lO=K2W2&U)-~{NuykH-9&RCL<8jMg^}sPxK3@ezEIe&ss1dKbwOMlCot6Eh-hIC zBq|5LL8Gsh8`2*6`?R+%+T+`gtMQ5W_&G~_>vbZ&b+VBz;v+BsA_o)RrQBmPZII*h zsu!>K=ygwU-_#UcODo5Jt@OzsDinxXl0;0QD;A;kpVT+ed^EC#8OGJkW3d7XO*5_0 z6VQ(b#P&%6EApZ|$p{^*Nda)WI9qAreX+2ljXK9KL;`4q7pPl=Nb3;3%DSRgjEusC&(P)EjMmv=DJIk?< zxeMA^=g4CxkQ%@Z1{?#584i$vItAvFn_vC9W4r_Z!Y8Enrh3v7)39GT!Y0`%mo4op zNBCTK%H@gul_U0~?34?`zq#^%DHOaz^O*kcl=AGarmxt2^ha z1LS68=6=kbT6v$yg(GgKTwfg^?-!Z(?40?k$i<@8P9U$2Tsl!`hcSLo!@Ugq-HUB&uZ)t)f~M%JoM~AziIbQh`>TL%pyck z=D2$L*b>lYXeakV+j_dC)-VS{QXBoKO=XVTfxujP5MRa;unv(O-s#*50O)K`b9-}F;r^K1?L>=Wq(51 zj5aA@A=GmUt7Fckkz?$N3(5k=!f4W*;tmKB^`wKcC9FtLTzzGs@|IDTUEG|FP0E*j zg~u1+tfA9*U$jh~&5H$Nlu|FdcxoTj#UN*h=ZjVAbk-$o;_%5RG@yDD$K}cYaP86! zXw_w%Il@G!89m|vpP8HR|Fs7u>>a0GZOb1ZvxAJKI!vEx%Y68Xok2v7Y>ZY~! z&}`}yFrDt`kiu$Cvk41itRUB1$lT9rcwXWxM{pe4$<;TBdN93i6PQ(X5$wHx#!l5`~juG@709W#N!dZSg!=v;MtPy#Dh1Kk5L1 zhdO(JZ95#-!pq9F2av&1*H9yGc87Qio|;S(IJrXA;!j=LAeu8^?h(`_(%2u$xdwYE zUOwrLJtLVKYsaQUG3savWp@TwmvV^npdZ0hfLjTD>dF>Vr0)m7t(mH<9&G{Y!yYf> z;35x2vSlpd)~L=SZY(9ahX|r>S*zJuMyphvA55U**h>pB*Ca1_ABBa;A;gu%8Gk_G z2J)jt#oj4|B37UAuAk}7vE)b$d6tYy+#_PJ@S6yca5Cr+6>5N8!O{lfvr&u>*N7^P zjo`7&i5%=m6iM5afM0>(XOg0Td-}K3hSZXEgJ!qw<7_`VMGY{@#t4`oTQI3f2k(px zGse|0wR9wyQlzbOK|>O)#=Wn`Lx|*VH&@|T0u2d|yai#EpugzzP?Hi>8~It2v5QLz zMxr{aG&Rhza<5vAz2vi&g@|P(i4r)=0J)v2$C1tvK+)14C3G;)KZ(;uOP|I0}q($mK zH9LmKP|*}rM7)(1rPiF9lFW3{=|q+~<(QOdlTAscHPxtepK4OPou-#UW^grkS30?Ex0JX4$3oGy63X-k5R||Pt+N;rZ z^@IG(snQxDw;ReJwK}!*e}vN?CatK9nns{ARH^dOIzKJQFXX@?KvFs$QEc>SKpAYM z>&!Uyvq6GEcV6{QmSC}FL?}_^`ny7B{;35 zkdLgOq>9**IZh73I;@xj{&3FC)1`Q@rp(AYnzsZ+Qu>}n%L5xf+5$&O)WpUKv^Xk( z!jiLYq=O12zBG}Ej@W#;PL2Z9ZFH@3ZODjO&d!PyxW`Ec!j0%EHuEql!7cmK!hB1>H|4!-8-KRGF~us0}p$J2L(pq zCn4B@g`E_xe;nwUY|)R>r*lG}4V5s%IG!Fo&~U65vLxgA;ojJ~m0E`@4ZgD3vIvz% z)W-Tw9p*~&OP|ZtyKf7aTEVJ;a7=CzA(1=+AL_X!0IA{Fjib730@1zV31;JElO;^t zn8BH$vGi^f$1FH*(g~WNit17oNMN5E8fJvU!t${00)KX=Ll$kp1)sN1517jPL|s02 zl`69DFk}sI5uf`|XVh6kD&(UT&4?WdCucJF70nxaIZNU_Jx*dnI9$m zOD{TQeUi0-Uaxta0aOlt=mQ2`9cX6B=h&bld&^|ax{b8rWJ}=mspSW~q2<@8*6F7| z>&J`n05rIjlB&9o^2*e;PPWZVE+c*$LZB3 zXg$E|qAu}6+ttO{yeh+p3|$$1CV+0OOaX#gEOB?8i%U;QES#FswGa^q^d^Fa=*lb` zh|m8=gx(b+9i?SD$`*H8eq_(B@oQlWc>t8i1Ag)nW3^al1bU}9D(foeQySFf#A)71 z7q`6rsBpudg7D+{a96)<$aEgaP=y2xRiQ_Yt!F{r`&(&&I(_Qhe^e{#U4yZl_0~7o zpawZ-%1`&I!Rzz!M>V&(K@@P&eQ6JIORLiR!m3)CkZI);@e-u^bSs1-Q{Ce1C)hpd zmcymRvqVpp)z2K4Au?t4w+d^HU;%z~ukPYwm)2D*qX|Vr#po->TU$1hgJ9g@I*wpi z>Zb`v8DGpfal{5+cHuta7MR2)i8LzqQ}4kFhKBIH=?UgDZ_g>5Ho;A0>*9UPnwXTr}PWJZYo%>D1Zjm=tvPOk(?!$Z;6rso^i5|s11 z4NTCQ4L>2@h<0#WN4Be=Rdb(U_lReu$k+`Pw_%)Oza$S{%C;1v^sFz_V=RXYT_7(@pNdy9 zYg?Bn7aKS0DU>Ds2u?WHl~F3w4$KyK*EL)_i%|rdYiE^?Hp-DRtvqgUDOkq5VVLOH zw-lpkpvLM=bl2ydt-7^MbU83*o9G}zQ3hoEG^6gAgP&3*+>5R}F>JP_3bq_%G=G@} z10iN00#vxkmF8YQRT_weQWDWts`NOO&a1RZ9f{wy&sf{s>!(*^8Ujbo>C&vppG!o` zO8Y`Ip~LsctF=zD7(SUdzViF(?$5iAPHj!Y_u!?ZJX=##|W z)Q}3BZ*hqFZ8zsVtHOZ=jIppUNBVoVqSPGScC0R+YD)h^cL8 zvrwsGZ&a*`a$b;l+JU5^Eoe_VL2_GKkXSKUY>^-t=`6O9&SD$sEw+)~VjJl#wvpaq z8|f{!k+m&02@-_1t^05gf@8@FF|`Q>fQD+M#(c2E9fst?w6^ZpzxP|3c@HBiPz#58 zd}?U96aJIE+GW;9W9vpihF{tj9z{26o^p6#S862TEPg3rq+0kui|yK;3RZT=u5Dpu zT`oM(iB|zQg~d=vG2g`oP^INjw_(1?N%!&O`ns}-D~V0;r)8nA-V7){h?Z>_zt4cM zQ_6XK4rUFY7E{JvB3MFwPVGRMUJdgoQaevO)p~>f&SJ7-QPiRUtE6Y0qn0{HEp?t+ z>O8g7d1|Ti)KcfErLH!$NWb5h_j^7~w0VvcRILT$3+ZZ$fyUymL98PbV#LrPTz84* zSvAG;G4SD5-FNV5LNk)QABHgrqN=2{NKpK@I>(d}@>wrRMzV=@6NdofbPNj3Lain> zxzUTd5{r=-Mz;`&AFwd`F}8E<35#iEsF|TF;#Mv;u$B&qZ%T9GpQ-0O10^zY3Z+An z47*kq1Qv-jGdQs!ZYxdP0~U~Q4ccE z(K#~`J#@B7yjtIXag=?*6Yjk zi9oCxL9+OvLK+}QzavfMMx-=1<`MW@HL?~#y~@-$F-9e&MNHdNBg+S*{WCQtgY!yi zEU8B9xOA@%{JUV>O;lm0CB&!+52>t?ED;_d`O4X&ybmo#!!RZ;PL&bO9aIR?G@7BN zC=Z^2Xx(PVVrZ%dYJ!kZ&LZLPxXo9B*1c3CqB4!v2ZO(>%Cf4QlCAOwTdndlGM0uS z&<6QNQ{BX1gzFzyRq0uTN~FPZrOGP988wCfU3s_0Y8&Io5gdusr2|8?HgRmg*_^4i)8bVt3JQmf5rLCL67vDo6BBl9EQm%9pL zb;2#9=_28#^GQo>d1*)Cgg?Y~@8I4(5m8S+oNNo^4boi%HQ7y{Mdly9P4pf&D&SCb zs{F#p1fT(FPPK#XIV6uphfkBA5DAAKC?aAm*Ip{_gK&W!mA(*fvn5s|iwtv(+_Y}c zj7*yu<1tV*sVD^5dn(gM%JYp8OuT(5Sjg9RMuvk*LoEmgLQI{aRI)QYIE#F!{!Q6> zUFqI_C(wDvti}ePzPG=!!=-(1bM%+fn}_UXgz{f+0p(LuD8IHA${!ANn12Qc!ZuM* zD$IvLjB(IA1i~Xoo^X)(Wjq!{rE9)Bg;Z5T^@`Qf%!(z30hp0ez&&OgW8NmwD`%#} z8_p!$G=k8&9SPW7`$)iUcO;+y(WTGFzNfd}rvf!~GvUJ~41T98(kr)H!*Vd}st5{m6?r#VK?6bLDk_Q1j^wv6 zSsuYRRQ#*BqLTcusq$E&in89cuV^=AgL=tEMI$F!Dc6+jLm=8sv(QuJ_(Tk6sivxeBruhP3jW%cs5sh*ot}!CG582qH09CKIo5&(4nH0s=>ZXlC$M;4oDl| zIuVAoXzDFEzo@VZ>j`YjEq;ws#o&|@_9aEl=ua#L+#{r8>A}3zNy(Im>xF1Yo2q>y zT5(wUABdS&UkD4AF#)&Jm>`!g)QuQ9YP6k8G#&V6uXrG|ptj zxUn*>(}k3e`cXyWhE*Z1Q>H>YUZ=Xk>3p1e+^E`(&74;#jT>3{t`_v@s7zxcstZ}q zHLpo0O1H&=#dqJGHkNe1Zd)rTS3po0x`NU);XV_?(7lgfFaRvOj7W(=Pw0v+Km*Vf z*$GWJx^gL#K6XFOQqd90?b~(^cZ!Hy1=U1kgfqeuPC{HN-agF zYRMKfNfm`OH})YVewz!wN7zM%1fGMZ426uIAmo=Trsnlrbj!@XO}}#`zaO|$CVY5{ z+S9Wt+x0*$0oome(RZ0?3db4a_i+1p^~$g-|cuxT{Q`NlZ#w%s9PkLY1S zp$o1lUI1~pc10VvW@6yLjutZLKbn`O38y+c=<7M>W2NGc*w_^ddQ9khZboK`7Uf51 zx9a+5gYfCV9nIw$XT%xGdvhWQNMv6_mS~uJlmzb{%h_Yy>#-s#{I)EmZ(2F%#+6fs zXkjD2N*gHZR~{7~_iID8;goElMQTWGkwB{9+J1f*DLWm;y=|o_-L1fk>w{qQo*-Ni z#cm^p2-jN`ZUhL{xZIRPu6rzP_((1+r;#LWNimSoXA2Aj4Bb1(hQ>HIC_dvqwq*t? zkPgYI3^#PD&=un%1Hlr>v?14mZ2G<9rXJ5tczK-2N?{?KD1k5|X-sz{cR8X1l16^& z6#~k3AnKjlfhecPQN7E8o9A;9BfH&}KZ;35`WWTInqbQ zqs~4a#PbI%yH-zhVkmyD94a$R_(Avltf!y1wT$)^*#^3$6^|Vn( zIEe?@N=M4~0tpBkR%9Ak%h)HkIO2|iF`2iMi(kqi4AKU7ZSiOEL}C-LEY*Mzm67Di zxe1k=n^4L536-3mP|5iTm7JeY$@vMDTF zP{<<`TsWIE(7vXlWguC}J!4_sR^ADB$va8JbK31*5H5@`vNlX-_9 zq@;|zd-k574aBZizQS&HEvlDwl^@;nL}ig0dKi5KuTcFFJeL1d^xq;k`Qi(Oe8Gh| zt2|j;MgKtz^Nnc5F+GVt=G7~D$pN=mXH&mZgwJ_{)TEvjE9Da=->$Q!(hZw}a6cbN zg8;PbJt%$A78?2BiHIc?_qII((LA1H(dc}mM&B(7v7nUp1~|7jiOwedx5JtwPZWCa zGn7Jxm53rUn~qu{b-~=-+WIJX%Cn1+dLzzSS&p&=!8sROVAB`Zy7kGTRE43nsVW~& z)&XHYT>nXko{`sJ5Dt$mzB;|3B>-tYpvxrw48a_C z#*dcp2a4lw%mq%^(=p>HcelgNDs3qMoGGGAbjBa2w!>A=x=p!oVmQ+gWxe%Ps7M*t zMuQ+H`sB>$@EgLa#@68x3pP?KJoI-EG6sp=%Xj*0E?t0fq6zwK>u=zBTWFZ9-yymr zMFa6LH2jQ*Ca%)aRJc(eWi)GbqDeVD2v;*_pbv}rQCDRee3LBvj4CsF6Yk{_<*Lc< zf7E9;HBOVmN1`x1{Q-x_4t3J?ASe#=vzzy8_|OeP4+#!KG?N*>JDrBIy?`JpH{Fhn;J85|e>(}S~ zB(cd;2hsCt~ zNbLX+pE^xuOz#7@3|L&H%3~q^&-?7=x>~db6L=}ksUyjbEM$#T;W%7~eE2O-Ytl3@ zi|am7haL3UP2lwOh80JM^&kA%%~$j>Oul`(eVv$;gCncU92ztX5k;dlyWdd`j>y+G zz{t~CvzOCZJm9y}S#lwu0(k?X2@A&aGtya!117o3^L3G2th}4M$d;!dkN+2c z408=1!`%1(-;ZJ5U6_oPat5lIJ1lQQAo4RN0yB;@FqEAH;%*HKCc`+QZ%sdFw-8wP=hyN6{;%Ubpy5tgaauB9HXYK( z!lHIB9iQCE?N9C`naT*X_+VqbV)zhgJK*bh?Y1!<@+k3(FsBQUxB!QDip{^rot5m< z`eW}3Yc9goP;KfjLW0^pMO zCf$%{&XRVM6$|168DiSrabL$11@qCGf5g}E(oMk`_+$V4I-b@T4)HNTp^JmR4)TFS z&?O1-&#&XzhX~dd+%kt$0IT-QP7=_nF*|Hu!1Y06O*PqMwRxXxw)qt1mphJE{E0tn zU%1WYwiW!gHtOce-0s_$suVhRb=xE}4soe9AI&nVEIBJ$vX9{UmV8-TZLG4ND5T4h zv!d+ATL3p(*4FS>mnCOZ78r?}MaNf1(Kq*nVLxL*dCOtb$Uwc}OW38Q@7n?u6JQnd z+dm!65=`mibda&;7~zz;pd&vtgU9rh4n?*X20@)XNUZHC3(Ao%o!b>Jm zopTp%P+2S%Ui;nLb_k5hZcteVeN@;TD~(HN;y7G4z>92YJJ407c~@0@Tt(Z}#W}~r z0luL|@lv+<8V*p-Hg55MHNFP3s{-`hvW3@iB6GH|ZMrbX$5#|)5hwBB+>&e!t6xYu zuVUQW5>Ada_G_7pUZ!SCZLDf{YSiV8mF?=hg3Ms8;k4o`(B-J`nw4ti=O%mqT*b-BGb1xmh6KT% zs#t7R?Xu*oD7#+c>iXd&&fKV%>ousWR`zFD5YgiW{TMysM~r&7D=b z7eu*v7v+vPgHx!|Y_;A>XZY&as5I{=on@>=+2Wh3i!X9gg%u|hkEDw6VLrQRW?kML zK&nFl7>OYl&E$|Nc6d)tC+pMMAev3p%D}tg0mkmCm{0TX<;Hlg)6J-HLr`<_2#GW! z4^p7ABrOjq11vb>lXqd1_|P9lDb%{&ie#CrRPwYcGUzG|*)O+nxF_Jbu@?kn~a zXxe|p-eZMV;N(a48FkIsLoH@;ihcEod6n>As?U`8v7K*T_WdTe>0&A2QT9pt4SD%5 z4LG4s+s9p|7+vv*?{$l=)Q)4DWX_&1cgOEzx`Mnk?{0evC_@haYB!@W)x)z{Bn3FRl58ymo zSZd&a40mQdLL0a?5WVEs01#w6qxEyPmQf>X{KXs-^)|3pfe9onyDCOANzqzfFrge8 zN1YC&9Q;sB)bCG_^z%6^YN{MQYN{zMWU5Bf=dd{nrT8vQz>Q@)e+^`=yFI+@k%rVfDJGchYNVRpl2BIv>PG$OBx+$+Wwp`O?pP+H( z#kbJO;%0vym!o%Hgd0V@qV7@pS%MyEWPvLz3JOYJE$Gp){1)p{`&yZVj)eKCBHS;6 zgrCic{7y6ywp!Dt(lF7Nh(se9Zx4plx%&2rDgp;~W< z4uEanSstq{dk+0hE(f{wy|p3eCj)GzLIf0|IzQF zXIAWS4Pn|)BsPB<)71qR$Qu3*jaovh+N<<@#=<*%ST}f*I0%PouQHBe;Z@fAiAh?h=-mA3n^1&t}43(BwnH3gQu`2IXri*)y zM~0`oN^32WyZ)%TP&U}M9wR%&^q)V2=65-FSl!kXPz`lwZkHB{6haQ$VRTuOgpuKG z4Ga!jCt^knn3I)Z>Tw*VGUw48JIOic90M!<HlPx1kP&Wv>HO zpntL}L`I)474Me%>I((#NZ5=+X-aBjahX%>sUtbJsA@H*$YdN}kd1rC5SYRRMAuKB z#RN%R={N>Mhj5m2#nW9|TN@h0ufvQbxv2NEQ|sRET?qh$MR@xMwCbS@eL=d`?wd3Nm{^;XTLo=f{iil>`9F!2iOP4+lEUO za1ZJhv1@^^yQsKCf~jsJqcB&w7TrB2cb?NuB9x>fZim%C$#-LvBzS#5c+JICOh{pM zW{oO-P@{_VRDspR>|Q}$d;y5`^*`)e>vR4Xi6!`Q(quYnhgsD+4EQd;2Xb4D1I#Hg z0f{MmMN+cfK%F803T|)W(}1~5(Agp)+1&Q2RpsU#3>Al{8DM8Pdo}ur!uGIbEbx;B zAU0-r7g-T>K%J}M>cr*@?<#T=2dYFxY|rqnB6kf`#P*C(k+pt^4^`G3+b_JU$W5%M zGPj*FC2NOw6}dN5!@ZXanIj8<+kZDyIAJ(5gVLs>P{a-C4g57Vw!9fTl+b%KSt>IB z0HT6^y-OL-rQsh`%)>cn1T`msa23tBz-*D3Z`MmZlU8FMu3{ps#yng+kydLSu3{pM zxi%23R^!IwnY3E-a1~Q&)$?%iR9cOBxU!kFalfnQ;mXlG$-2toZY^KetLKv&PhO^JZ6F%MTU16X4o&JIbD^xz$Y>Zb9GFe=2y!};wor@y9} zRebCNC!~tSYlx3n*bGa2#KLA>Ro(0FNm$%_x%2+B ztLpU$RAN~1hOD*Y1WUX?VQoj!j`taDK=>X z9cCS1rVMEv*uYk(0RtE7fbrUbb?^;u%xvqD9Wa|RW@_l<7+mS(tTAI-NW3lKSd4+rf4}1DH$>|`9rO>976!MZYR+GF#l)0lzq7Fqd zQ!m8U-d`oeV#dk}F>=y97eBSak$vhp>tkN)Z>x_}(Y*@AU>ioW;p|vbOHOU2dmGm$ z-SgOq%>v$4DUS-|`r)=nQH)%Zl12*gaA)x0ov25)4?czi5!5C%6WKXwJzFu{8@@3# zK6qD!&I)B(V>Dv7tJY{#4Cd<2s@ALF5D ziKdbbQzr~tyY+YkJ|}Hty)>#mdO=weQ(FMcB<8u8Nl1Wt=((2g^RGg zama_3_o~$tUcz>2N`sXp1^k2^R(Hb=tb581tb6JXsoS0TtAia@9}=#6IT!wz)0&)L z>0cGE_BwTIvvYYr(PPU);Ci<~#|ARP+7qLW*eh{1q5_sT8Im4%B!r^^dyo9c+1DMN zv_O`mNF>f0*O`(_>5Q>hiDVKI&5_^5;{yemZAnZuI8OiJ+RX?>2^x2+MUV4(xV0CDcCpW>g_p}h_8^BoOH=7PaP9z zaWi;!8wxr$(~dHa+OAVIn&%JKZpKJZFnw%k_sFput*2O9ryE^dolF7QqM?gk(d42A zdfW-99jI-?9H!}_;6gO0yqC$(ce|wo802WW@v9@<$EY-$sfnZb!(BEHQracluyg6> zg@$?%dUC@gX5PZT1*O%whRNZ#gYZ}Ovs`M*HS9sr^sEh5e&q)d!wF13vMp2CcNqL1 zcqUH6F2m}`v;XruvU_Qd(%rd+iNoj*pEOVU<0xO$lK#R4Bj)6g&X=T0X%;`05V|8X zGZ{)hwUwUa_lMgUSNQQR-Itr3R})5vH_u_;#oQ3F<8VGckRzn634XW^(+`{c%=e0YaPChuY-QoPu4uJE6 zJD|>&tNZ?qI=AC%D!ukB_8+F3@;-ql(T~EP^%Dw)Y*PRfK zw0x^?_(N~u1k|uHJot<0{_52?-~Ri%pU$03 zb;11AYj3#iqkH?`8-D$r=kuq9W6#%%uDjRncN*>RbM^18{_^8{oEDC^7wdoU=W9Nf zKTUw?U0eUPcmL?iQFW`YdHMFopWNj%`~mlR?PFaVyPp2=`%VjYwbHBCeB=I~-?eEx z<%?jU2C%l&iJIxrX-FS+ADN@9RG=n#u^NObeeZkjpvNF=1z*p3Cb&?Fr1|0C{MmF| z4_2fe%rAfNnmGkTZ@NM&d?9sI6xM?ph2;xSL2w72!EUUz0lq>wO=2#RXNBUEUY^Ok z%9z}du^wsE^x_CR2{DgKaf>0Gs}W_S+qu%(oRk~$O6cWVb2eMHFV7ib9w#sqeNJ^89Vu_azx==2>0=Nrne z%MvO^fUxJc!PpWHR3dG z{EUs4tu}B2jakFCPb?-aFVs-y8zXIs3@{zPeGbOn)SAP=4G)&>hVGk;rD9$Kv{P?8 zkRV4bPu5mfC~peOjUYL{7p3fgYv7$WiwS5)c~jksG7pl0;{3HO57Z1toz69?c1JEx z%#iFj8Ngr@Ya`y8?AXi)m4rdY1dh5jAF+$LqRZ}#zZp>HR#dk;Pb{+)9q1?}uF-oa z-f&7q46v80KLLRx6`diG1txfuiy^#=o$E?JbWl396z}tLwVGUQrMVWITQ#FJT&zmZ z9L`Bk>PI=GSfW+y*0vSWj1*`rU7w5GS4ktu8>k*@TQB^`NAPKfpodR^9S}9t=v_M0 z=;a&)RgQRkvZH^`cs*il;srbd*ucVq^ypQO-S%kp(QR&ZNJ@?Snj$Ars+myvM*X*M zZYM&fK`|&AHyRsih(dZRmF=*sq`J2s_Owy0kSau3Rj8rhh=O4j(WG;0>O3#L$w3Q7 zS>mHXMGZ96egLXrneWCs#ga8?KjPhrs-<#^*A3a7Y^m%@YSDP!GrsGN84wV*$h-7X zUPePiL#|Io&7~K&+NVzs$$M#xX&1k-aAB)x1`_EPa;uOK?ZA_c(4ePLo(4~tuSWS= zA8W53{z`nMqVX9)DYW_MMlE?7QOUl$$W#&J0O{gkcbaH0W<*tK2^f?iksvCzFmYn{ znR2v}_K_d=!kX2$@2uuLBlWSIoH6@8iotL50LmfEXf(Z;EFB#?Z5CYiBw1@!_rK>8 zs;sR;93AGjWR%*V#YX9nADLgz`gUp8zvNwvMPzCC;>2+)T>??jx8}F&$4k`eKt8OG z;xQ87V%m+cuzlmlW2l;fb_jkjZZuR8Ek|Fhity7^_!rq!Ka z??s2NR1}ofUAh-Lij*DCt4Rd_Jl8|vJIKY);|iO9Z{h&>ke;#!1VH46rtpbAt+2e_ z%!_?wWglfd(Xtiw~tjC0W6ebAyr#%gNZ8%+298l=W??CnTJ z(g$p!A>}fu&D4r5t4l73xy%S-2}cs`EQjrEGf@19or@BhE>~%DUb}m=#ayD5gg3bI z{6zZNG=O)%M%wgQ6`2g*JGUBuSO**}S2^E13JS0?S zWR!0lKLUm|WI83qPX{)I$~Oz4z#aJrpBZF9OjTY%H1Fjs07I>;qNwlm!D&XUl+vA!)$8pMswLd;E5p6rkJeq7 zBir6IuUwK ziJ{v3sbJx)nq@Zr6cY2{{s?;{qD}fK?4=e`8~OwI&p!2P8Pyeiy2Wi<^j%?!sTy%> z`8v+JKhpn6B7Wi;;kw>5D!GeM>E5`39IbpI6l+M1-gqQ)8zK4HyhF14G(CtmpU^{> zMl>J*-xo|Z*=lX;Zn*JBK!fL;`C)8B6m<*Lxp9*e)>2cFExHQ#kJ!ctOhbhz#cgp% zj>Q9QqSOza5UQc`pE^rKDd@Y&q>f@SJ{Lpp!)jhMitFo2EfApzLEcY*Fxum!>0^^6Q-)cX?j;B|_A|g>D6(UyPw?bJ^bsZ!u%RV#o zqt${0gwLdplsHO?0+6m5i@+#nW-iTjn+H)Old|cn*ioPIgz8Qz!G?{=^jew^C zGw?k0YMDm>D|eNKIG_gVbE4c9e@kGiFT95C1xmj3CRdsIN1ehXb(WZZfE7i%K3dw4 zkZ`ro`TLECn`0y5WM`11oU>X+9)oNhu|f9gT`FB@pa5}8PQa&S2x;6e{=he8M;vQD=W0+xX>+yWNItl zm~q2FaBrR(+G9tv3*~YjSv6dqF5!jYcjdId1h3X^k+NofJg20xklFu|a7D0^sd3Dwr&zD>*bRQrM!FvUYSc@m;QC${%RGE^xld&I)u@ z80KH{VHW4EP$CYs)1>imm3^6WJ&xWp0AI>P?WklZf{d!%WZ0xn{HXZ!`&L}D?`@qM zD($rhUT3cv*ur)tjCt2B?}M>b%05pY<{1HIyZA)?U3o*P127ubp!8+yyo9*nD=2-= z2&WSDm5Bf9);m%OVbqZbi?9PGA^y!7F`k&AajL^ZXd zWcLmmp_O*95NdXCO@soCH@?8JKh<;tC==RVpFx`t4BGNAgwVEKXS~$fQ8C(R$<1!$ zg*JxE8)HHncP?=DA%`|^%MOLMg-LAD%dDE}J4=)ruiG4Rx_XOW-qs-V7Nx(G8)^nY zzATDa@qtWi$|KJC zv`(hvtGulgm8Am6VqY;Svj28IcOMkJ(yaWBe9lgA-S9_8cO3jX#>Yu*EtTUI5uY@M zh;O@wW<`821mWzcNu#jR)Ace#FmTOY+)S*9h)8Q6+XV zZ_M;*&aZWiDI}LrNWj`P2qQzP3R{~=l(kwS0bdb$fRrS0D}5MwYPRsfYzgclH)JG| ztC&jWc&Kc_3y9TsaViJjW4PAG3rw&&YnMTaJ}t9d*1bi7Rn7fd&VTvbnnK#wo0Fi^ zU+LNeF-z&oj*#s*IYU)S;eN%vldV(M{0H_=N>jTy7BP%!TO|#VGY|5BY zE5*+L;Ew(6@9NkMTlYRHHEv`C3*~;RxzuM+dORl-dlSqsUHXbW@)jksp>&Uv6kf#+ zCFQp#RBH`C+XJfYF&}nsA%!C$#IIHJ^fwej4ojxuJlWT@wipHHF?w^OJMUtR)%+N1 zB&jZxom9(EF1oAK3?>9hm4PBHXJ&9zXSne%rVzQ;&(eQJ!jX*mkcr~ef3TvPf{1NMo~2GPPUsxt(Ak7Q-Goq^FJ+ztRYNq2#Vo#UZzBbJ&N3= zwSQ&p^KWt?2f9yoHl(xO6|=r6nWm!{V_uSSRe8CfkuSAfEhT~SLJW$U!q4Ose3?4p z5s@kc2XF+Ox%cy9veCcpQ0!e%XD3yMSGULLR<0T=-9N0+-5yO>E*%?Y)8$}aNs8T; z)f1qr3kw%(|4UFBx$j8$x?yCoxESH*_V)zg>Y3pk`EVzr1|*V75%!NurD~}!>{~d- zs$xj;lS(5;>^myVErc)&3$+U;SE6eEed5X7-$n&t^XOu3uOMt0T^yeef?y=qlHkJN zY)_8j5gCDw- zjrDDC&=o$YmR z`xpn6r(K?}pewH4rg2HVXVKM5>BcG$aV6l7bKs9F?x~W3X9YE?d*|5rTtMyQIWh?Q z#ufKdp4ZgK^HxLbCA4~xP}n-&YHb@|oTL)FaV??V6+uP5ZkMlTd~t8(+k@+DYPyVi z9GWk(dwMwNayIRh)OeQRXcaA95G*i=m(ZV`4AzdFiU(>q8o1Vi=M7w&gl`D4k!uCl zI?m#L;uwLd>var^d)l>gg80dL-s_(CrEMkX9gYQoFv@4bSNUPgD?<=KA;R;Z834<06y0=Zc6kjD6$8k*t zrSbdLUEI*@k|hZdgoug3>vlPMc1cKLGQ**Pjq?n;JWab6U#(Vl5UYD&9AbWT3(fgsUlA&c^1JUuPVM?LqC^m9pkrw zYZF%q5io=6M6MNFYq-{NZR9GAVXV1UaIIyqn|E`~?UswL395K=hBHKmSYKd!uCB~M^ZUNCQD5gsHU)&9N@8U&jiqS z0L2=v^+l-JRnRmc0dy0uba_DACs+j?6B1l5H#`bcQZKv*mpv1bj!2TLGb;f^z=VUY zj;2>9gV{*+?-&QBUhOdT>I8r_ywc?dvzr|BpeI#0qJ(}|cpz1HBL#K&!mSfs^%D~m z3Mx0w(pF)&%h5A2;URJJ3f_rcE+7?OhJ!9&)1)My%X5MCHWtn8lN`P#B^pz@?-E+# zjW9JS(PT5mg9WZNTocN~qpAvhyA+L~L){Tm=K z@*_<9_AVZv{N)u zfR|$||M8SNnR3F?89X_GzAobLDLf6^%T8^U6Zor3l8`CNs@YCzo zeO(*-CT$4A!suIQgSTp9-=u~Uz=+EsoY3=rSHr-*iOf0yD5KE{n;Wc-mWD*ThRB5F zQ12;lsyH8h?R2@i8WK(j5zT2kwVbw8`^hirXh^VmJUV3+wMy^fJ5-bo+xK(Kyk8nl z*~!zu30kO|_hRV%5}6a#cmgsd&Nt}tHSM3q$z|3L$uOCGVf+4$0{2g7_bsOD&IZN{ zfNp`wF{dTZ1kzR9o3YtXNuU_mKN;1xn66yTU*!v153n3<2P8QnJaQa?D7l*)d(o2v z(qkH%*Zr>iK&t%FR(EVhw@z^_Oi6lpBIA`Yqr1ri{(Gh*lBhCIxza#xey!Ep^4i2e z4o!Jh<9wY}HZ#rn(Z1T>7tnIFYl8V<*sV;Am_mg80BY)7}Z}D|b zb&X9;8Z&nUm&99q{p5f|2Bs!PLZs)Lr@2v@mK0u1L0w+Ycanp`UDFaXC#CwrUROb1 zs)7v^)`hJgd#w3jtDxoJ>ekzN1^ss%oU~rv6HUkETkmx_`VLM;u~M@)Pj_9Io>a1e z3Uv8V>~uN0rYGV?Lf|sUL5m`<6M{I>)T zRIGds|4FDFOi2V=`wS-vW)!E3l&5ex@plnMn+Ve}ewkk~iq)>_J6B?)-<2JhkuX`( zs+^PQl$Ps$0WJCV`e!;wXBH1qdm=9NOk(K@YIj0J={ej9YV}bf>kx;g%Yo;d2%^qIi=`Pe4>@$!?8D~Fowwx7v(8?64npcstEcDCL`e(# z5}`}Lqp*LBACF6UBGVQNyLpzCYMGT_a|!UDi>TRZ*=|?1XV%ayO30i;P4Wq%7H7K_ zXK$^=8fCjFE0r=kQGJ)ti)9#f687iNR~)24a=}hbhZS=4x&q@Jbl!v$V(lz~L|7aApqBOOJ`xDekY zxY3hKc=AsADw-t<)p@wX>fwoO3FGmI@~gM%ANl*qzZ}_ec<~fLcs$q1)Tj1WSnm}* zk|88cb#lUCHLB}E+LqySG0=*iMFXO(2ir6_ekqk z-;u>7YV|a(N*U|MR@^3xmMJS|P){|^PBI?Ob7zRXGlK(3FZtebjWLV5UuWvG=XJ%S z)SC3%DTWKlV!4eMT0UX241K-RT3o^}@wwVQ%b-xZVe9K1x4b^#7WlN&J?%<8JrA?q zJ?%?9rG`QGwCSj%24at`N7*>E9hK0cV2oT~2aDi4fTzOBa(wUEXRYNb?=34A&5 zOG*jKuv?`N4n3qhR61Nvi_1+S#oD?1LE2tS+oW$2eim>YO}-0boQqPVKgHc?jakia z&Xp+#uP0yF{vFq=4$@_+`D`vp#FO|d=_YQT!Wg+a#oyA;;)8P;`$Rfb$|OmqRbX%_ z|H;ug#7YUma&TyH7%e~KMxlc=cAb+kch1Igq^W2u3bJ{g?N`~o5JseNXm|$F{$Vzw z7iI+dZzk6vT!(Va;+oBM7}p%Gxm@!s$4vgtB;QQ(%_QGU^35dQO!Cbn-%RqU7Uej^ z{yUVvv$$q+9mX|>YcAJ3Ye}^z$D#J$EdI{sI*e-$*Icf728~)$Ey^*={+rF;!?@;f z&E=YB5DOZ$q*|0?w*7Y)f9G(`<(fw+^-NF;BDJQPW^?JkIb3tO=J89tSI-2sAX00p zNxAgjT&{Wi6^7J%^-NF;BDJQPluQ53<3EQ*VMx7K&jhs~QfsP7xx&`2pqSsQ4s(GY z9~vz((|pNr$7u%SHUo7q17@570nLD%Fm+wEXvQK{4C1P zqP!@2IP@`_^0O&FoAR?MKb!KiDL-7gIgIj$QT{N>A4d7ZD1R8`hf7a$C_jhtb0|ND z@^dIZhw{Uvv$>R?OZmB!pG*0rTvF!eP@||)lqKrW2y2vtX<8--a!E2o_!I0ZcP>WJdBOQ8$mOU7 znH(!HDP>%*LQ!0X%DDn_^<7AvA5l9NYa8j?Rr|?Y&KQ#+r@qK^j-qigbfr8amFA2T zHz6x?R;|i}RtZ6p802B|kDWSdAssW7RulukNox1cJCt(YtrUoQNMmC&QF+d6dSwoV z+_WX8ER{x1#ZPE&5&jJ6JYnDvE=@#V!e31d%PeyaWNkA+XK!L8H2;)(FnwA`x3g&; z!L7KTo83T5z+XGGl6+({jl$?grHo21V1)8NoSz1hv+I zdzp%Dq=yQF8eKu)96rs^%E%REIC=>&oK8+rN!Y6zsJTxyAK_~zxHRaWH~oV5a;TL~ zr6tmR)skje{xw((tsNA+onXu~T$3gIeOGWgQU3<0NhPSchcsSO5tZP5zkffVlopzM zT>ciNqE3I`K|1Dj9x{}4w}0N_^Y#1t0e|28OJ9#t)#L9wNXH!I>lr~k{&`RO`AFdM z&j<9p(dQope82MblE&*tA_pUE*IV$@K^m|6@N=s+&#I}cUZ1ItG+w^aIE{&BE+12C z{cr5W#mK0f$l+{tEo3g0>;@q$1-r2AV9)) z@>nNGCu@+k&_&U>v&`O?M=X0g&fly2kY68Z94C7dq;@4FCJ#j(Xd=Yqp@|d~e*cYY zsf{#V=aGmSv0Lm9bt|t3i8QvR>lrBje1J5@RDEzbL-n{T(Lx%RcsKp?&pXo3!C<$4 z-jja*9$L`zMcDDAoPil2xa8L)Q783Mf?)~0OvJCE2##?T9eRQ~79-?HPf{I=xGF{I zbi}&+BSqny|1%w&C+$RQS>Bw<<;7_0Mp~d3ZKQFa|2S$(N0D3&L@2v`?w)k+1oN&x zar9wOxxqlwlPM8hJw>rqEOb-eR14{;!orEe#DbKbFdVHs+9D=8pQ07$v5PdON5uvd z-#X8ftNc5u7e)3Y991`18B|Gd*z|Ntyd_u>%|_m)$9g+C)m8^-+*VQ|iiQa@6;Z@~ zmAne7BE3YoSk9G{Y&7+K8RLH?msGxD)eWPt`FLar_GKC7PC}d^TM4tb@OUv__<1`@$cs6o|0?AGFOlb&$rievHMtWd23Q z!T~741CY1M4fXbshQjpWT-CWHsV+s%3D?ss{wJf$Da`c9hwZ<0^>vVD;$zi#bKEPc zkuy?-j#lSCcX5}`_j)xL(~3w)9+IC6Gd+2 z-s(?3X9ZBFf8LdTuBDOwd0+auR(|;BO}|goFWJt$)t`RO3aU>3yes`2z1FMeM>0yJ zaipa-HA)Xk<|^VZ(FR3^4g>ye*!3(+uldDImM(qd5vAob*5>Dv_FZ=D9HqD3F!2J?#%Eh+ z+)BFUH4k!RtQ$j%VKX z;QTEx7(?Zyx#Brqv7R@qf`{D7=OAwRzg9=gP)MlNp$D z5Xro-TjiEBo}}@t#@Xogv*JY`3r)gY5SKX#x`{MZVtL6viE1sgC?!Q>oqwVYQ7UQd zgjMPr%|^P}olDR%SqQvjZvHd%G}A}YE7ix9Tnm^{JUWI|JeMpfh%~vL%Jw;cHuPJX zOcs@MilmbygB{PNxkHwvi`ysEt67KV9j@C*V_a)CA8G73)T1(mP?3fS!sh=Dim#DBS>V#YCN4QCCAo?GTX6)^fJ|oHlE&aw zQ;+81mYd{NAY?jCIE&@j%yUmktpn7F1a2dZ<%4Wvg+9Vgy#@F#(inKzh(d*C?%bTe z&oz+F<<^_eCzn>pW689>Kwa=<8)@u5S6a^L_hNNEAAXJjZT0w}ciTLKf1;za< zQ7ZYlPHKyPn|!)ajsuy6hAz@qY2?RorAIpK^*Q>|Inv;UgUSJTO)uhbsty)SGQyd4 z!|l9NI~_{pR{HxMf8X!#2T0@Lh{QqIJm^|zA&u36RP0JvSq7t6*@mQ3In^K1xE`6u zV#%=AzwIN9mBloS4FA08rPT9-7&`8aNYc+w25bI#SNi#B)X)7J7t#APHEViP|5k{p zQt3K>Pk_(;^Xa-t?sfwU_uF3v0BEO!bV%As4_6iK^s5F2XMi;Jfos!F*t*%Z)G8CF|JW96%6!gjq`Om|7&Budg0 z-`n}C^<+oKuFC1;J(V$C2^bRK=Nb?vF~*5fa&D>Qlan*=cQv<=#v(*UUS;?oiNR@t zFG8nVW|T%WywguzRh<^2H8%2xe^IB`HbP1t7$S2muIwhW=&px!yzszo5sZ_AWuWx? zcLV8n#{=u}VD@UtG1x7n@%{+6W>Sj`ge_af(CPDak;dXpA}N!r?V4P%V?z^pr2ITXypk$4q=(;jxMT z@q_Q){JlM2UUBCMy`A40{PN|S$NhX+_}s_e`mG}e-?!$jeKvgb>YGoQIc4$x`N_TC zzx}T3+Asd}4?pt9eJ`(X{rv?eUD5dQZA9ae&w!5eqhd9UwrdnH_s38C zwCkGtANk3|0~Y+|;Tyld-!~rp%(72hbK9BkX;|L=>%ac$jPY+f=g!aV|6kvE{1XFD z{kdcH<}bG0b??0&dE-^fN1SoyhfbRD?OE^G-1+@e_P_t*&DS1(<2T>?+7%6#zwpF$ z9nW@r=9^F4e#3iKH9dC57X}`?rR};;tXS~%WxMbEz`&-_AHHwq%%!L7x9*Yl_q}_= zcb_`yQzMT!=)i|ci=X+)^_QIYsfLCx?(~D;>ObB4p_l$JahL1Q9{p@*chiX%jp^=e zp1SnaPrYr=ul-1b0?D-MZ|Sz5_8~gkAO6D?cU?2)hJh>Q9rgZub|3ZqcRza5`W1_R z|L#W*dGB@aT>ZN{KR@@!KRc%W<~{d6;DpZ{@Zv*1oq6k7|Jim|SM%JZkFWdn(mN-9 zZ1nf8zIpG9=fAM`=?}f_x07z4dfuC_|NTc-Og#IKxnI5U^5<^;)aNd^_1b0c`Rco` z81tvgC;aBh&pvbVS08-%mbYL3!MA_#b*JCh_3%lvyY5+g)87_<^}tU)ea6~Pee*L5 zAK$Ne-mhmpc*|{zKhyHLl{bI)uaAD~cPF3pK=0R{3hV#0=bs0gZo6XfPi}d%-2KE! zli&U4)AndNe8xUE_1?SosT=Qkdhtm=`eoaZ3-0**FR!}g#nOV$-?3=XW#5?C+IZh{ zAG`A-Q?EJo_R@3vY?|4To6>A9E2zP#VdN4kvuq=>n{7lIi_B`< zs5-tn9W}4jTG3RGRHR$Q6In>jP6)M;j`<{jXhH{%ztcbOQi>|?_4j?sccagTCqC$( zH+|IQYgO8f9Yp#avwb_sJQf*S`@iAJ{Yq1+a?hj|ZD`I+)`DyWH-A^gLQw#@GPi=C zZVpD~l}tEU4hm{jLmKvf%%Nz2G`2Q0Uu4Tlny=&SBBU{C?4DN-O=RWBWR)G`7L=}{ zMO&2Gt6I5-TUq;ZI(61!=fNPh}jOK9igz8$61)$Q+l{Cz*^#Jw2rv}Gh)Q~y@K z0o8Rq1($;?(o?1K6uW(;Bv2bj42(gw(hu@Jkt_b%Xz-^rQ)_Hb#xigVi`{+!XJ2OL zK$kMNmZcJ5M6?#^TE|ebZQQ)7Mqh@LW*#G}RCTH?&93U53q?DJRQ89cFIr&dOs*tv zrDaq`7%gBYi>#9ya>duw!g%>Oy3D^d$AR@vx?yV}jpH!j31eabpoHyuzZmi%eX~Yo zp`W*bW{HGxCfSYDE%qQiLUqsL8a{ixm5JPlMSM+t>6(rP zsnNP!S+H4WR_0+1nA&gh{Uwdf#A=voNz>|Q9=hfhk7Lr91xy=P8a=5;Y!BU^=-(~ z-6~Cgdq`tbxw5oYhbkW&(A1hM9;a63b7f;wQFKfj+7@CD3@akmOMU8jA88yxs-`pv z67kd(5v{j=nsR%gMM=ke7FeW}6<62u<%}Qc62W;IS7iuCaWRP#2`!D6wl`Jwc_GhN z#?iDhki+xI2X6Wn6C6Xm#C^3@*ZFG&iU^fVt^2 zxg_!^h2vDNqA|;9TM!Fc!R_FX3QvcoTs%)=SJ4^ml!$DZu%Eg$egmZO_#IDeoJe89 zRjrkS|3kT@cDbm^rG|I+TkX2N0B+XVVDDb*>g^#tN&T1GUp;kM8swa6G_4jksdlmg9Jx{$jldF<~E2;IZ zK%150PC7{9yGWckNNe$WU8F;zL2T@ZUXx5o>8RUDcU=b(G&!*-yFt?} zsm(K;x6>|+(nWfL(0?pf^{_?^ENeBb@)SCc_BN)~k00FDJE;9g#1?5B$f^_oi7AOPk*)&H!%`T7Y6~)L`eH7bgxvD@ z3{JB6Eh`^Fab}Y!| zie8_$k2J=vw&f_oCP8RH_~v$Mgd$r=V~QNAPuq;oe${>zih=ZEjotZNiXkhs=~T#4 zR9~_zNfe%@?7wq7`|qNC#&dx5XtjSN*OtdKt>$zt$Jy{l$_(!Ok{f|8(s-Ici#y!; zL94uP;FMU{uiS9t0O@{e|25YB4ED}T)k^d$UidB>Ip@cO?RPtvJ4j@G!~I( zn7U!b#-QFxAbm9z-jE1i4o+l8R9YRi2aeJ;K`zOF^&k(D$(p)1<>YLcSF(~il6aI? zJw2rH&~8gTDQ;`MkGdeHHqyx=lZgTrBuaWLwFN%n3q{<=WP0V%JE9aLzprJXJI?k%hZHc*!+zl=5!hx!6pCF6F{A0 zR)4xkV<@yp@J!rB=M;tg%A+wMjb~%UnvSJ_v$>NTt&9$7vVdT?ak7OBU=+|y3stRh zsGQ?dqw>DoilHbtB|$IcoOp5v^E+(+CSXA{9i%hG3_6mfa=nhM?MS36BzCTeHM7C{ zRelj2C!MYG@+NDQPfx*B)Y17ZS4S7=7VAh)URTu7`~Y<<2EC+l{AWv8bJ&p%Nc+8! zk!-l>SDg&}0BJn%QQ*`oqPaA1$JZ1C5MAGf^_K>Dntul}eu?#9F~$| zoTVqP@d9bweo|%uWo^E`U-{_30BOt*E}twl@xymqjuz4}chEgaF_sOs>p4B_AdPJy zXQ{YZV)-ty^y>As^r@CMU&~G)&_8c_h}w_}txAPA(zw>N7v$ulAJlH;2KpY-SbZv( zqa}i2zkfSGI_6H_=Far!VOOd}DQ&j<`wr4E?LJ?L(3zeCOAl$Rf6^9WR`Q2~K7Z49 zQ#h|2aWLA>d$B+VX&l&4znmO$GvVh#0SX04NXQOOY|L8Ao}xuzCxLPFTl4p5VL41j zda9URq5ewSFCB1+oN+-ReJXvT7T;xpC>`iXf(qfFZ>6a#6h21zD?y)DnYvYJlCl>9f|{<~ z$w>anaZfLWhywnu2C-S$tG{f_Ds26M8`d_`IFg^BBSG8=l#duAy{}>kHAe$kvAS>2 z*WL8PRNY%PSk#NkC|I^-Z?g4LXKoQTDCtqc-dwJ%%MltY%aC$$zq3-YuSH;1(JaT9 zVSBf$t%Edg3PVz(>c2Z6( z&_(($>eXAg6b^~psEFhx=4ASx$7Vq79#4z`k)=ej!Uxf~9BgN+IAg)ZwjTBUC5?6B z@Zq#N27Mh(kEQCUwio2$yQxdXOGU48Aj@oIWYJ1DWot4@8GyNgP%rcS!D_@g#F3^T@8@FR&-I%wPje`IRDt8u7fnDYn^l=E=)U+ zPP%9xmRsv8?^iPno<9aDUvr$uVE-D=Lks@Ip{U=R_=$K zid%C&E&>_UKo@CjqovmxC(AMB`Dz3_!om-KW7Ltyt)5WzfXCRzwD&<$}RHo_>ae5X2L!tK{Eg-vt zG`0if)~o~=*;`ivVrrtdSNZ8yA89=0I#jnJ;p8T4!`9v*9NrZds8gKP>eEehuba%` zfgaM>;&5yA6HZCflrs;L5!!;q(f%8Ux(?EKl&eKh>~!Tm&n;l0_X*ko z%YCG=q*-VZC7Nf~k&RKik!4pMovWJM=-lXP?jnuD@2{-pq~B5dVe6Bw_BPVEc9*Xj z+DIPCBp()i461gp-}F>!VkQfFbt_qUIqbIjX+vy0KpKjT59e~raFRCMcn=Hq&Znsl zO6nqwtpqW1tRs4r1B&b;joorNmZC`65=fxtXI!2Z(wJ(~bS*g-b}Eh5c zgtIHSv{z2kn#)*yl$>^S32Q2ns8zJqBC>d;Ba^q01c?Hw!<<^{{|}(i2$IHDaxH1% z?D?AeNjiV)delYw{+zn>u1uG*vt{Wnse{gt->#kN?sEY3kX|Wxv{foWaoWv^gxC&& zqxW~faTP;NdXeCG=PQ6C3WYgky$!Rby}zgRc3LO>qz%i*Xg;#Mw3A1HCV8Ieka0C4 zDuc=qr76Iy<$SVkR>JjCxZ4b5b3Z`BJuRdej+a%Tcx~9O9B_OGX{_YaGC|f_iu-$& zzm;y2UTfWcFWr`ih!*LcY%0OImx-8)#B((Q(xT%Pc60DQT{oNlh%jga9toR?2oLT} zcqm16b}B_Ubdg?dz+Yv+yR910A_KV&vbC~Pi`9TX2?^0d8b={&Nr+_s zVmcHTP1bswqjeLtEk;_B#v!&X*Or~ml93p#ZOn%GBCAF%Kv7Nq1**U8Q9TJ%b8o2D z^9TKN@^$Jt^wmY0@@*W2i9^ozmJXY!`hDI3(tX6x6S(C4UjhZ5L|%E6aR|5dPt<%B zeI;F{+=`5)L#C=b8q;*YDo4_dobywMrAJ%;?E2J38uQF$M)v6mspENK%MH4H{vOh} zU)A}2aCcC-A=0MjbHz*5uM4><{jjZD915Z)^UCU-vqFYrC5Fv^0fr-y8>EK{hN%XF zA`_Bq3eC#&myA*j$pyaU>q%BwyrEk)F#bKHW4=devE<&2v41|G6qaoME9qidB8{!J zEKNEga!DME+6Ei8U$sMh1ElecM%uHE=RR8h+vRK{P326&&oSL~`*E3i5=A!=Ccq@2okkxth*OySCw&svk2(t|3^7&N`W7lQz-OR)2FXwUEZ1{NjL3yzTx? zNA?Yr(Cy#!WZ!U7M8AJCkbT2C#pV}%JEW<0m=b9BZ#uGX(0twgO;7d>D^UCWn*q{T zYwGL<7Xk#5=0Vznu3AXrkWgBYMc=qmK1QI6G_FZDf{Rcq*5PaFBaJO?@sOnaN+g&p z?w5RPq;YH2u?04dx_n)vF%2iJNd{^(>3hG=IY64CVYR48Ln1e6z4c{kU5=b3Jxf%v zm@7H&MdLjU>X0^61ZX;vLE1ApXievnt5wMc#i4cTsLa$WtfjZ`SCLP>^*W|`Gc7{( zEu;sj#Rjh9C@YyMj#O+#3kQTJNgt;hnJw;CNoc5tG?pfnveU)Bmicp6b?}~hqPi5x z(Oz$ThQ^)Cs(BQJgb#+6R_6^99i&SHmll$2KTJe1{1^{w-=8n;@qOATr!Ia5`7j9A z^KzbEl)?|Nt^on7Km04(Uoz#m#<&|jYv8w1{R36kd?3#%(a_yTDbLsPJkNc&P8rJX zy%p4N;h5(+(q7UL{#n2BCY2b3%G-LiD#H?6#}5^Hh;)=P8q~eqjg9U|!%aNcIbDxs zYrZCr^rMjeDb=Mn>1Vo6Utu?;a)Og|pQuD>Y&KU^BE06>d~yFc7j>0sD}8Zm_v8sX z$vifCS;vE)^59jfOaIboc+CfaVm`F26lgwAT2PL#n_q_L-sr~-AEFk)pnpnrS>6ub zjPy?qDP3~Wr7O=``sO7oR-AX?xu?8kQTgEMXI^^NvZbrIowoeEGY?+5botUHmn=Q_ O@+FsCaPS37R{UQuCB*mu literal 215612 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 REI;_trEAVV`23}-{x7~vs%HQI From dfd8afeb700a7ad4717ece6d7bab262eb30719aa Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Thu, 24 Jul 2025 13:54:52 -0400 Subject: [PATCH 02/12] feat: add eval reasons to Local Bucketing Client to support parsing from WASM and implements default Eval Reasons --- .../sdk/server/common/model/EvalReason.java | 52 +++++++++++++++++++ .../sdk/server/common/model/Variable.java | 10 ++-- .../server/local/api/DevCycleLocalClient.java | 24 +++++++-- .../sdk/server/local/utils/ProtobufUtils.java | 26 ++++++++-- src/main/proto/variableForUserParams.proto | 7 +++ 5 files changed, 108 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java diff --git a/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java b/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java new file mode 100644 index 00000000..1265bea6 --- /dev/null +++ b/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java @@ -0,0 +1,52 @@ +package com.devcycle.sdk.server.common.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@AllArgsConstructor +@RequiredArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class EvalReason { + @Schema(description = "Evaluation reason", required = true) + @JsonProperty("reason") + private String reason; + + @Schema(description = "Details", required = false) + @JsonProperty("details") + private String details; + + @Schema(description = "Target ID", required = false) + @JsonProperty("targetId") + private String targetId; + + public static EvalReason defaultReason(DefaultReasonDetailsEnum details) { + return new EvalReason("DEFAULT", details.getValue(), null); + } + + public String getReason() { + return reason == null ? "UNKNOWN" : reason; + } + + public enum DefaultReasonDetailsEnum { + MISSING_CONFIG("Missing Config"), + USER_NOT_TARGETED("User Not Targeted"), + VARIABLE_TYPE_MISMATCH("Type Mismatch"), + ERROR("Error"); + + private final String value; + + DefaultReasonDetailsEnum(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } +} diff --git a/src/main/java/com/devcycle/sdk/server/common/model/Variable.java b/src/main/java/com/devcycle/sdk/server/common/model/Variable.java index 326842f6..d4893f76 100755 --- a/src/main/java/com/devcycle/sdk/server/common/model/Variable.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/Variable.java @@ -1,16 +1,17 @@ package com.devcycle.sdk.server.common.model; +import java.util.HashMap; +import java.util.LinkedHashMap; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonValue; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.HashMap; -import java.util.LinkedHashMap; - @Data @Builder @AllArgsConstructor @@ -32,6 +33,9 @@ public class Variable { @Builder.Default private Boolean isDefaulted = false; + @Schema(description = "Evaluation reason") + private EvalReason eval; + public enum TypeEnum { STRING("String"), BOOLEAN("Boolean"), diff --git a/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java b/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java index f9c2e05b..3c4744ee 100755 --- a/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java +++ b/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java @@ -1,9 +1,24 @@ package com.devcycle.sdk.server.local.api; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + import com.devcycle.sdk.server.common.api.IDevCycleClient; import com.devcycle.sdk.server.common.exception.BeforeHookError; import com.devcycle.sdk.server.common.logging.DevCycleLogger; -import com.devcycle.sdk.server.common.model.*; +import com.devcycle.sdk.server.common.model.BaseVariable; +import com.devcycle.sdk.server.common.model.DevCycleEvent; +import com.devcycle.sdk.server.common.model.DevCycleUser; +import com.devcycle.sdk.server.common.model.EvalHook; +import com.devcycle.sdk.server.common.model.EvalHooksRunner; +import com.devcycle.sdk.server.common.model.EvalReason; +import com.devcycle.sdk.server.common.model.Feature; +import com.devcycle.sdk.server.common.model.HookContext; +import com.devcycle.sdk.server.common.model.PlatformData; +import com.devcycle.sdk.server.common.model.Variable; import com.devcycle.sdk.server.common.model.Variable.TypeEnum; import com.devcycle.sdk.server.local.bucketing.LocalBucketing; import com.devcycle.sdk.server.local.managers.EnvironmentConfigManager; @@ -18,9 +33,8 @@ import com.devcycle.sdk.server.openfeature.DevCycleProvider; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import dev.openfeature.sdk.FeatureProvider; -import java.util.*; +import dev.openfeature.sdk.FeatureProvider; public final class DevCycleLocalClient implements IDevCycleClient { @@ -146,6 +160,7 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { } catch (Exception e) { DevCycleLogger.error("Unable to parse aggVariableDefaulted event for Variable " + key + " due to error: " + e, e); } + defaultVariable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.MISSING_CONFIG)); return defaultVariable; } @@ -177,11 +192,13 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { if (variableData == null || variableData.length == 0) { variable = defaultVariable; + variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.USER_NOT_TARGETED)); } else { SDKVariable_PB sdkVariable = SDKVariable_PB.parseFrom(variableData); if (sdkVariable.getType() != pbVariableType) { DevCycleLogger.warning("Variable type mismatch, returning default value"); variable = defaultVariable; + variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.VARIABLE_TYPE_MISMATCH)); } else { variable = ProtobufUtils.createVariable(sdkVariable, defaultValue); } @@ -200,6 +217,7 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { } finally { if (variable == null) { variable = defaultVariable; + variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.USER_NOT_TARGETED)); } evalHooksRunner.executeFinally(reversedHooks, hookContext, Optional.of(variable)); } diff --git a/src/main/java/com/devcycle/sdk/server/local/utils/ProtobufUtils.java b/src/main/java/com/devcycle/sdk/server/local/utils/ProtobufUtils.java index 56b94526..7eb3457f 100644 --- a/src/main/java/com/devcycle/sdk/server/local/utils/ProtobufUtils.java +++ b/src/main/java/com/devcycle/sdk/server/local/utils/ProtobufUtils.java @@ -1,16 +1,25 @@ package com.devcycle.sdk.server.local.utils; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + import com.devcycle.sdk.server.common.model.DevCycleUser; +import com.devcycle.sdk.server.common.model.EvalReason; import com.devcycle.sdk.server.common.model.Variable; -import com.devcycle.sdk.server.local.protobuf.*; +import com.devcycle.sdk.server.local.protobuf.CustomDataType; +import com.devcycle.sdk.server.local.protobuf.CustomDataValue; +import com.devcycle.sdk.server.local.protobuf.DVCUser_PB; +import com.devcycle.sdk.server.local.protobuf.EvalReason_PB; +import com.devcycle.sdk.server.local.protobuf.NullableCustomData; +import com.devcycle.sdk.server.local.protobuf.NullableDouble; +import com.devcycle.sdk.server.local.protobuf.NullableString; +import com.devcycle.sdk.server.local.protobuf.SDKVariable_PB; +import com.devcycle.sdk.server.local.protobuf.VariableType_PB; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - public class ProtobufUtils { public static DVCUser_PB createDVCUserPB(DevCycleUser user) { double appBuild = Double.NaN; @@ -50,6 +59,7 @@ public static Variable createVariable(SDKVariable_PB sdkVariable, T defau .value(sdkVariable.getBoolValue()) .defaultValue(defaultValue) .isDefaulted(false) + .eval(convertToEvalReason(sdkVariable.getEval())) .build(); break; case String: @@ -59,6 +69,7 @@ public static Variable createVariable(SDKVariable_PB sdkVariable, T defau .value(sdkVariable.getStringValue()) .defaultValue(defaultValue) .isDefaulted(false) + .eval(convertToEvalReason(sdkVariable.getEval())) .build(); break; case Number: @@ -68,6 +79,7 @@ public static Variable createVariable(SDKVariable_PB sdkVariable, T defau .value(sdkVariable.getDoubleValue()) .defaultValue(defaultValue) .isDefaulted(false) + .eval(convertToEvalReason(sdkVariable.getEval())) .build(); break; case JSON: @@ -80,6 +92,7 @@ public static Variable createVariable(SDKVariable_PB sdkVariable, T defau .value(jsonObject) .defaultValue(defaultValue) .isDefaulted(false) + .eval(convertToEvalReason(sdkVariable.getEval())) .build(); break; default: @@ -143,5 +156,8 @@ public static VariableType_PB convertTypeEnumToVariableType(Variable.TypeEnum ty } } + public static EvalReason convertToEvalReason(EvalReason_PB eval) { + return new EvalReason(eval.getReason(), eval.getDetails(), eval.getTargetId()); + } } diff --git a/src/main/proto/variableForUserParams.proto b/src/main/proto/variableForUserParams.proto index 0c73af78..abb5e321 100644 --- a/src/main/proto/variableForUserParams.proto +++ b/src/main/proto/variableForUserParams.proto @@ -70,4 +70,11 @@ message SDKVariable_PB { double doubleValue = 5; string stringValue = 6; NullableString evalReason = 7; + EvalReason_PB eval = 9; } + +message EvalReason_PB { + string reason = 1; + string details = 2; + string target_id = 3; +} \ No newline at end of file From 264122a1e5988d0078fe7bb94909e443b51b2df0 Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Thu, 24 Jul 2025 16:08:32 -0400 Subject: [PATCH 03/12] chore: update Local Bucketing tests to verify Eval Reasons are properly set and returned --- .../server/local/DevCycleLocalClientTest.java | 104 +++++++++++++----- .../sdk/server/local/LocalBucketingTest.java | 35 +++--- 2 files changed, 100 insertions(+), 39 deletions(-) diff --git a/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java b/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java index 50ae80b6..e610d325 100644 --- a/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java +++ b/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java @@ -1,39 +1,43 @@ package com.devcycle.sdk.server.local; -import com.devcycle.sdk.server.cloud.api.DevCycleCloudClient; -import com.devcycle.sdk.server.cloud.model.DevCycleCloudOptions; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.X509TrustManager; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; + import com.devcycle.sdk.server.common.api.IRestOptions; import com.devcycle.sdk.server.common.exception.DevCycleException; import com.devcycle.sdk.server.common.logging.IDevCycleLogger; -import com.devcycle.sdk.server.common.model.*; +import com.devcycle.sdk.server.common.model.BaseVariable; +import com.devcycle.sdk.server.common.model.DevCycleEvent; +import com.devcycle.sdk.server.common.model.DevCycleUser; +import com.devcycle.sdk.server.common.model.EvalHook; +import com.devcycle.sdk.server.common.model.EvalReason; +import com.devcycle.sdk.server.common.model.Feature; +import com.devcycle.sdk.server.common.model.HookContext; +import com.devcycle.sdk.server.common.model.Variable; import com.devcycle.sdk.server.helpers.LocalConfigServer; -import com.devcycle.sdk.server.local.model.Project; -import com.devcycle.sdk.server.local.model.Environment; import com.devcycle.sdk.server.helpers.TestDataFixtures; -import com.devcycle.sdk.server.helpers.WhiteBox; import com.devcycle.sdk.server.local.api.DevCycleLocalClient; import com.devcycle.sdk.server.local.model.ConfigMetadata; import com.devcycle.sdk.server.local.model.DevCycleLocalOptions; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.After; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; -import retrofit2.mock.Calls; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.X509TrustManager; -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import java.util.*; - -import static org.mockito.Mockito.when; +import com.devcycle.sdk.server.local.model.Environment; +import com.devcycle.sdk.server.local.model.Project; @RunWith(MockitoJUnitRunner.class) public class DevCycleLocalClientTest { @@ -151,6 +155,11 @@ public void variableTest() { var = client.variable(user, "string-var", "default string"); Assert.assertNotNull(var); Assert.assertEquals("variationOn", var.getValue()); + + EvalReason varEval = var.getEval(); + Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); + Assert.assertEquals("All Users", varEval.getDetails()); + Assert.assertEquals("63125321d31c601f992288bc", varEval.getTargetId()); } @Test @@ -162,6 +171,11 @@ public void variableBooleanValueTest() { Assert.assertNotNull(var); Assert.assertFalse(var.getIsDefaulted()); Assert.assertEquals(true, var.getValue()); + + EvalReason varEval = var.getEval(); + Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); + Assert.assertEquals("All Users", varEval.getDetails()); + Assert.assertEquals("63125321d31c601f992288bc", varEval.getTargetId()); } @Test @@ -172,6 +186,11 @@ public void variableNumberValueTest() { Assert.assertNotNull(var); Assert.assertFalse(var.getIsDefaulted()); Assert.assertEquals(12345.0, var.getValue().doubleValue(), 0.0); + + EvalReason varEval = var.getEval(); + Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); + Assert.assertEquals("All Users", varEval.getDetails()); + Assert.assertEquals("63125321d31c601f992288bc", varEval.getTargetId()); } @Test @@ -192,6 +211,11 @@ public void variableJsonValueTest() { Assert.assertEquals("This variation is on", variableData.get("displayText")); Assert.assertEquals(true, variableData.get("showDialog")); Assert.assertEquals(100, variableData.get("maxUsers")); + + EvalReason varEval = var.getEval(); + Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); + Assert.assertEquals("All Users", varEval.getDetails()); + Assert.assertEquals("63125321d31c601f992288bc", varEval.getTargetId()); } @Test @@ -203,6 +227,7 @@ public void variableTestNotInitialized() { Assert.assertNotNull(var); Assert.assertTrue(var.getIsDefaulted()); Assert.assertEquals("default string", var.getValue()); + Assert.assertEquals(EvalReason.DefaultReasonDetailsEnum.MISSING_CONFIG.getValue(), var.getEval().getDetails()); } @Test @@ -226,6 +251,11 @@ public void variableTestWithCustomData() { Assert.assertNotNull(var); Assert.assertFalse(var.getIsDefaulted()); Assert.assertEquals("variationOn", var.getValue()); + + EvalReason varEval = var.getEval(); + Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); + Assert.assertEquals("All Users", varEval.getDetails()); + Assert.assertEquals("63125321d31c601f992288bc", varEval.getTargetId()); } @Test @@ -243,6 +273,11 @@ public void variableTestBucketingWithCustomData() { Assert.assertNotNull(var); Assert.assertFalse(var.getIsDefaulted()); Assert.assertEquals("↑↑↓↓←→←→BA 🤖", var.getValue()); + + EvalReason varEval = var.getEval(); + Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); + Assert.assertEquals("Custom Data -> should-bucket", varEval.getDetails()); + Assert.assertEquals("638680d659f1b81cc9e6c5ab", varEval.getTargetId()); } @Test @@ -251,6 +286,11 @@ public void variableTestUnknownVariableKey() { Assert.assertNotNull(var); Assert.assertTrue(var.getIsDefaulted()); Assert.assertEquals(true, var.getValue()); + + EvalReason varEval = var.getEval(); + Assert.assertEquals("DEFAULT", varEval.getReason()); + Assert.assertEquals("User Not Targeted", varEval.getDetails()); + Assert.assertNull(varEval.getTargetId()); } @Test @@ -259,6 +299,11 @@ public void variableTestTypeMismatch() { Assert.assertNotNull(var); Assert.assertTrue(var.getIsDefaulted()); Assert.assertEquals(true, var.getValue()); + + EvalReason varEval = var.getEval(); + Assert.assertEquals("DEFAULT", varEval.getReason()); + Assert.assertEquals("User Not Targeted", varEval.getDetails()); + Assert.assertNull(varEval.getTargetId()); } @Test @@ -371,6 +416,11 @@ public void SetClientCustomDataWithBucketingTest() { Assert.assertNotNull(var); Assert.assertFalse(var.getIsDefaulted()); Assert.assertEquals("↑↑↓↓←→←→BA 🤖", var.getValue()); + + EvalReason varEval = var.getEval(); + Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); + Assert.assertEquals("Custom Data -> should-bucket", varEval.getDetails()); + Assert.assertEquals("638680d659f1b81cc9e6c5ab", varEval.getTargetId()); } @Test @@ -664,6 +714,7 @@ public void onFinally(HookContext ctx, Optional> variab .type(Variable.TypeEnum.STRING) .isDefaulted(false) .defaultValue("default string") + .eval(new EvalReason("TARGETING_MATCH", "All Users", "63125321d31c601f992288bc")) .build(); Variable result = client.variable(user, "string-var", "default string"); @@ -934,6 +985,7 @@ public void error(HookContext ctx, Throwable e) { .type(Variable.TypeEnum.STRING) .isDefaulted(false) .defaultValue("default string") + .eval(new EvalReason("TARGETING_MATCH", "All Users", "63125321d31c601f992288bc")) .build(); Variable result = client.variable(user, "string-var", "default string"); diff --git a/src/test/java/com/devcycle/sdk/server/local/LocalBucketingTest.java b/src/test/java/com/devcycle/sdk/server/local/LocalBucketingTest.java index 25ad3f4b..b8bf04a8 100644 --- a/src/test/java/com/devcycle/sdk/server/local/LocalBucketingTest.java +++ b/src/test/java/com/devcycle/sdk/server/local/LocalBucketingTest.java @@ -1,5 +1,15 @@ package com.devcycle.sdk.server.local; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; + import com.devcycle.sdk.server.common.model.DevCycleEvent; import com.devcycle.sdk.server.common.model.DevCycleUser; import com.devcycle.sdk.server.common.model.PlatformData; @@ -8,15 +18,6 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; @RunWith(MockitoJUnitRunner.class) public class LocalBucketingTest { @@ -73,13 +74,21 @@ public void testStoreConfig() { @Test public void testEventQueue() throws JsonProcessingException { - DevCycleEvent event = DevCycleEvent.builder().type("test").target("target").build(); + DevCycleEvent customEvent = DevCycleEvent.builder() + .type("test") + .target("target") + .build(); + DevCycleEvent aggEvent = DevCycleEvent.builder() + .type("aggVariableDefaulted") + .target("string-var") + .metaData(Map.of("evalReason", "DEFAULT")) + .build(); localBucketing.initEventQueue(apiKey, UUID.randomUUID().toString(),"{}"); // Add 2 events, aggregated by same target (should create 1 event with eventCount 2) - localBucketing.queueEvent(apiKey, mapper.writeValueAsString(getUser()), mapper.writeValueAsString(event)); - localBucketing.queueAggregateEvent(apiKey, mapper.writeValueAsString(event), varMap); + localBucketing.queueEvent(apiKey, mapper.writeValueAsString(getUser()), mapper.writeValueAsString(customEvent)); + localBucketing.queueAggregateEvent(apiKey, mapper.writeValueAsString(aggEvent), varMap); FlushPayload[] payloads = localBucketing.flushEventQueue(apiKey); Assert.assertEquals(payloads.length, 1); Assert.assertEquals(payloads[0].eventCount, 2); @@ -99,7 +108,7 @@ public void testEventQueue() throws JsonProcessingException { Assert.assertEquals(payloads.length, 0); // failed events deleted // Add another event - localBucketing.queueEvent(apiKey, mapper.writeValueAsString(getUser()), mapper.writeValueAsString(event)); + localBucketing.queueEvent(apiKey, mapper.writeValueAsString(getUser()), mapper.writeValueAsString(customEvent)); payloads = localBucketing.flushEventQueue(apiKey); Assert.assertEquals(payloads.length, 1); From f35852780e0d557e710f647afc4020d285fd2a88 Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Thu, 24 Jul 2025 16:32:34 -0400 Subject: [PATCH 04/12] feat: add eval reasons to Cloud Bucketing Client --- .../server/cloud/api/DevCycleCloudClient.java | 28 ++++++++-- .../server/cloud/DevCycleCloudClientTest.java | 54 ++++++++++++------- .../sdk/server/helpers/TestResponse.java | 11 ++-- 3 files changed, 65 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java b/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java index 465803a0..e05737f3 100755 --- a/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java +++ b/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java @@ -1,5 +1,12 @@ package com.devcycle.sdk.server.cloud.api; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + import com.devcycle.sdk.server.cloud.model.DevCycleCloudOptions; import com.devcycle.sdk.server.common.api.IDevCycleApi; import com.devcycle.sdk.server.common.api.IDevCycleClient; @@ -8,19 +15,29 @@ import com.devcycle.sdk.server.common.exception.BeforeHookError; import com.devcycle.sdk.server.common.exception.DevCycleException; import com.devcycle.sdk.server.common.logging.DevCycleLogger; -import com.devcycle.sdk.server.common.model.*; +import com.devcycle.sdk.server.common.model.BaseVariable; +import com.devcycle.sdk.server.common.model.DevCycleEvent; +import com.devcycle.sdk.server.common.model.DevCycleResponse; +import com.devcycle.sdk.server.common.model.DevCycleUser; +import com.devcycle.sdk.server.common.model.DevCycleUserAndEvents; +import com.devcycle.sdk.server.common.model.ErrorResponse; +import com.devcycle.sdk.server.common.model.EvalHook; +import com.devcycle.sdk.server.common.model.EvalHooksRunner; +import com.devcycle.sdk.server.common.model.EvalReason; +import com.devcycle.sdk.server.common.model.Feature; +import com.devcycle.sdk.server.common.model.HookContext; +import com.devcycle.sdk.server.common.model.HttpResponseCode; +import com.devcycle.sdk.server.common.model.Variable; import com.devcycle.sdk.server.common.model.Variable.TypeEnum; import com.devcycle.sdk.server.openfeature.DevCycleProvider; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.exc.MismatchedInputException; + import dev.openfeature.sdk.FeatureProvider; import retrofit2.Call; import retrofit2.Response; -import java.io.IOException; -import java.util.*; - public final class DevCycleCloudClient implements IDevCycleClient { private static final ObjectMapper OBJECT_MAPPER = ObjectMapperUtils.createDefaultObjectMapper(); @@ -134,8 +151,8 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { throw beforeError; } - evalHooksRunner.executeAfter(reversedHooks, context, variable); variable.setIsDefaulted(false); + evalHooksRunner.executeAfter(reversedHooks, context, variable); } catch (Throwable exception) { if (!(exception instanceof BeforeHookError || exception instanceof AfterHookError)) { variable = (Variable) Variable.builder() @@ -145,6 +162,7 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { .defaultValue(defaultValue) .isDefaulted(true) .build(); + variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.USER_NOT_TARGETED)); } evalHooksRunner.executeError(reversedHooks, context, exception); diff --git a/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java b/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java index 3c28b336..12624873 100755 --- a/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java +++ b/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java @@ -1,32 +1,42 @@ package com.devcycle.sdk.server.cloud; -import com.devcycle.sdk.server.cloud.api.DevCycleCloudClient; -import com.devcycle.sdk.server.cloud.model.DevCycleCloudOptions; -import com.devcycle.sdk.server.common.api.DVCApiMock; -import com.devcycle.sdk.server.common.api.IDevCycleApi; -import com.devcycle.sdk.server.common.exception.DevCycleException; -import com.devcycle.sdk.server.common.model.*; -import com.devcycle.sdk.server.helpers.WhiteBox; -import dev.openfeature.sdk.Hook; -import net.bytebuddy.implementation.bytecode.Throw; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import retrofit2.Call; -import retrofit2.mock.Calls; +import static org.mockito.Mockito.when; import java.math.BigDecimal; import java.time.Instant; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; -import java.util.*; -import static org.mockito.Mockito.when; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import com.devcycle.sdk.server.cloud.api.DevCycleCloudClient; +import com.devcycle.sdk.server.cloud.model.DevCycleCloudOptions; +import com.devcycle.sdk.server.common.api.DVCApiMock; +import com.devcycle.sdk.server.common.api.IDevCycleApi; +import com.devcycle.sdk.server.common.exception.DevCycleException; +import com.devcycle.sdk.server.common.model.BaseVariable; +import com.devcycle.sdk.server.common.model.DevCycleEvent; +import com.devcycle.sdk.server.common.model.DevCycleUser; +import com.devcycle.sdk.server.common.model.DevCycleUserAndEvents; +import com.devcycle.sdk.server.common.model.EvalHook; +import com.devcycle.sdk.server.common.model.EvalReason; +import com.devcycle.sdk.server.common.model.Feature; +import com.devcycle.sdk.server.common.model.HookContext; +import com.devcycle.sdk.server.common.model.Meta; +import com.devcycle.sdk.server.common.model.PlatformData; +import com.devcycle.sdk.server.common.model.Variable; +import com.devcycle.sdk.server.helpers.WhiteBox; + +import retrofit2.mock.Calls; /** * API tests for DevcycleApi @@ -91,6 +101,11 @@ public void getVariableByKeyTest() { assertUserDefaultsCorrect(user); Assert.assertFalse(variable.getValue()); + + EvalReason varEval = variable.getEval(); + Assert.assertEquals("TARGETING_MATCH", varEval.getReason()); + Assert.assertEquals("All Users", varEval.getDetails()); + Assert.assertEquals("test_cloud_target_id", varEval.getTargetId()); } catch (IllegalArgumentException e) { e.printStackTrace(); } @@ -567,6 +582,7 @@ public void onFinally(HookContext ctx, Optional> variab .type(Variable.TypeEnum.STRING) .isDefaulted(false) .defaultValue("default string") + .eval(new EvalReason("TARGETING_MATCH", "All Users", "test_target_id")) .build(); when(apiInterface.getVariableByKey(user, "test-string", dvcOptions.getEnableEdgeDB())).thenReturn(Calls.response(expected)); diff --git a/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java b/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java index 7df4ec19..42e819e9 100644 --- a/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java +++ b/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java @@ -1,16 +1,18 @@ package com.devcycle.sdk.server.helpers; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + import com.devcycle.sdk.server.common.model.BaseVariable; import com.devcycle.sdk.server.common.model.DevCycleResponse; +import com.devcycle.sdk.server.common.model.EvalReason; import com.devcycle.sdk.server.common.model.Feature; import com.devcycle.sdk.server.common.model.Variable; + import retrofit2.Call; import retrofit2.mock.Calls; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - public final class TestResponse { private TestResponse() { @@ -84,6 +86,7 @@ public static Call getVariableByKey() { .key("test-false") .value(false) .type(Variable.TypeEnum.BOOLEAN) + .eval(new EvalReason("TARGETING_MATCH", "All Users", "test_cloud_target_id")) .build(); return Calls.response(variable); From a2e1517208cab894c96c3b5f0b4a7e47de886a11 Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Thu, 24 Jul 2025 16:42:56 -0400 Subject: [PATCH 05/12] chore: add temporary override to Test Harness Capabilities --- .github/workflows/run-test-harness.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-test-harness.yml b/.github/workflows/run-test-harness.yml index 4751a14c..f8ad6b7e 100644 --- a/.github/workflows/run-test-harness.yml +++ b/.github/workflows/run-test-harness.yml @@ -17,4 +17,4 @@ jobs: sdks-to-test: java sdk-github-sha: ${{github.event.pull_request.head.sha}} github-token: ${{ secrets.TEST_HARNESS_GH_SECRET }} - + sdk-capabilities: '["cloud", "edgeDB", "clientCustomData", "v2Config", "allFeatures", "allVariables", "evalReason", "eventsEvalReason", "cloudEvalReason"]' From b7009fd34ea8c406d82df297293ec093e1e49221 Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Thu, 24 Jul 2025 17:46:08 -0400 Subject: [PATCH 06/12] chore: refactor to ensure Default events before the SDK is initialized are tracked correctly --- .../sdk/server/common/model/EvalReason.java | 13 +++++++++---- .../devcycle/sdk/server/common/model/Variable.java | 4 ++++ .../sdk/server/local/api/DevCycleLocalClient.java | 9 +++++++-- .../server/local/managers/EventQueueManager.java | 13 +++++++------ 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java b/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java index 1265bea6..de6d81b6 100644 --- a/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java @@ -17,16 +17,21 @@ public class EvalReason { @JsonProperty("reason") private String reason; - @Schema(description = "Details", required = false) + @Schema(description = "Details") @JsonProperty("details") private String details; - @Schema(description = "Target ID", required = false) - @JsonProperty("targetId") + @Schema(description = "Target ID") + @JsonProperty("target_id") private String targetId; + private EvalReason(String reason, String details) { + this.reason = reason; + this.details = details; + } + public static EvalReason defaultReason(DefaultReasonDetailsEnum details) { - return new EvalReason("DEFAULT", details.getValue(), null); + return new EvalReason("DEFAULT", details.getValue()); } public String getReason() { diff --git a/src/main/java/com/devcycle/sdk/server/common/model/Variable.java b/src/main/java/com/devcycle/sdk/server/common/model/Variable.java index d4893f76..f30bdff4 100755 --- a/src/main/java/com/devcycle/sdk/server/common/model/Variable.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/Variable.java @@ -33,6 +33,10 @@ public class Variable { @Builder.Default private Boolean isDefaulted = false; + @Builder.Default + @Deprecated() + private String evalReason = null; + @Schema(description = "Evaluation reason") private EvalReason eval; diff --git a/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java b/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java index 3c4744ee..a619c959 100755 --- a/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java +++ b/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java @@ -155,12 +155,17 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { if (!isInitialized()) { DevCycleLogger.info("Variable called before DevCycleLocalClient has initialized, returning default value"); + defaultVariable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.MISSING_CONFIG)); try { - eventQueueManager.queueAggregateEvent(DevCycleEvent.builder().type("aggVariableDefaulted").target(key).build(), null); + eventQueueManager.queueAggregateEvent(DevCycleEvent.builder() + .type("aggVariableDefaulted") + .target(key) + .metaData(Map.of("evalReason", defaultVariable.getEval().getReason())) + .build(), + null); } catch (Exception e) { DevCycleLogger.error("Unable to parse aggVariableDefaulted event for Variable " + key + " due to error: " + e, e); } - defaultVariable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.MISSING_CONFIG)); return defaultVariable; } diff --git a/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java b/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java index a26440b0..ef323948 100644 --- a/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java +++ b/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java @@ -1,5 +1,11 @@ package com.devcycle.sdk.server.local.managers; +import java.io.IOException; +import java.util.Arrays; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + import com.devcycle.sdk.server.common.api.IDevCycleApi; import com.devcycle.sdk.server.common.logging.DevCycleLogger; import com.devcycle.sdk.server.common.model.DevCycleEvent; @@ -13,15 +19,10 @@ import com.devcycle.sdk.server.local.model.FlushPayload; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; + import retrofit2.Call; import retrofit2.Response; -import java.io.IOException; -import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - public class EventQueueManager { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); From 4165d15ed1e81131c03a64f6245a63d9e6ba6e97 Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Thu, 24 Jul 2025 18:24:35 -0400 Subject: [PATCH 07/12] fix: properly set variable type mismatch as eval details on Cloud Bucketing Client --- .../devcycle/sdk/server/cloud/api/DevCycleCloudClient.java | 7 ++++++- .../com/devcycle/sdk/server/common/model/EvalReason.java | 4 +++- .../sdk/server/local/managers/EventQueueManager.java | 7 +++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java b/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java index e05737f3..d2d42207 100755 --- a/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java +++ b/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java @@ -162,7 +162,12 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { .defaultValue(defaultValue) .isDefaulted(true) .build(); - variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.USER_NOT_TARGETED)); + + if (exception.getMessage().equals("Variable type mismatch, returning default value")) { + variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.VARIABLE_TYPE_MISMATCH)); + } else { + variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.USER_NOT_TARGETED)); + } } evalHooksRunner.executeError(reversedHooks, context, exception); diff --git a/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java b/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java index de6d81b6..1a0cad3f 100644 --- a/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java @@ -1,6 +1,7 @@ package com.devcycle.sdk.server.common.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; @@ -23,6 +24,7 @@ public class EvalReason { @Schema(description = "Target ID") @JsonProperty("target_id") + @JsonInclude(value=JsonInclude.Include.NON_EMPTY, content=JsonInclude.Include.NON_NULL) private String targetId; private EvalReason(String reason, String details) { @@ -41,7 +43,7 @@ public String getReason() { public enum DefaultReasonDetailsEnum { MISSING_CONFIG("Missing Config"), USER_NOT_TARGETED("User Not Targeted"), - VARIABLE_TYPE_MISMATCH("Type Mismatch"), + VARIABLE_TYPE_MISMATCH("Variable Type Mismatch"), ERROR("Error"); private final String value; diff --git a/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java b/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java index ef323948..59f2089d 100644 --- a/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java +++ b/src/main/java/com/devcycle/sdk/server/local/managers/EventQueueManager.java @@ -116,10 +116,13 @@ public void queueAggregateEvent(DevCycleEvent event, BucketedUserConfig bucketed return; } + String eventString = OBJECT_MAPPER.writeValueAsString(event); + if (bucketedConfig != null) { - this.localBucketing.queueAggregateEvent(this.sdkKey, OBJECT_MAPPER.writeValueAsString(event), OBJECT_MAPPER.writeValueAsString(bucketedConfig.variableVariationMap)); + String variableVariationMapString = OBJECT_MAPPER.writeValueAsString(bucketedConfig.variableVariationMap); + this.localBucketing.queueAggregateEvent(this.sdkKey, eventString, variableVariationMapString); } else { - this.localBucketing.queueAggregateEvent(this.sdkKey, OBJECT_MAPPER.writeValueAsString(event), "{}"); + this.localBucketing.queueAggregateEvent(this.sdkKey, eventString, "{}"); } } From c3f575a86d65ac95dd0b0e5c86e26066734cb8bc Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Thu, 24 Jul 2025 18:43:30 -0400 Subject: [PATCH 08/12] feat: adds support for allVariables calls to return eval reasons --- .../server/cloud/api/DevCycleCloudClient.java | 2 +- .../sdk/server/common/model/BaseVariable.java | 4 +++ .../server/cloud/DevCycleCloudClientTest.java | 36 +++++++++++++++++++ .../sdk/server/common/api/DVCApiMock.java | 15 +++++--- .../sdk/server/helpers/TestResponse.java | 18 ++++++++-- 5 files changed, 68 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java b/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java index d2d42207..1dd7ba5b 100755 --- a/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java +++ b/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java @@ -166,7 +166,7 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { if (exception.getMessage().equals("Variable type mismatch, returning default value")) { variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.VARIABLE_TYPE_MISMATCH)); } else { - variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.USER_NOT_TARGETED)); + variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.ERROR)); } } diff --git a/src/main/java/com/devcycle/sdk/server/common/model/BaseVariable.java b/src/main/java/com/devcycle/sdk/server/common/model/BaseVariable.java index 1c0055c2..43628052 100644 --- a/src/main/java/com/devcycle/sdk/server/common/model/BaseVariable.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/BaseVariable.java @@ -3,6 +3,7 @@ import com.devcycle.sdk.server.common.model.Variable.TypeEnum; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -27,4 +28,7 @@ public class BaseVariable { @Schema(required = true, description = "Variable value can be a string, number, boolean, or JSON") private Object value; + + @Schema(description = "Evaluation reason") + private EvalReason eval; } diff --git a/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java b/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java index 12624873..bb51ad34 100755 --- a/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java +++ b/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java @@ -111,6 +111,34 @@ public void getVariableByKeyTest() { } } + @Test + public void getVariableTypeMismatchTest() { + DevCycleUser user = DevCycleUser.builder() + .userId("j_test") + .build(); + + String key = "type-mismatch"; + + when(apiInterface.getVariableByKey(user, key, dvcOptions.getEnableEdgeDB())).thenReturn(dvcApiMock.getVariableByKey(user, key, dvcOptions.getEnableEdgeDB())); + + Variable variable; + try { + variable = api.variable(user, key, true); + + assertUserDefaultsCorrect(user); + + Assert.assertTrue(variable.getValue()); + Assert.assertTrue(variable.getIsDefaulted()); + + EvalReason varEval = variable.getEval(); + Assert.assertEquals("DEFAULT", varEval.getReason()); + Assert.assertEquals("Variable Type Mismatch", varEval.getDetails()); + Assert.assertNull(varEval.getTargetId()); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } + } + @Test public void getVariableValueByKeyTest() { DevCycleUser user = DevCycleUser.builder() @@ -145,6 +173,14 @@ public void getVariablesTest() throws DevCycleException { assertUserDefaultsCorrect(user); Assert.assertNotNull(variables); + Assert.assertEquals(4, variables.size()); + BaseVariable testNumber = variables.get("test-number"); + Assert.assertNotNull(testNumber); + Assert.assertEquals(100, (int) testNumber.getValue()); + Assert.assertEquals(Variable.TypeEnum.NUMBER, testNumber.getType()); + Assert.assertEquals("SPLIT", testNumber.getEval().getReason()); + Assert.assertEquals("Random Distribution | User Id", testNumber.getEval().getDetails()); + Assert.assertEquals("test_cloud_target_id", testNumber.getEval().getTargetId()); } @Test diff --git a/src/test/java/com/devcycle/sdk/server/common/api/DVCApiMock.java b/src/test/java/com/devcycle/sdk/server/common/api/DVCApiMock.java index d866c255..244e4a8d 100644 --- a/src/test/java/com/devcycle/sdk/server/common/api/DVCApiMock.java +++ b/src/test/java/com/devcycle/sdk/server/common/api/DVCApiMock.java @@ -1,11 +1,18 @@ package com.devcycle.sdk.server.common.api; -import com.devcycle.sdk.server.common.model.*; +import java.util.Map; + +import com.devcycle.sdk.server.common.model.BaseVariable; +import com.devcycle.sdk.server.common.model.DevCycleResponse; +import com.devcycle.sdk.server.common.model.DevCycleUser; +import com.devcycle.sdk.server.common.model.DevCycleUserAndEvents; +import com.devcycle.sdk.server.common.model.Feature; +import com.devcycle.sdk.server.common.model.ProjectConfig; +import com.devcycle.sdk.server.common.model.Variable; import com.devcycle.sdk.server.helpers.TestResponse; import com.devcycle.sdk.server.local.model.EventsBatch; -import retrofit2.Call; -import java.util.Map; +import retrofit2.Call; public class DVCApiMock implements IDevCycleApi { @@ -16,7 +23,7 @@ public Call> getFeatures(DevCycleUser user, Boolean enabled @Override public Call getVariableByKey(DevCycleUser user, String key, Boolean enabledEdgeDB) { - return TestResponse.getVariableByKey(); + return TestResponse.getVariableByKey(key); } @Override diff --git a/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java b/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java index 42e819e9..6cdc3cb9 100644 --- a/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java +++ b/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java @@ -57,37 +57,51 @@ public static Call> getVariables() { .key("test-false") .value(false) .type(Variable.TypeEnum.BOOLEAN) + .eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id")) .build()); variables.put("test-true", BaseVariable.builder() .id(UUID.randomUUID().toString()) .key("test-true") .value(true) .type(Variable.TypeEnum.BOOLEAN) + .eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id")) .build()); variables.put("test-number", BaseVariable.builder() .id(UUID.randomUUID().toString()) .key("test-number") .value(100) .type(Variable.TypeEnum.NUMBER) + .eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id")) .build()); variables.put("test-json", BaseVariable.builder() .id(UUID.randomUUID().toString()) .key("test-json") .value("{'some':'json''}") .type(Variable.TypeEnum.JSON) + .eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id")) .build()); return Calls.response(variables); } @SuppressWarnings("unchecked") - public static Call getVariableByKey() { - Variable variable = (Variable) Variable.builder() + public static Call getVariableByKey(String key) { + Variable variable = null; + if (key.equals("type-mismatch")) { + variable = (Variable) Variable.builder() + .key("type-mismatch") + .value(100) + .type(Variable.TypeEnum.NUMBER) + .eval(new EvalReason("TARGETING_MATCH", "All Users", "test_cloud_target_id")) + .build(); + } else { + variable = (Variable) Variable.builder() .key("test-false") .value(false) .type(Variable.TypeEnum.BOOLEAN) .eval(new EvalReason("TARGETING_MATCH", "All Users", "test_cloud_target_id")) .build(); + } return Calls.response(variable); } From 13aa4f705010c775a9e6aca3d81aa345d227f195 Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Fri, 25 Jul 2025 13:09:06 -0400 Subject: [PATCH 09/12] chore: simplify error reasons to use ErrorMessage enum --- .../server/cloud/api/DevCycleCloudClient.java | 16 +++++++--------- .../server/common/model/ErrorResponse.java | 19 +++++++++++++++++++ .../server/local/api/DevCycleLocalClient.java | 11 ++++++----- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java b/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java index 1dd7ba5b..6ae551e8 100755 --- a/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java +++ b/src/main/java/com/devcycle/sdk/server/cloud/api/DevCycleCloudClient.java @@ -117,13 +117,11 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { validateUser(user); if (key == null || key.equals("")) { - ErrorResponse errorResponse = new ErrorResponse(500, "Missing parameter: key", null); - throw new IllegalArgumentException("Missing parameter: key"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.MISSING_PARAMETER.getMessage("key")); } if (defaultValue == null) { - ErrorResponse errorResponse = new ErrorResponse(500, "Missing parameter: defaultValue", null); - throw new IllegalArgumentException("Missing parameter: defaultValue"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.MISSING_PARAMETER.getMessage("defaultValue")); } TypeEnum variableType = TypeEnum.fromClass(defaultValue.getClass()); @@ -145,7 +143,7 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { Call response = api.getVariableByKey(user, key, dvcOptions.getEnableEdgeDB()); variable = getResponseWithRetries(response, 5); if (variable.getType() != variableType) { - throw new IllegalArgumentException("Variable type mismatch, returning default value"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.VARIABLE_TYPE_MISMATCH.getMessage()); } if (beforeError != null) { throw beforeError; @@ -163,7 +161,7 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { .isDefaulted(true) .build(); - if (exception.getMessage().equals("Variable type mismatch, returning default value")) { + if (exception.getMessage().equals(ErrorResponse.ErrorMessage.VARIABLE_TYPE_MISMATCH.getMessage())) { variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.VARIABLE_TYPE_MISMATCH)); } else { variable.setEval(EvalReason.defaultReason(EvalReason.DefaultReasonDetailsEnum.ERROR)); @@ -227,7 +225,7 @@ public void track(DevCycleUser user, DevCycleEvent event) throws DevCycleExcepti validateUser(user); if (event == null || event.getType() == null || event.getType().equals("")) { - throw new IllegalArgumentException("Invalid DevCycleEvent"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.INVALID_EVENT.getMessage()); } DevCycleUserAndEvents userAndEvents = DevCycleUserAndEvents.builder() @@ -338,10 +336,10 @@ private boolean isValidServerKey(String serverKey) { private void validateUser(DevCycleUser user) { if (user == null) { - throw new IllegalArgumentException("DevCycleUser cannot be null"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.NULL_USER.getMessage()); } if (user.getUserId().equals("")) { - throw new IllegalArgumentException("userId cannot be empty"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.USER_ID_MISSING.getMessage()); } } } diff --git a/src/main/java/com/devcycle/sdk/server/common/model/ErrorResponse.java b/src/main/java/com/devcycle/sdk/server/common/model/ErrorResponse.java index 24234421..0162f89c 100755 --- a/src/main/java/com/devcycle/sdk/server/common/model/ErrorResponse.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/ErrorResponse.java @@ -13,6 +13,7 @@ package com.devcycle.sdk.server.common.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -33,4 +34,22 @@ public class ErrorResponse { @Schema(description = "Additional error information detailing the error reasoning") private Object data; + + public enum ErrorMessage { + MISSING_PARAMETER("Missing parameter: %s"), + NULL_USER("DevCycleUser cannot be null"), + USER_ID_MISSING("userId cannot be empty"), + INVALID_EVENT("Invalid DevCycleEvent"), + VARIABLE_TYPE_MISMATCH("Variable type mismatch, returning default value"); + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage(String... args) { + return String.format(message, args); + } + } } diff --git a/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java b/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java index a619c959..377bcd71 100755 --- a/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java +++ b/src/main/java/com/devcycle/sdk/server/local/api/DevCycleLocalClient.java @@ -12,6 +12,7 @@ import com.devcycle.sdk.server.common.model.BaseVariable; import com.devcycle.sdk.server.common.model.DevCycleEvent; import com.devcycle.sdk.server.common.model.DevCycleUser; +import com.devcycle.sdk.server.common.model.ErrorResponse; import com.devcycle.sdk.server.common.model.EvalHook; import com.devcycle.sdk.server.common.model.EvalHooksRunner; import com.devcycle.sdk.server.common.model.EvalReason; @@ -137,11 +138,11 @@ public Variable variable(DevCycleUser user, String key, T defaultValue) { validateUser(user); if (key == null || key.equals("")) { - throw new IllegalArgumentException("Missing parameter: key"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.MISSING_PARAMETER.getMessage("key")); } if (defaultValue == null) { - throw new IllegalArgumentException("Missing parameter: defaultValue"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.MISSING_PARAMETER.getMessage("defaultValue")); } TypeEnum variableType = TypeEnum.fromClass(defaultValue.getClass()); @@ -266,7 +267,7 @@ public void track(DevCycleUser user, DevCycleEvent event) { validateUser(user); if (event == null || event.getType().equals("")) { - throw new IllegalArgumentException("Invalid DevCycleEvent"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.INVALID_EVENT.getMessage()); } try { @@ -347,10 +348,10 @@ public String getSDKPlatform() { private void validateUser(DevCycleUser user) { if (user == null) { - throw new IllegalArgumentException("DevCycleUser cannot be null"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.NULL_USER.getMessage()); } if (user.getUserId().equals("")) { - throw new IllegalArgumentException("userId cannot be empty"); + throw new IllegalArgumentException(ErrorResponse.ErrorMessage.USER_ID_MISSING.getMessage()); } } From 9755b9fbf15ff6979a91c22b24e8f241eba8def7 Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Fri, 25 Jul 2025 14:54:15 -0400 Subject: [PATCH 10/12] chore: add _feature to Variable protos for encoding/decoding from WASM Bucketing --- .github/workflows/run-test-harness.yml | 3 +-- src/main/proto/variableForUserParams.proto | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/run-test-harness.yml b/.github/workflows/run-test-harness.yml index f8ad6b7e..3b087340 100644 --- a/.github/workflows/run-test-harness.yml +++ b/.github/workflows/run-test-harness.yml @@ -16,5 +16,4 @@ jobs: with: sdks-to-test: java sdk-github-sha: ${{github.event.pull_request.head.sha}} - github-token: ${{ secrets.TEST_HARNESS_GH_SECRET }} - sdk-capabilities: '["cloud", "edgeDB", "clientCustomData", "v2Config", "allFeatures", "allVariables", "evalReason", "eventsEvalReason", "cloudEvalReason"]' + sdk-capabilities: '{ "Java": ["cloud", "edgeDB", "clientCustomData", "v2Config", "allVariables", "allFeatures", "variablesFeatureId", "evalReason", "cloudEvalReason", "eventsEvalReason"]}' diff --git a/src/main/proto/variableForUserParams.proto b/src/main/proto/variableForUserParams.proto index abb5e321..e79b9036 100644 --- a/src/main/proto/variableForUserParams.proto +++ b/src/main/proto/variableForUserParams.proto @@ -70,6 +70,7 @@ message SDKVariable_PB { double doubleValue = 5; string stringValue = 6; NullableString evalReason = 7; + NullableString _feature = 8; EvalReason_PB eval = 9; } From 324a69403813df6b776cc9d3df01fa664cff831a Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Fri, 25 Jul 2025 16:45:39 -0400 Subject: [PATCH 11/12] chore: add featureId as property on BaseVariable --- .../com/devcycle/sdk/server/common/model/BaseVariable.java | 4 ++++ .../devcycle/sdk/server/cloud/DevCycleCloudClientTest.java | 3 ++- .../java/com/devcycle/sdk/server/helpers/TestResponse.java | 4 ++++ .../devcycle/sdk/server/local/DevCycleLocalClientTest.java | 5 +++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/devcycle/sdk/server/common/model/BaseVariable.java b/src/main/java/com/devcycle/sdk/server/common/model/BaseVariable.java index 43628052..d9303a3f 100644 --- a/src/main/java/com/devcycle/sdk/server/common/model/BaseVariable.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/BaseVariable.java @@ -31,4 +31,8 @@ public class BaseVariable { @Schema(description = "Evaluation reason") private EvalReason eval; + + @Schema(description = "Feature ID") + @JsonProperty("_feature") + private String featureId; } diff --git a/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java b/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java index bb51ad34..7434d01d 100755 --- a/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java +++ b/src/test/java/com/devcycle/sdk/server/cloud/DevCycleCloudClientTest.java @@ -161,7 +161,7 @@ public void getVariableValueByKeyTest() { } @Test - public void getVariablesTest() throws DevCycleException { + public void allVariablesTest() throws DevCycleException { DevCycleUser user = DevCycleUser.builder() .userId("j_test") .build(); @@ -177,6 +177,7 @@ public void getVariablesTest() throws DevCycleException { BaseVariable testNumber = variables.get("test-number"); Assert.assertNotNull(testNumber); Assert.assertEquals(100, (int) testNumber.getValue()); + Assert.assertEquals("62fbf6566f1ba302829f9e32", testNumber.getFeatureId()); Assert.assertEquals(Variable.TypeEnum.NUMBER, testNumber.getType()); Assert.assertEquals("SPLIT", testNumber.getEval().getReason()); Assert.assertEquals("Random Distribution | User Id", testNumber.getEval().getDetails()); diff --git a/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java b/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java index 6cdc3cb9..05adbdc5 100644 --- a/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java +++ b/src/test/java/com/devcycle/sdk/server/helpers/TestResponse.java @@ -58,6 +58,7 @@ public static Call> getVariables() { .value(false) .type(Variable.TypeEnum.BOOLEAN) .eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id")) + .featureId("62fbf6566f1ba302829f9e32") .build()); variables.put("test-true", BaseVariable.builder() .id(UUID.randomUUID().toString()) @@ -65,6 +66,7 @@ public static Call> getVariables() { .value(true) .type(Variable.TypeEnum.BOOLEAN) .eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id")) + .featureId("62fbf6566f1ba302829f9e32") .build()); variables.put("test-number", BaseVariable.builder() .id(UUID.randomUUID().toString()) @@ -72,6 +74,7 @@ public static Call> getVariables() { .value(100) .type(Variable.TypeEnum.NUMBER) .eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id")) + .featureId("62fbf6566f1ba302829f9e32") .build()); variables.put("test-json", BaseVariable.builder() .id(UUID.randomUUID().toString()) @@ -79,6 +82,7 @@ public static Call> getVariables() { .value("{'some':'json''}") .type(Variable.TypeEnum.JSON) .eval(new EvalReason("SPLIT", "Random Distribution | User Id", "test_cloud_target_id")) + .featureId("62fbf6566f1ba302829f9e32") .build()); return Calls.response(variables); diff --git a/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java b/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java index e610d325..30156a65 100644 --- a/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java +++ b/src/test/java/com/devcycle/sdk/server/local/DevCycleLocalClientTest.java @@ -377,6 +377,11 @@ public void allVariablesTest() { Assert.assertEquals(variables.get("num-var").getId(), "65272363125123fca69d3a7d"); Assert.assertEquals(variables.get("json-var").getId(), "64372363125123fca69d3f7b"); Assert.assertEquals(variables.size(), 4); + + Assert.assertEquals(variables.get("string-var").getFeatureId(), "62fbf6566f1ba302829f9e32"); + Assert.assertEquals(variables.get("a-cool-new-feature").getFeatureId(), "62fbf6566f1ba302829f9e32"); + Assert.assertEquals(variables.get("num-var").getFeatureId(), "62fbf6566f1ba302829f9e32"); + Assert.assertEquals(variables.get("json-var").getFeatureId(), "62fbf6566f1ba302829f9e32"); } @Test From 9240ce7eb72304ba5a9ce6022d5d3f13e03fcebf Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi Date: Fri, 25 Jul 2025 20:23:23 -0400 Subject: [PATCH 12/12] fix: update EvalReason class to only parse non_null attributes --- .../sdk/server/common/api/IDevCycleApi.java | 21 +++++++++++++++---- .../sdk/server/common/model/EvalReason.java | 2 +- .../sdk/server/common/model/Variable.java | 11 ++++++---- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/devcycle/sdk/server/common/api/IDevCycleApi.java b/src/main/java/com/devcycle/sdk/server/common/api/IDevCycleApi.java index bdc2e91f..58d41fec 100755 --- a/src/main/java/com/devcycle/sdk/server/common/api/IDevCycleApi.java +++ b/src/main/java/com/devcycle/sdk/server/common/api/IDevCycleApi.java @@ -1,11 +1,24 @@ package com.devcycle.sdk.server.common.api; -import com.devcycle.sdk.server.common.model.*; +import java.util.Map; + +import com.devcycle.sdk.server.common.model.BaseVariable; +import com.devcycle.sdk.server.common.model.DevCycleResponse; +import com.devcycle.sdk.server.common.model.DevCycleUser; +import com.devcycle.sdk.server.common.model.DevCycleUserAndEvents; +import com.devcycle.sdk.server.common.model.Feature; +import com.devcycle.sdk.server.common.model.ProjectConfig; +import com.devcycle.sdk.server.common.model.Variable; import com.devcycle.sdk.server.local.model.EventsBatch; -import retrofit2.Call; -import retrofit2.http.*; -import java.util.Map; +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.Header; +import retrofit2.http.Headers; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; public interface IDevCycleApi { /** diff --git a/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java b/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java index 1a0cad3f..e089b127 100644 --- a/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java @@ -13,6 +13,7 @@ @AllArgsConstructor @RequiredArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) public class EvalReason { @Schema(description = "Evaluation reason", required = true) @JsonProperty("reason") @@ -24,7 +25,6 @@ public class EvalReason { @Schema(description = "Target ID") @JsonProperty("target_id") - @JsonInclude(value=JsonInclude.Include.NON_EMPTY, content=JsonInclude.Include.NON_NULL) private String targetId; private EvalReason(String reason, String details) { diff --git a/src/main/java/com/devcycle/sdk/server/common/model/Variable.java b/src/main/java/com/devcycle/sdk/server/common/model/Variable.java index f30bdff4..a0dabc64 100755 --- a/src/main/java/com/devcycle/sdk/server/common/model/Variable.java +++ b/src/main/java/com/devcycle/sdk/server/common/model/Variable.java @@ -3,7 +3,9 @@ import java.util.HashMap; import java.util.LinkedHashMap; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonValue; import io.swagger.v3.oas.annotations.media.Schema; @@ -33,13 +35,14 @@ public class Variable { @Builder.Default private Boolean isDefaulted = false; - @Builder.Default - @Deprecated() - private String evalReason = null; - @Schema(description = "Evaluation reason") + @JsonProperty("eval") private EvalReason eval; + @Deprecated() + @JsonIgnore + private final String evalReason = null; + public enum TypeEnum { STRING("String"), BOOLEAN("Boolean"),