From c74c1c014fc9bc7a22e6bb6afeb06c5de7b418f5 Mon Sep 17 00:00:00 2001 From: Simula_r <18093452+simula-r@users.noreply.github.com> Date: Wed, 3 Sep 2025 12:38:44 -0700 Subject: [PATCH] Feat/adaptive lod threshold (#5249) * feat: use a physical min font size as the LOD threshold instead of an abritrary zoom level that is different on different screens * feat: min 1px font size, max 24ox font size * refactor: settings text * refactor: settings text * refactor: version * fix: default font size from 10 to 8 * feat: cache the threshold and move it's calculation out of the render loop * refactor: comments * refactor: removed package-lock * refactor: improve how we manage deprecated settings, and removed any types * refactor: how the migration settings formula works so we get prev settings closer to the new font size setting * test: add in zoom and settings test for LOD * refactor: tests to use best practices * Update test expectations [skip ci] --------- Co-authored-by: github-actions --- browser_tests/tests/lodThreshold.spec.ts | 197 ++++++++++++++++++ ...comparison-high-quality-chromium-linux.png | Bin 0 -> 54034 bytes ...-comparison-low-quality-chromium-linux.png | Bin 0 -> 36197 bytes src/composables/useLitegraphSettings.ts | 7 +- src/constants/coreSettings.ts | 23 +- src/lib/litegraph/src/LGraphCanvas.ts | 58 +++++- src/locales/en/settings.json | 6 +- src/schemas/apiSchema.ts | 3 +- src/stores/settingStore.ts | 42 ++++ 9 files changed, 321 insertions(+), 15 deletions(-) create mode 100644 browser_tests/tests/lodThreshold.spec.ts create mode 100644 browser_tests/tests/lodThreshold.spec.ts-snapshots/lod-comparison-high-quality-chromium-linux.png create mode 100644 browser_tests/tests/lodThreshold.spec.ts-snapshots/lod-comparison-low-quality-chromium-linux.png diff --git a/browser_tests/tests/lodThreshold.spec.ts b/browser_tests/tests/lodThreshold.spec.ts new file mode 100644 index 000000000..025347e4d --- /dev/null +++ b/browser_tests/tests/lodThreshold.spec.ts @@ -0,0 +1,197 @@ +import { expect } from '@playwright/test' + +import { comfyPageFixture as test } from '../fixtures/ComfyPage' + +test.describe('LOD Threshold', () => { + test('Should switch to low quality mode at correct zoom threshold', async ({ + comfyPage + }) => { + // Load a workflow with some nodes to render + await comfyPage.loadWorkflow('default') + + // Get initial LOD state and settings + const initialState = await comfyPage.page.evaluate(() => { + const canvas = window['app'].canvas + return { + lowQuality: canvas.low_quality, + scale: canvas.ds.scale, + minFontSize: canvas.min_font_size_for_lod + } + }) + + // Should start at normal zoom (not low quality) + expect(initialState.lowQuality).toBe(false) + expect(initialState.scale).toBeCloseTo(1, 1) + + // Calculate expected threshold (8px / 14px ≈ 0.571) + const expectedThreshold = initialState.minFontSize / 14 + // Can't access private _lowQualityZoomThreshold directly + + // Zoom out just above threshold (should still be high quality) + await comfyPage.zoom(120, 5) // Zoom out 5 steps + await comfyPage.nextFrame() + + const aboveThresholdState = await comfyPage.page.evaluate(() => { + const canvas = window['app'].canvas + return { + lowQuality: canvas.low_quality, + scale: canvas.ds.scale + } + }) + + // If still above threshold, should be high quality + if (aboveThresholdState.scale > expectedThreshold) { + expect(aboveThresholdState.lowQuality).toBe(false) + } + + // Zoom out more to trigger LOD (below threshold) + await comfyPage.zoom(120, 5) // Zoom out 5 more steps + await comfyPage.nextFrame() + + // Check that LOD is now active + const zoomedOutState = await comfyPage.page.evaluate(() => { + const canvas = window['app'].canvas + return { + lowQuality: canvas.low_quality, + scale: canvas.ds.scale + } + }) + + expect(zoomedOutState.scale).toBeLessThan(expectedThreshold) + expect(zoomedOutState.lowQuality).toBe(true) + + // Zoom back in to disable LOD (above threshold) + await comfyPage.zoom(-120, 15) // Zoom in 15 steps + await comfyPage.nextFrame() + + // Check that LOD is now inactive + const zoomedInState = await comfyPage.page.evaluate(() => { + const canvas = window['app'].canvas + return { + lowQuality: canvas.low_quality, + scale: canvas.ds.scale + } + }) + + expect(zoomedInState.scale).toBeGreaterThan(expectedThreshold) + expect(zoomedInState.lowQuality).toBe(false) + }) + + test('Should update threshold when font size setting changes', async ({ + comfyPage + }) => { + await comfyPage.loadWorkflow('default') + + // Change the font size setting to 14px (more aggressive LOD) + await comfyPage.setSetting('LiteGraph.Canvas.MinFontSizeForLOD', 14) + + // Check that font size updated + const newState = await comfyPage.page.evaluate(() => { + const canvas = window['app'].canvas + return { + minFontSize: canvas.min_font_size_for_lod + } + }) + + expect(newState.minFontSize).toBe(14) + // Expected threshold would be 14px / 14px = 1.0 + + // At default zoom, LOD should still be inactive (scale is exactly 1.0, not less than) + const lodState = await comfyPage.page.evaluate(() => { + return window['app'].canvas.low_quality + }) + expect(lodState).toBe(false) + + // Zoom out slightly to trigger LOD + await comfyPage.zoom(120, 1) // Zoom out 1 step + await comfyPage.nextFrame() + + const afterZoom = await comfyPage.page.evaluate(() => { + const canvas = window['app'].canvas + return { + lowQuality: canvas.low_quality, + scale: canvas.ds.scale + } + }) + + expect(afterZoom.scale).toBeLessThan(1.0) + expect(afterZoom.lowQuality).toBe(true) + }) + + test('Should disable LOD when font size is set to 0', async ({ + comfyPage + }) => { + await comfyPage.loadWorkflow('default') + + // Disable LOD by setting font size to 0 + await comfyPage.setSetting('LiteGraph.Canvas.MinFontSizeForLOD', 0) + + // Zoom out significantly + await comfyPage.zoom(120, 20) // Zoom out 20 steps + await comfyPage.nextFrame() + + // LOD should remain disabled even at very low zoom + const state = await comfyPage.page.evaluate(() => { + const canvas = window['app'].canvas + return { + lowQuality: canvas.low_quality, + scale: canvas.ds.scale, + minFontSize: canvas.min_font_size_for_lod + } + }) + + expect(state.minFontSize).toBe(0) // LOD disabled + expect(state.lowQuality).toBe(false) + expect(state.scale).toBeLessThan(0.2) // Very zoomed out + }) + + test('Should show visual difference between LOD on and off', async ({ + comfyPage + }) => { + // Load a workflow with text-heavy nodes for clear visual difference + await comfyPage.loadWorkflow('default') + + // Set zoom level clearly below the threshold to ensure LOD activates + const targetZoom = 0.4 // Well below default threshold of ~0.571 + + // Zoom to target level + await comfyPage.page.evaluate((zoom) => { + window['app'].canvas.ds.scale = zoom + window['app'].canvas.setDirty(true, true) + }, targetZoom) + await comfyPage.nextFrame() + + // Take snapshot with LOD active (default 8px setting) + await expect(comfyPage.canvas).toHaveScreenshot( + 'lod-comparison-low-quality.png' + ) + + const lowQualityState = await comfyPage.page.evaluate(() => { + const canvas = window['app'].canvas + return { + lowQuality: canvas.low_quality, + scale: canvas.ds.scale + } + }) + expect(lowQualityState.lowQuality).toBe(true) + + // Disable LOD to see high quality at same zoom + await comfyPage.setSetting('LiteGraph.Canvas.MinFontSizeForLOD', 0) + await comfyPage.nextFrame() + + // Take snapshot with LOD disabled (full quality at same zoom) + await expect(comfyPage.canvas).toHaveScreenshot( + 'lod-comparison-high-quality.png' + ) + + const highQualityState = await comfyPage.page.evaluate(() => { + const canvas = window['app'].canvas + return { + lowQuality: canvas.low_quality, + scale: canvas.ds.scale + } + }) + expect(highQualityState.lowQuality).toBe(false) + expect(highQualityState.scale).toBeCloseTo(targetZoom, 2) + }) +}) diff --git a/browser_tests/tests/lodThreshold.spec.ts-snapshots/lod-comparison-high-quality-chromium-linux.png b/browser_tests/tests/lodThreshold.spec.ts-snapshots/lod-comparison-high-quality-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d34400f3f3deba4b56cd6f8438825589ecde88bc GIT binary patch literal 54034 zcma&OcR1Dm8$V7-Cy7I{63571A$#ORMn*>V%2u-X&MJFTW)hMRva*w8uY~MPGLF4{ zZ++hH&*%5Y?|WU}b9G6a&UuaJ^S&SJJ|Pd3WUk;*;$dN7U6GTOQpLi$0N`cG{GasqSe}80_};Wy5+N1xQ2$l z>7wrV;mDRIqMutUrdTm5j?~2McnkNp9tp?s@vew0u|E}lYQDkO$#ws(d@`S+j_eoW zM88W0LyaOv_s31!f7Xr99nVBxZw^D^T1VGqNVvWA>=qN=mDf5LckJ3l1_cEn;F!)H zg(m)}uM(Xd9eS1Je%HyXdanHE=kRs@JWj)Z{^7U$D}Hr?MHyR``oBNAjw@9^DSrnG z|DWfhIR1aXuk=x**~HI!-Iyx*?^7#p-C4X`i2V1Ju(0~h{olSX``_V2``euQo(3hh zdCg=U`fSo%9!m^+eUbd1cW-!z%CwAqgE0w>=~bmb%NBN4vL>)4vdhfZL$LRM{MS`I}OF)hQx_bKI~pSQ*@a#fheGSnZAt({C>lz5Oo z(7!8wu$U!rG)1`W;mz|y60-IC0`gBm$=IxEk4R?uE*Pk zr_SEqwW@jexB+5fVo4wH{ypx7D~zwOw6c1C{QRk*p+Sj{8`W}^=Jpt~Mv(zWj4UG) z6WM$0ds)SwKYuPM=`-aiW?$Ytyh>u86_dL07|yYvn4eFThk_*Nn;JbZXV%!8ypB})9j(%V}Mz4$$b-gmEwCN}T? zb2#&{*mmaT^JA_PH}Hbs{RbX9tEt6}*$@VyHwPN>vtGY$Sl(7rP+d|lb zgoK`=>F?jOmg(p}eCYgVsJO^`<%zSiGa@rfCaUgeqh0Rjd2H_g+>1$E$5yPpoe^7C z;WQfGBTP?E&;I5DFE8)?`}ajeL>BU&X|@DiCL?7%kVf3*=l^D03@7+~#btMQ_d0&? zhYue%7rL25Uoh*}ivQV^_Vy{zuqrcOc77ky%JsFwLgM5;1NRe>G`}&MC@H#Y*RHW9 zJZ=uXw!goR$W+T!I-VD(C&Hm^l{cbb_|M_okypu6r=XzV;NX}}TwPtga-IL3I&1wz zz0a|SB+_N&SCDIgezgW?lI=v@4G9ib*7xt<_boX!8rc~cO~MrytV|wJ3Augy_Cs~` zXoe+>TUUmJ@6n!pa-sF^ri9c>KL4FQ}7jsDk|C^{r#Kur-${T-Aso6 zD-ZE+`j?PsrCha99)A8{WZ&bm5R2mZg@q#R()pocle2?yaoK50V9V-V?9Gz7T0c4( zSu$+>@ZrO!PoJixrICi24VRdy=6$NFqM-dTJiKHlh(xn#e0b^bW2))-Qnz^@yqKnj zM(C}_Je}Mrog~t?@UMnQ5epE~e&xm|_|6ilQ|nRIZ2YQVR&iG%(Tq(JAvf^;g~SVF zTiXwpw575Ac3(+^^Pf|rv8xhv2;t^k8c4%o_E7t+4(d4<;$1*b#O+i z%p|>*TYH$9DZ9#wirqM6aiTbV_uBEyzmGk&hHu}#tryw}>gnisz;b@}?AdGz2G;E9 z6rryyBdkm!oM(<9-uvx_=Gx^21y^k4oL)$MDZLf=fUoWIz2NnG{KS#L{yfR)vTnPy z6o$vYHEpZrNCT17A^KWcd$V!Mp{_Ww*kTR;Ic&dp9x_gP=i-1(QG(R zJCFE#XJXZSCzAZ1WTp@%hfG36xb_HWU>0W?I(YzNju#ah?^yd>Sf> zL~ob#bd&_r=f&5CWH&e@5l}9?1rNj==Q}QQ)qM2W{$1p=oi8mdJ#jd`o9=tE&rs@h z_um#F%VJY;ozRVxS2jhbyVoqlrI${Fq#< zC@Lb9sdqcvSs9@S)~@%d?KB_xWYwQyTj$>T{=e0!;mUk$I|?IeXlO`-z+q%$gd<8x zPX0AA($dm`QJ9R4C9WQW<^7aj7s@R+`JbgFNkp?TG#Ft?WU5lG6kT3nAtxv2w>aws z7xi;c2CrPXLhziP1h1D*Uqz*{guU=VRxdd|Zkf*0(qX~KFe$pnWy0k6c>W*VFw@D& z$x#v~ZlTpmf3dw{6hbZWTypQmTzh+4n{2EU;zB^<(~~AWRmMhwr{Ah_N&Vr&+kAYJq>23^vylI&QBNULAWM1cpxX)6dG&x1XI{wJwYSt{mFPm z-~Ik?BJ|U>I`L8W4Ibs?-+oyCpe?)O&#_oqQYz{uCNr&ZOjnD};}<@VJPwuZk#O1( zM9b#%796ggHjbPgogSxYp(ye2(}l_(a0D`F{ZpDqT1u=P9XHVxblYjRBFy3ho?PY~ zco)5RNwttjtn>fes>*|3i_Bck~{yrk1DBRze82(8|LI3IpTv;)r;Mm#aiKJ!w;BA!kS}6|BHL>JXXygkk5`q zy$G^FR35;cg2j=ip7{Xh9Ck)`QisZak6bmn(a4A#mzGaRXldIcpb^z#e|e1AZa|iS zI0&5yXh}FtKHHf58t7FOzibaqOLFIv9AD0v{+V zcNd$q*zq~f#I~A3+n-j8oC$t@_8|MDGI-&?*I+5^&AW_~t=zJ*vgt&VmPoPfA8GW=jFZL~6FpaL}tbOw5Q z*0X4i7h5DwFld1ld1oi5nv;WNH&rKT>E@M+iIZL5(_N~Tm5F-a%#_6MY(+ItKy2%e zcb=#S{mV%F_~2DOdhKt_&(G&(_)yyJuQw59xX-`3#-{OOV4$p`g3IZA(Tl-lKr+oy zDJdzgE5EjbG2tUZ;OFSz zuv$42+11q*aFH<73`!&bLO>RdCr9q~SsM9cHSUf+KH`$dT&1*MwVu1Pvu`VR9}n-7yDS^6Q_32Z5&QgJHMQ98!S~gpC%wxF# zuD?HuO2Wr$qR#u-9jrA~)`Z;&UteWqWqW&jD=U`vlKQ=7uDXqcqWHwbovp1J%(v@q z&Tjzblsy@w7PM4KUaBew93)cRLU!1AYYS=jEp{zkMfFKEP(5GmCM;l z2A?8^AV!%#n*fir;qp2o|tC zz;L)K!f8rKoEkPZw&je|{R|>>l<3Cy$w`z=H(;vut$tG%D7zn_ zE!XQe+Su@dj0fI7Y!z5~JP=^TmmJ(Jy47=+t9C0^KHFm{J1K{$@?^Wn_gLa|Q=*b- zbj2l%cKL?uC~Z>vgwNqqs^jS$;M=}XbPNyrlD;;L*$AMSNyDHTMzsW7l$}}E%6#ym zS$uEuy!`!w@Ihskbic;MN7USbUFSzouidpDqx zh>KBARh8#-+h}fX4iiSZ?^Ty%=;IDoxc~m@aH+*N%5}kY7P(RaD#7*1074CQbv+x; z9H(60gQeUjKR>XrunbqbuFYxOw)k%a?TeXMBg2toO;DP+nbdwka(&-RPQ#3wd|hyA zsrr-7(+$PXI@?CmJhGL_hku4k-3Zp5N;y0}^jad(#=BhR6(dAw;j~qU5#FHwB@#p9 z@&6Sz8TNJp0)qM3S%nER{uKK{#=vMnT7LV7h)lzijU;12BdNtcJ1zBP9L+Mp)2Y#mEXmFtSlgetZZx&2aELfX|rrN|Ed`% z@7kSTPhP!x1r39ZnHeddbg9C?3)5UvQ}gTZ;{o$0&)wC#&k4jZU$0`!fJYg^yNVsH zHz|wnGe{!+QJ>1no{oLq2B@i7o4&sVr?VHrl>RP1-*ac!f(Sh`GehIO)eAdtSx9|g zbkw>`=XA&Rl(d^u+--f5%Lfy-)NJ5;>>SYe(dYPJ&1*r#?Y^t)?f{-&2(*EGRigjg zbSyn*OjXvpi6jy<2>-j`_p+qumKGOZa#UfQ9+!Ro@F9FgFns~KB}EV#nuu-9!S8&G z87nKRU76s+0qb~qGZhsTU?BzsuAlQCc8iwk6u8}(6r!pIi6l4O0~+q0Rbi^CL{vNEB~vcXjul>!&EI(vwfw{s3-Xn6bOW)jm`CDZ1DDsI_gcw z$U->dWqhtD8z<`?GOpr@S-A<$JdCF>F{jDMBus!?xes3NO?U z+qAaHTyv89_6hojTB4!6LgoVn!^dvI2*3VF6oNQJiZvnh>agVF89`3s5IZU+1bSNQ zJ`$%&Pf2Cn;*t2eC=J2$ICn!SD^Jhql2xL&BM<$rGh<RR zl*kM=$^wxQ?-7V(3S{`W z!2LDy(_X%OIkNXCseR6&s!+1O;dZ7*{=nlh*v@)scTUJbn*+QReLQm)5~#PNiP=mTU%T28_-~3Rc3ZR zBH&KHlizD;T>P?Ws#0mb$Nz~`p8EXUoC?X@wg=a~!CgYTU(aadmX>1cql(5J&!BE4 z=Um;j!}IrB)9bLUE+liP5=9~y>O|-f{;GKj-S?$p8RTL`yPGmxv9Mm!AraqAd4eC| z;o*(iRJ6=o3POj(DLuP>nR)@BkF)R%G&5xcqhs#*bCY~L-jAu|V&TwfXEAQ;YfS7Q z2}($0m-mYrbsv^hE1% z7Jc~eb+{ueEDYX*os^B0wXLlU59b`9O3H|D3!8Hb3p4Ni8&Q%-(y*IIgkV}1NHK}= z@w4;utR$fw9UbA}_<8D|-7v?Ur;xJ&f~ATX#flh~P{10@zhsu!)2Bcq=2^6+$+m#VW~ z2|`at6dWCSMckX&_P9<-nW|&~U`akZ`Q=M!muZbgAc8qp=~1;n|6&&r88PLVijtZx z9~d0u+B-$1F9bBcKD%8ZZ&j_1m~nyW^)G29D*9}PT_;Pwl&Z1W1jH!HLoo;R{s<{L ze-y$W%a>IRzk74VyL%P6Wyr&bh={y_ z$D*;BpFaICE>0Eq_UL^h4H71ZHU*$EUb#Zm5)mG*#eUYQP0h>z48_F6z)hmcXqu?3 zBC?H{wi!3#W?tR!s1?jvSzPRST*jZmfkgE1f&0J%qD%46_wO$njS#p2B+^qA^iZHl z!$NG?+DqU~F1tDih`v(Lc<{il$w-v_oGq{vt#a#EV>T_BJgfN`CGXDHNrz_e-@ZNN z<;LEwN|N2bgw6!u_r@w2g@~M4|4k&E#t9NWamZN%ol-j3u;fbyh3cr*?e~woykISqpV-=xwS%_-^gBe#n2+)zF0M_yyPBK%#q>E?m_TMQYW^rbN=0bv4Gn(x zvRK&Inlgq!rA)E;Y~|)gK0(l6VzBOAaR+6@^Xi_A%tO|Pf>b{rm$A3sqa#XR;2>=W z>BqLR`bD}!AN-bBiUDr3LMsq?eSIYuj<3Qxdq8q~ zW|Bq{=_IUwgy^GKz%nF#d64q9xcHVoiWt9*80S&jZ!@r1K#`fL1ZuK(N-3YcQ9fdG zhRlE%M^XuaKA*^`e^$R&-gb2?Js=2B&j1Eg+C4HTY*FvE{4wXynb<&e6-P3w_eIv%W@;lzq*A&l1x>|$hS)!U z{=~+{@>+DwE-YM+_y*=%jomqFA$06)484pU;m4L4&?*f+S*qyj>Vj2P#{(};MNm;* z4vV>%J?yZR@P_awKi7*;nwd$yu3+R$PSl{F*WSlH za>C^X0U2|zOt?%>dXAoSEpNLxIWZ^5pZSAHsw7a6rDIK*NkA}!9R*Dypb-Ek(CllZ zq|+nVr4LhLVy0ZGF|vt3v7xC83IZxmQ(B1V6M&6_g|&#SMBne}C#h5Qf!c`McE0C) zss?=VDwvy{wJg)|M-|3ZTlWAnly!%%g>;M9XL=lG6PR!QOf6^MH;mrFN_8=MXYgxU zkW-S3qP?W&d<{w~G26-`Q}?e-6itf4QWC*$Vt2aQuq{g$bBDYfmD4ekM$}$nRqb;( zw*6pAdazIJmk&R@oS)EN39`@?M^ZMsFUY3(3*vcGD+#?E&(pP4{R*KYcuBwIGh_KJ zPvi^(aVxswoWg~*zYL`>5ru$CsG7&e%jS9O zD1K^95%CS650rx%JLbwzXj0&iBGD~TG)0AlIm~#5rs)gaX(AS7I%FI=eB$D(a1BLQ zq{B!-BL{eptiYJQfa&|dq?B5@Kc6D8HyHrRdGMoi&-~m3L5bY(R-C^hL9ZT@8d`>O(&T#O0vosAj7a+viE`8wd<>irI zzX}^~S1SRxJ~}!AA!cU4Sf5kV+}vDJQc_ttN+Um_*%-hd3Eosi&fB+Ax&5ycazOdm z+1a5B+~YP(E?yk{>aNsAgwtrR$4*KwN6h3;%CV)*$xw5^H%bo|8%tFciV*{`kp1*m z>kH81DX(A8Et+?G2)Fc}Rw8t;y?gDNKf{lk1`mnQ-F52gNdd1AnQ%>E<2WvKwVLvz zbmj~$12p<8^$I(`?3@S6atq&t=M^x^hK4)v`hrwoRtg@*_b-Wh?X80xug^I+G^E8& z3UJn@0$MB!NhoMyq$DJ!rlx^t+PGE*4L0gRjeOW#3`y;n9Xr9TA38hFQk>Vy+)tMR zUMm!aHyh(Ot&4UyPq~XrSj1=~5KWDV8aqZbPaL(CA~Hoc-`vQk2@e>t6I4)%M`wZ) z!~05sPce=mPa_{7l6`!g9hvh~F*_hwC^qO=Q%}!B5P{aOya4_>S;0sd0UFrr;$kA1 z`YF4;k=wqTE4p=M)h68&D@QUq_sABX?td0ln#>w)*8XsgxQ4cf>5udCvCN@nijRQc zY1LEoON)=vl@AD4evibNUM5@L2~=QY*KrPx&=3uAuBVp(VD--7CfuN-8I8X(#{N!??zU3z(R9( z$l_syXmT? zdNp9NMkB3{q`7qV>D1kun57)Rl)&}QplJ(TAnwJB&@;B0F8P1|{{3B1k*$r*w;QE` z8mLRyGFQs+r^3hbR3Ep8CH-=^&oM0RK75lxc;@Ak?=!9|R>Qvum0k?AWy@nQOZ~aa z%dn=P!dn5~wzf9a{<-92Zeg)7KYuSv<;cP6yKym~m{!x0nU<&-4u>kQxi)~}n#jQ6 zaqZBzNHhc8B`H)O9)5Ymz%FGx1#2FwTEeT$AIq~DyF-qmWG`^a(>x9ZS`6+Xj%VK2 zSNz_vWz+L~yw&l-mw}hJw5G<($mkAZ+^f#{$jC_8*C0&_3d;67LBj(n@g%uer=VDi zot{46%{$m@`yIGz+a4hAn(}D#QF5@bEUm6;_&)lgu0Vbg?>Hd$ugEc(QgP z$CK(J&QGSMQe~^Qmaw;%)YjGl8h|8$o137Bh%RH?6+%Ka639FR7n%C{p4RA7zzP_= zo~FbU*9xfuE*m)>GJ5plPhH!xkre=JgCCqVS?w<`IAZ+@r_We;U~U5i+MB8cU}5L- zmu_#a%H{sBwLKBfQZLC%=*28$u6tFgc}@_An4V5FFBM8FeQ$7CDR&bD*WM*3AoA~v zin`m|H{C=9Jvpe?t@tRx^t^_^$)UL(A_W?K^QI^@k(jWsj=Fl_1PZfm#I2>GG6iH! z?Ullbj;^(9lIIZ9qqlg0Ju3srr-ub!DwNH=+<2^MR#!w_e=Iq;9ml!7wgRrB&U(XP zr?zyt{vn?J!al{f)IfCRuU|T&3jls~b#!JOs@mt|n>=sA!=qN5GQwx8S4LY~8=_Dc z&)bv{Ei*(D$!$ZBS?v9kcA>!BL{Pd z%=XqEop|7bz_9R(Ef^8Hq;`tnOe-A-N|fnPVGJtmpefs!n&SAXvy+B(nup!X0(J+# zO&_d=ItmCAOi=_>Gq9LQ@GelVd2ep?Kxb&^ zr9shxASWB!W!fKoeI?*xfB{)CA|@^#Sv2cq@OLTDMz!!(#HfK;ElgtAg6h+nq$SK$fc7THn0f>UaLZCI3V>bRM$ST~Imj~jjz}Ua!1TIK& zhLWc!PBMdBg1qz59%g#lShS$FxEPikBt@zrr_-XQrp9~g*3`BK#*#U5LCBetF8Zqo zGp$_3$cjs~RWd0Kw&9zl%QBbzUjvY2w(n1_PfWQ#YO(WKdG)JrCv^N#8&`Aloc<-C z^0)z#dFqi75#XqTi~#{FhbjQ?n1q^p{Sk#Mx&5u1q9^sK^QA4=Sb3}`ToOL)2!BBv z466>PtddB`<)qdvcZsZ-lAmR!nw15thh7gnKHY1PC}BU0u=P5BNlPW4&#I?GYz54`_t2>SZg?{zvaq`3kt z4?;iUqdfLGZD?qK+ze(;zUK=dzO%L!0oP2}VOEx>XgizB+seU#m{wg|JH*!I6!b5m z>k~hIsH><*#=dQt5%N7b!pyYfrVb|6AI;qmabXbe6ajZi+4rFTX3;mQJA`(uGw$OH zo5#~@$G5ZploVNw`UL5u{g7vcZU3u+pyT--A3C+6&ewl${YOvK>Hy7NZp|R!zRyOT z2vtn>%7O4@=KU=t9LdQet-U;^Y4?Rc)zbz=gPt3+trUdTwzg3j$JMBQzow~mkV~gi z0%<;d`ZQ_t_{gd4oyjFR`EyMOTB+DQydJ(zZUz5LZGY5@Bqyh}c1(4u64OZl|6HU2 z+_%3jtK0M~v}HNlB`A5QK=9K_&#d_|9Rq{(w6tRgTgNz+HYLUu3N4E5|XBS5R_jtux?^J11f$%b;~Ab{=`G^R$cK4iL_j{ zsw6VqoooHKCMWqQ!|Irn<@Cl|o%l!Ff$Xo$UEKJrH~0ae3@4pE{TZa8ZWF zTixpbO1^uoftRK$*nrD}MH#87)}VJ=S-pB$`BL$O@L=G;OHt5NrLt5~sk198lFYPkNiRE}J2x4BE#jVIL`-h| zjn6B#e2wpdbMlsEa3v`r!2rzod-wR^(Vp1tJ_~^*>d)HSTOwDFX$gYw1jIAM$XX`X zWwzj6_D6z(6E_89pzm*&*hpTaU|9Ry!Kcj2df^%$UPxCKo! zHBQ1e2&AsQw$jP!9a`DhV}$741CpS_H#7Atu-BhFejIB%n@~e)&_g7#`sWWjGxJc1 zSyyv z*xh;cg`AQ|b=GT&{k@hXHfHCr8qN`uO;vBa2QI9mtv&qfS140IP*44hXqHVkY2pym zg98Fhw~?(9gC}jvHWPKVuV16s*q*@R^{72*cy@lX^s{O#tS&`JkYtL`^W?3E36RKV zTW6-6FI2;CLhv1r1jJ1IagM*XKp)6jx}QWdON1V%I;vlZoqTAjop=pL5($*DXLwj! zPfwJa8^T!G1CK!j13$@8bJRvaS_Qc6WpAB4EUw;gdf@zDCkr&PKzjAz5rSr{v&e6- z#vDo~=U{5e@G6jQP@;Z9x!*}iNePAYBZsI7sg#e84>Hh3A zLHjp_g^>&U|6w=wW#l#CYOb!X4wn`I+LncwRP*ET> z1d{EiPg^rl5T&E~@8D3~4r|j*?+b=vv_E!orHS0Xzy@a4&wQvbR@7w9I+? z_WA7>t9)+>E58jZaG}c)$!y;L)Q@z&*;+Lb{g$Udd;F(XVDrz{@yXTx4#s4>5eg z4``@0_9l?LIfq_8Fd?Dd$MeLgzU zq*<<)UKWl~O}m#RXKr5f(qgZJ8{>PTVE#U^RxBfmjDwv$T#Ak~Oqwyy+0`{FJbckf zxP~zTooS@a&%|VLdUDM3s$1jzAwEuEa4)QbiWk9|VleAPCXwnWq#tl0_5#sW#j4ZuEKgD@*= z0;{B6LI0A0_x8gA4S=dTs;YExtspz-aSnp63Er1#UJb}UKnOirZn!d#Gm+v2#mnD3 zi>TPGkVkxj_I%fi5`i=BwW%1(Fj!=`28u)|?m~A4An)px@{w`(g&Vh&o;-b8yZuww z{#*gh)evdW_n!luOl?gAVbo(F)9qEv0ma)Q>4CQZ z$ps!@W%fTIr=bCk3O^fscb)JjwvwcH#zOyu;>n-WwsM*dBk@Bq4$c(P)3ZB1*L<GxRgDVDbk!Csj z0W)0kSqC9WvF2%MgWA9j_@k?-hhNW6faQ$vV8f zC5bdI9iDSgRE}|OJ-_X7JUeT8ba@O;_t_mI=;dI3LAu4bn9X*|y2x1$Vj6#=fJ#*q z-eQ%{;{5$6FrxJ}!m$aB_0=*SONA0ThV?$~G3oa{sTRE@LT5s~G8sodx`m@cJU+-u9V{o2`2#!>I+PJJBIpQ|=u zjF*d;1*ani?8<@_O6n7Lf;S!sA-8LRYEr6r~L^&7N*2w5vJ318VCur)$ zdAm0&6}%L}WbPvTxk12lsQOwKbemEUFbn`Y{~buloq666u6Z%CGG1vvvo#?M7!G0x zk8N!$bPA%xc822f%wFnoK3_Eim|=6tf6}2UmXPFvBsn#8-RL42%}dk^Fm-tE)jL{F z-Gpkl7rfz2e*6WwNJ0`KwW@!0tS%$wK?#G;ZJzKtuT~G;xW4$T9sbi3MbBP+-Jj-Q zFX?i=Bh}`pnxe0t7=9M2;hX(#cjk_BOv!fO>mozL)r<#bZig!wgvD>eeoj;vNI1}b zi@v%OSKxiHO;}WM>1rXS6+xf$+i`1rexiO@(`WZ_Yt^M3VI=yUiS4E(es9j4YXSc) z;;!eU1C}Yihwp2>wmlRrWE99L)Xc)E|FC`bye%w{Tva1JIB|41m@H$0SW5a}sQ=cO zF)FS2A`Xi(4@$3E z{^!AA8WYosw@Ycx@51Vz^I-`sjPNgBGpouc{lCNK2ghZuuqlM=Dcuta^7=vTo7|+- z=h3c6(OFa*Wm7j6h>rhZI^ZdhZ^8JmrKEF*iWWpnjS-Q>Hq())Ned?eCfk(+eaK&Gge zT|`&>8wn!lNmX@zCUB5yn z#*?6FaqrM7DZQz@$J25q>AGChleuhNjQ!ZJ$uIo%4eJr+@`;@i)X^iIX zNo!r*&&ZmHsKnjcPh2j=wb-7|$0|Ri{=Oc;qhS5TCWARlTE)iQ`P-~g;87fm99cR) zl6mrc%=gx36Y^jctN8t(vv*q#RHa$D9ubS(A{!|ua*NNH@0GffA!=uMn3e$*{0JFv zQLMGvIznAQ=L8|%BNyNyLIw9hU)q@=$)%icb4DKOKEFl2>kjfv_I_lOI?Fx zWjQrm(OtB5_Rn?c)>P{^_l2JeHOLj7XXl}e_(-{)V0Wf{Fsx#KJ9T$YZ)vB`mP1G( zapYo2q;I}F4(k-WsPzwfVQSeBr3q^`*X<>m|6BYccrKEUA_1kd#K_LlP*YUA+_OFX z%6(ihxlM!>;GW=x1sO8(V4^|nlbK6sy^D~m2bq!=iFiOVFflO!_9k}+Xr=&2x)*p; zIvb6mXDXpkX5UZps5Q_EUMOL>iq+z~n=7{!Huc1z^))9Dwha`7&fkh6{2CwP$bD4B zYcI+FJ=DbX&U67!>AwH9Bu4pL9PK2s+EaEfr3@GKLJcntP1*JE>8q(h$Ps$z87fbD z9wWWEF z2(oIIX{Y(Ym#-bmSTl>pc6L2;4uCnJt-|a`KqC?#7cwCRSN34?2;#A#K1YI_xb7Z> zM2izCih@)c%p_KB-r%J|?6D%XZ+#0J3q`@F2!P?%@+?|l;qezoQ?10br(^Vj$4hV@ zZisdleTcwCznc-w(qKB}{T{_Y9BPDY$_x{FXP3;(n$KPIj=5)0xbbyN|9uSzijRA^#sqUz6e>r;(+HqC(*XF4#b#8EU7;@R(A$K5Z|@_83H zV$DB8At0~MnlQfD?;QsLBL-s3z88sf_7EW@)RoZnY5%-~fjhBpL7A8ua4qK4&2Ew|FQLy*TzXW6tsO zuL#`B98?6S>-UqzEbgX9qgiX6+!M_pGP00mhQ$zpLP#QIWATH~K4(E`-XhCnB}Qc+ zXm6PU8XLIr4HO!ex2Hecygc?UUyd#YxEL(AGu`Z36E}v%r|)RX;ykw9?@7VJ&+#HZ z<@B@4RE@LJ(gxoce6$mc?3Xi%D!R=tHiI(y$ypgQwN5A#0JEL@xS3p7;FSK8iGTZh zmL1Xn4&ET6l77G2X$6w z;W4kW8-5h*PRP&PqzCWM-U^}Y1#uCO;>&pe!4zn8L$oRL4vJeyD5Nxw(edCCBpqRN zX-+Y@n~lo%Amlz;^HC^-V0wtdq*PA1rFXRP zjSQ&x{CnTSSqZyVaBuBfC(_fYMXw5ijYNVc$3X0lg1Me`0iZo+X^X*SP^#WqQ7X4C z{{G$8)s@(43dwO2>4>N(n6V5J_dMHwZ+S#-_AGCAX&Aw*A0T$fe?>&B{3=`iRVKw4 z=e=7!aRWw7ly}!Aq7GRX=5tbP4j^!BF|v$tgT$C(f29e1SN80~lP0sln<$!^#g!VZEEr_jUI%m0J zJ?n2|AU{;5g(w@sNB{^&fiz^-uBC~2lG2)%>D(l4g_*gp#%f)?*8DS(8l!{BX=$~S znr>}NOq{rls-ctab%IeM3(=7IjU~ayylBr$PvmLoj8`ve-eUdSzd|I=g zbm~3p`!&|B)o^qe0%PFS_w*pguZ1;(Ty5?NK{$}RZxYK%N@6SagMvvCz0+S_5c>?&F|f57G!pt6lQuvP#WlPkHx z^^%KKKw_1$htW5D&E;|sP6O`GMK7g7LY)P^IYf#z3-wq?Qye1iCvkSRwY>+o#L^Oy zMIg5hwq7GumcVE?0ak{7&5Lgq)`#A?EndV>pdT3X8@u23#3E!*hqzK3%F(rt7Fxe8L%6Q z21iCm!;zn1{uX4;S_4~Vk^@Net}C+yG)_7R6H*C&G;NJNf0011`F<}f3RP9Kin^<- zz_`O?19n(5U2s`{x4oO&kSWhA1;#*jYkJJTSpb+qg?Le_!HTHiRQow>J6Ip%#?ul) zcoZKSvYU->-OM{$4B1u2Ki(-G^tq`*4rDLkZJ&_yZ*~9LGog28##FPXG$+WFw&%q6`6(51g--hI5M)z|Xa8CZF-|T%EPttr> zNZpry|9)&~`I`AROtZc!ZrF09qN4hcmq#lXJ0n;+?6o>twItKId998e(p3m5tPvR_ z0`5wj^aT|Kx7}*nTGwfgDvu{5tv^U^A9qK*V2~4y#*OXlqUheFYRMkz+k`vOuni&M zzeBg?M<*-4f9q7ca8Q2-hP$&mcAemPg8a?#uoec;aUk;1^qjE8_*S+m1wJlCaFyw+ zsxlWZubK}Z@FmK%*n#Y46udDxfpVH}D+N|YD@JhK4?LEyjLY=^9_(5Iguhpp_$P`d}B zUVz%t*w{E68=Ma7IA!7}XJXBFcg!_cCP0wwAw)J1bd5{Oy%Q5$U8IbNX%HHKzOW|z zZoEhX9?IIEKdC;D|8zAnf?2PDA3r+C?Kr>x-B|m?;CUw1Fi##>JgC+w_mE%h+x+_B ziOZDXIOa5M-Gb;XcWNkwMES@HgPcZ6V$I2RQoir6bxp;unkhdF_XpmhGa+7(KcMs~ zy^&jin>^gG1i}T32KV(dACQoce9gU*Y5_wox)TRKqkNBM&PH|Y?ABf3BNYbgPn@gA ze87kqv8gVot@Q?-gio;^q^%SITWT5_8Y-$!!`3zxy1D&UWxpg&_q+2o3XI9;ArcCP z0*sV+c~LEJd#yKKoN2c(GwbC$1`lHl<^)`-y;~x0^k1h>katffJH>IJZ z3ZIfMb;rWl6|*0L>{i|#Bu?Bj6YW`y+D8QUOTa|MvVVd&>W_LeGD0%7Y=Rx=8g3#! z%f^zNdXbQkouz)jwUIcPk$`FGhpYpTvHP3Jfx(qWL= z2g-uZH0$m=yhHd@FJWWLf`5_u*n-RqFUR zzW&?cu3o)*$!0<(s~1G6>~GuxXGkUgf@H&0vpAt+cW&FieJUEymVeS+TttoB2~9{W z8)!CsYO(FACpkzHS$|h0-at-iZ+}>v7xJGk6$>;ZVDtgTk-mgpV_WBh(a4yXNBk); zYi`Z2`&ShPA|jt%0ud0OZYx%M^^P-Z5u)&r8-ny|tpQhzEGU_s;D$|2P3c#=gxv3t z%kFzl?Xk$^yMNgS@Jz?c`WEYz&K{!8!rz~{*H7N6< z;5FE@U9&RZLVi?wUnnFZj`1x$Dxw)V&<{dGRw_95k85$Mx4B?sQ`MoDI8B$X8(8-< z`u-^Rz=}AAr8AL=OtBwF(oK{)rBg#&TS(0J*bBy^VD@6uqZXpgkIN3u#-7%y*TjR+ zX9FS6X?z5ch{=H+n6AgbRFpS}#xvi}L{o64Ae#hj)wXVbe!epW1|Kjl=Cs&@E9&>A z!(fcMQp*SWZe==*ce%nEcKg!mBxvm-oTgi0)7<1^u6GvBgl2c9ZM2%=H^KGt{luJ!fdd4&PE;A{l5OrWH-NiWil|AZI zUOmR7ogSJ++`Ed8>w8*hV=J>bXP%z31ToJ0*?ky{eX(*`Wo6~-*G7Yd`j_pg1>V9v z1+F=b>2?bnww@QXX?wrL{r5v#WUUDt{iOdYdpSo*A5e&Ackbxjmy4gzm7s^<;RVs| z>sP)k;vD(mhWyY?sykR(v#T#eAt;5Gu5=3HP`aL5-u9>%xe+3TL<5?E$L7fF^^x`U zkCj8UQgjfouhewU969?Op0`99-DCvM=NyEjRrnNhhuq{+ZQ{VQ!t2hV+_^VK7YUjQ!VZW~u-)MxA;~~Lo%ze@& z8~c_ybYXwE&+IJ7IQa`4mL;$A!kx;#Fe9P{+zmI4d+HgrQMBxWrGT=*pAGQK8lxLu zMDOu7odtE^9r1aiI23QQx1$&TMilMDpaWf77q#u#;1pnJJQuPRxgA>SbwM(kSBlvs z1WSu9<^hSc3Q5aN9qvmE!CWv_%#!GS)_ky9Ut3Y)(i%ztLA~IQBERC_e)rCcbHsuI zJ_dOwqJ(v+wCARz9R2JU!yIu9crrz06&T|nij$`v%A|g_Mo@}xT_{;&8O{cpSsyZ! zwB}~&XhBOqR~4Vdf^+w^q_OCM=>A6(g7p;xx#ExW>@l(s#t?K#dh`;4=@363ZUa1; zyLoD{)-^NoezgXZQ4PbMkBjFN6RlfZYH&olehWVP5Evi*@u)2p$&;Ne$`Ry}^J-^1 znWc%>nq!4~9p4Q1Wv+K{d4C^P_R}x11P|~`X)oEkSlCmI6q~qLe9+hYJhFdmFZ}+S zoHdg@JJ-Z+eo@`qd`H_zQ>I17ZlQ_(q=O&U{1p`yak=d6ocf=);4@P4o)$JlOUxzf zfcg#}JOaUr=Tt@TITjG6dy%^-+HFt8(n14{0H$(eC5M@{EdJ)%)y(0}?U(x*vwwU7 z3?i&KXXy30Chj-Pv1b5g+TCY*jpsbJ8>^j`bKnD%Xf~s|->oF!x!@cyAb9@NH{dr# zZ?$h8fpGqR*n0DLs@AZ7Sfx^_RLTy?OeHo6$xuRO5u(hq3`GbTOO$yia}-5Xgv>J` zNs>yEDN4vpX5R18d4BKn4*Re3Ip^4W?X~Z9-`Dk>E|_uQrh@2J76^!j#;5M?D+L{E z29UwQ!3Nwlm?5NDTP*LTTBWtR{{5rl@E{-{0Hrs2ITo_faeNU8G5R>74 z%14;$a7J1{=up%H%|Z>C)Q9v0>>)rq8gdfi-%_yvz2FY2@l>C=uX17Cy_`b@}Jcg1RT{Bh(GW|n@-wr~IZaK--{O|7xY+dCP)~_4{#{&V3iTgwm5+c( zyLj<9;~k~*K265VzEUlUQBxbeDZllbggl~=it}uE^rrs<_~PXW6bWzGLPZ{^Oh&+c zTj5oaY6a$s%eGXXuZ9epOxp}ZwF1!54*v+O4m|Z~VpX2;df)F*P;&{x{*Lm}z$Shccen9a`Vu;fvA}VL^>Ku$)x8 zPW{pwdP^%)q?-vr2-I;?aq~ z*MX9$|DZ@2G-aI!}Oc^LbSs8xthS*BTSpP~Sf%7`*ng^RT z%7Ut@(=}vx!CAwpYRIUQu3in(HF_?wKgizPoU=|_jaHrO9XSYV4$L3^0>y%!HsxZ- z$~di3`kD%21vsAivb^A4uFWGP;l)}*MgT?M zl!cy#ApOiDu!XzHF?Du9cfg9tUq4u>3EA&p!pcDTp7?93LPgDvhuE(`rpXbiv~*&j z=P=AYrauQlLUu$pNVf{gsNJKt@hpG&>!4`zS6NTtKh8IDII8R!b)HKlh7@j^3xHt@ zI;;nxPH)F%L+5K-xt+F?p&2yQVfy%PcxF;e)swfc>nyI(aJSsiq|;0$L6Bg6{Fc58 zNjPyzso?K}=f}rzrv;T!Uv-DoGlix-fBpwO&i)R`(Hyx5L6bUa88uFaw=o}TS`7us zbvusi@O?xnSV(QU^_AVZ-ybWE7iXS)pn}WYDq9K%h z6oR{mLv6xEjE^r1+L(850&9(Vqo0+O+<3Pr`?mfuZ%Mp2Gli;~pV3ziMyk^ko1%R< zti87f@hD|Gy8_^Vb~;(Ok3R=!-f8=p@02zW_<5Y6Lq#Ei!d` zb_Av2v(JaAs>eKMPkyuk^n)a+9G)!wvIWAXzBE5YcwsJHd^@#-4Rm;D2!xx&FOOEi z?d!>fzsPmYTQ;+iy>{zv%Gspd+Cp9zL#Ezf5;Sp@fzzi~jn?Vt$|6yGdk+r&^L6nw zLZTAR23_c+ix|>n`qLYKR+9)f6YC}Zy|lEB*RMm#ix;ae)G+Yi}0Y{bqwMlM!s&?nEmK*4Kpe+M}HHO452u%vQ+=i=#YHMqO z#Vnv^RL(ycQfr*UbBsD=*iE!}?GB`;l$D7WRR$zKB}~Ys0`d{Buya9z4>fQi_B*tU zcVyuZo!;p+cPp9u(YfFFwR3o2ZMZJ##o$9BHfR)NyL(4HGsUgO@#w=JqEEF7)@f^M z?)JdJ22}-moDIGopsKGCaC~7%&!kTOlqHLTJ{KJMU0+eKz$F>J!5w>KF^U#Zx z_B)DlO^yzj7$e0332j7L2=3O`j*c5GLViZ>$R=qx^nr>cw_Pcpcrfs?TDQ*SV+~1> zRmo>l^x2l67dJLVTbM16B%El}%S_p@;Xr5SZ?7+|btDK^fzj}D^2acuy=PPxmBcar z>{;OJQY&@MRUibMuHy)&(938lx;Eg6&_2$jfMnnuJo^};cdV6(-htk0zbeNr88f*G zLsRy*8F!^^%Pqu@4^-v-4HZ4PT7jgAvC2~j8)=?O58f-&EAoECxxUX{C(6HllYEq! zPSgvn;lk3p4gSg8@)5`tI$!s7?O~{#yM?z7-_`TforA4XD1PLd<5neF>Zxdt5DiT; zr{yEZEF{FNwKCh?1)W!-uCIK3F?^Fb%*DBP5Pe?8Tl<8XUhhMjE-1A*2}p`{5+^A| zWxr5UK`&_!jW?HgVvS(1>_KlQJyk!}kiJY@BV~@jk>OQcud-VMUZ1}&`FHJ!*P?om zq2Ooh-(XH%b8gkveet9d3g*8LRId|f0R{O49HNDtqv)GREU(;VE<)n3eFlaZ9 z9AQxJa=lXihEo)Y)6!L^sAP=U{PzSTlk4JApM-3^X;mFG5zO1Bs*<$g zWNm#jc~rl$>1h53NB5ZXmJk)Q?7j<^3aPS`UQiiwE%^vXJ%84<*rP%L*x=Uu!>LSA z4?eW|Has&_%o|{gWISl6N=ix^^s5L-_`T?8f0`lq1ZX$1u*>fThq87Kq@|sWcr4Aj zi|BZ?p4}gqPuFXr%|9JCEl0t$Oy48NF6B8>HC@HvCnPc#dNy=rV1DWqH@ryCPMzIT zH-4*_x@OK@0_um*`t3EKVxTx%74|cNzRV{r3BdxucZuY=I#OWr93;toqsUsYR4nP# z*Vewn|HVn1b}M%4s)V&hMK?P+IT_`>Sz{DO=+b9{Wlc4;@QxAB{_wM)B4x6lKE0DV z2;*Ty)Gn#(olemmBfQ+)g~OR8Z^D6ucR@~s#`eh3qkAb?goS58B(U@Z)xjjMxY!NQ623c~?VzJ55v+sl zk@LD#K&>%jeHHUs{-i9V)M)&PAg0dY8CGAU7yO)XQLk{hll--%rKPK@>)SVl)@eY> znR+DvbMW6~=-(xrI7Yj5q_c#M#Sw;HFeR_@^I3fn5{A4{wvU`7YHU;*v@&{as9kXA zCZ=8&Qy~uhn_Jj?X`M9I#rVRk-az%)WqRyeC8;sTz3&GQ*NGMJ&DWPkmy=>B^=W(^ zXOGyv>32RFUYPQ*rz#*IR;c6bg9l?yo2=h{xgx%paO_Cn(sX3-QBKj+9wWPbR~hL7 zYsqzprNL=+6tHPIZ1aD|y7>Z(VSD8cfQbAsH#aHz`U#eIiQ3^-foChRz z67UE6k)DVx&GP;`4#WvxNlfNOOb65OEPpQ^!|&v}WN)_U+-&X!G15*tPfiiNHmldm zBNq%}!VTuV47`>!rq;Ev?#PvI{v_)xB$csnKla$c*yD|ds4A>%m+KP64@}I}70rGZ zvHp4OtXY*O;??@c}REaR~JN4O={3h!puq20kwEyG8Io5Jd4p!r$2%cbvfvGn2X z%H!2Z*!K$hIV)3Cb4jQJ-sMEjoV`NwyGu89&Ek*f^cMy%%VRGSlai7~Ri13#UzbL9 zj%{*H{(AdEn@Ym(2(t|=hmW=1wm<)TK1t$+1b)jlCr!=B>*D0P{j8k_KKWHxKO`*H z6E3=H_W=Eke9caI{Fsu(abbGUG#)NK>11=%sGe$+#vn?Q1R zdu%~InjCwk$3fzE4l{o|`n=tSN#KiHEq6fiSotC_26lNMyAqDS&zYE{FjFC2s3LP% zta)~3COirOP()S37XAiuI5@@dVshzO7my5-FQlb>pF2>dhqHt|8wAdB!7JQ4n6=xo ziv7v(!q7LL`f^UbdG#oEdA58DQr+b|m9A`qtF;=M@bH^5YDfKSD>v_GrCkkerdE%- zt6@X0o_yC#C!`M+OrFL)ODbKjEg-kof<>KflVMg{RoLf^K9)u z&Wl)vYkq9MK1b0jP-+4oc%}p}7F=Y6g1AXrN%m$`3Je|;Do1Zorn2}MMSQL}c68eC z)5E8`RyKZc(ra@<6Y0s6m8fz&F10F+s4tX`6leO^7{xdJns6!AACrDxi9k6R_NolW zFY|(4g-lzD8=-;Yu_#Engay{S>&U!RZ?_Q=sCT-#8h4ZbbgSU}X$HUWq^iG^j&Z;I zC2yPQ_!(KoMVaj%P1NQ0Gjd53rrwa>L)d*&LoEdlQ>|~FLR|_WGKuYmVg)dZ37()IQB$OmQV^MnLGAlcE$ z3273!Jj2c<$CZ%{gRBD3)_8M(-*KsVuU=8>bcIDmp4s<@my<|GKrQTl)d@;r{+Nx*BZmg1bvt$sSim6-yN)2QTP-Y z1wCnuUH{aN4S1~v|oWiZpD(GKxI>OtC6fXCA&@p1i zyBPjkO8dcP)5?H8)YL2~F5bZ;=2Ej=7$uJOi!bHn5+Qxu0mdY_RnbfVJW_~2UD5XC zOWjmy<4;j|Z7nlyDxV?s-BjXy^kap*F!rK{H^eCB)3oB`B}4*PuH4%;W~Rgs#SEZ$ zVgDsZsm%C2c>+FDt$sLCJC1o43;R_F~Bo%(NwXTVtq++~%N z^g^`7$jHdPz$fYH>FDS`JURn6B#|ev6-Eyt;BXrq!k>|HuyNbI*T&gbMH1ZEnC}~r zZmVQ^oI0=qaELGNv4MPqf`UR$ZZ3*4yeyjHIONsg@`pB*XWubuHm1;PjMzZ-%CJ1i zmD_)6_al(mMK@;ckS;-UvDC#L8F;s)uuRXqM=0P=SN&GOoZFqgtnwdkZrlb`M@_8- z$$awp(y$4#G*8jW9MvzKyG^HGNd6L#T!^9y?b;RO&9HB3graTty=tO%Pu;7j$)zZg zumdH49XrMKY2AiRhtYVT*?+!HMSL0b^|pOH*wW3~VaBbY_E$F_;!aMFp&^-&E-4@x8P(kH#5T*H42K1R^UxwKA9EK z`x>QC1X%jFyt)NE^6ExLM$9xcl+bonigd_W#c7T39~e95S8*Czp!q}49qH;q6tA3N z5zY_`1`8MIXN2?@=j+##MC^@wt8d?xzM1?Kpyg5Rm)=SS5QWpqK&l@(t++CcteA+T zm9T4Y`>lD*_mC-&&lPr(2OC1eEzp68a)8XaIZ>Q$*^KSr1r?R|9@tKWhqie9VMYc>VpR!SYimUb3HaQ?>iRzeYn{9& zCZ{(XUwk>5GX4{l$Iz!klMmC=2dfi*7iV%q{?^d&%2atQtSGO45W9-CwRNQUJNV)4 z8z!b7TYZ~USZsFo^Z&DO!|2#)8j>H(438f9P_K`SCf9*fL>iBh+y32;@r}?MG?)$z z4nn8_FCQAmGrYW1)wc(BP*b0yb-KToDk~i65l42M`1?OvfP#+BmKK(PAH`0?l&A01 z_hH%NF9VWwhqSiIsNo+QdJP0Psb|gBzVydC3ZCg3Bh}ym%!=Nu-(j>cl9Z$E?Ax)Q zWCA>>b{~^>%QnjO85u)&<>~`(@AYbX#Gl{qu_q|I)9&EzyYP_L8mHgAXB5-B&ClTS z;1wO6{aebAFUeRUEZBm5CSt1Le3Tht1{|_IBHD(3x+bP(nKBW_4Eez0_erdw{B_t` ztwv~Lo*PoSIIx|6SkrQZaor}EB!?A`D82BwOnxu-k*We1ms|up)lHtp1~XXSEUYXo z$+1dwOsXO845mLH3QDyiu&JPSn|(676bPjzNE|xK9{J|WRgbvo%_wl1%6g|Al~L2s zEGu|lp35)s!+jkqQ)sK;(ST%j`KysX1B`->E0z&ZQCIudvg6d z^1JaPl2x>R{O|9-nz>f{v)OT~G-h;EiS67R;gO>-yoolsC_Bh#-#KRLXPc|u2rA#` z-`Byg$U5R#XT$Van&LFgn-3iOx0e6)NQmPO*ew&TJBs8kT<9YfCfkc`|oK#<%wN z6MsD(`~_O-CY+^h)jbV650$0coTIkitMDQD%C%+4A69sjte zH~Fg{%|-2ZUc-_eYQe(SQsVedwK}rzW(l=;pHKw22?iy=#?5iZ6(b&_Zl0WUNNTpo z)+T&SA3w4Nur}rZ$!B9DusPkrmq-VF`I3f3Ltp=W&L14*rLI#*dAw!4Bp(_KqT}O7 z^@0xMpW3O{E&xkfB=l$R6Jq7qX=U2cb|4>NAN3}_yxj2mK38NlMs_d{7BdCbYDaw* zwEf=wZ?eTHDwbc>M@6elefa;H){hp;&r4Rk3d$+uJtTLjKcc{MwLfFyx~RIDv_Djj z;FSdFlH1N0T7T`@H9B71nAliMFX)M1AjP4qfYq~1KP#CVn;gub9JM|i@)2f0!Hj|= z7ylenqdgI_hq8C7Su&bE9TD&kA402%^c8qN0UVx9Q7h?upYxoE9Y&q$P+ZgdwZh8_ zkWxm*3f=e9%*{$a;jkGP-yB(h|5HwFF_sQ044&8IwX z!Nrdq=Q3q=%0kz3tBYjPD@A%K%b!bwhXU|ZLR@k5gdNEbF~0C0OS6JY z?{iHwihwSo5#DHXKopS4f4*oi9#2GIc=bs|NE#IzFfz#*A z7E$7X^`5?Y=tCr_PNdaunZ@n(kn~;Yet`RHUO5NwGUCvg3KMo8`zgU1gqWcwP$ zpkB!4>G<*`3faSMc5oyiM8zsDGb;-@ZDLMCpOACh_2I)QeU3Ez1>dFocVn}WGHD1@ zo~dccuj)zXor&QKG&(m#F?NSsM>0tq*ehdYXXiPTo@V|&L4Lh0qBU+u_D4R56+mM~ zBQ-NKLs#zDa*GZC2x65(8_o_|EPV zH9#i3ij}-SJ!9eLrOo9pr8~#3>m<8O=-HC%a(KG)#gDXrykYTJSolg$Dw%MIuYdg32aD)W}D{qm2UJ`OAz2m2-KlNp-ge*Up%> zkk-L|S0){GIhTr_$Sv574I&VIeyUebk7m;`BZEPYYzU7bDIdh#SkU~NLG#7+4i>25^DH440=D^|G4j5NN; z2Fh(2#M|4ik%ba+6|K^11R<)QWNxSsjV@Lvm*c8~bh$=n4NNJ~ymK84*|BNRYySRT zA^8m#{ESG@Z`_rZTlnc(4&&kc5Hy{9PRSi3Oj!~k&!8k5!3+(qQ0QsOp``h0o=fDQ z&H@OR>6j8rTI!$+t;h3emHvxKW=(c1cI}svipq{d zq7R~@>+Qc|`iu@voufsy(~t9UH~<@q^ui3E-vB@{x2Fu%FHn`h`~lZ;RNrZ7X)j&` z^N52izR6svB8Mxj%#&3It2{VLMUw0f9KOTgB}I|=+GgJaGqvW*Rnqxt((vVeuF$g; zvnKpJieg?3r&n5N<^fG17wp+t@YKqnvZqx^Uetu{rbfP%qZ>|mK(6u&o ze?ty(yiOT(FlU->{kTR{WICI#=%SANLSvPS*vihGvK=Kc-OG3`pMKw#8J3Ze%)PL@ za#f@h0o?-YmGl+ZcN1Hz2qMeCAiId!3B~V{f*2R{XI;&q$j`-rL|yUMS=xf>Ovd+!djf?9IM zTb(!diYoJ^8}oAy9{6*6Y{@D@bp7|%)-!6fHDtPwOFQN}nMFd_PW}o{6Ke+AD<~us zqFA4{K5-y&!=NuFoLuFN`d3r)>AzoVV$v_ghSih$pky>su`kl4dbEd2B}j2|eGH&> z@JJT#V#39K%(xkN&i@3KotkG5dCJM@xYSe7#4$o(wRHCT^)?(AU3~iK9z$U5%1F!a zsntW&lpLo?+12}_g)M&4@dVd5ZHq2syV31ZmNNZoc-xOopQXe3E5SQMS2@;S+t}8< zaQj4TIL1|ch`2FTcV9=DYj1(`VOQhE=N(#cn|{Ym1vIsojFowcP5lZ!lB@Dy`VyOM zZ^ZrCu7EC=odV1e{*>CV;_xbY4O+DcOJp1=6C}ve3T8Z-8XWDrD(K~7;6yA>5#cPdu8bujHc3n8{Z4{>L zZM1=%SZP6)6F+M03KlW3NmX*$agw=t3fKD~x_p|0s`A3l_2Z^9-RtI>IUe%Y#nCTU z6&QDW==Uo}sl9&^l+0w~FW^QR|{Np#g28F*-B#2Hi=~}1U&0?qUdX>bsP9$8;{l>NDpBvq$i)12Xzb;)C{G_iv ze4^}B>}yAs4xY76joB9tb{Z*oWf$6;J)^`dNp&be62IAW7CT+aN2)C=lrhi;BM;|0 zoVAJwc*g!6xe2Cglsb|SOu_RWVF7^s3MkaEidD}^Ia%4dK)&+d4nGOf>%U4gZ09AoE!SXn{k;jys_OFcVcF(_REr#V-E&ql`f1eg^q z&AdmCdNIRb88PUIHb}`Pt_YiWgy$|Pcr4J=CxB*Y{K+ z)S`^_P=*5}wlFtWr9g7o?AGshdD*{ebEal&xhTtd`3qe2|j2sn_uh>SROdZ>GhSB zYWx7b?g>95=H(Cu&~7g_-zg_9wD6oDy~jvioBoZFJk-a8NEunB09hK6wSZ*1{>iRK zhvZjO4VgbNQ3LIkA7u|BRzWm+A%U!6lSwprbM@)bYy}^%t*_qNx(OM$*$-&WhX8kH_o4W ze0Tpu#maC6=6+DmpV{D3Sy);mSQtbB_TtUCLL(9|_=e_?zCu9fjAA0+&4rOv#=bq{ z*|P@s3c#w+`_=_&(j%%FW1;9g;MUi9@ddr+q#(2kP<&5cG1@I3Qf(B(x8#XCtz6_; zdRJ3(#@~yrV#zP;1CLlzNXX6fjn!}$61YbhMoHjz!d{>fd;)&=WJ@J{(kdo~l1%{s0R1$lKH^orhfiWS~%D=|mXhT3U zl$97M$U#+&g?-`DCD03qU;;iTw*jGA!wZPcLi)3YCT6M_z&uye8-ws5bYdq$peKac z+ew6xR^~JEU^O)%MB~*jjY+j~FnjiS$WatEmO8dSgi~v3)~YssJ-dE9y!Dgqk$cr* zeck%Ps?E&=$Ak?h-4qZe)gy?mO42t61_VISnQnKVG5bw(v#Jm>g|MpW^kI=GL;5oU z3;}$Kx=mX`Z#4AGG%E#+BJg~%nDFok=u1?4uiEcts|1e1#pNF)ukWZN2H_Nm8i8P; z^)>d4HRLrnUxI{(=&@sw>;wIkoHA-aCLf)9x)uqfNLyGd}2i6t5_1S$_2N_=P{_rAY_BkV-V~|czN|P z!mq(pit351jxqiXF&2(S3Uf%lg+;3*Ni5@#=(evvz*j!^W6W!H(U6R=n(r9GgRmyx zS7~1!Br3%8UQofn$$o)P&`GR`yng>?e)4M7eT!eLq*r;9xgz^+Q|1EHM|DB_F(iXl zCZrD|laz^pe(2C&uDu{_0JA_VBctZ1m&SeB(C{HZg6GeJ{uG1%!QI$%*Oxm0=NGh6 zc)+2L8JL<7yCM*aavo$_V-Cm$h@%&GUM@WpAjNrD7iOKd89tsJ7w%i0Wk}Bx?zyt^ zhL?(MY+2Enw2#u~Ue{@=h8*{%;+>oUpFAG1g;NnK^%^k?Vwos8V=`jQ1u&ITmIAy{ zg4BJGC=UMl0|%B4W=W#cM*2eDOz4sTUvR}g*U35Vdzm{Pt0BhK?1T=N(99EQ)`>p_izunh zhO^2n+FjYL=Zrf^ebTIttm|f`uH4OlsG9G@=+u1XL_Edd*~?5c;0I`BsxotlFC3$* zZo=Ri#LuZVpbk$X$?t^6!mG^TzK`|RQW1~wk+6yMzb{J{33-MjCTUg#B$q8nHX3JR zQV~`sybI4NE?$JN-uerVUYmc#M0ozylk{{iZf(@i)DuP2A-bV#a@++rUtR!(bJsW1PAror-yy8+j*Ad&P z%u8P!R{ER0W>wFsj5^%-e%?jq|g06$aq`xdHo*tJMxrEN82UN^CQfwtwE)*^xV zUdC9HpI)nLYO2we^y_L~ztov<{Pw(AJ;Us>L&vpxdPx%BNk=cDrIUiu}B{n)fX6FER? zpJ3TR2j2-vJOFoe{Q@RBQ9qHX&|mC+rhZ4DqKdBuBik*gcX8n8wei=foYfC6dG$E+ zs%#5mq*d3E?t-LY5s!=_&&7iV;$P{LVRimB#(|#VbTWlOT<U`w*rkX zfJn?d_!OZLm)aCp^nvwa;I_lpas%9!n;0AUd4zwDooID<+}zgwxx-m+qO#j#?`rn} zn@iU-8*Btv?7nxeSyu5mO2+tZiEClq*uDN2=;_{7>Iys?`x}m9X(~v@krjL40=Pey z{x?XZ4;Auc45D_N&D-hQtVS!^?eW*9V~aptAb;X{CJeZG-OHV~>f34O?}`94;uW;D z-X5z{p*ZKz2MtX8dZJ$g@f&x*kFQRRc)j|N8ir z1jPWus_3Nj?E!|$S`C(QkFDZjXRefUxYY;$o`{}5^~p}CCUlKQqVNts@jxYUU>8Cc zB-iqsb_w6z7zq(Sj3~BYYep17HutbpPF_vT+&{gGSAr#6gx#)iP34Yg#Wy94s{A{R z$y>stA7@~c+JUCOFAYDoIEfQ6jz$&TV-qeeiP7wbiW=TOsbrtqqR=*@d$uQgb+3oz zhK0Fn3-OY#z~Qw_3lmWBZNCe zxpm1?vUv(Ya_D!$%v`H(Zp`5U=X-PM6^&NFwUXssEHsTWRQKsP6X)FA8+50?R^&+D z=&;MXXw)D<+$#!-l+*ut3Zh2Ky(bXlxa{dAE9=J{@aUXnOjKBUW)ThnFhHIw^8>gs zGjkZ%1${RN0p-InntSt>rVlPM-RLQe9XU&-xi2MkN~6~69)Su*zdA_`a?)}VEYmXqh)V&C_cHqP8Cj*u0_%&${y>{|AFnZ5%m20Intn0 zva&*hD2Q9}s@K)Cr_|eCDyH=D6GiH6*F4U4Bduw!H-`$eZQe>VRIZ!{o@b7KB`AxI6 z3F)u|#Svj}n>yN0|!v9xRYT3UBMUp6f5eG~o? zCWo~X9Pbmh2~aUdgu|9e(tg?4CZWc`gr8S6L>Y4#LyVu@Pkkz(BOyp0cT;S9$CsXD+Tj*W{Ob%e@Fc(=9iW&$*4o)o1C$)A*6gKHMO9yFhUpEe8W=r zvh@oGQ8Y*H(nG_qU^jX1wccH$9Hms7+!L2*-mJbI`KwUkp(VRXiu<0N;HF!_RXtt_ zCt68V30rP&qFvK50c~dAl7IfcHNG{B-3md7sGaIa2gTjME=mT=rkwePpVI=dnLsE| z0~Zuv3hcA=bSpUqn6{veK_Pzo+W%+)U{Z{edekL-^Ii)ed?V5~)11_xS*eXY|9-kuZ)jUqmb+KWI_)42Hzk=v zTo1+FDm=h9=Ei$XChU} z_!3Y;^Q~*=!MsmknyHK$x(Kj}Z3bQ*tl=a^M)pgr7=er7r^>Bb{lC5`r^Y>h9uN|e zLe)Zh|HBNEj+T>n>ad#faP&_fX=7%lgLmpn`s@iou0ow&T&h)KfmHC3|1SL%+D4>& zGOjhkj?T`kzThzRp|!)esdX&l!2(%f!DmLOzOFn(u9dR);QB zuny9(eCq02feGEVt8^ZT=k3K#N2E~xi=nLsna92yA)o$#LoGF>kUe8>0j4D(UqSVV z7=w&ejW*VLq3io`9I6S_v9?~l(+hTf^UCCy@0(+cNT+GEqd3;NxSw28UgJTBh$VwY z3hc9zcp(BDfs+|PW8H5h!U)c9Km=?8ucV|T8olJFYtFQG8%|rfzGlf)u^G{fjF7%d z@*Ais_fXZ_503u(N)(1tx$QPokNU^?AXYw|8qFDs1wW8o&xDywg`b?*<)x@N{O_dQ zJ+c$t#;c5*Z$(}R`s6A^&Gt{GkKa&YmuNYJFTzULN9rdw83C|S{M z;hwrfQ`{GF5{ieaDfda|R^Lsn@D(S@HYq@-&S^SbP_CTD1Tw=)PC2Ei&bu&Rp6 zihc7xX#xaS@8XVw{lnA^j2C5t1OT$^1;Bo%GmnwUFVQ4Iwv0)n2mt8|7AD4s=G7V- z>HNih3C)2F6~yyUN#kVhcIgW?&&3h=2Y?(l(H-e8omQ6S9lc1=M}bwi4<1NuG7F`c z5>vf-9tj7~n6t|xRqWjXu>Y8SoURrLPboH>vUVF!z@~_eX+T;F)EJRQlNe`cX>0q0 zJENka+dS6;pckG7&~aBwI+4A(OGZr-a}9OZ6v{MGkX!fnV2AdQFu(v%W-3=#SKjDh zn5+;lVC(Fh-#l;yJl2@%X4Z=M2Jb_m1G5W9KYdS6|PV|r;RD*6aH^dc9s z^gU2>=2*AD?uD2IY&Q*svtS8PW;9Ph^jGlRVViO*Le1?82tNs)avUC@0rkqOc{1t!b7x98i%Es1qJLUQu9d#)dlR!Maz$2F#X?y#O4xyf71x{0FI`h~I#48~z5B_pU_Y zz!ej%jo)B15_JOb(Ni4_!88(QsM+X)BiIP} zGiESV_l`sFf#=Z)Ttn*G3wrrd46Fp_y3J=U1h z&s=m2p{YcS$+nw4&Lu!}z2LM(AbN|S2b^-y8LDqap3C!sg6lYl`~B(>Cwm?LHV}a#9>&QU=cZrVlX4 z;zNX&N15@_uQ?L%IJ7}bLR|x#U@*!SDRsxKzXW|ntGqlVxq6HM>+k&8;BFKTF9tpz zq3@!*@3M0hV=lF%vhAK=SuY@}7>t;&CF(l)ICGddLBEzgnmEH*95T13;t$1h?tpe1 z*zo}0;e{GdM@NT>C8-%$BLnp&%r9x!bUq;YO^(v;)MRe3p7^TJZd%&dxG&GNVQuMY zY5kg-hb$h_Dx~4ued}jLrp`qr)Sm?KMuo@`x^8PrR2(3-yS!GHf!RddG7U<+_X{`3 z)P53jL8RMWo)f#;Q|Y&z0qzkMb7=;@Y?p~2n0izE>HBxF>!Z4Aw7@(?LagoVoQrg| zp5>L4#B1!nf;S!>#=p~lX?PlAgz-_3J|R)6XbulB_C0K~uz&$lYG8I1V=B<*X?T}( z_{3ku#JDE&e~NbC(9bR7>IeZJlc&%h+N&+U;~!@Xk!4=O4VARs>E)Y`6}x8nQ=zft zouRMOrmg*S+_!;M8_U<^hOpUxLO7EC)jK7l#m}IeLb2t(QrJ?WvFrJN{n&w;70|iF*{IP zJlC=oVPsm#tT)@-^T{^MRLAei#|zL-pu=ySmMJ(5qPvcg(va9Xm7Fioc<=XvUq6+5 z2=-pO2N7FRNzXnL6HE9<$HoqNKK`rlg#xC*(E9y;*&QR}$_oLQ29hy!$7H%q<+9*^ z)#cj{MDNvMBZRzx88?;Ff}+r_OOiGB3jY+1agW@x@Wfk@R$+@FoTo$K~AU0oNG%uTp*a(Gnd54_@}g%MCq zi-iul8_oh%c~YN)Mf;G>vz1@7-T1lB=-;0HS2Lv+?UMCwXfunbuY0CQ5j_8HfaO9R zDYW;Cf{DWcGCkYMCwTP)Q}T-{ekSKWU|C-KcJx0)cBGzCm2WfMIvq2>K~`v+-f%E7 z5UWX&!=#0cj6?{?lhTcZ-i4~R&1}3qwc|SD?c@JG(Da5jO!D18?64i^5{J=lZC>&b&&m%AN*&D?UPh%rf79VUgQg@-u#yWT zzx|vPSU{rM%$)w=3c>Vb)d`hnh zVa}jPJu&G7k^hqtHp3;#Tc_2hZ_Js$+(gnn3Q&&;fj-&V>Q{2%_eg#AY#R&Ymu+2L zm;n;Z4=e<=K(_XCNN`YCzkE54=t4+SPQtS^WR_JjDjHb(5yIDt7a9OBOu-Eq4mvm-YU1SX>Q`huOK(Gh13HmO8g!Zex zb!S+^T`Zec7sjX0@{4n-zob|ryISexPv`L9VKrQO-8a!+7HV{gV$+2qG*k$OnmkE| zu=VK8|787`d8pThy$*l_ObIZKh%k;KPh>4jBuzC5!WWhkLKsOvT?1}JjvbFXdLC&t zL25Q6XVw_0(PAXqkPdhXL?#Z;@ah(xYjg55LO7Ec6I6rE@89ztJ!(ec6W6{#dqz4cO5Tf%jpn)APaxFdw3-HNRdCPOkfEUHsk+tAfh`qe-0ULe z33z!`5EZ3X>#I}DJ+q6OH*cProRm|HGQ(tE8H;?xIBZ(KPJO=ervspK+zbWk5$PV z*O?AD-5*$8{gSAmsea$r*Jk||N)~S#Vejoxz(aP`7hNm zs&B{MCVxCrVDMzbD#V+W`sf?;##BSrH^$YhzG2J}G!Y7#X6ZAt^~)<6*KV@Qyjefv zDzOrCekT3W?6o7Wt_^9qFK04Jzu_DZi0v3{=Qse9E3%^XEZYGg4HP%(OWy==m_YMeZZ)BlJc?N9!_|A7I zvGID~n1%LM-%e_W2{L$_e>Gc83wpRXrZm_LjrQUbdd7BODkjG8=!ghGObq*PFg%Yx z?sCBvYxnBe-923N)PBULpjCEIm`Abk;MmYr*}axMLJ%qRvHn>3x#C)}(4%vPvcwBT zvfWW4NRo$meMg=L)FiL$`w(g{2VS%w|a$;=Tnui)1l(sPd2Q4s+KZZI;Dci(y;s@ zD2Zl_W9D~@$;Zd?9t+d_usrbTlxDf{+&8ZoOAYZH}MPg>_m(zsYPR?D3?y}py!rELrU9&uDsdWXz4^j<{v(&fug z%$qmG&3v=YIw0n9PDoBcA!402lSCX+)_Aru@Z4q##`i&^aPh?#^W5WOlG8V~utY>g z8h|^%Bwef-nX_k+vxiuY=LQuk$mubeBIc(pL(_t}75KG5yf!yCSD?+sAlq+`yk4jv zi^NXSv!eT_!}9R*ssP!(a!&Z*Cz;=#uU3c&o_2?Jij8~I{JEZ66b0!cFumNzq z^-Rli&+e9bmn134%R36%d1bPZ&#cR{_ck32cJ_#2g2ZQY335w4@HWsz!J!S8D*-aW z3;sf{B!50=`o&$%=anPuG*pN~vMT%5-O&ara0X|N!$5cuhXq4u=xKG5yCI70MiITBiE z5y|a-E?M{P(MC7!O}K;|S1<4KXVmTP5(ZNx(CTnO)qtUSIZcqm-KGJ;b78UW`~A5t zYR62BD+X8IaO^FS1%h81x8(7YCpg^TY(wfCJVPHoVADj72a&v&cM+Yf>)g1JE6qKL zhht{Ned^0Qd3$$DNk84L8ah{-RVTLmo^EV;=#~X)6_v(|jyUo!-Fv>o=w6Jw3(U3g zJGbwf#>PETy2Xx%VAB6uH$1cH`cnR_cgbyAC-foAOC%drBf|ijrm}0oTa3rW;LMN7 z1wCiO`oo_90PrvwRiHF{IP6l^g^Nc5N&4p@{uR#2tlwkI#GXcwKZww6GD4%Qo-%= z=X+5uoF`3}y7w6c;*C$FrGXynj4cjho$r~f`iZ=fncv@Z+*c(~v>^si}IItnMP zM$)cuzc+unboO&C>REEH*7#hLy%Hv7I=HxL+VrP-Ix1T`AeA4XgJs_|f(^P*_ z{=sZ8ueo0TeOGJ}BTq`-nMD{5vDiT^-r2<_8^Rb1We1Ucf)UqHO4wRj{{G71v~4~4 z!yqwm+t?T~No3a}>J=|$znP@r`HD(^Izqs}~MVuQo%ex3g8m~dQJCtw;ZpL1J zDW!!+`z5oaWCddV5D)Y~{0(nqo8`l6*!Bt31s)L;OJU!c?Ga#BG&v8rnaETEFapWb zFXs}(j}7CdonmIb^wx}hApUKa_{vK9LMwgnFJ~QX)Y{(GwqIYO%QJ%FtZHlOc~;Q;cu~-Wv8QnW9Uo}_c;a2C%W~Y`&kbhxp(7*c6PO? z0EQ@2?-!8PKLG>=Np^>a#r)T429Df06~6|$vZg+psuOGc@b5#igz&ku3%P zB0YcGN;fL{Q*#&_iy1Ql0v`t*ooBVBFqZ|tv~%EhWac}a*2@gx*eP#ie`+F65VLCa zj5+j2pTZIv2)? zxjJ}ymg{H1FHKK2Jf*DM)a%5QZdqrl5*cfY;}`?& zd3o)yl%+87hv!5vvJvwx+N!IoJ37AV7=a~1MM;T}#9%Y-SbFeF2>Vq##uOuTOjyMoIURb|X zzN^U2W5hh-l6o+bG{4*>l4^Qsq#mcH=1W`%B4czrzC^!lwU9-q_WIzzmf4h|G*oXU zFF^Z`hhlZHViiUv9H-c`u}l>d09@gj83eoolE}ef5~@pVG2%?29V3Vp1+mq+U?tkP zJlid4R81M(c--;#2Ph;!dvDppDJ?6z@_V->@(P6FA%vSmNQ7qQO++GqVd40IFWz?f z*cWsy7!lVtY+`JTN1K^ud~rEvT%h_EhUmpAp{|sdm%p3`2(s}?%Zrq)f_7g+wS1yv zUg9S_bn`PykgSQWt}cM0z+nv^;P?uyA%{PlR#Q{sjJ(UI(tDJKs!*5r#6UOaUy2kH zXiy%gL`Ota^UDciR3dyy_Z2?>T7&;zAtMR`d|6ppC_f&k)L;K}^~dZYz9tM{mKf6Y zlx7|202ER`28I9~NG!f) zn_xi$;S@(*bkLTOj;;W?G1!`*OZPf-c<;anSNspy{@{XyC=Rta105Zmd)~{Jxa~U_ zgm^$xl>=*h36QY_rbNdPZ1^ z@K}fLKPF4n>riwt;W(Z#Z<+>aq~f5d;L|Vt4JfU`sP6x2@7$wu%=f>48x1iej8p04 z6hb3J(LuyanL-pvrP4$xhg6g@6(SVLDM^}`L4{5#6()*=gwP48BuSB!4$tfAHhb^c zhu`x&YyH-5J#*xyJSTr064aI~_GyD##O@W&$dmrsyd43%fhrlZ~G<%_Z zCokvb<;hL7VGCk=AXy-o7p&fC@DpTg8UAQ$|nSFff}DM zWO%9-c<#J;yK^geRvn{b)|Tp259Y-@l-8pdOib`?&U@3=Q<}&*ru<6U&@`*1b~K#55h` z!&`YEw<~LYIHkDs}l}B57n*pZe0`2 z+pc}1YEf4}>idz3=&czmWN@h}uRk9uLpT0tL_r;_`G-KORvXGM(1D?vuCMlwWT8f& z6Fo#(bH^4qi8XE>urq9d;B`kK?PQzQ9#LdqK!8KWWy|P=s}jwZW-;s6XYh9?AZRV) zKq1CzXr%C*j|v%s27Uw--U=E-};^@8Vise1WRQfc$YH$w&u zn(E#937LOWb%8Q=KuhGClSXwIP-jZ*D1T~38thseg)V`5{lm`gC z**?JP9r@=QUfqj?ZI3aP<&f5Uym3o=xVnUYPncX=vSjeF?rgWfuXcS;es+8}KP7E# z?eXLDYTXVUJm^+aRWtZv()&isP@hT$JYSVqsCtf&o$*t~xXoQW`rRSnwo{ z`tj(4)5Z!RH(eQA;`AY=J}KAMOHR|3+v{GuZbx=GQJ4>?V`tQ|g#4OD;d}-w&Eobf z<$4lcTP^orw>hG|#+)I>MPnawH|V7oWd+Ff}ZXuhbB& zt9UQj#R}`=3rmOv!-ox{CSf9jyOLY6x^$=M*>tbwiw{>1(AzCD&8#HuTKJi|Zl3uwi`XF+)!>D*yXxJ)vivj{~QPNdaFe%*s_W z9LYm#?=3!TIKk_wIg}$Zu*)UxJG~EsNA>mfAV)k6JdN!6%W;fLe>7tQpr_EU&lTJ*LI7ZtBwO}%6)7^W11V!7r&f0<9qJT9+a?Ur?A*yv z!(zr$_;4n|=D!D6p=(0|upx9=`mL$9@N-8%I84Tr3}$M}D5Xz2NOG^KK8dZRZwg?h&Ga9Kiz5(oBpu+AJf zhbbqSURN~3oe6f7>yjS}cofRoKPFGIzx^2L07d1>c+^TPKbXKs7*;oW0W|)YvwDH_ z068Aq7n#Ocnpo_dO#CFyP?NR0|N3zI2c7fJj`m~;?h)I|4}TN34J#(M6S6y9LW+;l zEDds5EEreJ3%h9Xh}kD^_HFJNs?p%$^EvGD;r;txtWU{kd9Bh+-gSL=W-%^xmO*zqkNpYYf@Ke-rf*lw@0SF~HI;PK;MSpb1Cp3|w>CTU-P z)dkNYb!xadJy;kbJ3fB*blkUefm9L$KIq*i! z<%lJST~1Et45D`h1s%%PzM0$$o8H(LPNjE+^rW!)*r7wp{+C><_n%v*!kX_CuhjDP zv9&WrbLQfpt2KLtz#7>17-_96yM!0A4+7ZSF9p?;kjNU7Fm!#f+ zn+7~x`Q2dOWgYDH9fxfM!RC(q)?-0yyxoJc<5v}&qJ7*wc%ltb04_i#4h;hON?&ZM z{wVR4@|ZEJ2v?*5Zbt7r@~Y+u4!rYfa?Z};NAEM8;@4N)ax|Rh{<-;-gmuD>*0RZ| zOZe`J($8O8bEaesqyZuNlJL?5RAXLcnWCV+un;uCAev-q^4b_Yjn?5KjhNfGV z_4Nt*Se`rC`EYBW-)r5{ELhT!eX1-r()28=n%Oz`+oE}2QT@0^k?$L83hy4CXv+{1 zb;1H$+j5F{1&?PxW6CaAX@stMu)5L2SZkz0?&Bk2VJcIzY2GwcWDR7=BsFZ}U{&rj zifF;7B{=vUlAG}9?nW7#5s%!}{_I2~7FKgn3B0QJV4_uF^DBnDOE0T04ihY`1Qi;L z;P#t#!uXT9`BOSi)jq3x%n`Z}oz~}lIz9z;e0qI0E*9Hlps`7lHqgz3L+0VMX%`0W zL|~#n+61wKl^MM}2v+XhyA-d$mVz;%a>wU{Iibgom+ncXiH-*kHpAaavgx7k=$dJYionxKbv_RKPjTtrgy>1VoZyMd3B>;&iQIV zWWo?cJ0RIYVkWYk{^ggPcr(88(K18H6_aJGJf3emc5G;3OUL*IEiwK>F)=n``(tDH zP8?%YRhFleycI@J5e!k7p}Q#sK=R82X#&nx>bP_9#fSURhS+Hy_3>xY6tPuPO`&o0 zLLf>en3(-@d#$tUn6FgqtM&yv77EqLHT%4~h_>EO7%oyCF@o}ui*sj!qRfyX8V>gq zLk%`k#`6vDT-w$vmWb?G74FWSZveo%Xl7qbj#7mAJ91=9?({>Up^0${;YL%zYEZy( zBOhfCR8S~`dgMqi{jp{9tk*@!b$lb7qH+{cwI<8t@n|5uQt_jHa_+f8(DfxN#uc8; zcNjK&I1Tpc(q91pukXAR&X(T+bcLmg2U1Olcl93TwEY$&Q(j?Bnq1D|oMHYms4?Nt%36 zHbbk8Er$;ePPbH$ltArX<-WZ?KS1qBzkdC=plpmQs&%%!)3SNAFCkW>*o$@HbM*z2 zKEcM(Jk4|3E8q}#OB%-cGW|Qht-msG^5e&Y!N4D`Cb+-bZQpKptqonK1 zY|0-5PAp5(Omkr1!_}+5d=Lwx)EM0vB9Hoog?r_r4+G%*2Xd*TE>6q6aK-#J!uZ5N>= zEKe^0#o~RJ#~V^CxcUudePWXKjIsQx^YWh`*3@PS5nov7-n8W20E-D`fbIs-YBGCb zl1Fq3cqEY^&XHWed-x%RwCfjNx!2@F{lENb@C`O6Df(_Nm#mbpw9n8Du+)xkO zBk~G)+_h8LS^}u9qoU$S(C$FDy#>gf;pFkl@CJCk0}oy_lhtqYw<+6q-hvadz_d}m2Xe7#^oym?J2j8!h}FX`CD=_ z@4y%nM2plZ-FglFZuNs-0gX&f7YG~}6OhXz8XoD1gj2QEIheQzOG3?9If&hN1SX%T zk>`N!{&OXJRlN`RB$)d#qn}V#*x9{g4GXM2>!}j41FKyAXU?%>l=iFf{++HOqLM2% z7f>uX#=oT_gAD#JD@4zop8ryOKKN36J{=}PJT9&}MXmB>vmO?LdgV965LT{NAnF$EP{ zJa#c1*Lx@l!~2d_EU>zo4SBYu{`#O< z#d$UFo1ML_lNCE3Cy}ck&HIPf4|A=*gS?!Qc|0_x;xsk?z#d|5er0=RyPzwvvBYolC_pCjs(d zoj8k;as!gC_0T^rT!a&{7@2+|yD+|c^wS%u66s&^WiTI=E2}N$-jZZ z7P1&8rX9Uy4@N||FzbvF8h$cLSttbLJ>Ohljm+VBr+8dWMMsyQsO;u9Q!;;s`VOtd zG?nf_Lf{m6TfF!4eOa!n7#tjY@7A)HDcVdrz1rWU^qc?$k)_oFdn)0Uor!MZ*@ao= zF>Z7sIxRQIs+HT~1Ty~a@scYYz-$#bJ~z_SITFJ>NM|fOaX%4Tj8}Ge=5h z^7qjTm#4b^cJky4`_z9VfKop${v&gb>GP?#vdkWPWU>%yNQ6S|#o;eG)=lCW?1taf zwe78&P8U2GX*;`#8THpx#2i|XL6y8O>FpfHbm`Y;(z^S`_6JpIJ?-*!7eURWyX3dH zI9%mWINGUg6yiJil@}ZX39V*)k1N6jy|(La74r~!0S_K5Qd|2N0)XG3hp|I`Wvol@ zZ-lTdDz<#OJMmu=FX^%FOqY`dAn4R3+>iqYeh~;{_w%l9D$_bQjOh+$t0>?bKflvM z*{x~qy`^w#xfT02w67T^&KAZ}JEFj*)YKMs&hIB4l{@jACfpM#R3W>R?%CI#6+d8G z&m$PnGoCBy*(xCj1V!^D#BtewJp4hwSLd_(ISBvrr|C;245JrrY|_0~PcRM(~e z=iP-hBRenrm5pq8q#MMMf#C<|Ay>fLPR~1X5s`D-=cXN>4jwpgfJK?jmpGS9`BX-= zqouLL>FC+dH=UC`De|X2`Dugr5zC7^XP)?)n*8mRW&WD`V>3qzH=?*F=qX61(XnY0 znQVG1Z}{sd{yXvL8Od%Fr=AB)^?=D*pGA6l*QnL88v^eaIB!rm#*H#wlRu z&Q){GU`oE#W7OU4+IKD*okXWdSN693dx4L$%L&$1dRl#&SCmL>ZP)8T68zMSdt8gN(moJvB&tIb%|Q9XjrIH0ulutUyQty$pTI)P!LFfE|b58hJjG@_~~? z90l`*;b)dh7@b0_c~u=!p`+Ht$5A~@kW~Z(1fb~=;@_+}pRjt=Vk-f)$W_tM{{7<- zfsp>FZBZ=JI03ivZ#W9*es2nRI}!5*dI7*gSy{82@0(d|8PHM%t-)T>2(N}8-iwZf zhBiXE0>O^@ASymzm`YAWv=#e`bR6Fh~ z`GE*yKg0u4SnVnwG*|KhhD97A{&G!8>f*hdaO7c-;INiwQi*dXU<|hMqh0_Q#%|fE zZ?R$0ri%`Ap4Dt2SHYPf&o%jZZjAuQ+FNTSZi_?~g{(ZL7imU}cI$(RKihMQ&ad#x zcW7lv)7UtQi}4nh-d!JLbzsZ_$#rBsm&`Wx2@_zAf3PHr?gscybTm7k_28$7ElCKU z_R9RUWlOq+&NwqgOnUJ1UVh3-qmqe>!Fz6ik!>&iX>>%*$1fS*q7a zTF1LS9l>;+5twgXyQT-7i@=IvL00zc!r#E;wne)$`;qlo}8~;Si4Pp-U>%nE%GbKT*#qV+jMR+B=#UHuM44?x9#JX zO7=ZwP`lPXUQpT%m0G&mF!o7C(vj;nDUr@atrp3H#O0QS85<3x;S{eS!Bm|y8y7D) z{+9*+SXq6*7p&pMN&P?sJwv<#i)s%}|9QG?FnTD;aQYz<>D8O1;A8FR4ab|K4&Gk6 zW^@FSU)Os(UiB0w<4dtr3g{ks%g>m$L}#hwM7r+g{a%`s?HqHWkc7#L#FsuQ$vg$hnCueaHCFjo#-~|#oaZWgt7^Yz(Dd&fcmJwOVru-Z#S0`lwd%1o5Dnkz zG4Ev0M#r6raY97XexA+O3yE*!NVYpkIWdxNf82^=WOOo<)pg#RkItmgb5>1pD?9ynFa~ zFl-3sbJvd}v}=1{Vtg~3$Mev}GZk}ILSf#ny-zPAv{|Gegh`+n+(-|ECXo@!#hT)? zq+jzS9wS1>b$B1o?`EA+BWz#EyK@KAf)013EDi_*Jni`3beA zWYnKvB2Z+h*iG%E4b_Od?(8ecX;{Rr1hrF1wzpBN^12uTG}L~#qt!Uj_dZJ|Oi?C* zvk?L`{-G@OB&^@7>-VBc$O&@p#rrz7y$|o*I}i4aU`}wByz2d6^~S(V)UUjfS|cO% zMeXk+I^gu1FlV$w5!rAH7HRre(b@Y21=D{SF5K%^Yx5k({hdM{@db$L7jd`nf?st> zTJj8&rny!Rt6lje;0aelynPN(JYI%_cb)0bOJ~_?psFX_Zm9wUe)`>rlv{vcXvMb&mKM8D@%G$DqlbcgZ~68`6^Gc>hq=Yg;SE+ zF-u-;b~hE`u9gK(Dmo7WiZ-p%ctlTTA zlvGr^CL_=`SomW8k8 zbdk|Un8udV&FNq!YaV6v{8IfcL+19u)&G39v7+$lB7N&_oz?qeq+R2FmNFbCXlz7V zGeh*xvliC9kAxg3IU{TUN|R;AbRt~30xkSubGr0N*m#DIGcq#rX4$Nh#X|)dHXBA_ zFrGbESOd~jjz0d$IDZBfl-sszu}pQr0wtfud#j5MzYv#`k}B)VT+oZ__CZoneX5)&3gpQNDhiE&^x(Qd@dBv<$U{qVqd_FRyjHKYX6wu^UEI% z`%=>KC!`Sr5jq{=LRlccd$6@jS6|~=H_uI*nrpSwoh~eC0SsQYjGbaf2C9~9stN~L zWDCUj*E=}16eQ&6#w6_@cYVo0EGqqHsl8jl3Fm_b(VHnGGjMcd`u*f}Lr|ohC{Zy} zeDtD4s5|Bzww9PXDnume=l{d(nTynp2!gN)LsxYl-dS4f%6^g9E6pYzgKjuGzZFK| zv-%qglGnmu7BGbzK8%_z%k6S-BsE=0L-5BCvYb~n#*97Mh6@bB zP34H&ckWmwJ1>97sx>BkKNpqZpnm4z>(j?KpJ`4LAbN#x3Fno!DP-YmDfsD0)z;4i z(x6z$XdyL4AV&nHiwtVD7vnR}ZdiDh3JTSKFSnl(@gv#O8|4K3GCOGp$jOC=hAy5z z|2$t*aLtZvDnPxVG;6!05>Jys^!}it=hVH-!=ghtZ*)53o8zEtOrYLBU?%J3ZFCszfQ`&l zDDK*d<5=Qn6VxI(_VIh*?g*lK0muf=E*d+;WF%{Wy<0t+F=L(*vBo*JaiW68`q`5C z=z_tocp5%@aAk?Of`SzVFwy{}*=BE5>^ot3Q9|VZp}=1BXMufhH_G>aqIbEM-^h>q z)<#EeC4ywV0D-a9PN&z{CLIAq+k4~v%EQEc1WTVkR1fzbtnPF;yPUl-w{vqtbh>z? zm-3NP9S()Ri}9$0nWo-S+LX72uUV)Zy?^DgG}r2dMn*>G_Y~HIo*w;m+)!;Vk8A!t zm{;@08HB6lsgy+l@KU0>cVocB;;J-JEGhkcd1g;bxh1w9}ht}%oB_# z7REJzA8&7G*VC+7|lb9mWWr%rrxh7FcL@f**c%i%Pa-WvXB4qh}uf#+#75*ZAy{8R@amp+#1Df z@Bg02^#uts-x9AM&ZxpdGc%!Bnys%-v2dIVF~?JKXRo=8@e~5 z?afcC6I*E8r#AO>mJ~ys&$&*P4CVn?c=MD|$6zeNnK|kEi`ADt1O}?gc7u?LLVU?>=8H&u_J;a22gCTZEd8X1) z6rHh`J0~rRS?T+S?n!ohrK=WNT83V9@F;sXqLkcv_Tf>Y5E+UMHz~SLZ7v9+F@RsD zGeH)F*xgYb(Y^|85v3HfN#E)r=Hv*`@K04y$$h?d#Hdl)n5zeAeLP%HEmZ&H+km#o z3XhQpQRJR@xLN?^5yW$Nl5L|C45Cv3S++?FQy0;OhmK}~(fP2zwHN3s;fM*U9}EmY z-Z*+gcyf3~E9&)?_G&=m-a9dqE^yxw9Y}BV0^AHv@Z}Vrh)l!pzYos*CgJ|}k@tjD zwANNge;6KzTQ_eGQL_uUyq+qRD=y4&J|1#9^74nvn2ej!rIEO0ly$vV!-vdq$%Dihpv{O4#6j=gvSq3Ynah zMM`^{Nu-Q7T_Flqm@NIADyI_bvY#DI>47etmd#2iyvNJafN2!EYr!eY>_G=N!Xv}k z>`w@-r62lyjk%ZrJbLT>ix>wxlsmG@Hq9)+_HD1fA-0W2e8fdcCj^WZFpLVaB zvn%=<0kv)>835uU;xL#bhLHqZx z;R*WdI{bAWgk$j6bMaSv5YEA0aq|DQeDSH{X`G*o$Xapxim^WT{U(On49}S=3bq!6 zA>V&@g?lz)ur>eLud`3-A@tQ-B?OU)uCJgEQoJev1Ao0;^w*X7?>q#TRut7qID3xM XGWzV-Wkmw#PxOPn(d<|~Yv2C`x-I=H literal 0 HcmV?d00001 diff --git a/browser_tests/tests/lodThreshold.spec.ts-snapshots/lod-comparison-low-quality-chromium-linux.png b/browser_tests/tests/lodThreshold.spec.ts-snapshots/lod-comparison-low-quality-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..a3212c734f8d9c3efa3fc38cc2e3a88df85adfcd GIT binary patch literal 36197 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 W1_!^V^yATH*uPIxDU)P+=|2FnYkd0v literal 0 HcmV?d00001 diff --git a/src/composables/useLitegraphSettings.ts b/src/composables/useLitegraphSettings.ts index 50488e3ac..fd340bb09 100644 --- a/src/composables/useLitegraphSettings.ts +++ b/src/composables/useLitegraphSettings.ts @@ -63,12 +63,11 @@ export const useLitegraphSettings = () => { }) watchEffect(() => { - const lowQualityRenderingZoomThreshold = settingStore.get( - 'LiteGraph.Canvas.LowQualityRenderingZoomThreshold' + const minFontSizeForLOD = settingStore.get( + 'LiteGraph.Canvas.MinFontSizeForLOD' ) if (canvasStore.canvas) { - canvasStore.canvas.low_quality_zoom_threshold = - lowQualityRenderingZoomThreshold + canvasStore.canvas.min_font_size_for_lod = minFontSizeForLOD canvasStore.canvas.setDirty(/* fg */ true, /* bg */ true) } }) diff --git a/src/constants/coreSettings.ts b/src/constants/coreSettings.ts index 280ec0df9..45093da5d 100644 --- a/src/constants/coreSettings.ts +++ b/src/constants/coreSettings.ts @@ -776,19 +776,36 @@ export const CORE_SETTINGS: SettingParams[] = [ type: 'boolean', versionAdded: '1.8.8' }, + { id: 'LiteGraph.Canvas.LowQualityRenderingZoomThreshold', - name: 'Low quality rendering zoom threshold', + type: 'hidden', + deprecated: true, + name: 'Low quality rendering zoom threshold (deprecated)', tooltip: 'Zoom level threshold for performance mode. Lower values (0.1) = quality at all zoom levels. Higher values (1.0) = performance mode even when zoomed in. Performance mode simplifies rendering by hiding text labels, shadows, and details.', - type: 'slider', attrs: { min: 0.1, max: 1, step: 0.01 }, defaultValue: 0.6, - versionAdded: '1.9.1' + versionAdded: '1.9.1', + versionModified: '1.26.7' + }, + { + id: 'LiteGraph.Canvas.MinFontSizeForLOD', + name: 'Zoom Node Level of Detail - font size threshold', + tooltip: + 'Controls when the nodes switch to low quality LOD rendering. Uses font size in pixels to determine when to switch. Set to 0 to disable. Values 1-24 set the minimum font size threshold for LOD - higher values (24px) = switch nodes to simplified rendering sooner when zooming out, lower values (1px) = maintain full node quality longer.', + type: 'slider', + attrs: { + min: 0, + max: 24, + step: 1 + }, + defaultValue: 8, + versionAdded: '1.26.7' }, { id: 'Comfy.Canvas.NavigationMode', diff --git a/src/lib/litegraph/src/LGraphCanvas.ts b/src/lib/litegraph/src/LGraphCanvas.ts index 33c05aed5..a32b8c354 100644 --- a/src/lib/litegraph/src/LGraphCanvas.ts +++ b/src/lib/litegraph/src/LGraphCanvas.ts @@ -441,11 +441,38 @@ export class LGraphCanvas LiteGraph.ROUND_RADIUS = value } + // Cached LOD threshold values for performance + private _lowQualityZoomThreshold: number = 0 + private _isLowQuality: boolean = false + /** - * Render low quality when zoomed out. + * Updates the low quality zoom threshold based on current settings. + * Called when min_font_size_for_lod or DPR changes. + */ + private updateLowQualityThreshold(): void { + if (this._min_font_size_for_lod === 0) { + // LOD disabled + this._lowQualityZoomThreshold = 0 + this._isLowQuality = false + return + } + + const baseFontSize = LiteGraph.NODE_TEXT_SIZE // 14px + const dprAdjustment = Math.sqrt(window.devicePixelRatio || 1) //Using sqrt here because higher DPR monitors do not linearily scale the readability of the font, instead they increase the font by some heurisitc, and to approximate we use sqrt to say bascially a DPR of 2 increases the readibility by 40%, 3 by 70% + + // Calculate the zoom level where text becomes unreadable + this._lowQualityZoomThreshold = + this._min_font_size_for_lod / (baseFontSize * dprAdjustment) + + // Update current state based on current zoom + this._isLowQuality = this.ds.scale < this._lowQualityZoomThreshold + } + + /** + * Render low quality when zoomed out based on minimum readable font size. */ get low_quality(): boolean { - return this.ds.scale < this.low_quality_zoom_threshold + return this._isLowQuality } options: { @@ -516,8 +543,21 @@ export class LGraphCanvas /** Shape of the markers shown at the midpoint of links. Default: Circle */ linkMarkerShape: LinkMarkerShape = LinkMarkerShape.Circle links_render_mode: number - /** Zoom threshold for low quality rendering. Zoom below this threshold will render low quality. */ - low_quality_zoom_threshold: number = 0.6 + /** Minimum font size in pixels before switching to low quality rendering. + * This intializes first and if we cant get the value from the settings we default to 8px + */ + private _min_font_size_for_lod: number = 8 + + get min_font_size_for_lod(): number { + return this._min_font_size_for_lod + } + + set min_font_size_for_lod(value: number) { + if (this._min_font_size_for_lod !== value) { + this._min_font_size_for_lod = value + this.updateLowQualityThreshold() + } + } /** mouse in canvas coordinates, where 0,0 is the top-left corner of the blue rectangle */ readonly mouse: Point /** mouse in graph coordinates, where 0,0 is the top-left corner of the blue rectangle */ @@ -700,6 +740,14 @@ export class LGraphCanvas this.ds = new DragAndScale(canvas) this.pointer = new CanvasPointer(canvas) + // Set up zoom change handler for efficient LOD updates + this.ds.onChanged = (scale: number, _offset: Point) => { + // Only check LOD threshold if it's enabled + if (this._lowQualityZoomThreshold > 0) { + this._isLowQuality = scale < this._lowQualityZoomThreshold + } + } + this.linkConnector.events.addEventListener('link-created', () => this.#dirty() ) @@ -885,6 +933,8 @@ export class LGraphCanvas } this.autoresize = options.autoresize + + this.updateLowQualityThreshold() } static onGroupAdd( diff --git a/src/locales/en/settings.json b/src/locales/en/settings.json index e2c759c5c..3f8d206db 100644 --- a/src/locales/en/settings.json +++ b/src/locales/en/settings.json @@ -388,9 +388,9 @@ "Topbar (2nd-row)": "Topbar (2nd-row)" } }, - "LiteGraph_Canvas_LowQualityRenderingZoomThreshold": { - "name": "Low quality rendering zoom threshold", - "tooltip": "Zoom level threshold for performance mode. Lower values (0.1) = quality at all zoom levels. Higher values (1.0) = performance mode even when zoomed in. Performance mode simplifies rendering by hiding text labels, shadows, and details." + "LiteGraph_Canvas_MinFontSizeForLOD": { + "name": "Zoom Node Level of Detail - font size threshold", + "tooltip": "Controls when the nodes switch to low quality LOD rendering. Uses font size in pixels to determine when to switch. Set to 0 to disable. Values 1-24 set the minimum font size threshold for LOD - higher values (24px) = switch nodes to simplified rendering sooner when zooming out, lower values (1px) = maintain full node quality longer." }, "LiteGraph_Canvas_MaximumFps": { "name": "Maximum FPS", diff --git a/src/schemas/apiSchema.ts b/src/schemas/apiSchema.ts index 1f30d31ec..145ee57a0 100644 --- a/src/schemas/apiSchema.ts +++ b/src/schemas/apiSchema.ts @@ -460,11 +460,12 @@ const zSettings = z.object({ 'Comfy.Workflow.AutoSaveDelay': z.number(), 'Comfy.Workflow.AutoSave': z.enum(['off', 'after delay']), 'Comfy.RerouteBeta': z.boolean(), - 'LiteGraph.Canvas.LowQualityRenderingZoomThreshold': z.number(), + 'LiteGraph.Canvas.MinFontSizeForLOD': z.number(), 'Comfy.Canvas.SelectionToolbox': z.boolean(), 'LiteGraph.Node.TooltipDelay': z.number(), 'LiteGraph.ContextMenu.Scaling': z.boolean(), 'LiteGraph.Reroute.SplineOffset': z.number(), + 'LiteGraph.Canvas.LowQualityRenderingZoomThreshold': z.number(), 'Comfy.Toast.DisableReconnectingToast': z.boolean(), 'Comfy.Workflow.Persist': z.boolean(), 'Comfy.TutorialCompleted': z.boolean(), diff --git a/src/stores/settingStore.ts b/src/stores/settingStore.ts index 4417816a3..3887688ac 100644 --- a/src/stores/settingStore.ts +++ b/src/stores/settingStore.ts @@ -188,6 +188,48 @@ export const useSettingStore = defineStore('setting', () => { ) } settingValues.value = await api.getSettings() + + // Migrate old zoom threshold setting to new font size setting + await migrateZoomThresholdToFontSize() + } + + /** + * Migrate the old zoom threshold setting to the new font size setting. + * Preserves the exact zoom threshold behavior by converting it to equivalent font size. + */ + async function migrateZoomThresholdToFontSize() { + const oldKey = 'LiteGraph.Canvas.LowQualityRenderingZoomThreshold' + const newKey = 'LiteGraph.Canvas.MinFontSizeForLOD' + + // Only migrate if old setting exists and new setting doesn't + if ( + settingValues.value[oldKey] !== undefined && + settingValues.value[newKey] === undefined + ) { + const oldValue = settingValues.value[oldKey] as number + + // Convert zoom threshold to equivalent font size to preserve exact behavior + // The threshold formula is: threshold = font_size / (14 * sqrt(DPR)) + // For DPR=1: threshold = font_size / 14 + // Therefore: font_size = threshold * 14 + // + // Examples: + // - Old 0.6 threshold → 0.6 * 14 = 8.4px → rounds to 8px (preserves ~60% zoom threshold) + // - Old 0.5 threshold → 0.5 * 14 = 7px (preserves 50% zoom threshold) + // - Old 1.0 threshold → 1.0 * 14 = 14px (preserves 100% zoom threshold) + const mappedFontSize = Math.round(oldValue * 14) + const clampedFontSize = Math.max(1, Math.min(24, mappedFontSize)) + + // Set the new value + settingValues.value[newKey] = clampedFontSize + + // Remove the old setting to prevent confusion + delete settingValues.value[oldKey] + + // Store the migrated setting + await api.storeSetting(newKey, clampedFontSize) + await api.storeSetting(oldKey, undefined) + } } return {