From f79390838a28c2af29c7659161a37d5864437488 Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Tue, 29 Sep 2026 18:52:42 +0300 Subject: [PATCH] render3d: a glTF material's factors are drawn - base colour, roughness, metallic and emission gltf_factors reads pbrMetallicRoughness.baseColorFactor, metallicFactor, roughnessFactor and the emissiveFactor into the primitive (pr.fac), and prim_factors hands them to every program that draws its textures (actors, the scatter's meshes and levels, the impostor bake) as 1 - factor, so a program never given them - or a material that gives none (pr.fac null) - multiplies by 1 and draws as before. An untextured material with a colour (or a metal/roughness) samples a pure white for it, so the factor is exactly what it draws: horse_cornea is its own colour, not the 200 grey every untextured part had. Co-Authored-By: Claude Opus 5.5 --- packages/ludic.render3d/actor.ludic | 1 + packages/ludic.render3d/env.ludic | 1 + packages/ludic.render3d/gltf.ludic | 43 ++- packages/ludic.render3d/scatter.ludic | 3 + packages/ludic.render3d/shaders/bake.frag | 3 +- packages/ludic.render3d/shaders/model.frag | 8 +- .../shaders/spv/01089da8.frag.spv | Bin 43988 -> 44636 bytes .../shaders/spv/1ce5c5d1.frag.spv | Bin 47900 -> 48548 bytes .../shaders/spv/1fde9cd2.frag.spv | Bin 43988 -> 44636 bytes .../shaders/spv/254e7887.frag.spv | Bin 41236 -> 41488 bytes .../shaders/spv/3b183d8f.frag.spv | Bin 46620 -> 46872 bytes .../shaders/spv/439a2253.frag.spv | Bin 4724 -> 4912 bytes .../shaders/spv/4dda406a.frag.spv | Bin 47104 -> 47752 bytes .../shaders/spv/5e70d731.frag.spv | Bin 48316 -> 48964 bytes .../shaders/spv/79b77ed9.frag.spv | Bin 45680 -> 45848 bytes .../shaders/spv/86f427b0.frag.spv | Bin 6776 -> 6964 bytes .../shaders/spv/9dce3246.frag.spv | Bin 4724 -> 4912 bytes .../shaders/spv/a5ad521e.frag.spv | Bin 44644 -> 45292 bytes .../shaders/spv/b20fdcb5.frag.spv | Bin 49992 -> 50244 bytes .../shaders/spv/b4587cd4.frag.spv | Bin 53728 -> 53980 bytes .../shaders/spv/b603a056.frag.spv | Bin 47104 -> 47752 bytes .../shaders/spv/b8cff226.frag.spv | Bin 49992 -> 50244 bytes .../shaders/spv/b9fc2041.frag.spv | Bin 43988 -> 44636 bytes .../shaders/spv/cb13f3c6.frag.spv | Bin 49992 -> 50244 bytes .../shaders/spv/d48d6a48.frag.spv | Bin 54792 -> 55044 bytes .../shaders/spv/f4a2b586.frag.spv | Bin 54792 -> 55044 bytes .../ludic.render3d/shaders/spv/manifest.txt | 276 +++++++++++------- 27 files changed, 221 insertions(+), 114 deletions(-) diff --git a/packages/ludic.render3d/actor.ludic b/packages/ludic.render3d/actor.ludic index 3393abb1..48886f9d 100644 --- a/packages/ludic.render3d/actor.ludic +++ b/packages/ludic.render3d/actor.ludic @@ -220,6 +220,7 @@ function actor_draw_one(render3d_st: mut Render3dState, a: Actor, ap: AcProg, sh else { u_v3(render3d_st, ap.l_tint, a.tint) } } gpu_tex_unit(render3d_st, 0); gpu_tex_bind(render3d_st, GPU_TEX2D, pr.diff) + prim_factors(render3d_st, ap.prog, pr) if not shadow { gpu_tex_unit(render3d_st, 1); gpu_tex_bind(render3d_st, GPU_TEX2D, pr.nrm) gpu_tex_unit(render3d_st, 2); gpu_tex_bind(render3d_st, GPU_TEX2D, pr.arm) diff --git a/packages/ludic.render3d/env.ludic b/packages/ludic.render3d/env.ludic index 6ca513cf..a6188f2f 100644 --- a/packages/ludic.render3d/env.ludic +++ b/packages/ludic.render3d/env.ludic @@ -836,6 +836,7 @@ export state Render3dState { tb_key: string = "" tb_version: int = 0 tb_shadow_ok: bool = false # the shadow came from its bake this map + gltf_pure: int = 0 # a 1x1 white a factor multiplies exactly (gltf_factors) tt_dir: string = "" # terrain_tiles_to: where a map's tiles are written ("" keeps the whole copies) tt_key: string = "" tt_file: pointer = null # the tiles' file, open for reading (terrain_tiles.ludic) diff --git a/packages/ludic.render3d/gltf.ludic b/packages/ludic.render3d/gltf.ludic index 8710c4f5..7900981c 100644 --- a/packages/ludic.render3d/gltf.ludic +++ b/packages/ludic.render3d/gltf.ludic @@ -11,7 +11,8 @@ property Prim { nrm: int = 0, arm: int = 0, verts: int = 0, # vertices in the mesh (each attribute buffer holds this many) - name: string # the material's name (a part to tint: "hk_jacket") + name: string, # the material's name (a part to tint: "hk_jacket") + fac: floats # the material's factors, or null (all 1, no emission): base r g b a, roughness, metallic, emissive r g b } property Model { prims: []Prim, @@ -155,6 +156,7 @@ function gltf_prim(render3d_st: mut Render3dState, p: Val) -> Prim { if ud != null { pr.diff = gltf_texture(render3d_st, ud, true) } if un != null { pr.nrm = gltf_texture(render3d_st, un, false) } if ua != null { pr.arm = gltf_texture(render3d_st, ua, false) } + gltf_factors(render3d_st, pr, mat, ud != null, ua != null) var mname: string = null # a copy: the document goes, strings and all, at the next load if value_has(mat, "name") != 0 { let s = value_as_str(value_get(mat, "name")); mname = s[0 .. len(s)] } @@ -174,6 +176,45 @@ function gltf_prim(render3d_st: mut Render3dState, p: Val) -> Prim { return pr } +# The material's factors (glTF's pbrMetallicRoughness and emissiveFactor), which the shaders multiply in; +# a material that gives none keeps pr.fac null and draws as it always has. An untextured material with +# a colour, or a metal/roughness, samples white for it, so the factor is exactly what it draws. +@alloc_ok("a model being loaded: a primitive's factors, once") +function gltf_factors(render3d_st: mut Render3dState, pr: Prim, mat: Val, has_diff: bool, has_arm: bool) -> void { + let pbr = value_get(mat, "pbrMetallicRoughness") + let has_pbr = value_has(mat, "pbrMetallicRoughness") != 0 + let has_base = has_pbr and value_has(pbr, "baseColorFactor") != 0 + let has_m = has_pbr and value_has(pbr, "metallicFactor") != 0 + let has_r = has_pbr and value_has(pbr, "roughnessFactor") != 0 + let has_e = value_has(mat, "emissiveFactor") != 0 + if not has_base and not has_m and not has_r and not has_e { return } + let f = floats(9) + for k in 0 .. 6 { f[k] = 1.0 } + for k in 6 .. 9 { f[k] = 0.0 } + if has_base { let b = value_get(pbr, "baseColorFactor"); for k in 0 .. min(value_count(b), 4) { f[k] = jnum(value_at(b, k)) } } + if has_r { f[4] = jnum(value_get(pbr, "roughnessFactor")) } + if has_m { f[5] = jnum(value_get(pbr, "metallicFactor")) } + if has_e { let e = value_get(mat, "emissiveFactor"); for k in 0 .. min(value_count(e), 3) { f[6 + k] = jnum(value_at(e, k)) } } + pr.fac = f + if render3d_st.gltf_pure == 0 { render3d_st.gltf_pure = tex_solid(render3d_st, 255, 255, 255, 255) } + if has_base and not has_diff { pr.diff = render3d_st.gltf_pure } + if (has_m or has_r) and not has_arm { pr.arm = render3d_st.gltf_pure } +} + +# a primitive's factors handed to program p (as 1 - factor, so a program never given them reads 1) +function prim_factors(render3d_st: mut Render3dState, p: int, pr: Prim) -> void { + let f = pr.fac + if f == null { + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_fac_base_inv"), 0.0, 0.0, 0.0, 0.0) + u_f2(render3d_st, gpu_uniform(render3d_st, p, "u_fac_mr_inv"), 0.0, 0.0) + u_f3(render3d_st, gpu_uniform(render3d_st, p, "u_fac_emis"), 0.0, 0.0, 0.0) + return + } + u_f4(render3d_st, gpu_uniform(render3d_st, p, "u_fac_base_inv"), 1.0 - f[0], 1.0 - f[1], 1.0 - f[2], 1.0 - f[3]) + u_f2(render3d_st, gpu_uniform(render3d_st, p, "u_fac_mr_inv"), 1.0 - f[4], 1.0 - f[5]) + u_f3(render3d_st, gpu_uniform(render3d_st, p, "u_fac_emis"), f[6], f[7], f[8]) +} + # Load the mesh of the node called `node_name` from dir/file. # the GPU memory it makes is counted as VKM_MODEL (R3D_VKMEM) function gltf_load(render3d_st: mut Render3dState, dir: string, file: string, node_name: string) -> Model { diff --git a/packages/ludic.render3d/scatter.ludic b/packages/ludic.render3d/scatter.ludic index c94577e3..616ab527 100644 --- a/packages/ludic.render3d/scatter.ludic +++ b/packages/ludic.render3d/scatter.ludic @@ -387,6 +387,7 @@ function impostor_paint(render3d_st: mut Render3dState, im: Impostor) -> void { let pr = model.prims[i] r3d_bind_2d(render3d_st, bake, "u_diff", 0, pr.diff) r3d_bind_2d(render3d_st, bake, "u_arm", 2, pr.arm) + prim_factors(render3d_st, bake, pr) mesh_draw_instanced(render3d_st, pr.mesh, 1) } } @@ -962,6 +963,7 @@ function layer_draw_model(render3d_st: mut Render3dState, l: Layer, model: Model scatter_attach(render3d_st, pr.mesh, vb) if not card { r3d_bind_2d(render3d_st, p, "u_diff", 0, pr.diff) + prim_factors(render3d_st, p, pr) if not shadow { r3d_bind_2d(render3d_st, p, "u_nrm", 1, pr.nrm); r3d_bind_2d(render3d_st, p, "u_arm", 2, pr.arm) } } if render3d_st.sc_ind_base >= 0 { gpu_draw_mesh_indirect(render3d_st, pr.mesh, l.g_cmds, (render3d_st.sc_ind_base + i * render3d_st.sc_ind_stride) * SC_REC_W, render3d_st.sc_ind_n, 0, 0) } @@ -1057,6 +1059,7 @@ function layer_draw_depth(render3d_st: mut Render3dState, l: Layer, model: Model let pr = model.prims[i] scatter_attach(render3d_st, pr.mesh, vb) r3d_bind_2d(render3d_st, p, "u_diff", 0, pr.diff) + prim_factors(render3d_st, p, pr) if render3d_st.sc_ind_base >= 0 { gpu_draw_mesh_indirect(render3d_st, pr.mesh, l.g_cmds, (render3d_st.sc_ind_base + i * render3d_st.sc_ind_stride) * SC_REC_W, render3d_st.sc_ind_n, 0, 0) } else { mesh_draw_instanced(render3d_st, pr.mesh, cnt) } } diff --git a/packages/ludic.render3d/shaders/bake.frag b/packages/ludic.render3d/shaders/bake.frag index 7688f19d..8472eb91 100644 --- a/packages/ludic.render3d/shaders/bake.frag +++ b/packages/ludic.render3d/shaders/bake.frag @@ -6,9 +6,10 @@ in float v_seed; layout(location = 0) out vec4 o_albedo; layout(location = 1) out vec4 o_normal; uniform sampler2D u_diff; +uniform vec4 u_fac_base_inv; // a glTF material's base colour factor, as 1 - factor uniform sampler2D u_arm; void main() { - vec4 d = texture(u_diff, v_uv); + vec4 d = texture(u_diff, v_uv) * (vec4(1.0) - u_fac_base_inv); if (d.a < 0.5) discard; // cut-out cards (needles, blades, leaves) bake with their shape vec3 N = normalize(v_nrm); if (!gl_FrontFacing) N = -N; diff --git a/packages/ludic.render3d/shaders/model.frag b/packages/ludic.render3d/shaders/model.frag index c860acb9..2518d569 100644 --- a/packages/ludic.render3d/shaders/model.frag +++ b/packages/ludic.render3d/shaders/model.frag @@ -12,6 +12,10 @@ in float v_lh; // height above the model's base (model.vert) uniform float u_model_h; out vec4 o_color; uniform sampler2D u_diff; +// a glTF material's factors, as 1 - factor (a program never given them reads 1) and its emission +uniform vec4 u_fac_base_inv; +uniform vec2 u_fac_mr_inv; +uniform vec3 u_fac_emis; uniform sampler2D u_nrm; uniform sampler2D u_arm; uniform mat4 u_view; @@ -189,7 +193,7 @@ void main() { n = normalize(N + side * (fract(v_uv.x) * 2.0 - 1.0) * 0.7); arm = vec3(0.9, 0.7, 0.0); #else - vec4 d = texture(u_diff, v_uv); + vec4 d = texture(u_diff, v_uv) * (vec4(1.0) - u_fac_base_inv); #ifdef ALPHA_TEST // A needle sprig's alpha averages away in the mips, so a plain 0.5 test strips the // crown bare past 50 m. Scale the alpha back up by the mip level (Castano's alpha @@ -205,6 +209,7 @@ void main() { mat3 tbn = cotangentFrame(N, v_wpos, v_uv); n = normalize(tbn * tn); arm = texture(u_arm, v_uv).rgb; + arm.gb *= vec2(1.0) - u_fac_mr_inv; n = normalize(mix(n, N, smoothstep(30.0, 120.0, dist))); alb = d.rgb; // a crown's interior is occluded by its own cards @@ -312,6 +317,7 @@ void main() { #endif col += alb * u_emissive; if (any(isnan(col))) col = vec3(0.0); + col += u_fac_emis; col = applyFog(col, v_wpos, dist); #ifdef CARD o_color = vec4(sane(col), cardAlpha); diff --git a/packages/ludic.render3d/shaders/spv/01089da8.frag.spv b/packages/ludic.render3d/shaders/spv/01089da8.frag.spv index 2f46226c222f1e83c33bedc7fbea24e728a299a2..f8254590c509a802b23c345300f7a80677b8e703 100644 GIT binary patch delta 5067 zcmZ9Qd6d;<8OPsY7ItF^C;??rcBTMRQT7xJGQ<|?9FDg^2bdGg;0yzQcu=_e+#cq2jGOwSU z)$mhl_>>wxt%gsp;j{Xu@-3ssXUl5zb87hV8tw+^C^5>8&U~D!-ePY|AAxt5wsn;@ zwYF{Cv@Q2>Lv1g0cCfZNUz_vx)|SrHGj+_4`tofjPRc%3pVE1l-EmWClWALXt)X|< zG@^x%yNEbxSdC`CPgTWoXQ|y-r z_6*#EXyg$+TP98(SU0V_d&azM7Lta~lll

Nb-&1JS;K%>zCG{zb6UvCrA?V>~T` zAMM`)o8+^!uv-Q{vsgN9KZ6%}GD=!Wax>x-jB@>d>sNYiY4AHLd|CMa34Ti9?;!sU zcO6Yy0$ba(vroI@D2Ee4Noiz{$|ei_u2YIro7dB8p9^>Y!~_xbd`s7LADF@EH`nSdL_szep))|S`Ix_r1dr=H5L;QsQ^*(Yb-i=hs{>b)3z zB;0$kntL}^bFahTgYoyutL9#N)!eHuIPuF5&Yn{q*E}RMm-k+kElsH5lWMqkU-+Bb zyRVvi_f>Q6zG}|h7reZ&dDNU`eLOiH@4#w*@4(>NSM_|N`HcE(DO=tn^CjB-$R4GI z6xns&Q|O<@M}7_5W2k;bp?w*AHBH+hcEc{7YQ}h$K3@fU{N$$p8u%*OMV0<5)7K$7 zX;{rK`3Ri$g4Jz)+z_7WU3Aj^4Rn3(K)fI|<=VdToVjDNZ=!15M{_vt8#UA0^E=?S z!sf56JZ#?sUtHMSS@Ib655NxFnC>$9d?w^AavgXVPvT|yPqhv@`jf8FAUggKtQHA> z1a^SCi)mdC)<=CvF|8kio&LEr?Z$Oms~g7}-vIUsTbSlmiu_YZRgu$;aGlhn#y5f0 zZ!EW*HZt>MsJI=Lai(tpyB)mrq6R+)tGgXs%3pxJDb-_2zXTg=H6Hr>3an;}RdnlU zyA@44ak4zI$KW7>0S%dO2I9_8;E{gE*X6V!>`D3W`7+oXnpeNqy*{!3{s7h|n*H2yccR&^nPyV+=o<_C zN9|`~bcJ<}71rQjJb8D6Jz24M_kh*z&KK`4kc#zq2=70GT|9q*VmkMN)o;dUFSh%@ zY966isLx-(eqJY|w)<&nuX6Cj5$7*BC>L#iw}=6XPMU^W>K`%M)4ee;{gz#1Dgy(jxJrV6{hR zt^tqq7+K7Y%YGB3+DrUKxLT}Vf3P3dPg@gB%|PN9>;Q1}@(qHk`8pSy za4`4~v9#rt_BCw?#L~yE912&{IcA{d3?i}5>KQq+JRtFgVY?V^-?xF~VH*K%D{RBT z<#A^X%XSvRNQAf3{DDMDqrh8v8boL92K9AHTihFCz@Gnu_(nC}fu^pHciV|z&%7_Q z;WHMDp7rkdaR_$Q5Es=+VApmgO}lTume7ItH>~!U-9&KAd;(Y=Hvi{vpqQxdbn=Rg zH8>UG5*XAMJb8?AD%eEYeA$zWebIA|L=|Sh;}(p*Gtt!b_eD@1w%K4Sxu{&XU`+2C zG^4zWHlG4``@9?cNuEx}VLLiUVRj?>I%yv>_$sS^Wm^2?ft^*X!92KY;2#VziqpX8 zedq8!2zJyEfldb-d}nbbo&i?VHxjFb|CwO@ujR<>BjJ3o+BI;G*jZpTug3*ExrZv} zOT*bTMbDQw5*)zIEgv?Y&dgtwMPO&XFu)wWsXc^BzQkqP2(z_^7%#i z&j*hth=z;$zz#YX+<~m*d124< I3m$F%KLkBnXaE2J delta 4409 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 delta 8348 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 IcbPNp|H$Cy4FCWD diff --git a/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv b/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv index 92803a1eb279d7a5ad75b26a30d2acbd8b3cb0cd..0365e5d28bb375d2f86c95b9f79622a0d7bcd3b7 100644 GIT binary patch delta 5067 zcmZ9Qd6brA8OEPk*@j{XC;??rcBWWTQT7xJGQ<|?9FEhV1I!6#aE5_DJoU!ucsl(N z9{Oy-Y$1wPDVt2w7BML+Q%j9fGTcj3TyZPw_j|whp85Q~bDrDv2*0#01TfHIIr{(&N_O_k<+Vou8-rljj zKlY4L&5*G*GkeDmd1_F04TIa>kqA+rz5?!P>FC-@r-oFQ4rtrZk=wov-qzaHTDH}v z?^f~ezlqnSgK)y;aeBe6L^a1xz&$Op+_om&sd3AO+;|MUqoup8?b7mqtlW;4%X(Tr z)|Ll44!^7j`XYEsj_cD~sBHJ<)=N8gmgbH=JsS<}>g?IHc||$@Dey}=x8x}%fGg)Q zsfwRk#ivy9X;plB6`wUAm2MtAK3iU;pHszGRB<;*XA7h3?8?Wv`c3wR^kH~U%l7V; z&28YX}fXI<&mlO|;!txM@V%xmMq| zYZ}nP$6Z96G^|Rq-zO_#xwF)6snBK=+8zDc;54%k@9rHsc4bZGCYy+4j+Moxn*{bF zcY|oJt>Be*_sGfENRj)yN8~(mZXxAf@TVRuXh8A|q;Aa*~r|oC(B2Pw1%SmoRoPtrV|8Muv_bzl=UZkUaz!tNhEw7zH#H@i-W(B^8#wX`5@r1mTp#r)y*tK_d=C?FgIJZQLe09;+F6$m_vX}7*%drc8an%w%zH7^fmpp4 zgO7xJFIIBz#!BvW7<>r+UU`+=Yp;@f^#vz>>4DjEO5>WFGIM$FRoK#mDn6--d-sLE zxxM=;xp!YB_wK9Y+<>S>Df+pgDSYHt!##%TR}|Wp!B^3=EoL|D=BZ|kXXx`)u*Xks`mcdMN4u!pe^vTA zL?;bv_$42K(>}1e&5s+xGrgNm+P{IW&+Uj8q{dv^Uz#&_O!iGwt@~*X$9d*F);n>$M$!~Ox-VH?w3CSSmWyhW}B@8(IoEdQz2K}UbmH5x?6AA;2) z;g7%$a8EI<>%jV`Hx<+RG1%#!OVe#))tnu|=udqdFUb)CWg;W$d-2m4~J!*U- zSp9}l>->?KCqu>Uu$(h}GuZ9mr582$IauB8;8Okq>`kd2Q~D*?SZnam=T~4gTdbm6 zN82rE+KH3pi9H5~5Dah#ycS1bx|J`T{WyPp)EumRehtni0FFMlq1nfz_R&Wz26`B5 z9m||s?l%y3h60cDJH9TbHL)kgc;@u5ayDMM3J3%Ve<3YUt40iGS1&Zn116IEYpMBWw z1*>_4UZy^O0sDE4jN0y_slCF%6GxmQ;BH!!<*$vY^uqk%nR=|p-@vZN^~8&Q_ruj) zd>-imzSQX7*Y7Ae`dJ0Jey=iy7>iHy93jSoVCTs%YnCUn-v2<<5Q!fGAEQO$N5E zoSinc80b^rCuy-l{|2jFOJ7&$8L%H$NZZr2I?jy%WnD0IavRCh-JT#Qtcyt16(cEZvfbj>!+=ere+{<40a&6a`^_s)qI_c zO*jO6m{{8KO8c7D1hMq7D~H0>bdDLQIfF>-vvNkxEDuP$Vc0H)+xM+tdDupP+Y8%p zaB19G!?In4FcRTyG=CtG(kSpYo(9obyFq=O(iZo|7_jI65WZ23x1*`+pffkoBcvW1K2?agFBE_JTL5h JZs8*x{|D2PTV((M delta 4409 zcmZ9PYj9pw6^3{2O_M66wp9YOO=+8wwy{RRQfLxqxcp(DzZ{*8-vkJ4#x{X8spE9U zGa0Aj_`_oT@KUTw<*MAoPZU7~6ts9(z$#X-LMw^_Di$b+KF`Tn@sKmKzw^HDT6^ui z_S$Ek^Bp==|LDQ`ISutoTT-e^ZE02-*fVGI+@Ce4bddHAq@<4~+R~A7JgSY0mF}(`jzGd*TQ8IUs*Wl&JzCMGq z5QTl!REGwHvC)amTh7a8mD=H#j&99^&6#$tE?;oQ!2D@C)pfxP{+bdg!hBt2+&wZ@-j>_05rObJMZQH`hhJ}sO#c#rJ z0j7L2R0lfdRbM>mr1?Bw`!+iV}#t_s>!+K++5{e#xpnLwNLTRTqp-LQ9Cpi9r|mNryOpm>#kn9WN&R& z=i=77W!074z1ey^p2x=oycWa12sV+A)52~7UftM*-^lq31Htc_;_s2SV*eiew8CHh zWB79J#;br$xGtq^I^Zu5j&(iV9}cbn4%7B0;XJE-G2k=s%P&8=A^5X7zj4}r48C&H zRk_^>G?USaQoPyl-rlS>?XU>Js=5Me!Iok#%?ZgZfm#f>9)7HA)AWF6!#7=3-?xh0 z15D@eqmO#5qGj`v?_q*{Cm@(*WZhqV-|C$M9w>UMS_}`7;PcQuNXp!UB={`s*H@3M zUX*!cglaEOiQsK;Pl7V{G$?aVgy8n~L@0Algy6=Llz3t2b`C4~9L}EwyVd0e`5gFD zwD(dpi@g`DkNQQtFiu3f2CQ!LvR*#NyXm9-^XU22MU`dmq#KufK9}hzDI6o&Qe-Ojy}XUBJAdFKs)N7 zqx(vmLG-&BtQG@)1?&X(6qEldSReKFBGX&IuE@DG?Z)-RbxX#Nfn4_6!JZ&7+dIJJ zW&avnAN5%FJHhHUuUK{maBFLiiGCgIpuub4%w<&ImcGf)PFg!Pm4AyL1FofclzDvV z6ZN|rtWPxiS)OmB*>4TaK^;inSdDuMJFAi9&aoUCoQ#|7J770vWcppOn$4@6>Ah&$ z2PnZ4*zN;A#@+KZlDi+Qeh)tTu{{93-}<{FUt+m_fZ%nU326L2P3>j&u{Z)f2;NSM zReA^<+1^KgH?uxY#z*ysU`ufqIAZ(=uD&b7iF-Q0kD|e%D)o!D+<@!C?%W`RZ zoc03Ea)~3(AHc?mB%T1PJxJNxQ`VAa{6_>cUPja5Nt%;7#9dot@h7koy}HQ$DX`j+ zrYZl!V72gn8mxctBP9+@M}7Y76pz%O!ADCi^uM4zQ)=<3{S_@XpTX^~Z#b^=yd9(;_CI-_t%B9`SXenHFmp=yi2iRr5o0Zzn82<#TMfqL? zb7gt`H2#aGXdrO}`Zu^-zn9=@$7rz$Uk3ZwX^W+P1?cg?pP6q( zQ`g_mA9;>6@xE9)DYXS6KqHI2(%Pz@X6wAJPoX-Zw#y!{>#An@8jsZ zjscg0)vkg2tgUcYDSA$>(5Z> z4Dcra8}Z@x{&XgSj$VbB-d$*J_t4fAnxCr|GfBTb&O)=l{@M-hB>jJLR_()mPmTN! D{}U4I diff --git a/packages/ludic.render3d/shaders/spv/254e7887.frag.spv b/packages/ludic.render3d/shaders/spv/254e7887.frag.spv index 0d5765a3e891e505aef884b0116455908f856217..06bb4601cdfbd75a8e1154c161e375d505435391 100644 GIT binary patch delta 1284 zcmZ8gO-~b16ur|=i^0UeVyYqn(U!JqSZE|h2^(c&B5`FxGLE&zM%$7W>dK77g)z}6 z8IAED=z;|qzdtG9HwaYuE4niAoY#4@@{%|2o^$TK@7~+j`}2W&i-GoFpf4(7$X3}R zKd0L-$L1m;tJrI^Q_C?YDk(!`uZT=q7wxQd-mc`Ve6cDLk%qQ!Lo1XU3blxeOKfPl zLcT&itoWqjtNGm3CfBdHiF|RQnLFiPYug!5D}@;<`D(5ik@05R&cvLTD0bW~+Xc9V zB_yvm;kTRc9B|3Xmade_%D?uX9+nm0Nvm?nzEDDWjhq}v)hd@zn~GUexR|rcs;7|D zy<44j(A{SC8t2>rv!iP~C^CX-I6k%;#vZ{}Vb?G_&XVoJzOFnQ3Wq>$u7yka+)@k2 zkc;FGVcsY?1yUAG1Yb97?bI@d1s!+>V)$ zanSAPeiZ9Nmv}~EdQZAO^$xYF&k>+wErvE?efvlT&5Y_Y2_ptegU_!=G*Oyb%7tF)fm-D|xJm?p`0DBj5 z)FMvv(nXMUTsjITnDP-HI&x|5lh1Mfn)~c?e37S7B;U*zaEzxvb>?P~d_&a!;uk!E Lec0<7{$u?E=s&vA delta 1063 zcmZ8fOKTHR82#>K(ils?LKlgOiH0T_8z^psAhjT(E-h{gai{@+_H6Z(aI#OVoF3w zzig9lH!|naulhv3;$3}oIZTfvWxo;`5|NpDx7oNT(kJU&DdMJ^Q`6*9kzY9ox9`eT zBBjx4b~?>&WAlWgRsX59uMzx$+jd)UONuQ|w%})5FbnePliqo+9r-W(rzhnL@JzjP z);;5)y!DuDpj&Tys4Y6P8sVvi+m7nDCDcC$-9*9OXfFxR6LD*77ekR95**ByM&}Zn zQWy9&RxW$k1B&Z7dS=agVW)fWK8je>SwH>l7_)w2Y>^(u z=PiTvpPlozss{J+cl6Q1rIZ>9R?2zh1i#ByR4Hgxe4nKcBjNz|hd9r&3&1a7qjD+Y zM<0qY>m^5jn6iw|T4iF);1%GB>(*Em6XT>l0Mmzj4qbi3jtBQ@;|*q=f$>iusWIF*R)R9G@St#uUUgBx1}Luz4LBkLRc}2J=uu z3_o&w4PcVq1<*6Fg@!lf({8=ALuzy>stMBGxW-Rl-jI-(s(>TnI$mkXRQ&?808K^7gEC!mi{jr&tprD4N=EODmL{3bmk& zOSZIJ!KsiBNIoU`nv*-z=0+q}b&Az??sR=E(r;wEZxJu*-a%3GcG)h#F(CZn-X{ED z6J{eNYqoT{RF?ir|LFno26(}$R;;<4b84RU;<2!i^3JBGO=G0~Y4nH7 zo-(*9jPp9elQ;)~AHzoLg0XuQX2ay@&lX++|4GeEYWxa#=At<{iiTi{*Z83idFJ>D zjzi)io(hTsaz=(CwjwKMq%i|H6E2;AGwH+)@95ZfGt1XYg>EsNe7zb+f%$qhroQCa zS+~#Kk5V@PZ$SHulOvcwiXPZEVUySR7VH4_B4ViDhE0xs`!E=4)XRx;; z$5O~`U%Cu(0+$|v6N`8bOh+!wttgJ)M{_R}$2WKwMe@OT;22MT>deg|`GBbX#TVX# Lz1s^PiaGxP3P`** delta 1071 zcmZ8fO-~b16umR;6zZh-K@?+Eq=ZsZKO#F~l$F7aiLTsWCXE)E1Y0u{TuxXSS1Pm7 zgeanjU!eHV>VNPbxNz&jxHNG=;yI7^bl@eg^Uk^Fo_p`>d-%&;_~{lhZhwb}BffOX z=Ld!9{0l&Zy|I4R+jYv5uOc#lJrm4^_1hvj+2YEYYlV##xel!xObUL{si+}e`SD|z z+^R*jn-F@EmBk%+X$NNEW^k=J)r_=$Wn0{n55O})YdV;$hc_l$TEj+XgQ$rfG~Up- zQLjZ(*2G7hbUmDy*b;owxDnZ=+G?(6F4L3!H>L-t3rN*tCwmWeC!NK^L-#ZP*+D4! zu@_QY#c+#iwRpveIm%H`Tw@rWt@q*FmBJ+ku^8tV)MpLm7{ob)IR*3C9QDNMd``tU zK8%-yL|V``0@oO{)$)-q8K;^AeUDVOv?uQjsQuM3*C{7gPkfI#&N0+kMjED+dF(R= zb2f5SVD|S8_;+P|)Z+KRRl11Yr;R90sHnv5h^& zxeKi_Mq6UWcm>aJu9_H25RafRJ)h%z2VeRzk8ygi4rB0$weTf?EzYM;Jc2u<$t#=> z;7i^Xea$n9UWSHEyaA?;%W`iG$E&p5s^Rz)E}_YJ=@nT6NdqQOKy!A2 E1uoo_pa1{> diff --git a/packages/ludic.render3d/shaders/spv/439a2253.frag.spv b/packages/ludic.render3d/shaders/spv/439a2253.frag.spv index 617a4d1bf37d0482ed2dc9c77bc48f774d978c81..b4491f7920b877649b543e5459f7bcd50e2b3268 100644 GIT binary patch literal 4912 zcmZveOLG)e6vvx{2_V6Myyf8}K>-PvQb3SL5=0)#BZ!EPNYk0=nQ7@vr+Q`rlnb#e zx5^gFg-chKOBXKu0506S;Ul>6Ra)i$cl+L+D{`w&?mhqW=yT6K=VS&4##aQvvS4+v zGRT5rtqTT(1j2^Qe)huE3kN#g`hkOoCee5@7&MCLj0D5Ma_!JUl(Z476CDyA70rmw ziBb{5wX#K5AJu74UkZYs<$dr_!u;E6^=g7&*GVuoiV{Q9TZq7U7+YyYyw9#Wd-bGGgq@@~GX6 zOBtEy%ewKMIF)S3e2@F|!cMQPxO1HyUMcZfmS%a04_RLe;bPV?`o+D-RWDr3<3^Hp z<2+2`r8t#>i+!b$H?n3}kK3K3d)L^mGBJ?DUWlv}C(TwjY(#0Ak;Q&IPn0_IQ77)> zs|{XDlf@91<@bgS-dT)mp;DR3qHj~YQ|H#*FweT4&6CEanPJ71fOtQF}-=E0oJ=05&En=O5rDGKLnYag#=?S6ed-N*Ads8P=9%U3@TsPwmjQNy>Z4HcwF(qVq za8Y|Nj7op+89vGLsGdaanyGngZy3DnO=BAxY(B4>Syc&YhIbh(;z$gp3|Y9Mn}7IU zER1@0K?}Y1Z#O1vlA@!FyuFlHdwj~>SS1N+&- zn0sIkJ&c(L_N#|6>%i2i<$F+PV8b3pt%0reFzO9#i-%EjU{w!erh)D9FzOm?kB3o% zU=tozwb-PGjauxWhmBe6h=+|^?6`+9v%sf?(KGmhRH7x1FBWosBN3~UAJv(<;SG_` zXh+V1XHNP0%qaXTJ&+c-Jc{1KLN$!E@fE6L+nOHp?Gz z!!tLk`b(T(&{jo7Un5^8@|WYc$sg~99`?k^0y}1T`kTe~=wbX33;OggzQECk=k3Av ziAR^741#-86N-ws=tnT0wn&$rM9y6{>M#9R6|wLIPd`!%+r`s|*nq*idGB~P?;Y>v zJv?`z?}(4w@;&li6%qT+V7Hn1d;`Du!X6t(*glTP#iKgzTMqYk=fmX|o>(02@8pNP zSGDs7%mnfdKPmzvSJ;n<=x6lDwIjpc<#LbC+#UH|E8|=4-6nL_n%W@C{W_rcqIP@` zKm0-M%PdbE@XQ1-G+2Dk2ZW; z@=fu3=SEIWC=%YXCBgXDoQ$J{55v;$E<4?us0q`G)+k-hz6h z*IB&pA42GDbeUt!R96?&9lw>~Pe{&u;y1<`%hNmjMqu__mlyQ-eSi-5jIeR-^uwrV zOoSiwo)v+AYVDrWnHdHCnZt_6M=s(o&DMmSd6~< zT|OqYv;LAkvKK^P_5$z9ORMzOno< zixI;Koms>Heq02`cZ+lJ-IK!b`>~B$MZUKpU?G8VtQQ! z#@o!=+`eIXFz6GjdqHRPk>ihAyd=74d1~>p$gjm&@#uiN_}|nSoaL~qI^&<^u(xyu d^Y4DmV*cIV7KT0g$nnqJnV-o1k%uFqe*u;NvB>}c literal 4724 zcmZveOLr7S6vvyq0Eq%BF9nl;$U{+ri1>&$otd7QK6IvYdS(I~7vdLC zws>5)bmejB!i68eg?l%A1XsR}p5y;l-FK#lR8CFT|9>BKtLoOR3=WL14uVy|x?oMv z42rff7!VVP8*$(Bm#$tq)b7*{9XUFM#`<8;DWWqLj0Qvc(ifwog);##JmoYJ5h zMm>KQ9ZvE*swGjY%F>+eTaI7K<9d>I;#}O2i>Vtf^hOYE+BE;Uk1&e)+lh?CGSc_Zjq;tpFu5~eR{@oB+Gfo=KPFRo9G$RB0@jTYkS%}&?35#=` zBo;OK~;SR;KRk%%;e(_RTwCo^?E%_0Fb|XWdqfbP??N8(Sd@n@LZ$ z!Iw1?7l^H!{OyLNPsvCIi{l9=OBT{HMB_I(z82j{*^R#bX2;i)JT5lh=GfBbi^CE& zUt6858EHlCz|3Y_pZ}lD_P)#|h56di=c`$(pI=Y*`8dOh@4u19PG=f-^i&;$icpx+KHT+f*kD2uL*yp zH{ou395oZ}uE$X;;qG}HdkOco$B~b4-*_A~5$=1BqaMQj=yB9SxSu?ZItcfR$5H>_ z9(WwJ5AHXQqvpYply)A}JGfDgqt?M~@HlE5+;)$nzQI*Ij@kyd&*QjvaQi)ung%!N zag~yr^0+-Ecf{lNmfQ)C8!x$2;<(^hHii8TRGXQciv$2m5kr9QNc8 zaudh;{V4x);?cwZ6@6)N_yhAk z(Y6a;)tCJwH*HVe)tK78ODt~}I&ffnyA0dgW!T;>FuC=Cz7=)i+^rMky}~DcutlGI zu+G{Z)!F-%I$(5-_rK-?I~x;=jr}kC^pRxT7vf`|z||Dzq)^a z+HffR>E`cx_=fO-`LXFq%}Q*MIyUItP`C44(3obpTEHHr9?_6v(RWXYUlpdl@Lp0|!0aXO9kt`SykN&$hYtL- zX22iZY00S@yj^hA6MPUSZx{Rz(&4W29>Gyl{*Vve9opa0N5IM(drq);gh}H zr#`MeTJH5T8nZ{Qt0N;e)&`Fa^X^xlQ2(~X2TG0@4r)vz2KeXH;h2}P%{!?vem^VY zcwS>Tn-Bb#Y|NG~w(Q-MI(u_jC&3zCC^>i<@pFDxv`_5YOX}#*j60$+9J)f}f zxnS~VTHVi|nNkPd;y8snd4+-n-c`D;I0a{k)M0qoI7j(^sETwi4W%EJlu F{{RD(vcdoW diff --git a/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv b/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv index 483029ff219f2c4ffb37e895671d116ef8288ac7..0fc7cdeaaabcf7748d7dcfc5ac840292eca87769 100644 GIT binary patch delta 8333 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 delta 7719 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 Hzdr5%IemLm diff --git a/packages/ludic.render3d/shaders/spv/5e70d731.frag.spv b/packages/ludic.render3d/shaders/spv/5e70d731.frag.spv index ef659e9e2e9e00bfe20fb16354ce74ce7ecbcf5a..84acccf2480e45bf372df2c6ea115c67cfd7d36a 100644 GIT binary patch delta 8963 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 Hy*%yzGae9( delta 8276 zcmZ9R2bdM*6^3V7mX1a@SV0g4F@l1q2{AMaY7!Jp#6;0`fyG6TrLL)tSfV6R#A{+K zNmQ`Jj%z{1hG0;^hKdaCpecw6%Ie(iobC<>6v{<;QMaS|M zyR=S{vZQ^|CTTUNin8$>Mf{Ps!u- z08h;EAaL!;X=A71kZHBmW9wK#2XHvNIFk|0_)*RH(eP}UhuOb883`X#H!+KKOf%nK z7x_LUJFY0ek8j4Sn(-4$Gq>rJmM697_4%wPfk#)5nE=g_*27PoT0J@VY4GW_<6Z2` zei^(t!MWez<;jikdV)Kd+rYJ~uXq9Y@VY~jiWG8RMn+}<7lEhM*3>j^XUpUTcrn4c zW_*1!{#i5bA+M`q4eO?6@i%?PUXgTa*~T+6eOgs*&G?gQr)N$T4aaXcvwYi@O}9k_ z(`B%YywtCAWoh+}oy#sLm36M{bb0w^TQB@}pK+zw4z!Z-9g%<)AyQ~Jqrw=Q+uvH4~pDpLhwrLJ{N+o0Q)QmuHENBk^4Ld z?s$A21joO$SKqBt9|Hv~vGfObOx++wZb>h4%X*Pp*@HVKD|?Y!*@F{5O^*7mkXYKo z!2p)_BDcI3x#hjct?t2{fYrUot?rw7>HfZ3l(jFd>f5!G$t>}kjY%@8G^JnH)M6g0 zUKaBrx0n~X#k|OGD{zOjpc%KWhrjkk1x~&Lv*I2O4#47G;w zWjcs+J&z5(o;Hv}_YuA~g0IfGeQp9@M;o7??wi5-s2_>OCAoz!bw9?u0jxF@yZPsX z&2utG-8{hLHg9?jA>0nOV+V$+!ySBii}a#t^BzAtPk1NX8mrIDT)PWwEzlNz3&12w zv_;&z!N%=j(b2(9j@sKzV+`nCu-cheW*}hFo{RNe!gTt+LqANHd1E9 zUo#xBT8{|26k^a0zV6cbQNA4Y9<-&UnFA^hQ_nFkLPn1>-*fxC%q_ULrFoKMFJPmgzqPgno&!FqC-CeTishM5-^I#WJn*~oE zwim!B#eF9SNC87=wM)8#go@*26Bzx0{coJca2wri)*|Fu8(@G@mjF@n$nT` zS7wD=C5HAk*et={0lRK;F3J0R&7s8^_yFt~=tuKq-D!ZgfbTzRodybqC`S`UE_W7E@afR{JEI+B%Sm<>ghpKLbC<)pw$p&gWqD zd+_l-*#K7a$a$Y^1pDzm(e?#R&3i)}aW;Wx(PCM?v~0O9PS2av^Qu$Sy05@KMDIY4 zAYa4Pqb&UotVXb=e&2wjpGzXwZxaKGfq5O8q!r0Zf_pBU^|y#7a`DSNE3`;l4)#qj z5?6rLd>eE>=$f|rOcGxliv zRM{G?PuRD~?QXH}$!@WI@-0r2Z6UE&kz_kG^;o{`!D`nd{n{oLaixYvl; z8SHy^9O5qE&aHWDIciUFR|G$F zg0)#SP3}(xwFrI?SS?~74DLc8^_b)^aOx~IM#n?I#g2!< z9;@~KnG{#4;*>ejs*Lh)iwewkAeRJd~t3&3M}^( z1S$C?*gqc`&wkpCG2HuKqvU9=jy{t83LXPF1}qQTv0z^S?B|apdDupQow2s#!15U6 z31IVRJD%$a!*f!_)sr06tr{NHEjo`zQ@8VpT;*XK3m)FO^vr?1(+=4>pM-E40Ufy` zbR=dpk)6lTYG?)<$yI-o`!pO6_5pHi%gwVo8BINAIRWhI#H-~*xIPoQ@fEKpr+_`Z z2h(&gS#7EMpvo?_urx1%lfiYgNI#`CWmsi86=e!7D&sV;p6XF%r-O~}&l>HnVAy8l zwjI#)>&j%zKMAZYCUPp+GZoo?184H3Q-^g-e+!n!7=8!VUp?-u--Fe?6KCdC{10$- zwHVJI;W1Y2j@9whgSEv@&IIT0j%jvy&p@!FPgu*v=`@|ZiE z0ylphI2%np9)^DctHs;ExnMUatEL*yp($ET#WC7hU=zk_{28p~BP9l-W)Y13USswD z0`_K!)&DEp!QSD~ivw~VqK2p;=Y#F29s{`m?AFFW=749@)WfF)cDcjnBJhPY_1L<< zf$gg;jZ*)2h)Fd@u#3UYJbeBE)=xcrE&+RohtH*8{nYibAYKlRGIJSNKA`a&rO7`b z({R!dLH-3ckhTc&Z}3Q(voPotU^RW+25oBLel`ysjDvC$xOt7b z8BINc-U2Sxs9WLss7HyK5BBb|L}@qIja=2Yk3bC&#Yld8R-x`dxt$h^ekWK@^$33# zIKpc;{B2y-Bl_Lo;;+ej;QB<>xfiUDdQ_8zzB(D$(x*d|lLcUmO~LO67lS_lcPbJ5 zL9jmR5&R)=#MU0M?*nUd;Mt#9t#Q=+*#vCT_=WN$*aX(s zPL!SHaDBr6DX=kOB2RgY9*JHC8%SGduYlDT=7rcBc@@0*jr=N_dgDs4 z{;xsYPYtpBuY;}r+9JUlV3TNbb`Jba@JL$RJ#T^4^mSFWsfGV)a6Bn|tgTHET;?^o zlY9R*cr7gwzXP_TdIWkGTul5PTut9dtQP+7gZ00hfzKt!2Vk}IQiLlJK7=UxBl2Ue ze*6`p{t->h=cYIk+>DRU#ISjdgr9&-sP8(i^00jh&bK>F)no( z>o_uvi)+t;3${3b5C9yDyHZ}xVqPgKD)R-)XG{@mqN*Gj`!kHovZS`^W%VE5xlOwpnW%5u0MbV1lqiU!!Zdq3 zjRQ4vO$6t7rqK6KqkU%`wW7$RJ#}c5pR^ZC^F!PaUo8<5hW4g6NA5Wm*N+lCDLf8} zM{GBk;t@Ly&LWTFoHtp2_a8dA8Etd&wkw9eoC1vLUz5GvTtsV5KX6g4F>_g`{^D4* zAKziDL9LmbM5glzpudcB>=vlhlEL&#NTc!yPMv!m-7Rs4VdnRLUiLpTx1Zei2N!U05ibA(KlmWu4(LN`K7cIF zT&LCcPxG+P0HOd;Q|m{ia{v$YG|6lVTxIH*cCJHjN3S+9a$ zNGGx7iDqaOOyI!{sR3RYV6vgBMZK&W=2vhcOqS}Zp`Y3Hxh@}`!w0s9{RMHtvy<;&=cDvd$TCfr{HnO96uC9?($WGOvSO+D6SG#%D9TitGGu` zu!y&twwaueM)~x&E#x1$ka2h$xp2*85_lJM2Rq1=Lpt@yph)hqWtT-Si~-qqgbUm# gRy7&tlJtnwgX%UsKp_Sx&)-Q<3r#a`>XUiRAS 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 Z$HKe+P#FH$qbELhKcOAne-vSZ=)a{sj(Gq8 literal 6776 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 literal 4724 zcmZveOLr7S6vvyq0Eq%BF9nl;$U{+ri1>&$otd7QK6IvYdS(I~7vdLC zws>5)bmejB!i68eg?l%A1XsR}p5y;l-FK#lR8CFT|9>BKtLoOR3=WL14uVy|x?oMv z42rff7!VVP8*$(Bm#$tq)b7*{9XUFM#`<8;DWWqLj0Qvc(ifwog);##JmoYJ5h zMm>KQ9ZvE*swGjY%F>+eTaI7K<9d>I;#}O2i>Vtf^hOYE+BE;Uk1&e)+lh?CGSc_Zjq;tpFu5~eR{@oB+Gfo=KPFRo9G$RB0@jTYkS%}&?35#=` zBo;OK~;SR;KRk%%;e(_RTwCo^?E%_0Fb|XWdqfbP??N8(Sd@n@LZ$ z!Iw1?7l^H!{OyLNPsvCIi{l9=OBT{HMB_I(z82j{*^R#bX2;i)JT5lh=GfBbi^CE& zUt6858EHlCz|3Y_pZ}lD_P)#|h56di=c`$(pI=Y*`8dOh@4u19PG=f-^i&;$icpx+KHT+f*kD2uL*yp zH{ou395oZ}uE$X;;qG}HdkOco$B~b4-*_A~5$=1BqaMQj=yB9SxSu?ZItcfR$5H>_ z9(WwJ5AHXQqvpYply)A}JGfDgqt?M~@HlE5+;)$nzQI*Ij@kyd&*QjvaQi)ung%!N zag~yr^0+-Ecf{lNmfQ)C8!x$2;<(^hHii8TRGXQciv$2m5kr9QNc8 zaudh;{V4x);?cwZ6@6)N_yhAk z(Y6a;)tCJwH*HVe)tK78ODt~}I&ffnyA0dgW!T;>FuC=Cz7=)i+^rMky}~DcutlGI zu+G{Z)!F-%I$(5-_rK-?I~x;=jr}kC^pRxT7vf`|z||Dzq)^a z+HffR>E`cx_=fO-`LXFq%}Q*MIyUItP`C44(3obpTEHHr9?_6v(RWXYUlpdl@Lp0|!0aXO9kt`SykN&$hYtL- zX22iZY00S@yj^hA6MPUSZx{Rz(&4W29>Gyl{*Vve9opa0N5IM(drq);gh}H zr#`MeTJH5T8nZ{Qt0N;e)&`Fa^X^xlQ2(~X2TG0@4r)vz2KeXH;h2}P%{!?vem^VY zcwS>Tn-Bb#Y|NG~w(Q-MI(u_jC&3zCC^>i<@pFDxv`_5YOX}#*j60$+9J)f}f zxnS~VTHVi|nNkPd;y8snd4+-n-c`D;I0a{k)M0qoI7j(^sETwi4W%EJlu F{{RD(vcdoW diff --git a/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv b/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv index 53f986a21977e234338d4f01006e93f9279a3eb7..16b6a951e44f872445a9753a17fce25e9bc2279e 100644 GIT binary patch delta 5710 zcmZ9Qdz4jW8OHZ8Fx-X|2uKO#A}}y8H9{aM!zB^ZOzmbD;xGd?o`n`Cd->}MllLjV9MKUxQlx*5IZ1wQBs*+?d(i%z^rTg})FB*~#Odd&+WHP0z z(9*cF(A3!3Txf0UPLismWSi1!Th~#tXsgQFP3^TcuWRj8ACT!ancm&nyy>_$Ez>r( zwrxBfdwQ{A=-7(do^eB87@Y1P!L{wH2vM2r1UJ$^{C)7s_U;V-47{;Ty?=5yxU10C zu`c)9qphhev;7LZzOkdRWb2ojd~WD#%KI z%52VPccHVnc~vPPXSchsp{w!o<}A+J;2ZLGBf)Dk+&`HC?p)Kjs-4-fkD2iGjm4(X z)6?0&j`ptAYtAcmHy^&TeQoB}khvWn)51P{aUXteAAVjRzO)a&U|>>wX7sppMIXJX z4`0=XyP?_(WZB-4<=J|IeL%7i-c{JxSy!K&cJHa(Tc%CV zwY_CpZLU4kQ$KcTMd}WlfJAc1(tO8F1pCO{9NPPp@p8KxmX<>e!Ec4{+q<{nZ0s*%cba@`e?QnH zuBBj4GY99%X9mlq@sIFGB$9XnZ3?#NSS z(`&y3UQ7R(gAG1~FqPVAS`BtrIL#&`cQ>d-zzy)DHOqPv=zuTV+HXP3VkcZ5bz`^` z?jRreHfCVBJH}DQsJn|-&$wdI4orHg4yE?GE$3dj!AD~E+70ds?eRlxD9db#mt{F$*oQAJ z{%hdRQ(8+W zaZd7eh)xB2#OF>)seHUy$+9K}vz{E|nD@z9(nWmdqVjh@!0PwpNqLggqQf79)$Sz7 zPJDKO)n;98AJrw0%( zNvbmKzT)oLW71!uYQ2x*qIt8ZnT{=g4Q|bCzQoDH_8ai>+~(aQ*Jj!ef=%0)-b3}eH2nY$&bNxQjbY~9IXCW@s&9v(}zJSp25ZJl_$Yo7*9~g9Q+Ba z?uK_xo&x(-s~$u8GuT)c=z9w+vH!H)Bo8_15F z@Bblch>qQAZ^5JEer`RA?`y6Brle9%J%pk?eEWk(VbH#rPW2rCev%WSE$*YLfovc< z))WU$)(EOmVGjDS1h$rSCrotl*INZMi$ZwH&`_4(*W!PTA{Q1bU3N-d2Bqaij3 zKBkN#C+~pUD2~l3V6`ZrpNi&Jc$7F!W6@3A<78~xIAjZ-+mP`BVOt(wnv^)K!K3M;W5T`x9dj0>1TCCq>u#fAf?F@>Vfy9yQ z6ma?S)xg!JQeqQM1MeZ0wrr;9Kba13>SI^d!qs$+5vVzW=-9e^M2;*ANW41ma^l(6 z{~^f3_HMAZrM7p0i?^I}a=JMe>JiSQ_yviS%mS~cHi*vJZRiWPwzxOm1NQvy#y4hT z4w||?-fd@rJ@fuN3ZHpk^t5-!zZb!V8sefl2khGV(xTnpQ%<3Y%m!L8oUqU5*TzbSRPp}0o#$bbE)NGe+sxqViwMa$1NCb-;buQzdse^ zVY?9QOg0p^HH_(9gAbrwM486~c>8=1{8@)fZQ5pM7WQt$3n;d+2Y>A7Um6zQI$%c? zYj7#tHSi~BWbq*|`tfu4VFVj$h(I3^Q#R*U;zz-1`bNiU;r}r)Wd}#*COW(ftabx@ zC;a1JHLu4{Qv2GToi7capeTC2#L>ZRxVh!SX6?xQMp*`SWd4?pBt8vR558PXi9r;= zYWg*#`SdA9gGRANY%8cU&InwVmGIbUO<=k0nC+w)>>G&fR)OUnDciMxuc0=c?X>Hc z+L6ZS{4?U**h(#*mrwuY;L!w8k51QuucOm=k6H)U&nL9DT=O`E)?U)4GqK*YrT+@8 WM>K#9bTGJCuAyGvvw6X@ZT|;v{-3D; delta 5028 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 R!5yT3C9fQ4SoCPm{{cM#OTz#F diff --git a/packages/ludic.render3d/shaders/spv/b20fdcb5.frag.spv b/packages/ludic.render3d/shaders/spv/b20fdcb5.frag.spv index a5c26ce0555ac135c48f3495e0ca33783528c8df..8f5ad99d53e8436f11c36e45bbb26f51bdeed3f9 100644 GIT binary patch delta 1433 zcmZ8gK}-`t6rE*hp%xC%M2xngEnuPDmV$_g(4q(R2Hs3a>HRw5$tp7Sq!7sO(CtOtV&kffU&Y)(x3iS7;r%Ef?3PxVP5NVBq|FmqH_%{l&!@ ziu>W>5{mod;*yFJjrRUfRjbjpgW&j_!Q6D|Fya;$4pYQKosKcTQDHhpjF;4D80$SQ z?5?MQ)Ny5*9~LCs2^p2ppc-WCROd@w8?e5G@A>Yk%65A#67gwK>v25YMmu5{$cOiq zR|v!U6@Q^6ttUn&Zqz&DwbpBGCcf5UuDmdI;oUxjx&&f4B-ngZVcJ5DebG`J2mT$M zPCIx6c=~ojI*x<#C?|lKL!Ldpvln7M#LvCrl=Mzh#5HuKcMfI&z2oCFpfzrsv5o$i zp5l+eJ((83n?Htw{lNS&98A66-WYro3{7CvPk<4~AMvIIV`$NixXYTD4Aj<9wT3J* zJy5%`y0FG!1vPR`MHDePY8;5z(fSZy#rddlIAUrvGLHCx(l{vb2*$;pHDLhULJ}LY zkO|J_)SL}ch@H*(n-hS7aC*8w_DlXLAn8D>H1LoBF%*4?;n)Q2+n{ delta 1202 zcmZ8g&ubGw82vVzq>X7o4Yr7lNs~6e(=@eeYOKM7=t){{LLsDfYXddWG)+N~;H4-i zDsvD)upsnoT|qnuJqRjz(1U-1c=F(-H^KL|ySjE@*m*zZoB3WQ@9*j#*Y$qg6Ymkx zBq+Ud`f>kCAk!;y60@{*@AAHaPri!CDCTOlQ#aN`{Ibg>EUsN|w8`~YzND%Jk7y}% zJ2)6lTl)NRZNaF{*H#Qb`23bHqqc&BT2_66J7<0mKJV+saOCw`t9A`GpLk_t4^HgC zyk@g{rMcW}S^n&Qx=&63uU6YD)g_~Tb*XK6*jA_7YU0KgE?Kx?)LN3Th$(B+LVa;@ z*Ko?hjh1t%vY9@7M~`~{hT=n|3)t#}geYadsLi3o>?8f3lms2eeCFa(Hn-v8m>GR9 zU0lZIw$<5iXyCI;$=S*m-P{a!v@Rn#3XbDEB4h-^SogVbj3Neg#zDW=#*Bj)A4_K% z+|MTICwA{=I@H-Tbia^@so_W{;IX%q&3BQvx>itY@u%j{NHn00s_A^?02|GsWB}i7 zzeq+s$iLBY>fBfa&%zk{pe0nk@S~f89)&NB%II94V3uvncFD00O2{$bozz^#!IQvq z4?UF}8sHU=1JgsEHGYC)L>$DgQG}6bHooPT31KD`I;R}J!=*xUkn|ZhW#L59P&E!GiWfTe$9lsH*q;478=E*lT9bF-mo3-9D^qh$%VF)D#=jBq6hdQ-Jk|puU7_F{I)?Qt96AdVFHr!d sk;CD}ZI0nNT+!zEI%aT5{+biuxSxLNtj$aE*QNFw@t4HBcxmUx9~a1wpa1{> diff --git a/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv b/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv index e14c9356ce47728aa104ae676d301bfbd3d04634..f41145f7ea0dc97ece7f0d7be0d1531d704d1ae6 100644 GIT binary patch delta 1178 zcmZ8gOK1~O6upzluO*QyIsQLZC_Nq>YM5bm>B* z%u2T+;!!3YW%bX&za0iN(LTt&pG$qd+wVzFK+73Zt2~6U@#)0 zNlc=$vDjVh`WhAahqZS1%3|z9L{4fVDG^yPXRN$=+Nu`JV!0*~mZrA5rIqZaLM`m= z8)|8VQn5-tMKQ zCwA3O=^{t`nKv+c{}qoVIMmQv1kp-=$5pcrxT3Y~nIL_o&VF3lEBk zkK3eVeeQ|7l(?r&aQJ>ud|=-Dw!}dnb6DcAk2&lB;()^LL*qt#?EVs|Wl(nK4A-_F^#HlMs>R+)}Z$B+?;%hZ(jT!ApHfhbb%+ zE0tokK(c5?SCMdP!#wAb$Q{Dk z{4bVrV_Rxw@P#o+r-KObLnr6qh`lbRGvW>x)7fR5JsPWfu|=Pews+zUHJ=!`5Q>8t zL464OBTOb`H?D3Q2{k!7Y}Du|2J#RxFeO(on;R~s6~T%pAt4kwuUX3rPpZfN5Xj6$7qM)W5NSIm&@jgLN_N9H_>-+{h^brXj7?9lyiEsAU+3Vpz0CNJ?3=Q)?7C~*eTR5`%;33i%c9eHX{nVjzS z8E4&%e-d#9k3fwtIAg>$A)%Xo#d#J@?;?pNz5z3lpN@TZV|*PQ`{Bko+$oskbdC{Y WJ@d&^n!L~zN~>q2p_U#1 diff --git a/packages/ludic.render3d/shaders/spv/b603a056.frag.spv b/packages/ludic.render3d/shaders/spv/b603a056.frag.spv index 483029ff219f2c4ffb37e895671d116ef8288ac7..0fc7cdeaaabcf7748d7dcfc5ac840292eca87769 100644 GIT binary patch delta 8333 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 delta 7719 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 Hzdr5%IemLm diff --git a/packages/ludic.render3d/shaders/spv/b8cff226.frag.spv b/packages/ludic.render3d/shaders/spv/b8cff226.frag.spv index 2d8343b923d6b87fb4988ffb3f14d50e94154423..4424e5469df7f472899835c17ae8eb09102a69dd 100644 GIT binary patch delta 1433 zcmZ8gO-vI(7@cKlp;iviM2xngEkA{JTM8l~LW>^M8+bDzsS6Zo0xh(qMop|-h$JS) zY>4rs#(4CgYht`{Fwui18sov6HxI@{4|+1u_oh3rvdLt>_ult?^Ud4YH|zSVn|h1h z5NQ%Z6MoSwChoM9eaU7aPGXHc-MFx))+9a%A-b?uv-9R`cE&8{viU+)2(PGX-P_ty zsjg7-%DSFyEw_{}llMqID*0+YcX@~Fm0TrXsO%p*g z(RvsRgqC$7&SF}c9+h2*9n-9pU?4>{f^|b?))iVuZp+2>Iow<8XE1R7y-T5y%>Lry z42S#S;t~$`$HgTbPBhvFLRGCs*A9W>a|UzMr6Y)2T{uh;4|O`m{6+`UF=D)=PQzI5 zabb5o4Wy1M%lxn);ZDdn2@OtzjGgLuscQq)x9~mRU8l0mUW-J0TGVmm~Ef_&{LP6+oWTbW??VsrYSTf)&#>tfayZ0MVCL~r+)(rBI>|4h$YV|- dFXJSpZs)4Yr7>Nt5RLtEp8RV+|fePttl53L&+r4b()FGzCS1m!hDk z%s~Xfg3z;d1@R#CAgJI$5B>!4%U2PJVy;%Y_1c<+%6Qd_GR9 z9bC%dw$<5D|L|vrlChL8y0JOh)q0HNC^(Muh>#JCVLjx)VTu^k83+9?3o{O4d`z8b za6g-*pV+yd=}>3W&^A$iC4s>Rc{}XHm<2&|)f^|Itf855bp2Wppl2FiRF@yX060CFB_JPGY`n<0;_z zhkfM?8sHU=1JgsEHGYC)L>$DgQG}6b7QW??Nns{7!41rS!!E#D^J#7@GUIY%!z*MWYcl1H!O`s ziHj)BDhaIb>Vm&O<6AJdBIjmpd&^efRi99fk s95y#$aSYGq3KqxLF^fy`*PH~${q$33ZC;YUF16o?e_D)-mv(Oa0VS}Ir2qf` diff --git a/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv b/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv index 2f46226c222f1e83c33bedc7fbea24e728a299a2..f8254590c509a802b23c345300f7a80677b8e703 100644 GIT binary patch delta 5067 zcmZ9Qd6d;<8OPsY7ItF^C;??rcBTMRQT7xJGQ<|?9FDg^2bdGg;0yzQcu=_e+#cq2jGOwSU z)$mhl_>>wxt%gsp;j{Xu@-3ssXUl5zb87hV8tw+^C^5>8&U~D!-ePY|AAxt5wsn;@ zwYF{Cv@Q2>Lv1g0cCfZNUz_vx)|SrHGj+_4`tofjPRc%3pVE1l-EmWClWALXt)X|< zG@^x%yNEbxSdC`CPgTWoXQ|y-r z_6*#EXyg$+TP98(SU0V_d&azM7Lta~lll

Nb-&1JS;K%>zCG{zb6UvCrA?V>~T` zAMM`)o8+^!uv-Q{vsgN9KZ6%}GD=!Wax>x-jB@>d>sNYiY4AHLd|CMa34Ti9?;!sU zcO6Yy0$ba(vroI@D2Ee4Noiz{$|ei_u2YIro7dB8p9^>Y!~_xbd`s7LADF@EH`nSdL_szep))|S`Ix_r1dr=H5L;QsQ^*(Yb-i=hs{>b)3z zB;0$kntL}^bFahTgYoyutL9#N)!eHuIPuF5&Yn{q*E}RMm-k+kElsH5lWMqkU-+Bb zyRVvi_f>Q6zG}|h7reZ&dDNU`eLOiH@4#w*@4(>NSM_|N`HcE(DO=tn^CjB-$R4GI z6xns&Q|O<@M}7_5W2k;bp?w*AHBH+hcEc{7YQ}h$K3@fU{N$$p8u%*OMV0<5)7K$7 zX;{rK`3Ri$g4Jz)+z_7WU3Aj^4Rn3(K)fI|<=VdToVjDNZ=!15M{_vt8#UA0^E=?S z!sf56JZ#?sUtHMSS@Ib655NxFnC>$9d?w^AavgXVPvT|yPqhv@`jf8FAUggKtQHA> z1a^SCi)mdC)<=CvF|8kio&LEr?Z$Oms~g7}-vIUsTbSlmiu_YZRgu$;aGlhn#y5f0 zZ!EW*HZt>MsJI=Lai(tpyB)mrq6R+)tGgXs%3pxJDb-_2zXTg=H6Hr>3an;}RdnlU zyA@44ak4zI$KW7>0S%dO2I9_8;E{gE*X6V!>`D3W`7+oXnpeNqy*{!3{s7h|n*H2yccR&^nPyV+=o<_C zN9|`~bcJ<}71rQjJb8D6Jz24M_kh*z&KK`4kc#zq2=70GT|9q*VmkMN)o;dUFSh%@ zY966isLx-(eqJY|w)<&nuX6Cj5$7*BC>L#iw}=6XPMU^W>K`%M)4ee;{gz#1Dgy(jxJrV6{hR zt^tqq7+K7Y%YGB3+DrUKxLT}Vf3P3dPg@gB%|PN9>;Q1}@(qHk`8pSy za4`4~v9#rt_BCw?#L~yE912&{IcA{d3?i}5>KQq+JRtFgVY?V^-?xF~VH*K%D{RBT z<#A^X%XSvRNQAf3{DDMDqrh8v8boL92K9AHTihFCz@Gnu_(nC}fu^pHciV|z&%7_Q z;WHMDp7rkdaR_$Q5Es=+VApmgO}lTume7ItH>~!U-9&KAd;(Y=Hvi{vpqQxdbn=Rg zH8>UG5*XAMJb8?AD%eEYeA$zWebIA|L=|Sh;}(p*Gtt!b_eD@1w%K4Sxu{&XU`+2C zG^4zWHlG4``@9?cNuEx}VLLiUVRj?>I%yv>_$sS^Wm^2?ft^*X!92KY;2#VziqpX8 zedq8!2zJyEfldb-d}nbbo&i?VHxjFb|CwO@ujR<>BjJ3o+BI;G*jZpTug3*ExrZv} zOT*bTMbDQw5*)zIEgv?Y&dgtwMPO&XFu)wWsXc^BzQkqP2(z_^7%#i z&j*hth=z;$zz#YX+<~m*d124< I3m$F%KLkBnXaE2J delta 4409 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 diff --git a/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv b/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv index f680ae9c2b65a6ce49cf6ea5e7bf68ac6ba6ed3b..9c842354ea3bf59e6f26109f48822215b85c645a 100644 GIT binary patch delta 1434 zcmZ8gOKTHR82u*CPLs5aNx`yxOO6r$G|`!H)QwVkqgid#Dn)y`#vFw?>!qziQ_WgWp^iK1;)=OkFg8kS zjY%e~_t740(*7L19Gm;yBC=*y%~b>kB_Mwe;eUrPk6kgADl3($6CVI><_D$S+U-u{ zY0Q>Utzcp&D(>KN!K~Kt5#UW@xl}CHal*mns+uBcf9&4zTlf10YuEfD7hFH+(-790 z!v*RdIW3woX<+r&h-0UU|4tmwVgfT7@Pv`JEL{C1yS}C85DozInI_ zmpkxqlP)I#dpK3pg7mP@iVq}eaVY2EdOMgw?D-MXzdq~(E~bCPJQ#KQH-LT6gT49m zle&s0_Ug&H-YPz~K++x`xE|DU*52?VJ&UW%%#?j%bSK# z^-!C%GP#sCVO`AaX&LKN?sbiJskraBJR`vU$n&8kJP{T@rLfB}J_Ica{5`!et8ff> z;el^9i-U5YHekk(XN_&tqILX;Z-(Wp;~jX1$Rms1Da-_V$4?cYH(s2y&Ewnt93KXI zGOQoJd>9HJ1?Iz0n0i3B+fIJz?agD>CA9eg-NY|FIE@-9#Ozz~D~Z}wFgu7M^9%c* zSo>Hr@P`^Xm2rSQIcl7USZRN;KZ6mdaXMmZbW(7rqN{OI;%Ur_o;A?`o`7RPCNe-Z zr=}VNu~*Ic&WWep!9&>d?vqzd!`RcU&h!$YR@l%|xpR1Fwra`v4fxL~EFeUFu W1RM+KSkzgZL-O%N?5_E*xBdeQ<*Oe6 delta 1184 zcmZ8gOKTHR82u)bXOozgP|ybRFf?zFL<%iZYgg*dB8XriM4LdMO-lMeEEoz3?zG&6 zR0{e7M6`o~%YvW_7yS#}xYK2P)_Trl#*Do%%sr2L?)QC}+<&P*e4&SRSK23{Nl^SU zycKQ-{`f_L0g=$_2XBHtk5o00akUkSj%Gw;t-9K5t%`WXXDV6sE)+YJGnM*Mb7iHu zULUA=^#y9dRBtWT7V0>?{O@d0rNS|-WK4&zh39&>cDdH6Ey3&&w|qZ_e;&guvt7O2 zUTk+v|IvTCM~2kFSag<+tXDg2RBXCJCT`Vhojwi&uT>YCjYc1zFmbD6R}nELVw-x> z-JgOPB61l~=2U<&I~f+W8_!&MtPi9t=ro=k2bZ(B=MFA!ajzU)L6sBHK+#e@sahiH z+SiTUL__Pc>o^pyOPJCS>P=xk;=pGpVo_)R^t&z0{)t&Ob@tEm9tU=w=RBxe{xKop zG(;?eOO;bm<9({((ax%3cH7v`ehg^iYP;MW$s?eM%UI-7Bo$P?@Rf&`A4pq5?W!g0bqK_Gh+i; z92OVxU6?o=&?cVsNkupvo8SRXhszFN^G+Nw0uvj0g`Y0(q%DazKV2K21m>q}W9mnK z(TB-*om0*0}q|-`WN;MOJgeW6tbD}8~Yu+Sq;xo zX9kn0*|!Oruy5m^hIk57V}^!(TBM5-2ba1)-od4FFtG?7m_{y}b6XszXLBBlbAh{x dBKdQA!SOu()S1m9`SVgc#QZ14h~M~p?=LMsm%so3 diff --git a/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv b/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv index 1fd9940ee0346373e0085995abb380fd2605cdcc..8b479bb2c9219980afbf0c2fe7e9ea0a12545aa2 100644 GIT binary patch delta 1434 zcmZ8gOKTHR82u*CPLs5aNx`yxOOjX4T))=OK3rkb^$LLGP1#T9e8U~H7u z8k0;|@1s51r2RR1IX3sZMP$vanyUy7N+N6$vFAff|N5{GxS0MChg?km2Cxr$us5H6 zQl}BDN9@&;b-h)5Za~r=AGjXWa@OAPBRz|w%*>R1V&sjkr7dl$7SDnhL#a64kD-oR zyHgLfNh^~}X%p7P+@6-PKILB5XqSrnj>9to+>bmTTEY`y@ly)B9OLB4VZe#r_ONpvLKlsnJQnM-^R-lM+v3Ui7Sq2Ji$N3o?-b zsyQ{)Ac(zc&U;Qg?G7Hoo@bxDY8uA=2Aa+xhC{RfGmekqbp2eNgf$Ja)eYonyo4!v XMk3%?K*yra;vABfCt`Qaf4%h|{}QVk delta 1184 zcmZ8gOKTHR82u)bXOlE7p`Z;WjiGsiBvNRRTDwwr7C{6HA=(52ZBo()V!=>QaHr)i zq*BlyAfg=b)+(!w=BkKSe5R67??bWESyQPkHC9#{ z>$Sd`Q(vLxP4)I-b)kmS%m2<6R5BdXipF&KdU&pjYnQ9->JrQzam$Yr_}2-{GFz29 zt;JT`^dJ4Fdt^Wzj7DeK$ay*jZJz(w;ef{AJ4BP1hZHrD3l?VMA9((;Yo>@+SZn~89`elC zKo*C^MSKq?4hOV}XMIu@PRAyAfYaf!1K7M1M~uM4hF<2U%R6Zs!<(P3jZXpd)3q`6 zBfs%(^4pn_Y4{Vs-=W{aa}gbO)!vP0=MwBhO!|q3PImnp`?{qum3Ru-O!