From e4d0629ea0d89442149bd2f13f8a04f529ca5b69 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 10 Jul 2018 12:16:58 -0400 Subject: [PATCH 1/4] wip [ci skip] --- Source/DataSources/PolygonGeometryUpdater.js | 31 +++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/Source/DataSources/PolygonGeometryUpdater.js b/Source/DataSources/PolygonGeometryUpdater.js index a26e346dcccd..6b8536bbe958 100644 --- a/Source/DataSources/PolygonGeometryUpdater.js +++ b/Source/DataSources/PolygonGeometryUpdater.js @@ -4,6 +4,8 @@ define([ '../Core/Check', '../Core/Color', '../Core/ColorGeometryInstanceAttribute', + '../Core/CoplanarPolygonGeometry', + '../Core/CoplanarPolygonOutlineGeometry', '../Core/defined', '../Core/DeveloperError', '../Core/DistanceDisplayConditionGeometryInstanceAttribute', @@ -32,6 +34,8 @@ define([ Check, Color, ColorGeometryInstanceAttribute, + CoplanarPolygonGeometry, + CoplanarPolygonOutlineGeometry, defined, DeveloperError, DistanceDisplayConditionGeometryInstanceAttribute, @@ -120,6 +124,7 @@ define([ var entity = this._entity; var isAvailable = entity.isAvailable(time); + var options = this._options; var attributes = { show : new ShowGeometryInstanceAttribute(isAvailable && entity.isShowing && this._showProperty.getValue(time) && this._fillProperty.getValue(time)), @@ -138,13 +143,23 @@ define([ } attributes.color = ColorGeometryInstanceAttribute.fromColor(currentColor); } - if (defined(this._options.offsetAttribute)) { + if (defined(options.offsetAttribute)) { attributes.offset = OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty, time, defaultOffset, offsetScratch)); } + var geometry; + if (options.perPositionHeight && !defined(options.extrudedHeight)) { + options.positions = options.polygonHierarchy.positions; + geometry = new CoplanarPolygonGeometry(options); + console.log('coplanar'); + } else { + geometry = new PolygonGeometry(options); + console.log('polygon'); + } + return new GeometryInstance({ id : entity, - geometry : new PolygonGeometry(this._options), + geometry : geometry, attributes : attributes }); }; @@ -168,6 +183,7 @@ define([ var entity = this._entity; var isAvailable = entity.isAvailable(time); + var options = this._options; var outlineColor = Property.getValueOrDefault(this._outlineColorProperty, time, Color.BLACK, scratchColor); var distanceDisplayCondition = this._distanceDisplayConditionProperty.getValue(time); @@ -178,13 +194,20 @@ define([ offset : undefined }; - if (defined(this._options.offsetAttribute)) { + if (defined(options.offsetAttribute)) { attributes.offset = OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty, time, defaultOffset, offsetScratch)); } + var geometry; + if (options.perPositionHeight && !defined(options.extrudedHeight)) { + options.positions = options.polygonHierarchy.positions; + geometry = new CoplanarPolygonOutlineGeometry(options); + } else { + geometry = new PolygonOutlineGeometry(options); + } return new GeometryInstance({ id : entity, - geometry : new PolygonOutlineGeometry(this._options), + geometry : geometry, attributes : attributes }); }; From 7de3100a138daec5cf5ef2b60c8c76e6311dba26 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 10 Jul 2018 17:54:23 -0400 Subject: [PATCH 2/4] Support vertical polygons in entity API --- Apps/Sandcastle/gallery/Polygon.html | 28 +++++++++++++++---- Apps/Sandcastle/gallery/Polygon.jpg | Bin 18187 -> 19753 bytes Source/DataSources/PolygonGeometryUpdater.js | 4 --- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Apps/Sandcastle/gallery/Polygon.html b/Apps/Sandcastle/gallery/Polygon.html index 56e7e95d5c3f..cb0a8c50fb4e 100644 --- a/Apps/Sandcastle/gallery/Polygon.html +++ b/Apps/Sandcastle/gallery/Polygon.html @@ -10,10 +10,12 @@ @@ -108,8 +110,22 @@ } }); -viewer.zoomTo(viewer.entities); -//Sandcastle_End +var cyanPolygon = viewer.entities.add({ + name : 'Orange polygon with per-position heights and outline', + polygon : { + hierarchy : Cesium.Cartesian3.fromDegreesArrayHeights([ + -90.0, 41.0, 0.0, + -85.0, 41.0, 500000.0, + -80.0, 41.0, 0.0 + ]), + perPositionHeight : true, + material : Cesium.Color.CYAN.withAlpha(0.5), + outline : true, + outlineColor : Cesium.Color.BLACK + } +}); + +viewer.zoomTo(viewer.entities);//Sandcastle_End Sandcastle.finishedLoading(); } if (typeof Cesium !== "undefined") { diff --git a/Apps/Sandcastle/gallery/Polygon.jpg b/Apps/Sandcastle/gallery/Polygon.jpg index 7308767830065b51067e708337df23826698f8e4..bbe5a86979a46b64d8abad836df1d5fc4f742ad0 100644 GIT binary patch delta 19457 zcma%iWmFtZ(C*?IEVw4Y65J(NfZ%~m2(H21g9aD^L4rHMLvRm47Pp1PS=`+n7MBG+ z-tXLV@84U~HPff3dwOQh>8|Rho{oq{DNaKH9%mj`Kt#&&O7b8S6co^xrvvo33bK~- zvatk#R8>K2AP@)}gpNWD!g$J|JgFoK&Hv5Iqr3*8{ckzy(@kE`(-}nkq-sz4pL}`J z|JwZT)!D?x@hg|3#n%@CTs&NSyiYv=^B`FeDhkSf>Hi2C2HJmuiH?qjfrW{M^`Bzn z;Nf6n<6>iB;XcE~#lwFREF1#DXZQsFSyK%oeUp;Nm;h!tL`%(0(jPF`n@-&Nr`JRC5?C^3a+oQPSn(8)ZLUDnA-nq7=&! z(V(AMCjH_|;7t1qRQb&zT~lK&!Dme`d>64y6(oTl>k^XnLy8qms3nE$HJk4^gD!@> z52FJEs6($zJP8v6H0$A?W8E&+qidO$lSs47E%M}z%9_B1jN+!b;TV~nut>G>rmXdh z@6*2vDSs$6**R$7t5LZn#EgrqQ{7vm%xWbIrfMo+goAJ>Y0WdNV$>c%38qoH)L=f5 zu5W-Mjj+>2kA0wY$KiP)zd|cxL$v%Be!Zrn7o|kI5i}t>h=pg_!W1>3X9%Vs^OktR zs`3$35x`<)GpP_C!GIUM=Z6?)jB7u#6)8lOJY>Jv{$tuI%|f5ZH%-@?9qksSc5JxYKndBd1>Aly?~9-jXA0e zVbZ(ZkxMN4S;?Bv!8(sGgZXM>WxTZkFezI4W^;c5=({+)-k~cTlVMjyaUz$DEVt<@ zBvab>kfK@tAH_{+5E-5PA+++thI_|3Rb*1&rt7@s&)yHGxv{QF;@fET?E9)8ONEbV z25-K1FcuoQO~)8q91k<)UI5QmC=S?9w%4-{icMG|a&{W8A~sHfk19FWyaE^Oi0#PF z2K(}%dDY$t3d|WYhP{!4=AODz9wQk}*Nia-+$SlQ5X5pM#aiHX0XM#v12{l=N(suM1D0G0{CmSBG}?sC=%QXN4aW@hJS_Yra@hC->N11M3T;q&gsMcdMV z!>D0VjGV3czUoT8vm~POV@E1NgyLC*YIz8~Z*nu+Uo9*v{Mzo`JPfoFA_@-^)&ZQo zH0GGF^JV-QxSK=aLbWbeJ`*P&A+L$0g<)w+GV8M+BEG101=q88oJg^2o4apb{PK{K z;cx*%vvtX?w-RMio&}N*^~bSVt!RI*A!~#LcBRF-`)Nth`81`R zT@?6bl(bw+>rNb$Um~woCU+$Ht~>9#|L(&p_j=GTdtezz5X0$yI)INd^3Rl~LJ*c^7SI5qiCI#oQfeNeIA2rVNs&AgvTWuMB zzoF{=G+yri{Snlm*R~P~RKpLBA3^Ad>!dX)%xg2%5l3;toZS>X!kQPYxv|IdOZ=fL&{6T8cEMK&w5Mx5@<{s_Tm@#iM1hhP}}%a)PDPw``&SDN0O4rJeD|B)znqM4hUZLU{a(bCef z`6l?n8~AcrrrH0AUmaX!pPfh@Zx|yD$#U-F2$9#&M-cD`x^pM18gbjG@z~;V{r5bU zkdaQ}_EHk|tI0Ij-;x9^gBT{+aBCK`@kTeDeWLUW;9ExFNm&qpwX}e`@`b)II{V(~ zq2<%BeZPOt$_l^5RXbG{jw2P;UWm;*t_=mn!71V3{(wD9bAzK{)L0&{|9ViggoKE| z$oysTIU`L~!UF&e2gRA0`!^A+<*hqnZzE$)6@DrM1G3||ziEB8v)Tr4Kj#JKXc5+l zXGWa@o8Qr`7W`AUE0rU;UYTX5`hYN}Hh}E*k7!3U=Ke+p1bL{6=jf5<{*n`Y+Ii{n z3+B-#T6QhMrC!cR|G~D!EZPTajjz<>+(BY;x zh_MBuR4s$d+FY^D^MfbR5+(KUojxNC&X2QzmV3$6sKNL!H`ADH3iJwTm$ zxiD;IIX~RxR8QEzx=iPC{SocuC){Ig=o=~hgu3v~)Jh;gEMBtchz7rfH( zV!^%3T`R$M-b{BF=i;Zv38-29qP&T z?h;?|o}Kv-WNM7l3V*WQM7}```@rh<{#_+>2gAGO`ivv~sv)K15yS##$^Mxtp3+>% zpi?cy}P?=X0BN zQ~9U=%wEz&X$or8H?QenpS|a2sgh;lrc6lu!zoEp+x@?yP$#0;dACz~0{-50$Ro&@ zK9$tKFtyERSs-%$C+nsqd<$)@1J_VMY^~H?98IufmDsfjV+PExUb*THR4+9M<>|a`?J+LZJ z;F1sb#o(iUdS$WiBR|^L$ER;JT!R_;z5%u9_XaHOX@ zzspy8hb_t|N~iYLXB#yvdhzg-dnh2M3ToBXrnY#qEijHf_wUBO^kpxMzzqgE-d!#} z&mA%QZ2@Tsb%X-svLrZS-$>rUO|n97H5%PF<}4;$^_A|nRJ+5_Ot-PHvJIX`n!Sj$ zOnvUH&Cn8;#Nn!-viyR6cKf23+7fb>s+(llp94C?qT|o%pLwzvvWhq_6^{=+ zdIW}Ew4Yv?XtO4agG^#r3-=s*$!9fPXe+6p^5!#T^Ui=!5lnh6Rdm3&@Vn;AOsiVW z!5$xE-vH*qyK}fnw6}MwWSa%iqhiQHmDMSC1TEQ)-9kd)*Au$ zzTd{TGtKSUZd|qlq<&Z}pKhGzJ%V&8P;_UWEIWO>zrkfs3y5C(maVarqyY=7kP3;( zzkj7F0FxYHT$r&(JA80kYRnE@#`OJ!kopu3jK3SbcqXHykNXP3nQ^f@*SdP21gtC= z$1v1zHhWIrN+B72M2&^)GG(t+sLeQfBtTT666_<;O`VecETXG#Efh=VA_%Gw`sgI4 z%6ZQ#M}NQP@uP^VpETelv*QKec5fHGSGn`%nUX9wmwvMeiu>fe6-dX2^K*6~sm@3Qz> z>_n1Nxn~u8(33Z>>R2U|RCc{~Q{gC#shPx8Gp{%Un-BU!+GxROx1G(gt55j7v+}Z8 zrp>y->U!4Siq?&-_A6A~X=tZS`Q+Gj0OfTlONt7 z#ILI7ip>c$nZ;yjdBik;5~zpZ7C4Nr5$MQybJMSdB)M1lT1{2j@cNehfiwS_s#V|- z6y$pWpV@~}Uxhz;7GXvxkDwog9aBTn?&)^VSOjFWp zP9Ni_vct7Wv+CN1kx8a_VDgW7*pG10ES^%9_c5m_7BotG?dJ};L+ob+f-nV&@WQYt zL5u-A_Ideb{igjJh7^}ef_x5Dwpyl*P4bGv(WU-APo!FmV&XtSC%9lqqW&StvUukM zK?=j2DAs&}Hv5@gn(A$K{N$L^#BM9WwQT#6#C1%;t`v#G#XuznutbHKOCE!&>N9WZ z5iy|s_4Cgk=9?j;yc>}W`3w&@#dj$Cjihb{zA6aM;Ei90(#XnTzgFShpX-{m_tDr&`6orzuhkuo`dELLZv|q zy`6G3XHld0L0$ z)!utbK8R3P&DFH3N)7op{sJhaR;Iyo{Hx2^oXIgxWilvcmmbfW>R0X_L0OZhZQZ~% zb0O?Fu(}^;>jAp>OHz>^&d6{s=1bvpYN#Ue68(tR%D;h;6b2oN$)~t9MWK zJg$xl8#|AfteaT9j*-!Ofkiazl-;vL`NA^cmWI|mj`T9*&j`HRU%Mw&gy1qK_- z8aIys9rBXTA4b?Of$(h9R{DL0xyC$~9^iLP=8Cv4@x|}{ zqr*Z4uC6AN(%H*2JB0Q<#(l9-He%OiiR%#*5{c9@z1eRBCyTqp!FbyrpWLeNd{qg9 zyaJAr9~VEf*6~K)hoTjTRE~4g03A(BuYu4mV~3N%h_3*Z7Yk0fWNyClc#k{r4<0++ zMDNe*u7tc)aRzTUYMki2A3=x0clbbO_I>(A)T`-t32NzbKiw%B>-&dXM;!UY;~j2( z!Ok48HZiVod9ch@n@tPZ%DFTuzaC}h$NYj_r^b)K#@c0kFPNDr97wqiy@e+|v;n^Z z-)Rb$2>1wmP%^gbMCG`h*qQ^~qvdDoEo9>&*8@b>cU+969Ka(3Rm#;v9Pt=m z{yNDgNU_plpv^P9Bal!@jUb~pJp%6H6njylNs0Kgyzdq=Fc>KX(cL)5?BhKm9Yw-S za)(7kL^jNCPh6%;Nt|kmT*Z@T|Ni*YsQR0G5%k3Y&KmEk#59Ixb)Z*ykEU>cM)3$D zmNN&;WFJ9Nmu*+`kDy@Eb2KjDnap%nbTTZ4C>5)MKJT}%QbzB9!rRcr2j zc-u-`8@ZH&G10vA?`waAz4@1NcP9I)fNvYq^FApZ;F;+M>>G?ODdO6T>uE%gDv7)= z)v7niniyWqos75kRYr&1zqRH5Wbr;XieKfIR-cWw7?_LJN=&n>BaWNSqaQ&M&2Z{g z2Q|LSuiD~GoGGQV44D3XZNQ0&al~@%Qq{A{5MNG!xol8sj2^Y*HzKo3dm(xGM1^5C z{Q;+8OX==|uhBR-qU>z5CE0cob#PrErU%ZdWU*AxGxAnv`7$fw@!$kIp z(Q>pg-5)=!b_$O+6eJq@(4_=L`R6Pl<(Q&wIbf>z`vutigykw>ohtF`^gJedmz@TC^Ja8?iai4wL^Wh?d z<}#;}-XqBJt>5v}OtRw{(za5eYD3o(3YY`4+ntj5<0A{Z>)ow9?8UYL%EX+Ge}a|u z=T)hgXPJcKEOHl5fl{ZldwuQe{JXE$@kihYBT0mIx6{GhcTeVoJr-_48_%DVF<0cg z=(SPJb?l7-8cZ8i1oJgDPS`z_(0nf^sE4r711-eMSSxF)w}m@@U*0Tg|HB-NJ9c z$#`&mpYt1C`b$-4MT^cTblfc?GtrEEA$^u9!QuWe!zg&A4gVS^O_j?c9-(eor=leO zYdsh}IKZ$uCl0jG{f;hC1a&FukAW{(zy9FxxL}OstFGhR>*O~cq+cS3rEg@rpiUp5 zZH%aQYnf5qKxEy?F66RQVAq_`){j zJh?NW=wxI)JIe$tqgvqW4@~JQ)6|B^yG6T);xxZd$w`#E4rV%xdCfa|L@FLZodAU- z-JGvb^vg1@2*rsPO|zG;Kja=3d9bFlLo&jfvCKlbI& z?!p`@0LDzy#t>4kk>}Ohrj#bx%+dxIbJ!i{)>}HZhisoC&TVgRoUXF7x0k39lB!f% zgQt5F6HcCNZXZW&Z_+kB^y<=;Y>mfS-^|*|2sVyAEo_Lr9nGWU(rTmPdBgscftpaU zRP$mD6NylIeqA@MT0}y8#NT>9z*9aFpn++tfSy;8d~L@#rpn2i@(V90dp)Sz2rup! zP?rsiywcY1^u%Bx`{3%D7~jV1<*ur1emAy%jZ~zh;w#k-S{K!8q^G`D~-+2 z9WZCxG+VBDxM+YNy_PQaGTlZvR=7}OqZ&VP&4%4G@Y}Xl^Ure!-*G5{yFslm5t?L~na?S8|z1ft#^ZHAYaR0oR81JPb+84xbv&GrvFjUgKdZEO}}9ZM)E#k7wjCbR4-%r zOh2$+dfLZR#8P33?#Yj4WZj4xcXN|>IIX5f38`eWo$1M9L#+SA4F0e`gECew0&Md% zn^OC4gL==74-yd=lV#df?L*96mN-TeYEwsQXa~be>e4F}AdxSk3{}qHABe$!X$|3J zMe0Ew%?6eIl`PAA|McBwFQ*qeOq^2<{L8-=4v-()K}!F%%sZKXTlY)U?`><2vJ_da zH*+!AmH@kD!^?$L$1DG2-#hNx1E@O6M9%~H;V&NAf}ORpaov}R^aL}Oc^)F?R@Lb!`LSN#xW{(U+WqR65Jd->UNon zlRcC2;P@Uwos0%7LJh;fT7vBx!C(3;X=M&AHDWwsDR_SB74po60{f7Vy zK|*|8S-&z{;kl&qndCWx{AM1u($~Rplz0Jnyjs?YRv2cVBOQUAM-T%NXDy0+S|wZ6 zft*uWVo-=InJSsLHnW}gXr5k}Ki0W4c`W)MHMuI;P8c*?Sy&P#sp5=9YLy z&1!D--kt~yuZgeU{4NC!?lVdGY&^%NTz-BTm-r1S-e+uOH8riUD(;ZxBG23(MJurT zaev@gsIBF-ArmmQE9RK)lfHy;{k_=hxn8m=mimN%U4itLoE=l0MQ%UjwyI|3U*snE zywbMnzQi0M|5Jco=w$fkTJM9!*+?#dMq2=>$s(+&Ld}Md_t(6_p97=^ z%;UW(^K!#8v}^KN-A-G97T}0o%Pc#a*k@d+1t*b;5qpcesd@nKRE4udBdjzQl50rP; z$c-YFH-R0=UzNpD*2yPFQR`xcwyO?n`ZK+D`_@#Pf4**rPb(0W@=+#YI=hggID?GA z_nB=gImV=tcwQc3bPQc}k|HN!?_b71mtLBc+MLO}GNE-LPZ)x{*Ip10jiUU)>Ke%q z-D5Rjvt|)GShUERx7J``RnjI87&=$*weqv&L;=u=rbNF@PHnz1y`x%iYv|gO3%ul| z_h9XKXe6q!nyhon^CCJ|3K|q?g(xu0HSC|6J1URcd|`N?_7>kP2ZpKkmcZq15#h7~ zKZtl*hLHc7+ne)UuDb4IQr|V!11{PV zVvSCH-El{=Jj640Bv_6~!OZnSeUCzN`DaftYo%ebHvW5wI%7d~iMsfU7~>>(L4LYC z-=$Z6A9u&C)LFG8`l`DrM?VjK4d4UI99RH|27FbZk~zPZ^bXt(VGM$yfaVZf6hL@<~v9$`~#_S z9pi~$@8b64!?V-i;4IgKaNw#baZYYHmTf0X27tsWXTND(f4fuleKlEY7e#*uo)VX0 zlCp1{;3~9sym~L3r;jT~eRE2nQl&Act0A=4R_evrL0!@CXIH3E;xYyB_C1604T;AZ zkO_56b}E|VFnN38&Z2kW;75ay`r&`6B0g*8Q+^I~C~exQ^t5oOtvzS~A9151)lQa! zc0PAcLf3djgXOF=WwJTEYc}%obp;wl>x&1BL%5T?F-uqP?(x*Bn_K=hR@Y3>D%gpS z3b-s($vYQynM8M6w)X*@RXfiCMmAnv^`Roz(s|GzRA?l^w1J|7JFD)L{GgcR@{8A4A@i6y=(eo~xk5)%5q+F&%*A z1aHf^e;IVEGVbg|9O!VqnP$xT6}fmkt6zLVM|RmgePEntoni;z&djuCx;yU*cnYl+ zC@PooC`rRplfL|Ln4^j9cJ}373q8m!@p9~|Eaz}?*v{Jfm1(A1$i@M(aCF+@>!R{z%Q6Ld$UPZmP^`kGy9!_S48KWdv^(qSeT>y z6emGXq!|OtAjl^p*0qO~m8^T;hi*IMLe&1ae6zOk$Le~VvqH`lRuN;MC>eLCfcCVz zU@$OQbjBlVXYe#5E4fPYsy6CWggnKAg5DS{D2->=VdfAzO>mRzaP0;kuUb% zW>mSlKm^y-g%Y;3ARH~*7UiQei@u*H#npzK>rR#2O-C2XY>Spm$)Q&4ql%oJ8E88M zf)_=;N`N)#U zcs6C(9RY<;y_D)W;tXokjZH&VD%WN!ccrDe>-AH)5O2H?6))ugAsL2#OVxvZ;bNwE zHU4h@z98si(Q0T+i?GF?Nl2lppkE9kMW{Tq+pKhrN24W*N?DDkDgFo7joA>(CObRJ zyu*T+ghk?y9TX zvR3Y>HH;=U6Z^|IA5BV|LI0b&s~({V4`a1xwBgoIkQf>#Po25&^bkvp=C6-eGW|B4 zha|rCU^*F^DijyiN``35qm#(i8!%bxkbappEZZ;-;3tMtn%uj=oI{_Thz;yWc$=wu z0}WDs=ZkJ_Lweh=(H48T>B@_1nz!3OYr)TuA`=xgcSYtC-8Dx!rn+-DI#ot z+SPb;K)8|XgHPC(wK0*74bkkfYT+IQQSTVjbnJ~C&B{ijbd?V342;iZn2`1F_40hZ`VSQsewOLls@wwmIh6T(K|2Sb4o zQZb@`(}sD8b?RE$Bu{s3kurW>{-nA$`6nIX^wZ~JmfEaT<459W>%)Twu^vkY6F+`% z?WE%<%dh;-JmFuAzJDYtwj_CLgoKIm|EV#oR?guf#6PI()1>BD;ZGe^TE0|FD^ zqEEz~1tluf+E%jbo{qVY(1Q8BD{6@{m(GsudgH%gOfjNdFgX;0F@A_m`xhPB@m8LS z2+K>(yt&;v2#MnOf}EXWl`0>y)!<*G?-&n06@2IvxyUC@3t{ec`>-dO0I)csH6+=a>NL)|GC^S7V=aIBea8!{+At$hN$ ziCDnehmGWCaAAb!szr2gE}fgSO5dOA`lt%Le|-8;-G34ppUs+Wt|T)N@qn01Q${6U z%5JMbm;`; z8ThnMl#4IZrSnML=~j-J-L2icM(dUE*CeyP^$?KnG$SRx5={D~yjv{4p+B$lBk0nD zCE6wFE^%*{OO-5nz19{RcixHm3`*T89{zd+`= zLd}>nwoZq)MAC%o64_a{(2fZ?H$Dh^YS9+KbWXNX{@7|$cr?nV+~@d~(k(8KS4j)P z4l6!HQrKtwuov=X4C;Q@N;QFR_YgkBV>%eEA-YGvCoeBecT1mSxi)ut@+`uIr=Eq} zQkF&`xSd0uPbQfW$Z`o(^`{H((e6^os>#SKKV3GyW|?)=4jI^eD$qIgt?(6G!)~4bQ}bT!KohUH?q=I2wS0+z?_Gf`@G79TQ{Pt0S&o08V0KB4 z(cYUmi0=^lU4jjk&5iVKpM9+ByY*IfuTCcdU+$PLAyc~?d=AG$OC~(;q*!k-7j{%4 ziH5T!0j`D8i-A4uV6Op!rv*oKUE6f;IXjG`VB$hy()i@oDX8t-J{$iD(ce~h1obzv zpRPYpw6xs=IQ~zC9p=EQoPXxU!Ty6k_$hF0jEp-o>cK#k9zB8reD6p~F58VR#IYRu zODdm&bajs)<%+Q3`Knrlcd8!Q)jfe`*D;7txe-f?sM?6$GP8vKGkh>Rx)!dkTL|NI z==AiT&!5!PXU=c*M;(1)4tVpdcM+YV?y8b1yFdkLemoVr3+yhj!7bxU_g2LkHhN^t zno;THTp;-Q!ze`0KjLd+W|{)SjKDmLcXEdwdTJ*k5Zht1LBf+nBkk50YW%k+1TfFW zveT=m`ue~&z1iZxH+(t!aZX`yG#0ZhSQ@0uu&ml$Kkt z&pJ6t?PmKU=}!oX@7^LYPmE`rxX!%`Lg?fXEEZ9TgCkFP?`zc|s@LJdUrM?Pnb5K- zSGl5FUnAtJD#_Z$P2z$xgw)xg&mEwBfQWQhX1-~tYw=9SxQA!>nG_yU`Du_LMMmA- zt0v4KZQqmeyzDvc58F}9O#7Qqc`#)u_8Ho_atA3;i)nK3;Xg81Rtmuc&k z@S3+3REXpk)#mH02@@BU+skBb;fXxQ*voBNYEQ8Vwc}$CqZC8<#5Ds7ZtXqLtlgl> z?o(@VZFoB~Guk@$@Txi#tiZ<+-v6#0WW`#DmXI*apLV_% z{!O%%lEVi>#Bz{Q(fsVb);^k!R(D|bj- zE93L<(iDw;RxM-gVnA|6r z)YYSUf;RCpoP!je0M0A@<}zvx-{Zv)OBw~x^O!_!La7c1H|QL{{x1KV;SeKc+!3UM zUi4YrJK7|yoH<>W9(+>yj@_P+Mz`%{)=gUHn_CS)*2zt~Tonkri6Y zwm)9`;;TpOo#RjwH<2-oWq$P^V+pnc+5>i6j`7Qd#&J*>kWb!S%}49c`SVU)HOWRAvRp5SIuaws3uwn%3)yZJ~Y zuQrAI8&%evTyV=%Yw7LC#SL?+`#@hM{L&jzXVp3r5O|lPerGnoJ^Yc|VG-kfEAJFi zq6k`O8*eBG9C)1OIUAR9{3M>E{6fZohH;b4QFaI)v|IZtj+XH;L6_V{+2>HXIx^kP zkUaZFaPBVLD@-bya4W)}^jgqryw5Q+M}4DxDb+ZUsNECZbKu{JgaHJ zCKbV+)VmwVe-%9yytYhW7gs*?&_Gvns`v$xY)M4qR&Ch_Vpf9Ttk(C`{;c7Y9Ny%5 zY0c$7yqf=g1|#;R2oqXw$3-vPh(Jne-G~(!IO0GM5 zICSeRO-@fRaVp3Mfli6?`32?$3yy7FvQ3CL>Ps4f9|jE$!2xqPeLMcU_oqo@T}uow zJiWNWLVq7UuG@j+xubkPF7Nmj4*Bd!xIJWCu((Wb-fuc_*3+A7F`2IA5!4Xrs>b_$ z;<;WLb5|N&WkQL8s=EuK(oR8^`w#P4`&_I)!=mxf*k zU;c2hZ=DfMvO!>{S;%VKJb7gZH_>ZQ7KiDB{9!+{2&Lg7)`**NpNB#@=``|rfuZZf zVviFem|CGufQ64vBXXO~hph96!86{6=neAIwS%8ufdL$2I4^{v!!kl^gEYJx+sF}iopWXr#IY#?2t-e1WLHNc9 znumboN6reS_(F(FmIa84QJgOyVXQzRxFT<$Y{(0$T5u;$cNP9Z;0i#hgn zQD#l#s6vLEH|I+(7CNSBhX#b^7l98$X{KT)SKg)Kc2V9T_R%bGp%B{oYRT928f9fs zrAvE=MrUt2S(tACwHrTO9CD^EGVvmc#2x>g0pypWsZwPm@^i8N{?oS}m8-9beH%z+ z4IPf{dsQm>LX4rgonF7q$j#Ua=#WOT|3SVwQH2C^=+V(H^(d8!V&bW%xP22$Alnl2x;)P1{P`#awnLF8q-X_{~o0<(AnE2}TJFOnM@f zL+>#J#p)XB#SR^YQ4ygDL4gvW7ng84@5)rEl?(=|+-o3rWk^;oZLU+Sl!|kNN$FJr ztw%9&I>%9cmu=H0MmaICcJFNg;q$&+FC*1CgBZcTi9L2!ZxzScl4sDAHo1STym_%I z%S#hR14jUnB7>T0uexNMH*AXX{c`P=3*sG`4k~wm_a~V2!QusxIb3!H^GA2SNh!TY zHLCJL4PC%s>GIKL^*rTq!fo2jc&ei#FxgGN*|#kgLhzQJf0_}q`4I$0SY{U(&D`f1 z^L^0ypRPt2P$o&(eV+g*ui`bj@QzCyQh$-(eD%io5d&Xk&`c>souZFcSZF!IGLpr3j~p^ zwAD;Umx04`$B)V#sA^88;`%uHFeXMxqiwQCgsB+0>6)Er(>3cd+bg=AfZ)^AEzwL` z4uR(6mJ}exm_19)Jv#b1hI(@&ciX@=Fmlt=)i{_I-QX^KY1bzRZH}&1y$r^uOx9T( zr;%5#H~{_r@)})hIvD9QCs#)9;o9fE^#bMjre@q<6n~c;tcLZu!tO<*;q|VnxkWuA z>6QohW*&3ZX^6qPi9P1w@W&Gz!EQaTKTd>RS+ie_tDx+nL}d-}w56zJ{XGQj00E9j z-wM6mopKcR_@^9IU8eX`mG`X*XV2^njcwTCljc30rnPf&%e^iK-q&Z}edx|_lHN+H zUv!{;!z8amq^SPxz$MFV*t;@}0iqr1J0MW)pe$`i(mtv$pM!~l74HJ0!2fab7A4kS z7jYbYEbdmZU~KqdOUQ$_yR!#38Q>uM)MM#-N11-*SE>QSe{W{|2UXBwQ*9Rp%vF+39RoRJ6% z-5KlCNl)hk)^$^k;1jNwMwgk(IhbB4t4fSL`=jQM%xGPEcK{zKfF!S4yU%5hSg~Od zvae-dtHi;y?Bv441*K8|*c6fMI!jL;#?esc&q)mXQq%5|-%Sbp9A^4YM^-=0(hq{h<@3iYMOzf7B>x1F?6c(Sx$O z!ttFfwd|}JTgl0xh+H|{!9jxO z#dv-VOTLY=vPR0Ay~fHOIw|9^8apvKkzu!uS=}5{eZW~j{~vjCs{|)g8qT<@5WCMx zZR1E;Vto(&`dntfcp$;%^Yqa@iYTpr?b&8lE$7C(N6Cs+fSvw_MnAp_F3y<_KE;2b zk%t`Zf&9@en9?iXgS!1ZRMs#luvBI^Xl;6c#W~(Ktz0|12X6hNH`%*q5aF^@^!YR3bS@@#r%JQPQ(7;8h=qxJ$`IwKz3@b>$JLxNSMJ-;4jqaSB4tlFPjK+Q z3E>`%5uQpw-qO7PTL$US9`&L`8tt1*Ru}^*bOp~(L4Eep_}^-$F5Q5rI!>R+{OI3y zTDoR}+zqD)fJzV?F_*``hi6AB6i~(srTo~i*LCXZ%s(u$!+t15=RZ_6wAx}OOPy9; z@%vwS%Uth=Z#t{46qHbQM@rEbE4(mCECfM}`)UiIegC%Hv zpS0tgXst|=l=Al5MfHJqLyhelb|m-N>-#F}5^txQt+phx%g}^=*QvOY=h;(DQmEIB zSJ1b~*?t8}s%CzsyW*eaSf=G=$_h^`urf|D+_?W3>FfR6sBO^UA^e5lks*}LFwL~! z*eTxt+tEw18hQkOln+={?W%EsRpI4QcE^;n$S)@a#cQPz<$AXl0(bhQ)@z^W zlENCiejOVH$_Q=KN@B@i_-5K_`MviJ#e=;3b;U5fZ|Kw|6-f<={0cs3@)P_@hbig{ zbs&zdS#cmPtLWLrCIx{s(a|7Jb7I~0O{)PwK=9U&eXyUW)_T;X=(dS{X`rf(O^I^UWascMZtS5FTh2O@x|QSSCj< zw8rtuxY;DrlFn>SQGxMAG5Y)yn#)oI5N5RWOutL7WOhO2A;ASR(-NOp9*?*014&0H z1NUP4i;WnA(MOQY)8-55wO_tN++e^D9Tb1~b8gMuL-n8h-6gUq+Vk}=A2y5-o{fgI zV};JRv){|ljZKZMUNR2Zb`4^V&4aM8tnml=Pa|Cw$#z?*s>Z(#2-l4t`$o7oScX48 z8)E2Z@(YU3Uou#6pkzb~&_9c`!rZ7$Y5Ng+-$ZW=6Ouf`>e5XT6Ep%(o&mtFwnWcr zOi%9x&7s~y4-^rhAEJ^Yl)yH`yh8j(MPTR$0~@TU?4P0z`rM3`M$YQ;T&Pn0wV@e7 zcBR+2LX0|uf(WmdL2F_)Qc?COS))Oh)WJ8IgA7IVBVVib%GU&0gk-g2?5r_PhKd98 z7=J5&LoA7Mb}KeMb{~vq1}IlyKq;TBh`CSCU)Vj9ec>l0oTjMW)od$Npg9@RDO2Gs6H1~^}gZ;WVZL{Gh` zzcV=ca6_E=lRIM!(}K%WzN_kR$Dei7-k0JeMH4c$aaLhg>$QBR)aF%`d{9*-NIE_i#8XMTO(%UFb7Xdw+iMZdrx+*Pfxhh)OE8 zO37p;*pTEE*pNow9az{{Q{yR*hIan=o$KjYe(abG`I>bvByqPUt8-lmtHaB`kEYy+ z7qgB`!0+7*{8P+m8`NWfFLLwU(MxKM+D?k_T3^RTF!*0{v?%R@xW7dg7pAjvyiUAA ze-HX|IQkSraP#Mq`Mpy2HSEK!dPs&hHzi*4v5Wyk{;q!G9AKr~leE0gmwW?Wj|rpB z`?SDQ9qm{7_fS{anQ%P7Wk2SqLQ1F4nVU)vE=MDlon=Y6GhR5H{Lcd^EZ+a1S~nE) zMYK#GqGO!BN+mU1wom=bV%>3a!~8-p_?z?e^T@cKeE;OlnVS*;rv|q>Rh6LF-?TyF zQunsWVw+Bli$D{BWNjkTe77hA7USj>X|2%L(R|ti3R`61h>v@oeu&MtL#c*h&C7|V*N*G=*@&WzbT9a7w|e9u8Q;+N522)W6ob~wY+XD@ zY=_xlbA-tj3sTKePXqwHqGZh6*o_fMjVlFRE8mnVM?h;q!gi>3FxiuM2tS5&(M&jdnJQRl64%?EPU33>Ps`X#`a{ z`+w{XWtAaHFIwea$wk$*yXGVc;lymR+UyC%cGqXmK`tE|C%@_C_rSC8p@D_rE%bPR$ylGB!3&%Y@mVg&x0_4(txyp3N8C{B;oq zEtNNX>z%vv*EO2^*+EH*_Ic{fxBJY8aeoc%ofH81x{~k_1fN*Gevb7BqWaT9c+r`S zyhCc=Py!|sPrLaZaLx$3mgi!?*WGt~HuQwGBPLalQLXVq?PC(Q`I}DyjzyZXVg^c~ zUla%A5>AUPpeL0FaKXu_maTF>i`8%XEA%kDUg}4XdYX_pL-lXm--xJodVt!qqYZa{ z7O-2QuC5Pum`=0zh^@-nF8RFB{d6C{7j}$>D zMAov`yL(r1H|vX25WlBh(&g}nlYaTqRq;Jp!NP_HSNT^@zEL5&?X6SsPERt=cIqis zSKBPV>b3U?SpCFTk0sv@!R99;q5QMaC2vRUxee3^0E7K#+wx@N?HeG?tPs<-L60AKCg_k%#ov#!(BHd9T1xv ztnM698_f1~hVj=HV1UCp|eTuUynG zOn=G#u^g!og!7W(dstwS8rMRzm;8$win z$T2IB%n%$GVh{`*kO}HWdY^-uR;j4NbEPe=q;4%_a_xB<7QJ*pKX`?BP(yKy{D9?# z>h?Vk_R;ZHond^}9uLv=C6dy8KHVi=1ow<$Jni4GeaRlh{#?NQHBOL0{ABw;8wE1B<)G_ zdD*Yb>H5Ruy+v#Ez0U>l&x!R-drj1AV`SEB?Ee6?1(3E*C-zhD_rnPE z%|BZBw6;2nK@!CUtP)C*jk5)2XiIHp@|cgh4(wxa&xrUx!4_jq)FGcwopjN3{{Xq2 zS~;YFlrWGY9i-vPMz@+l z=7F?62}CCctCdg=KKD+w@*cmb$#FY;*)GJ$+2x7k*ViAk$AUE<4)_9X7sJ{Xv8jJ+ zTw->%w30y#XzJs53JSZqK%kC5VbpW;BYw~RKGh|Y$?#u`E(~LPY|<_pVw`etybeb- z_FOZCba3u-(aHV`{t5Gcc*QqSMeAg6my8+rH{Qn>CaJK%_pYMz;g5-}?j0o1HHDHg zRh6vd1xVoJV}d;@vV1J@J>2UYejnDPk;qk5vyihB&;gD~ucgqMYF5!JA;wo175#wc*V{Zs}m`NmtB~zw3+r&>9Y zrz<&Cd>RaxuChOXK01|SW$>6WUKZ3kgwric! zohES_hmG(Ih_@(nP>03?k$HZm79;H7!zIc&Qp{0AayqywfkOaDY-A1; zV0jFF1=i$^SZNxc%rniakLg-kf5E>L>hasPzJsXDFD7ef0>#YIfD1;WsbCpNUZ5~N z>z5scp^2q`?CWjO_GUO)R;5##oL{Anv%ld8@UQ&?d?)_^g6b>fANW{b6hG)@@i+br z-~RxMqP|1@S^og1tM5LC`%+)?>R)m8{*(Uz1RDLYtR?WB!u%4wj_Sunmq*n90OG9B zHXL2cG*T)1c2DlzRPm5gxaPg*!awjxZ`xUOpA1-k&HFy+ejlGf((dfUDlO{{Vtu ze$f{n5j5R$*Y<7j?xUnzUz@4?GyebyMv)$!aDvg`+UzBXhF!z_iW}tN)v&|o3(xo< z=j~;GtbASY-l=);L7~yK?PWD9i(4-h=+7K6M=bf>!<*(0nOlqP@k`x7Ysw zXVr8!dFE;3nOMm3vu+!9r{MHN*!=PqeU{v9;zbwZS2trK?p_7?rVg|>_=ZRCP`7$h?^x`&6#wC^>+ z+<7~Pme%0pbrKLWgH8a#@cid4$9J2mr_pF_TX_$QbA z6cKzsW2eKRt-Y0nlGs6OZ>e~41d2U>kS5X*z$!e2134j70o8%%AN~pd0Q-Lb0KzhC z{>>kfB3RbdH9ZMJh{S?57$5)vkH0{D7K$kLZ~33${zht@ioX>hb=pdY#wo3I6~E9>2U76Zkt+X`r1h zZPj&;39L~`9AY@wAfIaO5kb&)bN7x;t*7iS{{RIMyVc{LRq%I+uOhRyy<0^7+wh;u zEU;Z9Wrx~8We+Sxfylso1B4V&OWQuf_FinMY5Nj?!AorPxU84L`omj)K)WLktoTkw zDp|K~W}LGft<;mrHAhze0D^M=0Kq~$VWD4Xy4QlWyQ@3+Oj5)Bwc$@K_ZUQ(A85$R ziLggG^7;GJQAf6YgV_1A$H)8|-TPZ@kNzzlp}URb__IRCM9x3cJ$%o@Z@qdaz;E~@ zkL}s}H8!C)gMJ;)qupwMktBBxb)O7f`I|$KGd;tQq4pjz#^cu%QBUg<>-zrynIBhO z-{Jm8S!MqK1pEI0f{AGnGTQiGSW>pa&Nq`<@VmH$H~DB-&RYP8N#~Ln^$Ke2zp&T* z6ltN=B>w<}XIX2lLh>2+{{U@xTLlx$4Y+yu4YbG5V32db6j4im+djyC!_EF5hxhHPwnSMcv! z)(xEIbP{-n!x4lyTw&7bUm1I!l%2RS@xj4G3bS1Y>{i!joyGqE2KxTj%0J|g>I&Ni zbK=bl8?bZ#0582{Gq>>1wR)GsfA}J=?N#8rJr3Re6!_XW^xb0O{!?Y~3q`is43^6Z zn{c;8LvV1x<->+i7{(BXD52Jq++SCT!2bZmKA*ME{Suh}0Pv{M{{ZQ#d1El9LUq6ZPZ8={vGy~e1~ znNbI0yngTZ*So$mYtEXp)}6b~UH6=4?`QAllxE?@CE@`$vp372d)n$+>L5Hk5D4$~ z1G-rNJq6vt`>*}i-}$c*;Q!a(B_O~jAiPUR_`hEw5@JFk5+XuEVlrY9(*N4+FLE+c z^8W_^-Q@rM_0C;<{JW$?ghc;)$^Y#h{NLgKH@fKnQ4@nQYN+sr@Bm^nof^j&QppY; zS)Pl3=?uC(p#v}b@spn%&V1?H){6p%jIoRy&?8;na~S2#ttoFV<)>qRRr9{+)x;-; z^)rp~M=YLg#=rYQVpE^D`owLG>WkYTLnUo)rhY;D5KfM z1N^?~9GXR}v)!xc;Kv6_aJ7*tpaFp{wi}R`KI#h*r_fz&Ivb6+9-(KbWZLZY!>{HO zP=QyemOSju*UEi~CsP;cxL5Xv-tjoj=!<`0EDVg>LV5*liS^8?`7Y|D6w#9%IRwpbdiuf}g4xRw#U!tdm? zR#e7+_O>-8+~6+JAp_GT{sR1;z_6N5CzmP}XgMeNtt^`XD7p3nokZGC_!5|@Pl2`* zyeGRK%clC0ffsNUOcQ<5FQ25}mb?vbJmX0dt1Xi%5kBo`38S@`;jRi5QTlUY5BBNftDM zOAQ>yE11|~3<5E~zEB4-Z$F`kziY^#LDesT*ZXLcN2$2jV~iDw&-P}Jc&(T$B5^Ut zbK$f|C=oC*;m=)PU+1_1#avFJKUjYF;!naO9}s+i^%wA%yY#vmxnyt0(_%v*Pj6D}R*- zjedYyN>03^mLsXz9l0EGbXs5GBjb$}d(Ci%4263Vj}B9kfnTAHaWNZFQVp>V+?u@- zagpl|lsjH+OK7cpvi$o9 z%C!1ku*8;%Y=TK4uf6p+huna{0RjasNpx;N!N8fZQP2?QB_aPcF6{;s`z?%l#SS3V zeC^1t@kD%Ki-nD^@LqvRA98uN}p>roxzsO8aj>;G!^U55AA<4s3z;oYTp}ozHC- z-q@$4;R1}4|JJ(w+tcC@Cq|}%djU!+q6v-@Jm%N03BD{+@v;GFM&=&ruY@&w?1i5` z!jI(QAZBw)G75`GC3lHe?V*ux!nZL>NgF+?RKeI@iDJDlEnZn3;US#J#o7XYFMooE z3U6V5FYPCgK}w9Yad18+S*3wjBZU^m_P-6a#3V-xpCwHNrZ0pR_#UQAX8NNmXjeU?a^?~xdsG_vWpcDByaEen8u2bv(HOzVRsKD`ZuA%#$uz#>*<4K)t5*8 zF1Du9aRM?hijO2NLWM9B@Px%O%)di5-B#e*6XB}o|h?eD7$d1Dnf zo`}g)gD0IG`!f?#TOoI^V{bsth!3JEu)r13!UyPt@n^_K3QqBtSMTVrB9;-HK<8s6 znu;)t%oT@L*)yZ-2j_h(Ck$!7meqaZET1(UlMH{?&-$ue%JEv0$r@0)0fjffT2?;l zq86TEf|p0hU;QTVx&i%CSw@h2_@F+^Y&!Y>#+;7<5Ml(EyLL$%KekPtr+WU4~ zCMyQZo3>zBaTEd9tw0dO?cUT0^aJ7V5{INWY9nvI)-*6MowrGwA+VZ@~MoOZ>vYF{gtM0 z!A%diE>B98IDDTA=Kd}!Yx+>X@r~Ht1}4U4MqIm`I{%HK-AZ~Gx%9ft=GQ)rQmkL5 zCdhig-W3pkn-Jc&odX|ix$&>be0D+`G=IBct_ky8?oE8Yqb}ufL)Rd#BY2?l7D9 z8>cINxK>{e#4;3NYL9$Z{M$4nr7DMuu&^#8jaQ(S>%)R^z ziJzkH^W`2b`3c=qm&_aO%6oKO-Od5*R;x7Ebncn6usPsSXsvmb= zF~(@#>ux$aBCw&n>-$t`CHAQ9xr|uW$F&>Kz_%vJ9c^?;;gSAn%!S&T{;d63HO5x5 zy$aRxG9mN+@FR(3wuqcHSwnT@d7fg3^o#=QDw4E3V;&KCO6Ha0o;4Lp>O~9;tZgS5 zWnKS5ZSMEnfbJ@z3gj}e`~i?(K)k_@j4s%N_RYPop~>ECfW5S>aVq7=lX>a%yVWkp zdcQrf)snA&l-+MY7=HR2P(-EU#LEMz8xS5+&D%qQ7$;qVpy+dTv~`{Iz5 zL2(zj&*h~P(GAG`ckoaKBoxSS&N48q(2_b%T0P|K#`62zxBI+i!?~#;3yM!41&{Ku zv5|8YnlsexJtJkUEe>rwAeK~%x_`^Q+p*^qMJuhNA;!<<+DvE3ER>6gDLDe^) z4#(F%eF|N@OG^^b*`^Q-O|!D3h{e>((Z_yAu8U|G!MzZJ#@#&GuLH)0TWbje$wc@I zRsFljRDZ%YnN{ST8*ue3hz5~0)W=C#xnlM?`jg1)zBTNs2^;C((`{s4)ez{+^GTM& z=+2$>WV7{+0D(@Trv6HP+K8Uz%>iplvEOE=B{TWfY?JF*M-J3F5_jVTqin+>8W1a6 za%X2{Kg~1JdEMOI@~V zb%>YTKDi}DV^1ShcG}^EA9Lbz3~wqP^E0b|d?}q=UjFWQ;EoZwls*+hEjL=rF3;MF zarQDwI#KC}8Gt`6#|^9y@ASn=yQNAdE${}U=yU@@JbuwWiVLB-#wugIV(tFDW~u*U z%pK*rp0imz)9y_0iPbx~m`Aa%_~NuIKs~w)+E7~bX4>%Y$bQ}ZFhAP<&4`I&MaA8H zu~{b^aqg8~$c)_YuQ#Cgh6iNKv4=`326(5gfUs$PC@@$x_c7}$Sz$|nT0q0szPLWy zw+8nP(JqVD)+IV+W$<>vsgWS!dnX?-=7vFoQWT+Ys}Reh5lkY<}Ua zVsbxI52d?N*Sc=oO^{ANS*}h<2-{>&2%b>jL}`p-`0l>Xl5QwfL3geCeBi?9bj)~4 z!=1e(flr503JT)MgM+&?qk`gH-Lg{0#ryoXJF(!p1$ZN*lXMp***At2M9Kfoh7bjb zt51MFXb3A=_3UugTSdnj^2KTe#W26@7I=B*nvzp+@NL$ld+n7_FWF{myM@x`$ZAci z)k_zhxxSWZ2;anJWy%RrG_ahjjM7G6_%lj?cS#GJXHiwttv*h43H)7^cb{HYl+~j5 z9*nz1_g8??@BeR;2HQatvBTQ-5uH|Q2qz(t)Litl;o!K(eHMZa=$qrk%;;{ck5&eV^;11 z`Z(ZUFVCN2OlH!0Rsp7^fkNkc6l3h}i&kXN)?32aPZ@DM%JSY39n8OBK~K9+QDr-g z{w1PSMNNiBzEjwRli5+Rj!{-IHw#f~ubIucpwv@E+O^SrYINXQLqes95--*fG40mA z=&r| zXd3gP9!ERX?tEr08=t)|G=K$m$>;kFT%pi=+cCPK>e^7MDA4cpW1JQL! zaJwusKJzc>DU%yktOT6)mJCZ0=x1k9zudf*dl^9<>q)8s@R2GPC{K*$DgDKi#k+r% zytzr6+LNWm2^)0#e;MXJ&$d+Y=A`QLj=xY-i8(#&lC3Sf0pY`3*mVG{;|vkXKRn&O z)o?z=s9=4C>ArXcuIBe%yICgRvuqQzQubF3$8Fxe`Z=KBd-}bdbnGPXFtVM+A;TmG z5u7M!}0a#J-Ng*Hk{d`h#K;;y}9LJ!6O(=S9i0=Sw%PV zQLlZttaKxI2j4SKezhUedQ)3h^{naWJO+R!Mc|mG3zE7JbinIL%APC5jIhGiRCR0= zK^5NdWN2$Z)&h!gKLWM6YV5UT(GYWTHDJWEm$m<)A&7F;4xeL@?aH+LDXON^x1q*r z>rAU?u{^RcRYX*HP|wS(r2m#vSNM_ zpIg7RjM@-o<7OS?c5+YfpfU}lwP0S0~6ibG#Fx2kD7E&7Vk$#y#2AEn0_$9FzJ6i#5eHZHq#|Meu_*d~m{uRd9aC@*sGZ*RgF zB;aU~Ejh&f`lC;UN1ugg{)3d|eKC!({o}i}WF?D$c9niSs(g5`fOBOnsbvJ}*NtRw zZztSI`HNK@e;xJEEROY>VM~_`y#8?M>&J6uj@FrHOM+&JI!ijgA;&X^cEwCaiCJP@ z2eVgRS7(a|G&0g|JVX(DAEnW4=}?o!+ca6Rpgk$d@BAX4c5%K-LY+n`RlJuR{>Xgj zXO}-v+*65pz=);QKkI31m{7V0JM$pIw7dw@ZI4@ZY7)w?%ujA{RlJ5}z z+~Fa2PEe}rvHl&bEyfL9e`g$1B(HO^dIv0KOReP{mVwv#@FDXiR9b$2+v;%$6V#H& z8>*ZwI>wxnJFMYK8R!eHbRz3zZnxyLwXg=p$zYSOhBkst2Xdw)%0;vSwRKXhmiIAk z=lN??3#>R|^D9%_u-|#6NgjLSSDF9OxLJzsg-vo-aOY#R%DQq@&7=Yo{JFs@1ilHi5V< zq_eeQ_cp5rCEJ1ogX(j6G6FTb7rs+Bpm=NQ+vLm&w_pLC!#bdTH*}2BFRBPJpJrDn zMf(UI+OAudyHq8KO21|lB4kbl4-YQ}Q?fF4nXj7)UACD{tVRHr#sHoDY3nGS&`axS zvhOCDe`_w}FF3=;2V_5J-e)!51Cpy2wdOUMdDng}$A^L+Yq1^mmXBDTJM3>VGmUsB zlW?6fE9Jyq9iDC8&V?EaTz}?+Tc9#N__*EE;(6+4e?LQ3++53?mM5IJPm#EzGWwQ) zlJ4TDrhC&@S%Ip>RE23cj93rM6<{KxeC zorku?slIyKi}dR_`x}sQ{SD~+pT)x)5VYzBlvi^DLgN3YS+r)?)c0Sfp)&VwBN)NZ z?VL0)a#TzqbISMJf^^q5>r>r?R{Y+_TJK~UsXcz%yeR%a=&q@q&Z}0}A%a!DEX{bI zqv-ux`Qz@}>oNd31h{Fe{0J)(>q?5uq|u?z?1B(#yX_a$@V<}5t*8!_O8*YSj^B4O zM0Zm9CVlp~4(tw*LW>rz>9fM3&W)!|11~D;5+E;I{SPYLi&6?Q{0oyaQZ;;?ob1d$ z$MB|Q>Ace_uncr!whs-M*-Ec^`RJa3Z#=_TVhTjG^7r3MP9WF(dt$(#mBaZBDD3EB zF}0T-9L{7`!}&ZFx`muOJ_Apl?mj~oC%G1ii%v&qMUtc%hHL=`n?K}MYZ3N`vq%$k z?Yv+7sr(1xMhXS8hYRejw_qs3X9wQIdorShUrB#T)#YY>s?V&mjHLX_Eb{my?Hs-E zVO}+#`~^NCVAqE)tOwqP+=Y9xm1?d0OdNF*8w22r0du}4Ws?coyBgI8))=dmeQCvj z@r768RfMthkM~)|rwm8NK8KtUnX>!&fGe&LR2V%s!^<;WIqrL{U{~F zy~906^xa2r@*a1#s+|8U^-)}RQ~8L^-#_M8$MM|-qJDq*sVw$8KKw0sB}k*(60%k1 z!?$iKCVVT1_zD~xuu_8ig_$$)4>mGEYt9(0QtPXl{rg%*Num)aHz0;LIK@9kT{25l z?USd`UiOJg(t?(L{nTdR8hWAdfQa6J^&1eO4>;)2YJ&7cm(u;l8X1G_kN$y)vUM_c-b2g5sp zv5ZlhvMX=id2qPgyCredN<13HLh`M?GmNkdz?h%4X@zMyK2@ADV8-+-mKVjDR9?sY zn3DndwCFcfvAonH1o7H!w=PR{ZPSog`QfI5NnYVH14gnqPK*u)Rc)_&&pYOFnena3 zuQ#Ykq~^Xq$pD_ls?ewug5IS$Ar%RGChVJe&WD@I7ifr2>#!>C8Nm1CA!6R|ys z#;NSJb7fdk+HOF!9SYDZG0bik+_?ociQcXEbyZtD8+)t^8op2a zQ8*z^CM;X^XYRKm2U2FSnqg+S{ptWEYbnoo*wN;B5jnO#NGu zCPA{wAM%tNbft#H-G(&09gMm2Hu>Sb@iLSKQFV^PxD6Z-<8K-@XTpAL|9VHK`usLT z4Jfw-FfHAaql!8aQYJ?(af`yCY@mLo{vJ93w`_IE_*Bnnsy~RAgO#D~w~6F$%9%vM#3a+0`Ri=-FijWAigx zh;;`9dQD9-vX-{trZL0Lj@1c7tXmcC3znwqA;qH}#V#^R>R&yofJJvBS{wVtcNIcz z>d3C?0T0(|2@Wl?UrE+N$5VhK5+gv6x@W2A7Xl;dt8%zj9+xe9c*PHNK6^3kP(Aaf z%#jcB;RQvxB5~95j2KpB6CVPzWo zx1ZS1e9P8r$Yjq&r3KB~z@N7@!>w5n{{YHRpYOM#GRlIAjcf7_-$aS) z_wQ_q8b6xdJ@y$zv|xsQEwN73_HRzMG8XRKfAbGw0*Vxe}oe zmtlnW`!!DR7D95H*&WA%8#0j_`C7i)%Cj-*X>~>&P~CzDo!-fC+kr<)vdb zX&w9##7>RzaJeoyShK`Nj>AOFUnywm!v}@T4<^4&ra9+-&-u93TPPb?uE1G}wP*0d z2YTBdj*E)MRX_DC&U`e4cLU1s;%yStD6zjZ&f1JHG8i|nTt-5<>6=1JQl)vl)V0`0 z5iZalpZ$xzZ;#c&(p-zZA9TgvfSy_?vHm$_HxpTkDe3+GSw?*EIVF~jehr@=dCSHj z;{Pr#GH~iyLr=p|V*7Dx@L3Pb+YEyWSefaexMat=(X|txbqkuKqP{(AA`y@LYcXeH z`T2p;^VkY5!<}WfN;^#1)q{`@PLxq#zXCIAr$0y;Q&nN9ZzWAZAh@l#Jg8yzu(i z;%5df>#z+m9PsNhPfur8X4kc*pijxC1`9(`C0~tYVmZ!d zhA-I047*l+Yn#C>QoDach$fI|${SEO;*xb=85MxQTG4O9QAfAhpupiZr)duoE5}lN z1LFABp1BL=yu4F*14?5<&I3%yi(BKj3HXfuPO}yi0Y8*^(1w2&f_i5yfypdzW;EI7 ztIZrENwE{P@}ua&XI@iq2!_6|ZV6X7c2Ml7xft zM`d|+O0O>-hK~e4Q)E)hZ_JgIujyA$>rw#V)A|Qz$2ApqB4imJMGW?{MlNn zUfZW?4LoRvDy~Xp*wM3i8V0s!>|Y0PPKOW&v+=FwJ%xaWt7yAk{97+rqvw~d9GUk$ zx7$mz9Qy1$7;G<^zRDTXoR^0B=fUXw*4a?o$gnRa_2}Q0Lyb*XtpJmKJUNc}R6kmo zbPXjnf$^mX0WOiIQ(vk0_9!`o5W{izlzU7dDd$ezm2-!^FPzU!hR~!) zgDK%>rnK`S-&|`_24?Y7j@yYxR=p&=g#L}v1~Fnffn~D#aWVJu;;e&JjfTtt@M0IM zIx#+fYQPFKd^|)X$mmaDo*V0`Qj6=1*_CP9_hEurCf43PX}mSrK9}rnWoFz%*!Ny` z4{1<^6CVz#LbCDMxM@^==>AND3?Jqp!4q zkAfk9Q>Dw2ASxprMLDjkt_d-l6n*cz%U<s~n%(grks4Gm zva3RM#vtLId0PjPEk)o$&nk|R4%G)&=?Nd*4LmmS67U7_K1oT|94+>?uIHqW>Y3Oq&`igy@0AS`OD%F#>r(Ci0a z%$6_~(|g^jsf875Uc~q%W(Je>+A7qbGEA;2p3k4^0Liiaf3?Ck= z542~zS?;u}5f0`T7?hKDfp4i50G(RxRQe)y|4O7R36nUTQ;)T&SdND{1vTuxdTD~- zPXbI1_x(}PPp*sF0lI;}l{Okn1T!Y2^Hhv1j^UVKYk|eg;EqC1)?`WVK&UJthfNJ)wn|bYwxk zx9rc`35@oC5IGkw!DwgZ=#`WAoE%0#ipIL4Bn41@JcHm{|0xvxa#Lg82(GB5u1BdY zC19K+0+wPnFZJdxiyc1`!v8eYJyOKcY&vC$P;XE&#XLkC?yi`2yHTw+M1PAtzEWD( zL_N9?-Cx+qpbZB*@OqzHLVaF9zMUhevDD~$v#|4(zpb9mS$Ww|Ve@1{s~s~UgFa~d zo{j(Aw*i3ZFJxUqXUpjO8xWmdjhj7hfJW?C9jjRKUifmu;W7dDw}ifcFT%bx9HFM> zS47yCV_3;GUyRdgS$%ld%g;YtAIwW@cvWS*v(x9WQCsMh`5`v|v0po+*ucqRw8GGq z_X{!vBb8nmbN{&D-j}bi+R{F1nfjCY7%pt@9z+kAFIUlY>RweWiQIs!0LeWe7P3c#%(|{icptkihlB*_M3|wbtFCi5wdm@Pwdgxz zpC$}?VvdAPCRBoXdNQk>Y1GU63kK-BZOY5~9eJ4hPfmUZtz6mS`hESx8)C3zg{))RLk>=;%s_qZVN4{i-zJpglm~43Dlbc&A@}d+V-3)RxwkMufd!*tty~z}sdNP&;rFpv zc4PcsTFrWQSnCmb5$b8I&(*%!m=e5tyfHLpRevRBbgD!=REFkoj_fe5AbnH@?wKs* zV^S5ln)p~SuKlPr7pWtnp9{Ef#@8d5l?1F@IM}0f0IKaH#r7~~fagGna@9gzabA5W zZ<+p8Zj+Ly^&nsiNn~JopQRCV1FC+UJ?plX7bui{EL_T(^H52(KYu0zbUA$hzoO`K z{%$#oDO**}sOf6effnJm@+dob8i(8#H5bAfN-O(Z9Oe#etzQ;vE$JPcL9#7RL_mgN7dF(hDt0!Qa|5GS9Rz{42k;p$Xor zB$+xBgSq+!O;ff}0xAS-^?w+Ne&~VN^6DnvD3c=W+62+>AordY&qBoS30vG+Fp>kZ zs>|h)n#^G){RXZ3ioRLX3PPV`duemHmj;GR-S$%b>P9nw;gHNFh85b&I$_;Fp9FBP zvW#2`^wz^iq#RMupSx#Y$p$fwiP@v6!mx@Se$2J+%Lg3z@BTfDBK1zpu9;wxN?L=@ z<=?)xq?7EqQ)N6A=Zewq3PL5@tgF&np?99!T)0~@Uwlj(A^uT{3Xy(%$dcl<{~Ze~ za}eThXLkbW$9%W4r)ja;b?u6*nAwBco%yujZ=#%RfE{3Ky@f_WR@RuI?+YI&MBB36odhk`Vd$p{hm_ zi&nOv%b>izlVW06bZ3x%^jQ;wG=2Gx)!grDKmd?a0lsW3xRmr*VaUsZCstH!_`W=P zEj-xNaWo59oRcU#^;j7yqhRQcc6zDP>&{|4uSa|sme>~Q59}cd7k3cUMTz61qp;f2 zSE6!3TTM5hzOpH?cNMRH`DE;j{}o-&jciI$x$pb4H_!`uLU}JD(G2OYJQfmt@%yB& zOc-#A`?!qQSYr98d=zl2GB1qyoh^-53L|V04E6cJc!7TfWz+E)-c~KDaf^a}c||C- zuF+p)Lh_OI6-zZGA-|O#*G}!J)*&KA7luC2FxvTtVfLgCPS)~-j-wD$kS|g`!f>T; z@Ghg<h>5<$<=12T~jqH1ItO68d)VfwGMD6|Id6JiRY?i zB&sqg2uz*DDxa%#n!d0u#=XeZvFAy}--tin9zLxgzYKf`kjHrRvfM5DTDX)B$gsE< zy4G}x_AN@J-YJNviwdA8@DjSP?_L~lh=Ob7gt)1*jd$6%R}BSvKh!nxY|H)lu_933 z`fMuz?DDq9Q9N#!HH1M~#4%$Kmc{H8Ush_udKqE8y#inaD)*UJ`Z)$~Lul8`*Z@uW zPvmyBCg+X_eV3XCd;lzWDS(w zC!Ti0HkX|`M#(VYOGDiNUXX}qac%#A43?+9n)i!?gCp^XWM5lIaW6!Nk_b)tj<36w zQ=fLv|D$Y`p`M`cznTQP(+$g|>GAm-y6Wb}XH#(A8KXAi4WHZvNmr=?8B$2XLe5#Lhalf`M3O!3(y=?W3kvNIE25yz}H&R zQQFBVREF2NrBN3GhZ8H-+)`!|HW?~srr92*@|62)c5s!>&eO_UYZp5D-h`6~2ZmU} z+&sTPw|v;?{7LhS97MX6Md{L$%TPo^a!&l7-!JK5k@|Suvp-0NvoaXP;|qz0R?e!D z+E^7uOwuQTmPQqkfsvopXM(kUNw-Cjc(~$eL``%;D=Rv46ItKq0Obe%w|4Jw&4MJqo$KTe00@Wb!DGhdZqkk8cYN)DqcfZ^=Hpl17V!2UNDHk zBn!Jtcc6#^KLKAqf4@7>YM$S*u!( zioTT}%}Jl8qFkmu^+xM7Uw+PNXOXv1w{0QeGPjX*mo?g`zD3!{X{91QAn>pCZUgmi zUsbo9&@Y=2buHl28_?;@XWTS`ei^0qzS(Za*Ka13`%}4CmwT#2i0ghI&+czO({?sF z$5<#JXLVvL8YW>8JY^Vgjd!v=-mZFGj(ecChTyEIWgsElHu%K$bdq2#2*#xh?K_Spp*dCdaHPj7|Z%neA6 zRWS2cohR*)u;&MH|GcHBjqPa0L$j{B48;;wa*_cy?BA-e@$a}Lcr8^7R_aQ(Jq4B7 zJ2TCk^ruk6q$zv5?b^l0;+d(P%h=CuR>!>^H~#Hz7kCG(4RJN~kwW$-+Hd<_^D zRx-i=$z~H6BDDdj+w7>MhEc87*R94l(U>DO&;PV_!5?L4EX4bOH1|;Oa~dRlIWb=}7(>bVz6y{Z3@hL#A3^Q1xr} z$fvZXBpVI<(#Ob{v*sI6)QNl_cuEB8_-!7mm^ihX)D2jRkDX+H z%G!(i>~Siu!^5&pQEs?`vkxtZSV)>_i3TMK4C6=DZ_&H%81|i5z3OPgCX8tV{U! z^`f3%3_U*Kz{s)+QL?vLbM#(5DhmBC4~e7E(R%$+X%}GLQRCqP(ckx<=X*s?KvL@i z;((67soadGV(`>6^(bB2HM%91=6y%0O1OH8jY`L)XwD{GNu(ODqd6GnWn9>{Gocf)O5Pn=YhcG5JiLh$z21K?aZKwWd770@_ zPA-!M)>b^2%0MAUeIuX?@0635^k-mYmLUC(z6{xq1@*OSq?y)1==2+qWGtM@@$sWa z-3G;bJ8DZ3?+XDEwTdiH=c3l6IHlXlY2|h)EG^pSRx4@e#6W*}Wyi^iWa?)3%rM?H z9*opxevGL)`e7!S!-3~6G#Ug!@t^JJ-_t4o8#2-Wf1R<7t#T@Lp2716%hPOpx!VSOdGm*Z({9AGgZ3PgB;3WxIy|eL*R9|<_A}L!L5Gp zKNTUcGNBS5Spo-^>$@HVI~weBW1pNy5m{b_BS(suce&8z6B$)r z)2e6FqR3&Tc=FjzWbE-SJM`>zO?wJ3x`!+n!hh~7{Js18Z5{e%SGRtC8|?VSvboe| zOcpj9yz{bBJ1DLDHX)6qzeN^|K+-lPRTJs+)I~~K|GdrYavr&?l`$)hzCJ;x; zhrXp-WpuumV($ygFyxn3e}daOxOXoitd4geKcm`;7G{&?4%O=5pjSF{-hletsDa;F zvBmxgV($Emcm_+)QBeY;)lM|%8idNvE&DO^Y#yx>1fFd{iB`qNmT2qr2vYU^PQSxZ z$`V^c)Gu*|bO;n3>~s`M*Rtlb_fKb(6yuyyA4BbSK=|ZjxEud4b~!`=H*rg2`w*n& zus{gPI>p)B_Iu&q_ChG|&qHl~n-?b1?`Wea@nt!g_*9G?H=NT-_vQ&1e@#fNVmUAyk=}TFg8bRhfs`uajRI0zo zmDOOj%#w&RG}M{rop<(lcjm;vBi^H`_i?8_cjDaM9wb>x!4@A6$eO4Nc3g(b5-pl; z-GKHgu2h|obRkUJ?K~L|*C)^7M1n2vGVDmP&b@@;g_*0~7Pk!Mmq=ZlyP>YS7_~l$ zp3>idTwQ3SHC8n%tuPd5Nj(hyN`eIysRd-w#iHrGj>ze9sz6W`7X`~ct62=C7H@9Z zw$Vuv`e{U~bH6wcM-o<{!5)?UHv7z7G-v9&s;+*v53|})3%IUW(l&j~dD-#7M!x0a z>EZ=z-lR0u6!S}#9~<2>@2iweXl6Lp1oxxK(YDqT>WYT(#}$DAw(=5AkTmFN;tz+ zXKTK#ap|X~XMD=Y;)Z_7B`Hq1V~Dy7wsHF5Ds_Cb#`>{$JZn1Rp@`cYJR3Q8c-@2D zs=SprqgXLBHy{OJ03`rK(w`v~KI>z#SpD3~JY`%koHuSEu7pNDX6XfK3d=#i%DyEh zS?%W_EnxNI1cQTG%9Kj(uM*xh;Xu3@sW8_B)@WxC)76)$L&BZ&b`~^6dmR%vaRYL& z9#p`gvYhlH?{s@I=%?#$YW$bQ7!ZLA2xI*BCR;KG zuAvf7R`g$mEw$O>NGX<`A0I|J^|U{lo|C$=1km&q;StTNe`iBg+cU4D zmBg_`m`v1_D%#}38FZD2mgVEmc`{Gd>YPFBO8Wt!z6+Xa0iyax>HZ?DrqeH=pgG~P zAoEP7ywH$~HgtC9&KW(5sT{xxjb$eZ8|}7)I87RMOhlQj7Gzg--QtY0D*-B_r4$Cx z_Da^wL0N*NFW;GTbF1<&k({u3FQ(;%0yxJA7xFHZW9B^+piD}_K#DzENG z?r!oyhKQZ-r84$8CDr-Uq}9p^LF{c93U|b~EN!06PS@=+n43Pq*n2`Bw^TLk&nJ{| z;bR)u<(|V=W)VwLm-LW-@Ns!2bO?`}?(ODD0AE6~ig8HqOVh4c>(MA6UwJbJzQOrN z;9D$~qKp$p_d<<}RNz~vvS5&$aII10!j5|oMu{6%L}I5G)MP*7vF6$LO5$h#@>+cC z;X4G2R=)E+tLq|3GWUciVp(vn#-@2QQP{VZq&{n2iGLcHwzU)%w^4n%orp_QS-_)w ztN$`*#^$@w1+^CQ!aqEqL%|cWD{5qZ19Gq}=4%5hw+rBmhMo4R>fFW+v2*r49FI9z z((9~Vuq-{~6Rht4WYoJCfsDPi{Nj=Id8Ph5TO2g7^*8M*K|_Cx5%tC0Z8~OSwfk~? zdTF}Vi}yiF>v?LRl+Lvh*~(0*Y{buAll%1=3d!DC*D}#w3W|VPpi6U6kh)t^cPDN? zn}chn^7LAL?d4RZLze%7gnTj}rv3fXZlm|%tHrFy;RyNB6&rBs?OI9 zzXuA~0<*jlOwj=EpO5n)|Dtc7pX5hFK2q@@sX~h_wXa%>$5ovDc=uIEo&4WdtrLs# z40dK|xqZ_af%|2{x{c?j-^VjQYYNR21-?}M==K{*pf$ z$gP~U;y>6V$W!(Ep`d;xonE4KR6wJyX#?Y_voMv(l^FuQD>6r|r1YA!SKlrw-yjQU zg`_1$cU9NV%U?$+lYQ*M)R)JHGe-SvA!Vsu0#zJCShU)U{`I@zHdl0McEh)x!U~nE z{dkj^M1YnV+zNchbr}xkZe5%ZDg3;`rw(C2pFZxi+i{%zFa;qSyYy4mzlCKuF3jY% zz7PdO0`%xntO8{9{QAy5;_!G3k_UYMTzn+Cr(9os_)m!glon?ARIsd1cubm(I@;qS z{^Z1ciih`M;N7giE@2x@$3+!3(;ZQF8r`z|P3O*LxBO`wJ!aDim78M-^D}L!r5;ID zY<`uV=z2%Rk==AB5Ix=gcU-~q8y1QZ$?TH`s-Z-d`L-2Lr(Qce6V+6d>>HF9SKM8u zirx(@RWM0m8+aVY2HhEcOY{$VlD$&AcNM(MIfwsz!reyl)hPd2BuahIKPf2_cZZVX zFbpEp4JFZ|t{kcu)!?hJq?UcUmw$|0OK8i3qveg^`Uwh^4bQ9kn3wN+bp~G^1?EA4 zu^W)xZsms=B;8&u0&k~Rz%j*L$_8v2EA`rDse>GEF>6KHS)X_(gdLOSZ!geIqj~7k zmnb38x1-YcvwSoHPKPx@!FvEyG6pbk{G|T0yBP0y_H0k6`9+?Lu-2(YR)WRqz3R|C7i{x& z*zKXZ!Ys}%RtN{xy&&F6Dd^!nSO(H4_GqG8&aL2~Ge>%{`GKEqx;r1^eoIux75Z?{x8QII*LZ|`_5f{V$UC{}@MAn!^C`d#yc&v>nbUFc|LWrj)YA_{_$xJ|nr z1e=}}k+uAHa0#a|^Uib-K%!1PNNzx5#aR8@StH&fE`s&qaHJK>q07jSAq1`4H=OK( z0jl+Du#%Zi!>!Nta5pV1RXhm4NBMXKSRRC6KSSohkV9aZ_6D@BU%FNKX%AQ~`JVvJ z1Tp*H4fRQlzM1CEF z_RBAbbs0o*1ZGg`90m%1%rXuM9M@@g;_Dlq8^fzfV&*C44<*KVRl&&V?koK~%Bi|} zHX0J$LJ9n$k^IMv_H)M8PpqZ+v*w@M1L4HlH-I906LUJGhIjK*{aGv&_TzvnY$m6wr1Z^nX^I-?dn=gI7 zITPk$um05{-o~s8%m^JuYJs>CH}3&F_o+6={{TFP{qs)NDN>6kH;pUqQZ{j#yT1rRy3r!8!UOv{p0!5806-ok&&>hgyivxa2`_x*g!oE zCAq!sNozc|w`p++!=c>1{-V3hGf|6Evs;vG?i~9X;5Y;~_f22${=E8C(TtK|X8D)W zuF-E(j-s{GJAIAmMQ4A)S)zZ>(ERAGYs>l0Ph}I#_iPz|0);Or2pbepTD?`7?M6~s zCU&0=bt&w%OI5azq>;(KIajK%lb{u}s%OPXmVahB+Ed9SKII_cVEcQ%^Myd*uvu##oK0f{*yiYTv{;;J;F+|tzc za+;H=hWDM%9g|x74~gyX+R;ufLt$I=ub?~us8{=;Z-|5$W4ARiW z6p=+D*&r(9?%mVZ^rDLNFtsN*>dw~~*yl9ggnksfpH7ca@V1M1EQ?2Sw|Zo5vTa8B zfGfd&$o#Wi*Tdg|Uk3bFp;pQ%So$Lu8hAZZOt$KHpa+Ww&AW=nrzmTM|wPWIQ4}Tpl zW0<@<By-2T6jp$@9~l!S?n7r3<%UHgbBuSz z6jFPgE)i5)wx#_WO*fZEWSH7BgWkGxpj*vguHa`BQA$UhQgTa1V``chwzrmeWya1W oaaj|(t0u)Dnkb Date: Thu, 12 Jul 2018 13:22:23 -0400 Subject: [PATCH 3/4] CHANGES.md --- CHANGES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 46c4f9d69092..0f1921ad4969 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,8 @@ Change Log ##### Additions :tada: * Added support for loading Draco compressed Point Cloud tiles for 2-3x better compression. [#6559](https://github.com/AnalyticalGraphicsInc/cesium/pull/6559) * Added `TimeDynamicPointCloud` for playback of time-dynamic point cloud data, where each frame is a 3D Tiles Point Cloud tile. [#6721](https://github.com/AnalyticalGraphicsInc/cesium/pull/6721) -* Added `CoplanarPolygonGeometry` and `CoplanarPolygonGeometryOutline` for drawing polygons composed of coplanar positions that are not necessarliy on the ellipsoid surface. [#6769](https://github.com/AnalyticalGraphicsInc/cesium/pull/6769) +* Added `CoplanarPolygonGeometry` and `CoplanarPolygonGeometryOutline` for drawing polygons composed of coplanar positions that are not necessarily on the ellipsoid surface. [#6769](https://github.com/AnalyticalGraphicsInc/cesium/pull/6769) +* Improved support for polygon entities using `perPositionHeight`, including supporting vertical polygons. This also improves KML compatibility. [#6791](https://github.com/AnalyticalGraphicsInc/cesium/pull/6791) ##### Deprecated :hourglass_flowing_sand: * Support for 3D Tiles `content.url` is deprecated to reflect updates to the [3D Tiles spec](https://github.com/AnalyticalGraphicsInc/3d-tiles/pull/301). Use `content.uri instead`. Support for `content.url` will remain for backwards compatibility. [#6744](https://github.com/AnalyticalGraphicsInc/cesium/pull/6744) From 4edd9b524d30f42ba9bcf63ead96698be4bce64c Mon Sep 17 00:00:00 2001 From: hpinkos Date: Mon, 16 Jul 2018 12:32:50 -0400 Subject: [PATCH 4/4] cleanup --- Apps/Sandcastle/gallery/Polygon.html | 2 +- .../DataSources/PolygonGeometryUpdaterSpec.js | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Apps/Sandcastle/gallery/Polygon.html b/Apps/Sandcastle/gallery/Polygon.html index cb0a8c50fb4e..42acc0be55ce 100644 --- a/Apps/Sandcastle/gallery/Polygon.html +++ b/Apps/Sandcastle/gallery/Polygon.html @@ -111,7 +111,7 @@ }); var cyanPolygon = viewer.entities.add({ - name : 'Orange polygon with per-position heights and outline', + name : 'Cyan vertical polygon with per-position heights and outline', polygon : { hierarchy : Cesium.Cartesian3.fromDegreesArrayHeights([ -90.0, 41.0, 0.0, diff --git a/Specs/DataSources/PolygonGeometryUpdaterSpec.js b/Specs/DataSources/PolygonGeometryUpdaterSpec.js index 18d40f26e264..223eaf337444 100644 --- a/Specs/DataSources/PolygonGeometryUpdaterSpec.js +++ b/Specs/DataSources/PolygonGeometryUpdaterSpec.js @@ -6,6 +6,10 @@ defineSuite([ 'Core/GeometryOffsetAttribute', 'Core/JulianDate', 'Core/Math', + 'Core/CoplanarPolygonGeometry', + 'Core/CoplanarPolygonOutlineGeometry', + 'Core/PolygonGeometry', + 'Core/PolygonOutlineGeometry', 'Core/PolygonHierarchy', 'Core/TimeIntervalCollection', 'DataSources/ConstantProperty', @@ -29,6 +33,10 @@ defineSuite([ GeometryOffsetAttribute, JulianDate, CesiumMath, + CoplanarPolygonGeometry, + CoplanarPolygonOutlineGeometry, + PolygonGeometry, + PolygonOutlineGeometry, PolygonHierarchy, TimeIntervalCollection, ConstantProperty, @@ -78,6 +86,19 @@ defineSuite([ return entity; } + function createVerticalPolygon() { + var polygon = new PolygonGraphics(); + polygon.hierarchy = new ConstantProperty(new PolygonHierarchy(Cartesian3.fromDegreesArrayHeights([ + -1.0, 1.0, 0.0, + -2.0, 1.0, 0.0, + -2.0, 1.0, 0.0 + ]))); + polygon.perPositionHeight = true; + var entity = new Entity(); + entity.polygon = polygon; + return entity; + } + function createDynamicPolygon() { var entity = createBasicPolygon(); entity.polygon.extrudedHeight = createDynamicProperty(2); @@ -231,6 +252,7 @@ defineSuite([ var geometry; instance = updater.createFillGeometryInstance(time); geometry = instance.geometry; + expect(geometry).toBeInstanceOf(PolygonGeometry); expect(geometry._stRotation).toEqual(options.stRotation); expect(geometry._height).toEqual(options.height); expect(geometry._granularity).toEqual(options.granularity); @@ -241,6 +263,7 @@ defineSuite([ instance = updater.createOutlineGeometryInstance(time); geometry = instance.geometry; + expect(geometry).toBeInstanceOf(PolygonOutlineGeometry); expect(geometry._height).toEqual(options.height); expect(geometry._granularity).toEqual(options.granularity); expect(geometry._extrudedHeight).toEqual(options.extrudedHeight); @@ -248,6 +271,29 @@ defineSuite([ expect(geometry._offsetAttribute).toBeUndefined(); }); + it('Creates coplanar polygon', function() { + var stRotation = 12; + + var entity = createVerticalPolygon(); + + var polygon = entity.polygon; + polygon.outline = true; + polygon.stRotation = new ConstantProperty(stRotation); + + var updater = new PolygonGeometryUpdater(entity, scene); + + var instance; + var geometry; + instance = updater.createFillGeometryInstance(time); + geometry = instance.geometry; + expect(geometry).toBeInstanceOf(CoplanarPolygonGeometry); + expect(geometry._stRotation).toEqual(stRotation); + + instance = updater.createOutlineGeometryInstance(time); + geometry = instance.geometry; + expect(geometry).toBeInstanceOf(CoplanarPolygonOutlineGeometry); + }); + it('Checks that a polygon with per position heights isn\'t on terrain', function() { var entity = createBasicPolygon(); entity.polygon.height = undefined;