From 89b8d371e664d6d714be8372ea322a189932659c Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 19 Mar 2026 17:05:58 +0100 Subject: [PATCH 1/8] fix(model_componentns): return name or id if name is None --- .../geode_objects/geode_brep.py | 3 +++ .../geode_objects/geode_model.py | 3 +++ .../geode_objects/geode_section.py | 3 +++ src/opengeodeweb_back/utils_functions.py | 9 +++++++-- tests/data/LS2.og_brep | Bin 0 -> 111223 bytes tests/test_routes.py | 2 +- 6 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 tests/data/LS2.og_brep diff --git a/src/opengeodeweb_back/geode_objects/geode_brep.py b/src/opengeodeweb_back/geode_objects/geode_brep.py index 44fdfb16..5b3027d8 100644 --- a/src/opengeodeweb_back/geode_objects/geode_brep.py +++ b/src/opengeodeweb_back/geode_objects/geode_brep.py @@ -88,6 +88,9 @@ def internals(self, id: og.uuid) -> list[og.ComponentID]: def items(self, id: og.uuid) -> list[og.ComponentID]: return self.brep.items(id) + def component_name(self, id: og.uuid) -> str: + return self.brep.brep_component(id).name() + def inspect(self) -> og_inspector.BRepInspectionResult: return og_inspector.inspect_brep(self.brep) diff --git a/src/opengeodeweb_back/geode_objects/geode_model.py b/src/opengeodeweb_back/geode_objects/geode_model.py index 537c32da..70d02feb 100644 --- a/src/opengeodeweb_back/geode_objects/geode_model.py +++ b/src/opengeodeweb_back/geode_objects/geode_model.py @@ -35,3 +35,6 @@ def internals(self, id: og.uuid) -> list[og.ComponentID]: ... @abstractmethod def items(self, id: og.uuid) -> list[og.ComponentID]: ... + + @abstractmethod + def component_name(self, id: og.uuid) -> str: ... diff --git a/src/opengeodeweb_back/geode_objects/geode_section.py b/src/opengeodeweb_back/geode_objects/geode_section.py index 83b228f6..f630186a 100644 --- a/src/opengeodeweb_back/geode_objects/geode_section.py +++ b/src/opengeodeweb_back/geode_objects/geode_section.py @@ -90,6 +90,9 @@ def internals(self, id: og.uuid) -> list[og.ComponentID]: def items(self, id: og.uuid) -> list[og.ComponentID]: return self.section.items(id) + def component_name(self, id: og.uuid) -> str: + return self.section.section_component(id).name() + def inspect(self) -> og_inspector.SectionInspectionResult: return og_inspector.inspect_section(self.section) diff --git a/src/opengeodeweb_back/utils_functions.py b/src/opengeodeweb_back/utils_functions.py index c5da4ab6..bf11ad11 100644 --- a/src/opengeodeweb_back/utils_functions.py +++ b/src/opengeodeweb_back/utils_functions.py @@ -214,7 +214,9 @@ def model_components( component_type = mesh_component.get() for id in ids: geode_id = id.string() - component_name = geode_id + component_name = model.component_name(id) + if not component_name: + component_name = geode_id viewer_id = uuid_to_flat_index[geode_id] boundaries = model.boundaries(id) boundaries_uuid = [boundary.id().string() for boundary in boundaries] @@ -236,11 +238,14 @@ def model_components( component_type = collection_component.get() for id in ids: geode_id = id.string() + component_name = model.component_name(id) + if not component_name: + component_name = geode_id items = model.items(id) items_uuid = [item.id().string() for item in items] collection_component_object = { "geode_id": geode_id, - "name": geode_id, + "name": component_name, "type": component_type, "items": items_uuid, } diff --git a/tests/data/LS2.og_brep b/tests/data/LS2.og_brep new file mode 100644 index 0000000000000000000000000000000000000000..584949d900f7ec8e1f8eea17de603b6f11996fc4 GIT binary patch literal 111223 zcmeFa34k3%wea8FGm~Y)5|&8VCm{=v49wkT?yycW*;f`p188#ZoqJ(0B>9q{;PdH- z57`w_LF5T>!vz&lzzt;-72)BAfap^QiU=YI_z-Y`@BFH}?sT8qeRF3rLEr!X-I=QD zs_Hs*>eQ)Ir`A4hX;br_&bV<-2 zp1tl(>(;+z-Em9Dj=T5#lRrZm%yF?0pP1n|J4@`w^4h}Y{`KoNozcHxljrWTazlCD z!t(mQ^1_XU4QIHnCx5Qn~(#s-(23fxqMFZ)RPMv`wPXj zoE3-M0l??_DRM*+1Rhc z9%ry|yo1H#czI)gjtKAb#{Pn_Z#4E7jqNoXrv-bg@i^XV#N&7e8Jik%y`LHTK4agH zJ=P*v<9EV~;f+$J1ZyWnN#=Zl4tV!W` zv&G|hDPyk@+w}^@E*iUp-Q>Z(t~bHhJ7JGCL5{bVcpUE#V?RKI_j6-EXzX8Lk2UEW zZ@PFK?@(iZng|chcfHRV`v&Z>9>5)MUt#|+82g9VV@+zu+h076moxSiM0oEv_6LmpLF{oJSvcM_ zV;^DcuZit?UpMwQjD4H2zllB00~^O{H})~c{-xNi_ut0;m9c+q?1zl)?Pi?avBw&Z z{OR&d!q;R|gjD3``zbm%ueb3n6H};*z_VzH&p4elJ$ML3! z$ML$2{beG&n~i;ov2Vp5>yg6oCK)?z?6qRM-dV<8XYBRZW6VpgX-2N$4%hIzYwE)_ zGD2RWf?dOhU!i<#B_~3aShkI9tCoZFmk=Dd4?5S(?VS%&s-x;Ttg+-qxN0XxLgl< zyN1hLk4ko1ykkvJkFlvI$1tyBs>5kE(T+FIM7-75mti-1JviPRV=p)MX6$AYv}7UeG)-No;%(E&&?*n@s7viZ8G-1W4CxK z#dZxq*E`WfeB9XgVmF&;$2-9UU2E)5VYe7iu8DBHlT8E?#qmCe-R!+yY}Z?5>@{LL zMr;Zdh;Y19jeQ<=lX=VWPBTI0V>f%Ji0zuUTn{nmc(l_X!tqv{p!XR2eSQSVUGELX zE}4ig`Vj;<-W!eme~i5myTt^#29z&w9V4L~@25mJdwpWNUfI|*EXVr@c9V&4yf>Mk z5BWj7<#-iiUxnRlJg#@TJo|0bF~UzG2y(nLjD3@_zk=Ojf?QLnu19-zJet1a-H+Yu zQO~Z)*7a!mj`uO_W^aSou1C>a?;L`>?_f8X2**3y1bqv;#iQu1VF1^Avx)eEv44Wy z?7{A?N#T0unut5GTRfVH>;0Rt5&n*m&yIH+&&?*n@!n=4E;sfkuv<)!>;1btyQUj) zOpoJuKO(x>g8^LcUBwVJLpB3BjzGm!SVmF%z$GhGHebv}^VYiqd*ZY(_yWR~Z;yz

vbL19WUB)xzfL`+~>A0pZ-_U{@~NC zdx|q~itCPDw0>j%Ti361|8vpprxQ16;<8D6@0dx{uD8Ad1BIi$ zH2)may6=3V^=1|I$9az(MXI;`Bu{G(r~2~T^FB({)i+#sN)TnyD9w9|A?o=vTVAJ9 zU9tFF!+|gT?!VG1>c?{)`Mm@=H_kW-mLo3<@W}Z)|D33=AO2RT9!BHs%b)u@Q7d2m z(s&isvht(TiTc<}zq}=gvHOVfzYeVbJwmf zy~%yN=d-4fjk{w-!A}!JbS?brTS#%rgsz<;5l=0>#_3?%KJGVhbD3b+^tLGfpC$*FE*{js6SG%cQls2Q6A`+RsI2E(^GGOz--Q z>tyhK!QxvG4bJ{^b4VM>%f{Ti@*S|Nv*@KFLSABgSbvyz|6PPXl|AVyKisBx{ldFV z*YWx5qZhMLpZ+`H?$D%3zvT(1@5wmjAqqF@OKgG*S{;@0JkG=H9fVKSa z$%}sZ0O7y7?EP1Y6T-H0$+L$3Pwl;&uB?jf$#d3TM2c0H-UGx?iW63xLBn!>Ts$z4 zDSjT$tT?fo@K@4bdtRJSireQsxi>Liee^^cbTyCX=3Zm4{r-<;Ad;)$;}^a6&%D3u zLwg4Fu#~#2XASM$`Q9@fIdMXHe5-fW^~AWVu6)9e@v+J;%k&fe_wviIKq$pKm%o@L zX4(sfP4Q#=6wfZ1Y`AFkY zZ1Fp16{oiQ;TF=T=O1k9@7{;6QZ;+)oZT-a%{RXHmq5V!Sml2|8Pes%tl)PVEIkN=@~?TWd3Z6ap>;--_t zsiyeS;yn)e$3KW$P4V=?DRhj^z>EtI4u^ks&ffPBzW+tD zgO1Zex@zSu-zH|-`~L2VQ-yTM{6!BF{_aooL&s|PB@1#;+VNK0{bD$LrygHpUYGi9 zz#V>#PFV0OFmV=~zT|J=_q~PB?ML|6ezPiQ-TwQpUEn-Q`1dZk?lf^EUyJD{m%s1< zVsiIAJkFMV`8;khTA?}fwnU)J$K z!r$;v3Q=8s|CE&*4k7#luX!TqbH=#t>IId@3H)PfZ&Lv~iKk4O;-LaxU zjdP)&*J36g$G6pJT!oDr3+Jxx7ai-I)tgtRjnd`368r`prZV_>zT-3nZgb#{5w}Im z*ubSo)T7r-hsQXxci8q z@~peRJcAD|`QU;NF7Rm-6C*A1-ik!5^3M;<|xL{`kQk7kqIk zH!kJHg+938fqRgcsbZ#uTsoi`VsL3pGsW;8F5$2z;kdj*8FEZoDz943bMa0%}aLpUyB(1x_Qq`@T)m;7-NSaj!^z|D!96+<{K;hka-y4KCh zGw#XUj{g6PPQOEW)OjCGHZXUbvSW96B2xESh`cX4?K7nrzn#Po;( zKkLqw=XNo;(5+Vt@8J^WiGd!tJ%LLc{)5EK6Ei>LE|6#7;bP$7seua|{G`E!ZVSaM z3fv{)E*1kFaS2~4hHzX=s~G5r%R9Khz+En8nHccGh3+fF5RMC;E5#6wi-Fg{2bVOs zyo*cz$BCgnaG~?@VwMCh_>2#pad`(9dgH=hCy3#FT++J1GcNUo3;*GQ--%*g8*)#Q zXW-z%j}yf}S6tr3B@VYkOtTpB!krtqivt%vBOHD@Sq$w97ekvqBybN6T=<7@-hZ7K z@WLhENn%KcOBgP6#HC&0&Jpu^G0-0uvy&M3AGarPp*McwksdvkNBPK(%$OL=WZysPOj-UgC3Lq(l!0%z{8%T8*L*XUzOkX;{B>1`TsKc ze-ucdK(jkRrV8CtTs_IMw3NMxdTWZ6Z+5PNE37dj5{yz}0hbh-O!hZ0R#xJq)H}cJ(Nm-o(`dDMY@j=aFU* zsHcSJY+XHLNU!PYAu`>!tLIPXV_ZFHJDxy2>ZkW~^;B{TfqH%iy~@>-40PhIo;V&y zpq_^5B2drfS@JU1nQ}IbT3y=f}qsY%>6Rjb@ikL>R8Q^iG(?>o_OmfP|wRwBT!GCp>n!9ubBmA1W+?+Je5E_&CR&T)vGBee>HQ_QwY=(DyXcko^aoXKt1h;Qt9f&9<*^+ zPa>n1yLwI*-QLwxVJN7so@ql%cJV9hEQfqGj1KmzsB%R~b8 z0?*C_>iOJG32bd)kK9ccAMty3!C~U}$lWFH(tG-o{vE-uy_oB&v}Y^DYKw-oB{&kx- zHP^m>91$72#weM@{!I4Hr#>@lP@>!RSUL{3r?C5kqh)!-btm>-|8ElDq(1O92s03! ze3RL^W+?U8^EdqvT43TSb&He|InJ_4K&FoNOm{BRo-J28hUiqu6}vO(N(DNV`%2KM zN+|l(rnnu3O^xp`Y;uw3LU7~w8x2LNpblJJ2Qf6Q84)$ndg-x&H^#4vmXX#)6KHIC zbI0sKajSK4#$Mxkh!`CBaGD4wsHC=w{yNq~^n8E6u5iSbmwqh~u2jxLz3=)hDL&Ej z%qPTAwdYTrg19@fsZ*bZq!)vy$!$eLHLd5wJCFY^wT_ABiQh|1El-rP-R;?YIy1x* z9o^YdXCdDm#}i1Zrhx7-ZKkm{&~m2Ql4bQb`-|`iCZ3BDWNJa)?f;T)EO+?%c8MO-rq6>#0VZr<#?G zsA-5c!qVJ;`j>8RR3~E{1}tU>inLz6?9DF_amk8{r;4NM*_YNky1iX_!YQw>-`)~> z@=UHh+nFy8aZx2-DrCzY={PQ;6x%JeO>gPE{SOhTJ@EYGXO2anta;@6wn1^LJn@fX z{Rl@j(7|8r`^>T1$t=UsDjJc;O$-oGEa!_cviL2F{k@X+FS~QDgvIg(@^gf;n4}R| z9G1Zk{I=^)^?ULJ8Jxx4 zD_!l`zCvz@Qt52D+?UPl*nWM@^m&F-R-UZ6akp_J>(|Zr6iPj`{LUw#)ZI7j_3>m% z&3eRpXMLWEmB{(-&Qg0emFpa$Q%9v#%9nDndbE+qaZ+%U##Y?ppBBMt0ZAdcQ}M*7NBFKl%yuzc{mU zOD+AaR($Qm>z^D!>q&KFiXxAT`5`)0a+SVPrJPFCXLexg840DD7(Xz)W_2iNeleWh zSnudJKczVd+=*raqV2IKBDz*JV&H-e5uxcv(0cx7;oVHyI>$VJ*}dYtTCK;-OuX%p z)|*GvdP@1CXt~|_t|6`{rZc&0I@PyBd+FGziIMPx%Q)ZYGhbak;d4o~OCo2;$toZ~x)T>i_@=$2cc4b2iDA(E9oyny;Al2qg6*C2D=RjKpMDuGl ztY3TX>2lIIdVaX+@S2SYy@k>l<-X&B*TV;i7oW9Zt(jL9ZC3tTjXf-DBy?@1`(!F= zjF|CaSd7_444Nrr8!HAKds0xuXbD>ms3~Dkw(#j_&umz1HK%s{$spG}dmcFlbC_l- zC^$3iwU}^l^30o742&7+1f`HuMpSCLaq#a?PcULYN65Rre5ghQBl?;MJEE_Nu-aB~ z#0OuAW^PmXs=K7KnQvY0Pv1HHzllzp_FU}GGpyPFzG#GH3QqqWLxM5DBF`@CO`XZMx%irobVF|v*Ow^ zSida;xa5bAquNajCmcq<6L)8jW^$<#L&9 z*+}o$)rRdIWYt$&x88G3WJbSs3M{-HGZMkngxbn-F~2wkrDb%MPRty|$L7yiPd@Lt z>D$OZ)jCFBBW?-J6Mt);2OqEBr^oU{I^QRwq|T1;yj3w<=Xb2cqV}SjXCpILt%nLtXrk?64i+<0%nUKC#T+6AeQmm! z1l6ed)m4qQm%EJmkUUmT8r>(av&D_>&E)U351C>Az!iSi?yR}OpZp#C@}nkV%}QSx z*xFX|BN7++244J`Nn!O0nP3j47LwKrW2dC!6~8gVQv4{HRs3l5ZbaFm@3jgceW_>E zzd-SmbDgfcamD3NNQATLfEN!JN43Qruf32rS^&6Pjey=BKjA#%T1^1gYAiMkO@{aI zkGA##eXZ7EwH3m^mGCg`_@Ov>@XQZCxcNR`(;13;f ztY?-|q4mtJu1u=0oQu_742|PD{9(-Jjd;nqk%^pUcA>GIsz*$(nC%rV{vy7eq6ieH z!R4QBIhs1O6Hr@f*6M>4b_i0{!E6fK@O@CsU99Zwx&x4f!hB|+R6FwZ9C&7gYcV7> zT0eNha~J}{ecP$OS$|9YbvjN!vNO$`madM=OMUcg>CVt{Z?;s)3nQ6{t<9U(N5IPNTc7ZS5 z+rD;nG@{3XvWkoIuK${3GJntfTiB_w=H}LBlgFCht(-!{*2&))-y^R4f+6eO%_gGf zW8XFrTh@04J;;N*%^2jp(z_nJU7W37>~tgOS`L%A0MyG5M@l{vaYAYKARq#s9E!MV zfr+Tn>gEYMnLHBr2CccR(@*gqK1l|SALnlxT9eolE^LnE;q04s{Bk69s*O-8P|WIc$n*6Jn_qX6QNXqCE!1b*}uMy?ex2^VzX}eI(8#ww>2Bb5P!NZu{20 zJ>v9S{`E0_4K}*Y+w;O0KM#$SK=UhV@Q?k5BsJxTUHhRNgU9b>QrH4IlXmrqn5bvO zDhH;0?0d8UWvRRM?tl2R5%IdUWF9}cO2o;hM6eqC`M8~WCNuLSlV%&&uZvDTHBX71 zeDYtdoqw9<&66zb)l~8*iUuK`xw6VJ&;G4Zez@cHN^Fz4lFIXX5kpyg4R>4X|Et*%rC` z7jpU6fS z<{&XM#7q~{CWa9(s~u)LI2!M}79DxD_?^wYAAMXL)l>T#FBy4zZZ2=$SO}Vj-GjT$ zDZ6a#lpVSs5T)7$tQgaqi`yK8wTL@L%vdq}P;hzXy|8lIDt>A zv;59th{Mn9Gx-1?KjFmVC!8PolAhTbe)x$et!NMCFf4xJcN4?U#siCY@RJUFD8uez zn2p#oc%CFK`LRcq_t?kHgcS8eJrYkiVZ3AgzyOv_kDvGO^B!pl!w)}E_k;ri!ZoPCW{|_-pAi21{#r$yr3U`o}mx)pCX1jq8{4B zgx|6GgBLJ~CoS;EpK?-OXhwd#11{E2dBb(iGxb9rw!Wx8aKaBf(%SNX6THL^egIyZ z81N#0{NU3j20zdINN3AOnDs+vaJ2PHdT?nIW6OmLje&<8;2qjCX>DBr!{!Hn5f1LW z3vTv(p4-G&dI1|amOos1rhM=x<>T4%D}H{wW8f)KE2uxrRpBIx8LwcS`NBU#L1@>$)onolwb}_IH@vtfH1CKbu_#G5H z!*0On5~@n+CwISu3lJ zOuJ8j1K?_EfEuJWp%yg?RiGBs7d#V|?3;%%b34HUmR+WoM|ma}yJQb7T@UW`XKU@u zE${emZujKa1j9S$e>OcRFsq|gX=Xh{Bo2HNhnQ`{TL~i5q{)sg?ROZgoLOHV-y<)| zFPJw8_8HU+$L;!5O*w3YleEtuvZ9r+rZQ$b)>MSdBOC59SUF|UL4Tt3f4YA1OX9>1 zR%mjgw7CFKMx@Z(VL_N3F#@yVx6in63E_r~#HG972h;LQ96wl=XTo>}4t_G@nXpls zwr>Sr#83D~S-=TA$qzsAyo;Y7_+V^0aJ6M8t&KCyPyEF5E^)ZcV~n&5rt|;y*2BJw zJj29GyQD?NN_R?5x)t-KA!%1ESBm*`)|{Ep(hd@C_f)J|fou3^gyiTqMLlI!ol8rc zuhS{aDGMWOlBUcOXT}m|-(u&v$Rk#4#jn5(M~=4!D{5q6*WO?b|Jj%Co@dxDkod#~ zD{#7>irI=;GpW*w7O_yw0x@Vd^Tiw_X1W-9YBVhRupJ=EMzC|vEHdVowm&EsInVyV zT!|km#b`;RB*g#~kz!Pi{n7eu%O;GLO_lINs_|^40)TiX%t|i8MoC(Y123e9l}O?> zIN%b_4_y7HS6%@>@WBt>q$eKyh_mlmX%$GNKnH8T@8?g~Uu3*XV8CAL=z5{EB1hM| zx#rN9Cs$?s{14(QT%Ybww9#+H7&XXn{ZZ_t$SeNt;oe zXt%fyeCRFjf)+L#W@HT#3@paR+9jHF?WW9T?fOs^QK3+XXS%pqc?i%IB&TDC)<7OB~o zJ{`!Qn3amg&NmqGy!F(}+Xkf|c3hFX72sF<277>XW7OLXEU0QLP1e1Vwi6|9K#D#3 z%1GkzMUy@x<#2v<%hjifquP$Y>_NZb#dL1lT=a<9r#!}XZgfg89aWBW{pA z7z&3WFuZyFBR76$Vg1cqu{vmXrGyUJogSJ%$aHs?g}KTo8#_?4*lsUrmz~{!C0hK$ zku6)Hh(GY zZR&ESp%faL(492_EeQjMrM^dyF(WuW{QPOv63w& z_Ed3Nz%Vwi4`+s=k$I&idIg632Sb<*=F-KOM%LJHGkTm}?{7}tDjmBumo4cxE}wIY z;N|>nzvG#GRjp(6b>Q$;^e-=a;I#TZ)m?&8++1TREt4g=La3uEcXoI6Rr-t;95>gf z#att+y)JAX)L2YSH&$b2lG4im$TFgtYkcpbb*D%!&V|ztyiFWMf2kmIZO32c&N>QO zVB$xRNqu@Dm6w(AbTM=*qFfeKDHOZSZ7#8W`bcQi3Wvk#tnstn&z^v3V&M9zV%THC zYWcrLueZJJ&@6`~H#eo`nmK9YX?3dAo-;@~vLLSpYuQO>00xJ>4L|V=Ku^-Cf!H17 zqtU0+U)Vk!y4Zyj%WIG{5+3#pKf?f;L;z1tD$$`CyXEY;#%DC+diFe(ts<^ zl*_o018E=nde^t>_vs1pyQ5G^$z*pXbj6e`UiYQC{R8!*CcjN_{2q67<#%wggIp%G z`{H*^6XH0>{LjP7#8I4R<@e*$m-W||-?7?HF_U6ZK!{b{)>JHai%8EUUvnHtwwV5{ zvHmJn!;q4x_55uKun{lAHPLy{iO`wEsdB@Z(5a`&nK_*7(u3Ktj<9o>F6B{4+qd2NfT8aADd*}bOzC``E+W8% zU(+7CI)C4q16yw{mo~58xO#c-$^P9?&T-@9q5AP`{Q;NpKn}(0?{6?!9gf%Ey$I3= zUl-QjCt$;lq_*GM)L&(hSfc$8Zt4$*(1NOw`qM3ul=@2`q-+i&tqUEbt`bETDu_=g z6w^ml#B|>1F|t2+h~WA=4k#$$c#T_7>?&^h!x-DD5Tl%i^4DM6h*p^Xvh-vhyM&S- z^k*A-I+p zTB7L2#Rx*sPGGTs0e!4>tA`$uyfr~}-kP96$r1<}R7X6;$Xi7DP{Y;@Q|GPAt(igN z7Nv`3#6XfJPz{x^+C+5wA>#Nl}8q;}essxQcp~fWZ zp}aMZlXu-3(|PN12YDxojwoGpjqTy%mOwQoma0_KHC7{7^he4xujv{Mc&UoHE}5C5 zNNj_whX`&~u;`B?N$e2n`cr(7NX-oqNv=OSSHmj0&;jVgLYXOp#6q!uxJq!HHw2IL z+PZOTg6gl^X;#v>lY!)(h&xjm;dtE)q7|lDZBIXS0;@5P8LCeGoiB+UB8>hDB9&65 znr72TN=?#8r2gt4kr9!k=^3Q1(o54LTGyH$0kwTWu8UODxU@*xR$c45)VKw8nIN(P zirU7dzoix-o0e#i_M^)cNvXeCN3Km_2Ga~)pTTyK{bAdweyo+q`eTj~J5(w9>$^d@ zeX8kiLq<|+$rFjx->@Yz(n2)7bqmn+*7Vf$uHSzK!-;^JnqCowUzZug>S7+`T&+os zxz?mK<^kOjYC2jjjd?I)j;}4MGQ#6pDrp|nUlP?c*L9|KJY90Fcj%G_b)Hc2XlJ2I zK1B*AEx_`){?2VcRG%>VjwbQu7&+tmsv1L)TUy5vuXJwzS03wH1|?nws1Y zG1NjdHKVbbnr(hszx`;6fOg$-X)e*_(k)+?OW=nv*X0UYNCKAxG!0^Pxq^XEe7UHv zNbAyaLF278I4u{n+|aE<^Mi)3>83SAO}A*-HQg9+B=bX%cLLplw6=BWPrnBh=95(` z-H}NBQSL|s(&8?XQgb21i1a_28k*W#R_WT(vMSoTbo;5VlSXE%w78*~BA9DF(wJ*L z((Ox^JRoX93yH?+77|EVzbbWYfqA5b{CLhIzo(XNoN>~7#Tn2mA{sMI^Iey`fq7PE zZU3_`lV0~f2P}E~CF0MVHTQkQYs%<4)e=+JX;jP7pLh?TC(tcAOQ-3kCSAA8``xEN zd{%zSWgyP8G(MlKQ+j6JLBQjwTUi-4s#G;{#?qDTL_V84^+F)O)P*0rUnscS3RLNqmlx=x^Gef=$%^YqE3DFPSPEtlpJU9LdZ zRr_6Ct{^_ZT$d}_^0i!GCx_HXkXCa^WT8iwtET_?()@GQQ;Byz(R#BuHQcY|hORFy zH*~z_2i-a~-E{w>=@!H%(5=397v&{Qw?JF5{m%(2&X@sVeq228O%R6XYBM-_&f1Fz zSas<=kUQGCv_#{@YRV5RIQGv3EWQ2X><5dc)U{R9|7dDxF4VG2*M^p5^|`RV7Bn?n zEG=$o`X9|_8Z*sjy8qE7hlWFKK)0XzdlUky`7K{pC74IX_&R6J!J6h8b4_y{ujl_j zKuT7X91qUhyPwit{`_@Zr)T@WgceX=1DoQ*wmg2p;#+6yBz65BVtDJh!qQ&f5 zbS^q`8A5!3=W3*$c?>%I_`WBS^0RaHzK4MQFPeRdIJIMZO>fO9nqEQHiS!D3pagnF zW3{9W7HIuqX@b=7xW-&#rZEp%Un1rKpC({lf59c-(s;~4EW+cub!r~fty5#JORjlX zmt4cwJRV@5Q1bfA=510q;Zw`wH?Mq$ISaJtrQ-SUo0uUs)>RtxEK1KD^IBXKhTWb@V&opk5p2|!pT4aSuPg&NqUQJY8ZY}3EZkjGp+;pV` zxFuj7+2W)X@*2!_>(!WPss@-<<&G|SeawRus07S|w0?bSWv8aTHBB{US}xSbERwhG zXKM1+RNGeGfy@fZt?M(OxnFMG{>eMi{&l&cZAil=d1MozMx7U=8B{BD^CIsH6sK*s z%VvmEGvw9T*Own^hi?1gNv8t*zKQ#G0G#KlUU0>-JFX+(+KtyTh#cU#8mY+=Q5yDN z*6~5!e#1klw}>;qb3``iLhIgD7rK5Q5|K+9Yv@_Gf7G%;w=i8Hx`pX@jl0(Czu9~8 z)ez*E8&)z2U@J6%7wgX=1a!0gd7DemN?PT z$_aCRXcWW`eg3J7i4-%GQj;`N*IF)+GE&!?p1Q6zJ)(83`=Ef@e%sVVA~Mprbl$qI zbswbbQsWlY;xul}KGAG#e5-ersSS74l}|{_fS4hgj$ia%Gj`ndp*;^JGQcdpT#=Nz z^Mjrdf@=m0Btli9Xo(S^oxp&BsPqxj4I6qz^40|1R%J&8u_kDs(EE97iUB$@Evg%) z&Rf$Z$h%4xUD@>|X*5=29;r^ikYslpkxU(7R1Ka7?E{rOy{ksBI)7c zAa7mn$RJDC80D^8V>)k5mmu#dT{Ld>IXS441k59wadeGAwTNKRm}$YHm7$_htt&+$51GH{VFKR$iGKS1Xdj>(H)V>j ziY|13bhS{r(De%y%+dL5su3e;q}SGsTQ^>fn#Dd->%biZj4-HBz%_fOI@bBPsPbq(&@gdg;2> z^a$vkP~t%C^bylV0(7Kt=}tt~wZ=`?wZ<*LJps312Hw`jWj$*ifmGjnrXwfL0MAu| zYl#+#)a44$@(Znp%Rx#jNA+Y?P?Jf~!8AZpbTHYQ6dlYq*=Q}p19B%t2l`o3bgx0AC@}%tDJCz56}-d5%oa0CjH~Bl z$2E{c6I=m(4FugujBfyf3x2NNY2MmE$|fWpd}ZdW^^*RCMj%X;)Qsdzv(al1J2e7< zavvhb)UNJPc5Va$yfROWp@ZJuwo4-rnk6+#klA0P&*<&i00eWVkE^F7CpM6>2@YZ~ z0hha4;Oy22goTnaCC12Wy?JT(Mj%lCh=2pdxO&}fj|L#P27A4=W6uUsHo-xx1RL7x z11ggmfdKXhPg;_z<>G4^fbg&Pu}D4LzgGjLFqa3}w#fWtn6svdA4>Ccbyq#P0q7Ib zk`g(3j2O6Wju<%aa53yQrvB)a4HxRpeD4NwX!z?AuHLY?PXo}$A?J{H3>n~ccJILN z;A`Zco)g)(0jQB%*j&9IWWNR=xJK^jb?5yXNZCwE`bFDEx_WQo0S!QDqWqQ?uAZhi zun`E754b=K?a|efywe+jfUK~3jjJb^XEXr8MI&;x zsy(xTl+9p`G(oZ;VO%}7I=BHSE;MlUTq(t|0^$7gX22wVmaiAf>tFGReHLDQ_ za5&s;dR{#gpWOh2ZGHy9)vKuO4L~(o34I7ZS5N#O)&PWYmYcc-0u)Be5BEr}Ua~&C z0jRBLNpf!c5fwLon!H)3UEi#+pl z^{p$p268ZTGy)q4dI_Vm5eUd3%X6+iL(|m&1egBI)l*aX22!?CcZ@`+KV(CXm}A8- zYNUR_%g9N6D@%6+(9O+;uAT!rqJfl6NEt@fhOhLgi6a|;;2Qa)Zzwpbfs{ro^(61H zVp_$}&s%LBo~iPSK1h9Z1JIl4qQ{6CFUHK@=?(G6Gyr8EQtuK#KtDu_4!0!6hD~C~ zi5zKFv@WK2XS+LiYxDwrr@)*> zQc_#4-oZ1sk(9^th=W8b~?8 z@&T;{9)d^U75K#R1?>QSaP^f03meFx6)w~~59d-(Wm|jMol3vjO zb}n+u)h9?-HjuKJlt@D>IbD64=eS0o(01CySQ+c;S@z=_fHIBN2L$SSkr?V6+DsM$ zeV`?+k`}vI%n~tZF-yhJhAb9nJV+Gkq*9ma@Lr`kHUfQ) zq+B3op%}Oo4rgQscQd*>QVbmH>U|(5H2^(wjVm9)`q-Lb$dxXXgK_YPba#;M-bZNHbuC)!4Gd#OL|&()UAOFwxh zkiUK6Yo8M*x+ueK{7q15>@(+o7+PTBDa8lUna7#Cc75qh9l@`?nCUKZGi=`wq4Iqd z`CeGI%m0Mn`b?i(g30bW?!ttrM)VQ%f4L?*dBgg(=blmS+qiz+>cYnLXRqs9&845^ zbDF2rENUHBef4DXiXn#Mak=#?(>$7l_)a22OnoPKB>?V&!<$81`o`LUq^W@nvc9XF^kFLct5Ipm~W70Yv-H>DQay%NO zW8nL?>mkHFkFLozST%WcFRp><8aQ6i9!C7tiD|Tl!GRB_2gSADFlf8zuVZ_NSaVzF zY$DqJW8dc}=D_je{BQ9jUs3*VgC2z2S5Ispnypq8*+ZV zz?8$Od~ly0$!qX;pLoucqixQ`Su!8^!XqZ4=kzc9%`f1pj~jHizVOxYq^M@TW$}e3 z#n#(yz88|Ty>Ii2CWXCSx#waZ-8K8)7hpAgo*}#aHqx3Kck{`9hdDxPhtG4&DQmzmca$`Dbgj{c-B;wGDy22bI6McEN_^b_UeVJ#z zkSZ-({{FXFeAa2=;`QT&xt;rey%#;1>P!7kK%mullQx$(Z!FmEq3_H>sl0CUrfq($ zGz*pduO67rA+YA7&CwA|6@&D%k@9GsiR0HM#>UZQj0yaQi_16=T@D@YKrz4?D~67T zE(JXmofNI|P%-rNbTa6&z(Lm~9QefTE(YxrKg0koT@8LZq#iMh)#-B3rFqB3^PClf z);dKD;{wJ9&0+{cM<$GSEIjmQIxGC(v8NdD0B0%%Jsf?V-T*(Vkl>GY$IJ^I8t;%E z+?GV=~Ux@27FPWjNM4--Rp zrVtHY4LpehSNs+~!oY=hp%?UpmnMsWX7CGPbHwm2^rpV3AN>5l9hW)= zHqX=*E_DwM;MpSv+ChK&4txhJTOZ^_orA+vG0>QIs2kGE6_H&JRiGjw1(;jFGJ%OM6;SuPJYQ;PJ zpc^jj0bJk{{GPb*JwN==5SYA&A39Ke%4umpT(=nF_Y8|CdsqF0wi=mU*toH9?&@I2 z)aoSZBtVT+0xPJ)&lN)r62>!>u<=j>KUl&o)Ev|XLnx1*nj#(W?EAcn-^TMyi{oA1 zvGLS2@9-lY*iZ*9ArGhub*O#(#KBF}6n^0GuJr@UhJzpRqz4Y+qy?6JUmmM?lRvc% zPW8;6uL90-Om4F7NQO^#?3lAJE^v51!yde&AvA zBOX|k8(c|m@#THqCEUIbY>OB8Kp)F5@@R0iVbC91^Mii8PyLc7`B4{P8j-iHd-8++ z#9NvJk1$)mgp)Tv;M@0!w`s_WJSjiv!HxHLpK?(?TOZ^P&p|id=UwomJ++Aew<%(# ziUB6LQ6|E{*X9|f5$SFH0Uv%Q58#tOc@s{0%g+bNGe1iY+nxxcty_46TY3VIa)A$c zP(JViSNmSG6v&mG;w}D{%wNCXyT&v5fQg@)i2Y`bd{S0EEL+UvhGr%TUAaQ8qa*n% zj@vtjW4>c#6=|!*OUZ)Is;LjlIv;#xLJv%;Q<(2u$9;09d1{S_p5J$Rc~e-~_7!b8 zkW3XwMHok>Uhw#it0$CV#^^P>WTU%5nKycA(dUi>=-90vg7cIz%#_@*0 z6>ef;@4DstZ4sZ-J22rL;wbt{1(~lne({$dIp;2k#>BTCVlraX6lkHVEK{J_LdQ`1 z$@isGnS45tQrp{nOo3yE|GExhXj)qb)1^>`QdiH-eM+94NB2LlUz}P>nJLg~-t&+D zu1~30IaAJdbja6YbD^)r=1Sca`8ZN8@oTZ$ODO+)X>b3-tU)P`l`{j+Pxfad66Z-` zzac#m(l$X_#6R6qoS+)b@1^b5bIB8ujq_;lBS(m%YH#%AO!#|g-5-14{q^O{@1>EZ z1g&NL>&n$x@pNBSz93vohonqCpOe0*l8WOA6y>Jv<%wn^;S+fxX^JdyUMqI?b0o}C zvlDeY8Kya|XOk5MA)^0D&%lumNQB_iD_{DR#5l{J>wT9vvD|}lHo{(tq(;#sd%9W- zfnhHC!M%km;1f)|48BxYASrfpbC8n6`D^$7*=A*;(^wZP`HBEd`rK`GHO_u`(rR)xVoNZcFF<@1ukEoX z+6Dm`tlw25YzjL|ToX}~V$JVXP65=`$=?~@Bd+`cHS&bg>_PF_wS;O!?3Z&X;NTzo zO^TY#2QJuPA|jb@|F?E0cnnGWX6kxo8o(PbA)ZIe@SCdVG32mc*=4BUns(r}y%OPM`llZ(j%vI9bSr}oFXmIW+nj67peXy(Axw$zYxN!fGqp5i>o)>I{Gd#6 z2q&Im@+029OBluBJ@jJ22_r3j(m@Qu3B%oO^Tz(dy3^N|%^G5Vsk~{MlQD7V3p68( ztPBDLP$7GsL6c|V@$<|NKd6BYKc4v!532a>GcItTJ8=eP@P%G~y!QO2&rC<2VdAA- z(s#qVyNl9o%5O;JOyvvtO0Lr3FD6$ai^-tSoFI&v4zC$0^;Q=sPG7$+GGtQg6S66B zxa$)m=@%Q``xxIKTMnoxA&W0kw%SGJR*x#Q4U%WiG|ON-XvT>C$FDsPhVe`T_Dm`} zjEOl)*_ezq<+MZG(CSij%_|h4*1Yr@qy^Q;x|#wNNae%@x9akl&BIE}nurD$4v}KF zF7jRxnmYIX;msF|6D!4Nd0wp)7>N)wjTot~r2s9}N&{FREDd-j%-|6`8;Ko+@yrjH zF~W8v(rO%nk01H^PrgtEcl_Xllp;?XA1(uNgp;0f*>~j8NUN46GmA8)bpjh)=KSp+ z_t*b!ceJ5u4+gMvP1II)?p=Vf% zkd}EdN?6U9yotHQw3wsB82xu8_{%T);j?|9FLlOQ?y_yJi;F_N5vE_?j z5>U<^e_DREII4B*u%4;~?ZrFlv^Uo8sam9g&_*`-Gf11S&E>x8OR{NKuC>)r#uV3Y-n{-SS6@QV9EL8-6YjR5%k-Rv zGGRq3-?4gQf3diJUCj>jvEeMZUTE7{jCX6Gw9fCY=Acj6w1#t-&`=JtP+0@zbwfGm z)3G~;bKpZ7+b+YdZp|6n2$}Rz*@@vSc55h$-QAi4x4SMVoV|AQre*U^TwUR*=3ar}%3xpD)ldxX`sl`fVbJ?G1o{BC<^V{fg7rC$1H)OgHI&5^*VRyJDp()Nni|gL zpoX%U=DHe6q$K)`==5+FGaAZbrt4}bt)cd&ZX(3 zH7%U3p>L9U?; zI^CMP!de%t-`M}w_3K0)x%%{FS2%}!LpgN2HBiDi=+pH_gmXBup&X8KT@9tC#p#Q1 zjt*yYOhefm>$)1sP+g!p{BHlRi z^%)_KbH}V+wl66)e#Z`S$(O+(9L^7yfgyuJe)bs`-X`1*czL!1VFtPQQTRt|kjp@n zADqLF=kOpGTx}TmSwDE-C(h!`vmG=OhQF!B404UvG+=g!yM~^ki!;+kD|uGx70UPw_cO~&kOS(9{#bok0d;vD?& zRh+~#ueRNcU}ZOHkvOt45U-pLXCd9+*=X63&fFzw;x=n{=0wHgxj2e*MMW|F z!Z*&J^&qss#E)tdD3$6i%Y_wL*=UrPU6$?av`pu6nR2$6r(4)zl!_ITBcjw)DYDtt zK6}B0_sg^MW9K&=;v`UNQOBwG*QZphR@Kp6&T_Fwh@(n!cBb5&N#52Tr^);)ZG5o( zi&d1X3R_}789TPtwHCALUBll^XjL4jV#mDEsydeb=oj+ry!)K1mWiWkZ-;5x=1_?D zZ`W?9uT>>&eCY1Z$;O9_Obk_Soabve5uO91=ZVQqx1 z)Sef{H1`L^yV&U}s;!oxt37bdFeqS5Wc7cB@MBCS{j;81d3&sdm zHsY;MHAT@4B6@!Erav7UudxhoTZid+&GvZzESP5;Ux%^!30;&M+VmGpr;UWuTjvO@ z1!5M8nJ;Fp7!Fq-D+Vclq!)oDc1jvN2SPNSM?JpZ%lK`EjY zF!C5|-Pb2TiHPep|C!_ey#-y4-SU%dS0%WlH-fr=}eCBl8c@C~wCz6KneR)b(#h*QquQq@ z_P4eHNe`W{J122JkD(q^3$y^MH&iD_ZA4<%Z9Ds#6t+({J+x`>R?`^jx*v|{4K{_T z(}aGn`JcPc(ufk<@D0}SYRi~muL9bmLe!(Lw%AobdK0@>mEOcox6spw)DofesW~6% z#dG2>SFmwbwVGG2Pp1#0Kja72`1ye~&xHLe^y&1+Ff+J0|uE zKtZ4Wxt%Y4q<){CAivX{owA*=oC{6gb{12W&UC4gB)_*;CiycOahLw-o*_ok*Y*qt z3&G4dedCG?9+qe4ybtFd5=U{OozZygybF%4FTWEgRVbyp+Ou7i&|%|rshmyavOAVi zdNgh1xrx~wYpyZ1 z8zJ`{+6ZayZ7ZxjasAr-PWp&!scgi;p!KO&tfGyRp0gOALe0slJ zE1Igg+<5E|XtqCY1GMaY)VCv7(N5KT3afPpHX9$e0b6!G>ThXTwA1W5`TXjSPNEht z@$+-B2j?@Tl59CigDspFYyI>KqkV8bd_d>eSEjbsKRAE0 zpb&d-zN?EH7`ie;^Hlk4rBdwdFhWruoM+J79Iv$uXYbOu;PfPYr9DFfk4DeXKsA5j zrDidxk&b1X_kJfRnA@|HXI!I4VuMB!vu&rbp^#)GT@UFfARN_U`v6ogQ$l>jo;2!C25+jYy?dg4=6vDaZ z6IXKeW2`h{!Df^Wq5~?n_0!Ug<|Z!BNC*5p^TSW;r&H#~Ge6?Ti@|T7agi8gMjX$h zH2eKeyA33I9B}jDd+%F+Pry#-}^MGJM6gkM(bk@`*>5}F|WJ&#*89RtlVaGE?|HkoJ7gnQ;w3$DkxT-T$L{9OEJ|3eIZ$aa5lLF&nI zww`)<+n~5rxm(zM!qG&mnLOJ>ILF>*r0AL>j+tm8>^y4X1Z$0?-g@@C4Jg}9)J(7@ z&b-zRj)r~TS>k605__D){$t?9pXm$uf?4X=?X?gw=`#?Ph?eX%OVZT{J+EDjuv6s8 zop9pO_oOjtatB$PBAD=wn>~YloW$ex3Y3{5*E(0saH3|u?bZ8m7PHH@FMl8Nd(P7r z?eYb2V*Apm65+*OwY|-IT@tR^24ZZN3W@0oZMR8RNSBBP%a3Qe#_;vOgwe(FPWXLO zT@uFogcHAu7{V~4^~Y8N6H0mq$9l@T#yEsHeDDN;rze@Sm12aBW{7gI~F&}NnZRcE{J+o z7i>9zPnh)+N7=1k9!-AGhV@l;1%bDPOJ3y78Z7x!e$s~PAzUWHNlzHR`0q|^b4O$n zyFpfpM9~=*LL!O>S@44*Md6tr=;HGJ6fyK~`0YD{L2ANG&nVB3pJG6&HZjEUOgw!n zetx_MJ{A|q>c_nD3h#lZ^+Q%}y~Zz&fp2jqtWCl!87U88{9qmO^?gG&`NBd}523aU zJQGe8QEkAYEQGg-i{Y7mo9gD7A63SWXEX;(PheSgp$wFjCe3?O#HCEY!p{#j0cYRm ze$fiTLY}~|VYV#z!5x>ps8fq8xPS-Y0^^S-gubqT|(?Ya4_;b|`2K{YgQ2bVxuY8!5aif|h> z29@I{0*13a-JgH7XD6v4yUh!ZwX3PrqHAUuRURw%Mb{+}B9!He!X!p;Bm)R2t7j;wO%0!f1x}U7q>jAEg2B7(@U+!#D!h_xYli zXUK|6o?%=G<0rv>c;x1_vkpG;wEEL^cS*X87Vj~bJtH_cb+(kv+NS^cP}~V>(BxdFF#`!&2ojb%xZRpw`!;J z`Mm7mG5dG^sf%VKAzRI-Vz+m4(yYA2)+!vGcsp*-@Xmp=X!i3Z=UgHnowl!RIa3@} z&pUk4%-j|9)BL7O>MxqbZ}_k9CC_vvwBe#CH<*{orT;xgYY!HhPZKj$%=R*kIpR55 zm%qUq%?rO?61<$(<)1!8oLJsKvW{>;m87OOfv52V3#o=DE}XIIZS}WNCTeDtF0K^| zUw~Q6b`;9prQidv(K~t3G)Hs;`M6F=nHSS7<_IxaF^7pcR1Ec+pzdwYwz-DYz3t^C zqb6;0+N&p69r1U5N|CFxLPN_Y@%sv^I}t}P`I9&?6E~F;uc8iTW8XM)ZKPFE;Z^^7 z4|@^;y~0;c0~OU@x|siqXCcV_Cx7e*;;6Q>V>L7KHSI}Uu;Yg|hL*&SFf=s$JfoRe z?QOI*Gw8(+ZOh_B7=C_)fdkJLN1kn1usN^A-*Eq*Z+zj=`kGm+zR{Iqu-2IiZMaYO zrPH11PNSE_>Kj1|idj5uY@lJfaI3l3tnybQg3q}M1)}=`?BsM!gdGH!h!H6(w))2l z2u62t+mVLxIh2OCBblxFskwjucgfSaWRHWlh@;xYj?*{7U$^+e?w9^$1p0=o!ppAn zF4=lsJxRua)pELM&gW|`f}8*4?yH?jrUC3CH^<_VhKc3#|mBkvD0OL`r-&AOS-#DE`+J%3PX~mGh6OXb#|MhKbnh-WZB;S$+X_YA?EOA zuj1-VJU)^EO~*w=gZ#y3lxzv)}2jLrw1Fz1Iy0rx|n zf9hi3Hdo=Y?K=^!NM@Zf3U^A+%sYVlcUfIGGdmp$K!aAmi*P8o&!?2^e}2JY&~ zAO03_TdQ!{@0|!&c6#fSQMiAYXYLnpp30td6>xX1!sU9~M7VORtxg$*``I~r-vhq; zUo`s^;7+W<1nz69aJj)Y5w2WZt5ZhdezEt-F5s>@d(#Hs?p=k;#kGlW<-S^-G75M6qWAt8 zxVt{ICu8h^{i<-ewKfs1Tvn@7M&TaTd-+D-{^rmLR|EIJD%`euaHqJgP8o%Jz_NQT z0Pa0s-RV@|POZY_ZrVhAy1`e*m;VeC768oiYmd4gW_8La+*4L=V7|-wz-yi`y+x`Dm)m9&;mU%EP8o$e zW9iCv;69r>^+It5vQ@ZTGMflj?v~Xlqi{d4;8@cxmfrsHBZ1phh0E2liE!mcS)DQp zcmHJ_9|YewJd}D1aF3|M#_|A7- zoiYmdie-0P2i$8nUdtTfz=A5=h4tVrlAC~4$|&5Odc6CAyDs(H$AG)I3U^68xJzAE zr;NfqWd5Ruf&1=H^c#7$tO|E|J-91eSEr1^ov`3n$Qx(D=}Z15&cMnl+~exOJ>GS7 z$|ziK;dA=|_iMjdbtQ05sKPz59^BW;rHd+M6z<7$)?NhMRhQm_TpKv43isrCa9`)T zI%O2@SLgG^aL0M%$NzX9xUa9mT~!b6DRM=uN*RUw$vL+@1>843c%k8kQ>$=Ks|WWD zuB%f<;a;*J2j4p0io0JFXW)%hxU1{IUE{hsWfbnyOCLopIJqaB?*X?^g`wgF+UWI!`J-Gd@t5Zhd zKDP9s8-e@yNAIWp2F|R)eN#QSYh72TjKJlz<8Pnb?`I4w$aI%7o z7o&ExhTt+VNq{TE5}h&%_p+Wfj{x_3&vfL(8Q3`lmw`zFTp5<=lu@`B_kMR0aDO)O z#Z|za7=p{dBmu4rOLWR8+?!Xv;}+m9dZ~CmaQ6toWnhv3SB51zWfX4v;z@Kb&V3X2 z?Evm;LU0+FB*2wniB1`X+qvY~R^UFh_ww_AyLSjK1Cs=}GAz+4qj0a7yVoY*?qA$= z5^(nm!DV2Q09S@3I%O2@>lfZ_mgZmoh3Cz1=fDtL1||t`r?{?88HM|og?oJtd{<6- zbT;@-4Z&q#k^onRB|2pk?g=Z-m;u}$7Y}?BaHoghGB8PiE5j0Z2!4 z2W~b5mw`zFTp5<=lu@|f>Rn~zue<8XCxF`(g3G`p0j>;7bjm2)t5)9fZSbA;zQ4P` zJt72`fk^^f8J6gj5x8`V|Fh=K7CJsme76|86D8Bd6`h%4$I$$3mwa`iE0_D zkd;K+ad;u|u90DGBo^Efw|g{v14{MI6kBpDQEN(GvzsdM+f=bz8&Db(zvz&-w>t5l zN8*NyE$w%hPR5z_b<@ezl%w&lMvT%rJtePFH`t=--~AGb=m~$BLU$E0*KO2v75gxG zw~H7iM|T(V8ZrBdVKSD@M|+524}&P#PP3RPV%RRiEDeXnn5}3N!y!C+h@HhSLa|Hw ztkg3#m3T;g%#@Q0@_pFi+VY&uo8{B2XKyYaw|?!pXO#Oku3vX@dE@5tIWkUgUB@$` zcc0)eJo(rgr@_fT?%os}WhYnv*$?+TxpVJ&%smf5#0SvllF7Q{31UEB`3b&gT7If}pW|DHQbLk5g{*tWVN$N<$v8 zpp1RSrADEL8w#h^>^o4#KJzZmCLo2}#_uFu2OH05HE$lOCfC(i;Mjxg&t zty=ulBtPCIjCc$+NPe^u-U)|UIKbo`%1RhN!teu+pM4iNybBi)X6a(-fD0|5kA(*; z-h;CUgRa&Omk@@Z=P*pd!(rkzWdI)K03Puc2YIX>%C+SOPw<8A79M3H9}5S%@Xi={ z;P7tn?U~QsbnGSd5AQCLL}YZ9d@y|N>f-vd*Y!!iAbYG_ck7%npyj;osfTYAXTaTc zIWNui-#J&-G-OAW{Ok8>ri_00^4OQj2NOSKlr%li*`1P4;AHzkDs!fWtekZQuGl_ zV*KLPS%Z?Y2Hn_?B_^Ck`lsFPb=HbIR|xXX@dx#OgF-|aR&aC~fv_W{2guiUG6)x* zZO4KOiy|nA!w;L{M`G|yIDS}`XTo^qhabH85jIK(YO2!%s0sYQ8GP{5C4(o1XMU!c zi64A;_CtL&iuY`JY#g`(i?Z-8uyLbzdtG_WTaKweJrFxV-q+bDvjh25NYr(Ac4zW^ zeX-l*!TDeA=!B7Ef*8N;6;NjL^)^RhcAP6iv=_|n{5pj{3CRTc*cIb{2Vy&SKZ&DS zlZ+tTaYiDKaPvE5H{1b-;0aHVKl|@ryQBUF=cMmAbXK_Wt-H`YG-;HT9xz+!3T}Lh z_JB025%qwrQzYe7G1J5xEM}&dHZe2A93*DC81(e*@BLa$&t`i+$QAc7a2lEI32BJI z*Ne87t;~0)hCdlHxUhNlpkUD!ObIyqrkx&8PdrSVc+XbiWJuygl!M3bWiqc$XHD8Q z$UNz$wAiCBJD__LYRcd6EC%aunsfdZh&TJFRriad+M+-4jdUHQo()ifsNXJmHtmxK z`5{TIw8w9sagqEmA}&Da0c;r0Fed&{>cPg*oA5K7C2)BLSNuGKs|^D`>$f-(#}7Za z`98nr1J7tr)$-I=4zB+lhu8yMl}ui);m&u2L{hqt%J!B0Yq<4M9D`@v@t1%7``nX0 zGH2CEp=faTO>p6zRdQ=0daT?a#Ykohn->bqIbx0xbCei!Xy>-YAN{pFI|u#va7N6k z9r=A4JTk&QjiiS6Y}>KzCVZd!$9KQ&_aivaRVp#GOUaT*^{A-ac~Z)E`xn7zE&`S9 zJ{D+nio~%^@@OdT>PKCPF-sXW)4ol;QVNEe3?t*3#4yejH~Af?^os&ZdQc-Wf;;IA zZ%po4-AB}Um+S=J#PWubEiGj^B(-ULTg`-UVdKWaxvPUx$VV~cHzZR0Y{^;-p78PE z(>hLiU`XF_z4oR(opDAAJI=l5pZpmn*)Vn#Am}+azf%I7{=V|M&Ha`B^2XzqM$_GN z@e#j&Vus^jn40l_q&q<#HS#Hl5MGVUte!*z-62@Gf}?lkwAuP0}~dthu46 znByx0m15}HvV5*HUFpsaeN0woaN?cEf7g~b70F=B!H&bxG`>m8uRYV9%g8ryDxr-q zm0YnqldhQS$_?LZ@T`bI)Wced17$Pewa(cu5~^>2JA zo;-h*IS+M#Q#sWs2QfSH;cu|zG98tUlKFq)sJYDrDtrX-p`^QvdPF zrq{-k=k4hl@}zPl`NVD}9~NufmArhSE>peVO5?xc8}}q+@M+;zMgL-FS6S|E2@eR0 zoqf_9XNJCkr!$!Ki1*I;65N}u$)H=t7VX)-LT-pe>1?^&m-Rmq99zMQr=7Jjz6Sm- z;x1Cb`R-0R4xW-P&Q|4qN2OHCmqHuCH2&94y#C2}{3pr;ogz>sTan9c`tqrv4AQA| zxzd$RCeYg+X}vif|0B8;{;7_P>{!YbL*w*HuF_Ykl+9PUV>#%~`zO5+kN=7zYw$1S zi+toTAG+han9k&~;TzI4fnGXuWvA8Tq(*}u0`45q6;3>RW2I0U5YoBL=y_^Hxo zM!=`@eZoMU9pNTi%oaMkvdI$Siqz?s#?z;Bel2}cnH(~xBlJayO1UCO%{$FhjJdc{ z7vR+2tiL5*#ND%46+k)wk)WkiNP>3BwRnByTrz$Bnt$o-oP5EE&k<9&OnU0+s*a^KNiSc@gqm2XuTt*JRfcBsbRAr{Y3sT6=ALLB ztnZJbkZdH%7Q)wRbf>cEbg^@2Vo2w3%?-1c#~0xIvs3{}nY8o*9dZd_wTg2c#m-Es zJoM2n4gMoHerI8P8@PJC0^gPHmNt+{|KG-rCAO+6_#Rr7_{9(xN}~&^QEYQR?|zO} zi6Rl9ibyn|t?4=Uo-3?GOOV(YQBp}wCwgi|Bj6-DzfMI~R%KfNtp4x+B>Rl#(2;SQLo&=^ z7Eq*6BnnXrY?T-7NR;K!Pklohc@jppStJCqf)SZAMv(;AhcXl$Kf{u+?}pD$@gmp( z>4)KGR1CFvh(ys1P+9<0i91l=w*Su4Jop3K33yqR5XUKvPOr-{feY=vU_b6!ew1g= z`x6#>a#hq`K0y+WBn(i|i93&(9({P>_?kwe{+~H& zNK_jEtJMdlE}Y^K?EJ+-ATwQuXA&i#(0?DsdE`bQrjPIC8FcszVUUKc?O?eQWVw<8 zG9cB-583$mi?8J#-f?_&mVl4S78pjDVcO+?o+luW${l|HJ~q?G2R935ZMzl09Rvjp zkc3rI%1TIg=<&dx7rx;w<3HzY4DjXwXn?;i4Ph=}X<60nYM|cfy~%yw^AdRLFT$cc zuE6<0Jk|vdjuxUd;a1TNoBNLO1kC(x6A%|*wjjbs!BeW>r^+C62gvgVho9vMSPEr1 z!}69Dq$aH-LIvgo{H<)|?g;;f-otqhn5_EWv|MX@nvJne24q>TLtmcX%#%HJZPUt| zib&OYL5571RspR*$j1zC2=6RWCZn7I=%g*rN^MwSw zR1sXvM5EKkMXaMNZ5u}RVm`HI;9dUa4Bce&C(kpeJqaV~iVCHZ%I)z#omg^$H(mGK z(xj=qgjs_1BQg{v_?-N07PdmU8>d zdE@VF;zcmkOGFR|4aFgahk6&_IW(l+&ZzFbk*gl!Rdo7RTLeNtVFfsZyk7`E7E2Yk z179}iI$FN+98W;Lm=I7VFxn9eJi7Qg)o~oA?znovZ2uNs!b7)P0!UO?7e69&{x}E~ zq-O5o4PHlX=1p7fusI~5)CUF93>jY-s$PcSC5j(-jkl>o*W7K9;IrhMS_!=U+C-4{ zTL^r1gHr@}b@LT-)q_r8H#*RqTd7UI!Has$s`KRm(F>my&lEh~_-Tr5Wn_yj^4R@L zG2ktGCWg_}#^AF@lw!ckQOvT;WA`>mS;l8~ABB(CESMCWUv5+2vv7rC!0QQ2&AWc3 zrFlNf8z=%ix!%+wv5IJs&&~r19uGk`!N2+_0Uvk_!>8c!G-Xo&dsj08@R+MkG2ltN zCIK^R2?0JcnkjfZwABRv>yre$&+uLf9#8W$!C$tHfcKdLOTpv8kS6#?o+jXZ282@Z zc*INHF46g`)7_EbW@pwU{RBUMue&U|pZvC=`QIcM`VoE~ZIUs66CuOroje7PA0(Pe z+WVrdq!2Ov?~`ka0r!!ccJAtzsGak9=1Ae=4sob(Bd&h@TGQ%Hr(ffaOOyV=*KPWJ zddevV+`nfE@U9(1fIfYk6g+OkF$uVTk|DsOC6HpkO&TTv$956|eA;^`c>H_63I68Y c1iVk*$K$Jd+Cj?t#`;El8+70AX@W}p3kmqby#N3J literal 0 HcmV?d00001 diff --git a/tests/test_routes.py b/tests/test_routes.py index c20b8907..b38ad2da 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -431,7 +431,7 @@ def get_full_data() -> test_utils.JsonData: def test_model_components(client: FlaskClient) -> None: geode_object_type = "BRep" - filename = "cube.og_brep" + filename = "LS2.og_brep" response = test_save_viewable_file(client, geode_object_type, filename) assert response.status_code == 200 assert "mesh_components" in response.get_json() From 98bfae7780ab43b7c1a5de4770b99da7b7b8ab62 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Fri, 20 Mar 2026 10:46:33 +0100 Subject: [PATCH 2/8] assert that there are actually names and not only uuids in model components --- tests/test_routes.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_routes.py b/tests/test_routes.py index b38ad2da..215afd13 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -438,18 +438,26 @@ def test_model_components(client: FlaskClient) -> None: mesh_components = response.get_json()["mesh_components"] assert isinstance(mesh_components, list) assert len(mesh_components) > 0 + name_is_uuid = False + name_is_not_uuid = False for mesh_component in mesh_components: assert isinstance(mesh_component, object) assert isinstance(mesh_component["geode_id"], str) assert isinstance(mesh_component["viewer_id"], int) assert isinstance(mesh_component["name"], str) assert isinstance(mesh_component["type"], str) + if mesh_component["name"] == mesh_component["geode_id"]: + name_is_uuid = True + else: + name_is_not_uuid = True assert isinstance(mesh_component["boundaries"], list) for boundary_uuid in mesh_component["boundaries"]: assert isinstance(boundary_uuid, str) assert isinstance(mesh_component["internals"], list) for internal_uuid in mesh_component["internals"]: assert isinstance(internal_uuid, str) + assert name_is_uuid is True + assert name_is_not_uuid is True assert "collection_components" in response.get_json() collection_components = response.get_json()["collection_components"] assert isinstance(collection_components, list) From 2027dc3e0799300433ee452eabcf86b5aed48599 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Fri, 20 Mar 2026 09:47:25 +0000 Subject: [PATCH 3/8] Apply prepare changes --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 230c6e9f..e18b73d9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -60,4 +60,3 @@ werkzeug==3.1.2 # flask # flask-cors -opengeodeweb-microservice==1.*,>=1.1.0 From 842f459615eea03bd6d3ee22b65a10db8d22d358 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Fri, 20 Mar 2026 09:49:08 +0000 Subject: [PATCH 4/8] Apply prepare changes --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f0e8ccb4..e18b73d9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -60,4 +60,3 @@ werkzeug==3.1.2 # flask # flask-cors -opengeodeweb-microservice==1.*,>=1.1.1rc1 From 0133a6b27098c723ba4ba4ec4873b58ba3c06cb8 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Fri, 20 Mar 2026 10:49:58 +0100 Subject: [PATCH 5/8] mypy check ? --- src/opengeodeweb_back/geode_objects/geode_brep.py | 2 +- src/opengeodeweb_back/geode_objects/geode_section.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_back/geode_objects/geode_brep.py b/src/opengeodeweb_back/geode_objects/geode_brep.py index 5b3027d8..f5cfd5f4 100644 --- a/src/opengeodeweb_back/geode_objects/geode_brep.py +++ b/src/opengeodeweb_back/geode_objects/geode_brep.py @@ -89,7 +89,7 @@ def items(self, id: og.uuid) -> list[og.ComponentID]: return self.brep.items(id) def component_name(self, id: og.uuid) -> str: - return self.brep.brep_component(id).name() + return self.brep.brep_component(id).name() or "" def inspect(self) -> og_inspector.BRepInspectionResult: return og_inspector.inspect_brep(self.brep) diff --git a/src/opengeodeweb_back/geode_objects/geode_section.py b/src/opengeodeweb_back/geode_objects/geode_section.py index f630186a..12b16ee0 100644 --- a/src/opengeodeweb_back/geode_objects/geode_section.py +++ b/src/opengeodeweb_back/geode_objects/geode_section.py @@ -91,7 +91,7 @@ def items(self, id: og.uuid) -> list[og.ComponentID]: return self.section.items(id) def component_name(self, id: og.uuid) -> str: - return self.section.section_component(id).name() + return self.section.section_component(id).name() or "" def inspect(self) -> og_inspector.SectionInspectionResult: return og_inspector.inspect_section(self.section) From 1f45b9d1e59bb1ea5d8f45ddcfa53a9c31bf2e1a Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Mon, 23 Mar 2026 09:26:51 +0100 Subject: [PATCH 6/8] geode_objects type --- src/opengeodeweb_back/geode_objects/geode_brep.py | 4 ++-- src/opengeodeweb_back/geode_objects/geode_section.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/opengeodeweb_back/geode_objects/geode_brep.py b/src/opengeodeweb_back/geode_objects/geode_brep.py index f5cfd5f4..fc9faa70 100644 --- a/src/opengeodeweb_back/geode_objects/geode_brep.py +++ b/src/opengeodeweb_back/geode_objects/geode_brep.py @@ -88,8 +88,8 @@ def internals(self, id: og.uuid) -> list[og.ComponentID]: def items(self, id: og.uuid) -> list[og.ComponentID]: return self.brep.items(id) - def component_name(self, id: og.uuid) -> str: - return self.brep.brep_component(id).name() or "" + def component_name(self, id: og.uuid) -> str | None: + return self.brep.brep_component(id).name() def inspect(self) -> og_inspector.BRepInspectionResult: return og_inspector.inspect_brep(self.brep) diff --git a/src/opengeodeweb_back/geode_objects/geode_section.py b/src/opengeodeweb_back/geode_objects/geode_section.py index 12b16ee0..a2f26b78 100644 --- a/src/opengeodeweb_back/geode_objects/geode_section.py +++ b/src/opengeodeweb_back/geode_objects/geode_section.py @@ -90,8 +90,8 @@ def internals(self, id: og.uuid) -> list[og.ComponentID]: def items(self, id: og.uuid) -> list[og.ComponentID]: return self.section.items(id) - def component_name(self, id: og.uuid) -> str: - return self.section.section_component(id).name() or "" + def component_name(self, id: og.uuid) -> str | None: + return self.section.section_component(id).name() def inspect(self) -> og_inspector.SectionInspectionResult: return og_inspector.inspect_section(self.section) From 649396e672b3b3ca1a3c82bd526655efa581c112 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Mon, 23 Mar 2026 09:56:41 +0100 Subject: [PATCH 7/8] missing | None for geode_model --- src/opengeodeweb_back/geode_objects/geode_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengeodeweb_back/geode_objects/geode_model.py b/src/opengeodeweb_back/geode_objects/geode_model.py index 70d02feb..5baca669 100644 --- a/src/opengeodeweb_back/geode_objects/geode_model.py +++ b/src/opengeodeweb_back/geode_objects/geode_model.py @@ -37,4 +37,4 @@ def internals(self, id: og.uuid) -> list[og.ComponentID]: ... def items(self, id: og.uuid) -> list[og.ComponentID]: ... @abstractmethod - def component_name(self, id: og.uuid) -> str: ... + def component_name(self, id: og.uuid) -> str | None: ... From e9be67d7a34801fdde2923c090ea7817e9f520ee Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Mon, 23 Mar 2026 11:20:53 +0000 Subject: [PATCH 8/8] Apply prepare changes --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e9826f10..e18b73d9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -60,4 +60,3 @@ werkzeug==3.1.2 # flask # flask-cors -opengeodeweb-microservice==1.*,>=1.1.1