@vertigis/arcgis-extensions 53.14.0 → 53.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import Graphic from "@arcgis/core/Graphic";
2
2
  import Point from "@arcgis/core/geometry/Point";
3
3
  import SpatialReference from "@arcgis/core/geometry/SpatialReference";
4
- import type FeatureLayer from "@arcgis/core/layers/FeatureLayer.js";
4
+ import FeatureLayer from "@arcgis/core/layers/FeatureLayer.js";
5
5
  import GeoJSONLayer from "@arcgis/core/layers/GeoJSONLayer";
6
6
  import GraphicsLayer from "@arcgis/core/layers/GraphicsLayer";
7
7
  import type { IArcEntity, ICircleEntity, IEntity, IInsertEntity, IPointEntity, ISolidEntity, ILineType } from "dxf-parser";
@@ -151,18 +151,18 @@ export declare class DxfToGeoJsonLineMapper {
151
151
  private _mergeConnectedLinesAndArcs;
152
152
  }
153
153
  /**
154
- * The DxfToGeoJsonPolygonMapper class processes DXF polygon-based entities such
155
- * as SOLID and CIRCLE, converting them into GeoJSON features. It also builds
156
- * corresponding renderers and sublayers for visualization.
154
+ * The DxfToFeatureLayerPolygonMapper class processes DXF polygon-based entities
155
+ * such as SOLID and CIRCLE, converting them into Feature Layer features. It
156
+ * also builds corresponding renderers and sublayers for visualization.
157
157
  */
158
- export declare class DxfToGeoJsonPolygonMapper {
158
+ export declare class DxfToFeatureLayerPolygonMapper {
159
159
  /**
160
160
  * The shared DXF context containing references to dxfContext, renderers,
161
161
  * and layers.
162
162
  */
163
163
  dxfContext: IDxfJsonComponentContext;
164
164
  /**
165
- * Creates a new instance of the DxfToGeoJsonPolygonMapper class.
165
+ * Creates a new instance of the DxfToFeatureLayerPolygonMapper class.
166
166
  *
167
167
  * @param dxfContext The shared DXF conversion context.
168
168
  */
@@ -182,10 +182,10 @@ export declare class DxfToGeoJsonPolygonMapper {
182
182
  */
183
183
  processCircle(entity: ICircleEntity): Promise<void>;
184
184
  /**
185
- * Converts all processed polygon features into a GeoJSONLayer and adds it
185
+ * Converts all processed polygon features into a FeatureLayer and adds it
186
186
  * to the dxfContext collection.
187
187
  */
188
- polygonToGeoJSON(): void;
188
+ polygonToFeatureLayer(): void;
189
189
  }
190
190
  /**
191
191
  * The DxfToGeoJsonTextMapper class processes DXF text-related entities (TEXT,
@@ -1 +1 @@
1
- import e from"@arcgis/core/Color";import t from"@arcgis/core/Graphic";import o from"@arcgis/core/geometry/Point";import n from"@arcgis/core/geometry/SpatialReference";import r from"@arcgis/core/layers/GeoJSONLayer";import s from"@arcgis/core/layers/GraphicsLayer";import i from"@arcgis/core/symbols/SimpleFillSymbol";import a from"@arcgis/core/symbols/SimpleLineSymbol";import l from"@arcgis/core/symbols/TextSymbol.js";import{project as c}from"../../utilities/geometry.js";import{delay as x}from"../../utilities/promise.js";import{getDefaultSymbol as d}from"../convert.js";import{normalizeFillStyle as y,normalizeLineOutline as p,intToRGB as f,deriveAnnotationMinScale as h,sanitizeSymbolWidth as u}from"./_dxfFunctions.js";export class DxfToGeoJsonLineMapper{dxfContext;constructor(e){this.dxfContext=e,this.dxfContext.lastLineEnd=void 0,this.dxfContext.lastLineLayer=void 0}async processLine(e){const{vertices:t}=e;if(!t||t.length<2)return;const o=t[0],n=t[1];if(!o||!n)return;const[r,s]=await Promise.all([this.dxfContext.convertToSpatialReference(o.x,o.y),this.dxfContext.convertToSpatialReference(n.x,n.y)]),i=e.layer||"default",a={type:"Feature",geometry:{type:"LineString",coordinates:[r,s]},properties:{...e}};if(this.dxfContext.lastLineEnd&&this.dxfContext.lastLineLayer===i&&this._isSamePoint(this.dxfContext.lastLineEnd,r)){const e=this.dxfContext.lineFeatures.at(-1);if("LineString"===e?.geometry?.type){e.geometry.coordinates.push(s)}else this.dxfContext.lineFeatures.push(a)}else this.dxfContext.lineFeatures.push(a);this.dxfContext.lastLineEnd=s,this.dxfContext.lastLineLayer=i;const l=this.dxfContext.dxf.tables?.layer?.layers?.[i],c=e.color??l?.color??d(this.dxfContext.colorIndex++,"polyline").color,x=this._getLayerColor(e,c),y=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Line[y]={value:e.layer||"default",symbol:{type:"simple-line",color:x,width:e.lineweight||1.5,style:(()=>{const t=e.lineType&&this.dxfContext.dxf.tables?.lineType?.lineTypes?.[e.lineType];return"object"==typeof t&&t?.pattern?{pattern:t.pattern.map((e=>parseFloat(e)))}:"solid"})()}}}async processPolyline(t){const o=await this._getPolylineCoordinates(t),n=!!t.closed;n&&o.length>0&&this._ensureClosed(o);const r=this.dxfContext.dxf.tables?.layer?.layers?.[t.layer];let s;s=t.color,void 0!==s&&0!==s&&256!==s||(s=r?.color),void 0===s&&(s=d(this.dxfContext.colorIndex++,"polyline")?.color??new e("black"));const i="number"==typeof s?this.dxfContext.intToRGB(s):s,a=this._buildPolylineFeature(t,o,n,s);if(n)if(Array.isArray(i))this._applyPolygonRenderer(t,i,a);else if(i&&"object"==typeof i&&"r"in i){const e=[i.r,i.g,i.b,1];this._applyPolygonRenderer(t,e,a)}else{const o=d(this.dxfContext.colorIndex++,"polygon").color,n=o instanceof e?o.toRgba():o;this._applyPolygonRenderer(t,n,a)}else this._applyLineRenderer(t,a)}async processLWPolyline(e){const t=this._buildBulgeInterpolatedPoints(e),n=await this.dxfContext.projectMany(t.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR})))),r=n[0],s=n[n.length-1],i=!!r&&!!s&&Math.abs(r[0]-s[0])<1e-6&&Math.abs(r[1]-s[1])<1e-6,a=Boolean(e.shape&&(e.closed||i)),l=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer],c=e.color??l?.color??d(this.dxfContext.colorIndex++,"polyline").color,x=this._buildLWPolylineFeature(e,n,a,c);a?this._applyPolygonRenderer(e,this._getLayerColor(e,c),x):this._applyLineRenderer(e,x)}async processArc(e){const t=(e.startAngle??0)*(Math.PI/180),n=(e.endAngle??0)*(Math.PI/180),r=n-t,s=e.layer||"default",i=this.dxfContext.dxf.tables?.layer?.layers?.[s],a=Math.abs(n-t),l=Math.min(720,Math.max(48,Math.ceil(a*e.radius/2))),x=r/l,y=[];for(let n=0;n<=l;n++){const r=t+x*n,s=e.center.x+e.radius*Math.cos(r),i=e.center.y+e.radius*Math.sin(r);y.push(new o({x:s,y:i,spatialReference:this.dxfContext.sourceSR}))}const p=(await c(y,this.dxfContext.targetSR)).filter((e=>void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude])),f={type:"Feature",geometry:{type:"LineString",coordinates:p},properties:{...e}};if(this.dxfContext.lastLineEnd&&this.dxfContext.lastLineLayer===s&&p[0]&&this._isSamePoint(this.dxfContext.lastLineEnd,p[0])){const e=this.dxfContext.lineFeatures.at(-1);if("LineString"===e?.geometry?.type){e.geometry.coordinates.push(...p.slice(1))}else this.dxfContext.lineFeatures.push(f)}else this.dxfContext.lineFeatures.push(f);this.dxfContext.lastLineEnd=p.at(-1)??void 0,this.dxfContext.lastLineLayer=s;const h=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Line[h]={value:s,symbol:{type:"simple-line",color:this.dxfContext.intToRGB(Number(i?.color??d(this.dxfContext.colorIndex++,"polyline").color)),width:1.5,style:(()=>{const t=this.dxfContext.dxf.tables.lineType?.lineTypes?.[e.lineType],o="object"==typeof t&&void 0!==t?t:void 0;return o?.pattern?{pattern:o.pattern.map((e=>parseFloat(e)))}:"solid"})()}}}lineToGeoJSON(){this.dxfContext.lineFeatures=this._mergeConnectedLinesAndArcs(this.dxfContext.lineFeatures);const e={type:"FeatureCollection",features:this.dxfContext.lineFeatures},t=new Blob([JSON.stringify(e)],{type:"application/json"}),o=URL.createObjectURL(t),n=new r({url:o,id:`dxf-lines-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Lines`,visible:!0,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:{type:"simple-line",color:d(this.dxfContext.colorIndex++,"polyline").color,width:1.5,style:"solid"},uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Line).map((e=>{const t="object"==typeof e.symbol.style?"dash":e.symbol.style??"solid";return{value:e.value,symbol:{type:"simple-line",color:e.symbol.color??d(this.dxfContext.colorIndex++,"polyline").color,width:u(e.symbol?.width),style:t}}}))}});this.dxfContext.subLayers.push(n)}_getLayerColor(t,o){if("number"==typeof o)return this.dxfContext.intToRGB(o);if(Array.isArray(o))return o;if(o instanceof e)return o.toRgba();const n=d(this.dxfContext.colorIndex++,"polyline").color;if(n instanceof e)return n.toRgba();if(Array.isArray(n))return n;if("number"==typeof n)return this.dxfContext.intToRGB(n);const r=d(this.dxfContext.colorIndex++,"polyline").color;return r instanceof e?r.toRgba():Array.isArray(r)?r:[0,0,0,1]}_interpolateBulge(e,t,o,n=16){if(Math.abs(o)<1e-9)return[[t.x,t.y]];const r=t.x-e.x,s=t.y-e.y,i=Math.hypot(r,s);if(i<1e-9)return[[t.x,t.y]];const a=4*Math.atan(o),l=Math.abs(i/(2*Math.sin(a/2))),c=e.x+r/2,x=e.y+s/2,d=Math.sqrt(Math.max(0,l*l-i/2*(i/2))),y=c+d*(-s/i*Math.sign(o)),p=x+d*(r/i*Math.sign(o)),f=Math.atan2(e.y-p,e.x-y),h=[],u=a/n;for(let e=1;e<=n;e++){const t=f+e*u;h.push([y+l*Math.cos(t),p+l*Math.sin(t)])}return h}_buildBulgeInterpolatedPoints(e){const t=[];e.vertices.length>0&&e.vertices[0]&&t.push({x:e.vertices[0].x,y:e.vertices[0].y});for(let o=0;o<e.vertices.length-1;o++){const n=e.vertices[o],r=e.vertices[o+1];if(!n||!r)continue;const s=n.bulge??0,i=this._interpolateBulge(n,r,s,16);for(const[e,o]of i)t.push({x:e,y:o})}if((e.closed||e.shape)&&e.vertices.length>1){const o=e.vertices[0],n=e.vertices[e.vertices.length-1];if(o&&n&&(o.x!==n.x||o.y!==n.y)){const e=n.bulge??0,r=this._interpolateBulge(n,o,e,16);for(const[e,o]of r)t.push({x:e,y:o})}}return t}_buildLWPolylineFeature(e,t,o,n){return{type:"Feature",geometry:o?{type:"Polygon",coordinates:[t]}:{type:"LineString",coordinates:t},properties:{...e,color:n}}}async _getPolylineCoordinates(e){const t=e.vertices.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR})));return(await c(t,this.dxfContext.targetSR)).filter((e=>!!e&&void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude]))}_ensureClosed(e){const t=e[0],o=e[e.length-1];t&&o&&(t[0]!==o[0]||t[1]!==o[1])&&e.push(t)}_buildPolylineFeature(e,t,o,n){return{type:"Feature",geometry:o?{type:"Polygon",coordinates:[t]}:{type:"LineString",coordinates:t},properties:{...e,color:n}}}_applyPolygonRenderer(t,o,n){this.dxfContext.polygonFeatures.push(n);const r=`${t.layer}-${t.type}-${t.handle}`,s=o instanceof e?o.toRgba():o;this.dxfContext.renderer_Object_Polygon[r]={value:t.layer||"default",symbol:{type:"simple-fill",style:t.closed?"solid":"none",color:s,outline:{color:s,width:t.width??1.5}}}}_applyLineRenderer(t,o){this.dxfContext.lineFeatures.push(o);const n=o.properties?.color;let r;if(n instanceof e)r=n.toRgba();else if(Array.isArray(n)&&n.every((e=>"number"==typeof e)))r=n;else{const e="number"==typeof n?n:0;r=this.dxfContext.intToRGB(e)}const s=`${t.layer}-${t.type}-${t.handle}`;this.dxfContext.renderer_Object_Line[s]={value:t.layer||"default",symbol:{type:"simple-line",color:r,width:t.lineweight||1.5,style:(()=>{const e=t.lineType&&this.dxfContext.dxf.tables.lineType?.lineTypes[t.lineType],o="object"==typeof e&&void 0!==e?e:void 0;return mapDXFLineTypeToEsri(t.lineType,o)})()}}}_isSamePoint(e,t,o=1e-6){return Math.abs(e[0]-t[0])<=o&&Math.abs(e[1]-t[1])<=o}_mergeConnectedLinesAndArcs(e){const t=[];for(const o of e){const e=t[t.length-1],n="LineString"===e?.geometry?.type,r="LineString"===o?.geometry?.type,s=n?e.geometry.coordinates:void 0,i=r?o.geometry.coordinates:void 0,a=s?.at(-1),l=i?.at(0);e&&a&&l&&e.properties?.layer===o.properties?.layer&&this._isSamePoint(a,l)?e.geometry.coordinates.push(...o.geometry.coordinates.slice(1)):t.push(o)}return t}}export class DxfToGeoJsonPolygonMapper{dxfContext;constructor(e){this.dxfContext=e}async processSolid(e){const t=e.points.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR}))),n=(await c(t,this.dxfContext.targetSR)).filter((e=>!!e&&void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude]));if(n.length>0){const e=n[0],t=n[n.length-1];e[0]===t[0]&&e[1]===t[1]||n.push(e)}const r=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer],s={type:"Feature",geometry:{type:"Polygon",coordinates:[n]},properties:{...e}};this.dxfContext.polygonFeatures.push(s);const i=r?.color??d(this.dxfContext.colorIndex++,"polygon").color,a=this.dxfContext.intToRGB(Number(i??0)),l=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Polygon[l]={value:e.layer||"default",symbol:{type:"simple-fill",style:"solid",color:[...a.slice(0,3),.5],outline:{color:this.dxfContext.intToRGB(Number(i??0)),width:1.5}}}}async processCircle(e){const t=e.center.x,n=e.center.y,r=Math.min(64,Math.max(16,Math.ceil(e.radius/5))),s=2*Math.PI/r,i=[];for(let a=0;a<=r;a++){const r=a*s,l=t+e.radius*Math.cos(r),c=n+e.radius*Math.sin(r);i.push(new o({x:l,y:c,spatialReference:this.dxfContext.sourceSR}))}const a=(await this.dxfContext.projectMany(i)).map((e=>[e[0],e[1]])),l=a[0],c=a[a.length-1];l&&c&&(l[0]!==c[0]||l[1]!==c[1])&&a.push(l);const x={type:"Feature",geometry:{type:"Polygon",coordinates:[a]},properties:{...e}};this.dxfContext.polygonFeatures.push(x);const y=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer||"default"],p=e.color??y?.color??d(this.dxfContext.colorIndex++,"polygon").color;let f;f=Array.isArray(p)?p:"object"==typeof p&&"toRgba"in p?p.toRgba():this.dxfContext.intToRGB(p);const h=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Polygon[h]={value:e.layer||"default",symbol:{type:"simple-fill",style:"solid",color:f,outline:{color:f}}}}polygonToGeoJSON(){const t={type:"FeatureCollection",features:this.dxfContext.polygonFeatures},o=new Blob([JSON.stringify(t)],{type:"application/json"}),n=URL.createObjectURL(o);this.dxfContext.subLayers.push(new r({url:n,id:`dxf-polygons-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Polygons`,visible:!0,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:(()=>{let e;const t=d(this.dxfContext.colorIndex++,"polygon");return t?.toJSON&&(e=t.toJSON()),{type:"simple-fill",style:y(e?.style),color:e?.color??d(this.dxfContext.colorIndex++,"polygon").color,outline:p(e?.outline)}})(),uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Polygon).map((t=>{const o=new a({color:t.symbol.outline?.color?new e(t.symbol.outline.color):new e(t.symbol.color??d(this.dxfContext.colorIndex++,"polygon").color),width:t.symbol.outline?.width??1.5}),n=t.symbol.color?[...t.symbol.color.slice(0,3),.3]:d(this.dxfContext.colorIndex++,"polygon").color,r=new i({style:"solid",color:new e(n),outline:o});return{value:t.value,symbol:r}}))}}))}}export class DxfToGeoJsonTextMapper{dxfContext;constructor(e){this.dxfContext=e}async processText(e){if(e.block)return;const[t,o]=await this.dxfContext.convertToSpatialReference(e.startPoint.x,e.startPoint.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e}})}async processMText(e){const[t,o]=await this.dxfContext.convertToSpatialReference(e.position.x,e.position.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e}})}async processAttDef(e){const[t,o]=await this.dxfContext.convertToSpatialReference(e.startPoint.x,e.startPoint.y),n=e.endPoint??e.startPoint,[r,s]=await this.dxfContext.convertToSpatialReference(n.x,n.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e,startPoint:{x:t,y:o},endPoint:{x:r,y:s}}})}AnnotationToGeoJSON(){const e={1:"above-left",2:"above-center",3:"above-right",4:"center-left",5:"center-center",6:"center-right",7:"below-left",8:"below-center",9:"below-right"},t=new Map([[0,"left"],[2,"right"],[4,"center"]]),o=new Map([[0,"baseline"],[1,"bottom"],[2,"middle"],[3,"top"]]),n=this.dxfContext.textFeatures.map((n=>this._createTextGraphic(n,e,t,o))).filter((e=>null!==e)),r=new s({title:`${this.dxfContext.fileName??"dxf"} - Annotations`,id:`dxf-annotations-${this.dxfContext.sanitizedFileName??"dxf"}-${(new Date).getTime()}`,visible:!0,graphics:n});this.dxfContext.subLayers.push(r);const i=this.getMaximumFontSize(n);r.minScale=h(r.fullExtent??void 0,n.length,i),r.maxScale=0}getMaximumFontSize(e){let t=12;return e.forEach((e=>{if(!e)return;const o=e.attributes?.fontSize;"number"==typeof o&&Number.isFinite(o)&&(t=Math.max(t,o))})),t+2}_createTextGraphic(e,n,r,s){if("Point"!==e.geometry.type)return;const i=e.properties??{},a=this._getTextString(i);if(!a)return;const c=e.geometry.coordinates,x=new o({x:c[0],y:c[1],spatialReference:{wkid:4326}}),d=this._getTextColor(i),y=this._getFontSize(i),p=this._getRotation(i),{xoffset:f,yoffset:h}=this._getOffsets(i),{labelPlacement:u,horizontal:m,vertical:g}=this._getAlignment(i,n,r,s);return new t({geometry:x,symbol:new l({text:a,color:d,angle:p,xoffset:f,yoffset:h,horizontalAlignment:m,verticalAlignment:g,font:{family:"Arial",size:y}}),attributes:{...i,text:a,rotation:p,fontSize:y,horizontal:m,vertical:g,xoffset:f,yoffset:h,labelPlacement:u},popupTemplate:{title:"{text}",content:[{type:"fields",fieldInfos:Object.keys(i).map((e=>({fieldName:e,label:e})))}]}})}_getTextString(e){if(!e)return"";const t=String(e.text??"").trim(),o=String(e.prompt??"").trim(),n=t||o;return n||""}_getTextColor(e){const t=String(e?.layer||"0"),o=e?.color??this.dxfContext.dxf.tables?.layer?.layers?.[t]?.color??d(this.dxfContext.colorIndex++,"point").color;return this.dxfContext.intToRGB(o)}_getFontSize(e){let t=4*(e?.height??e?.textHeight??3);return t=Math.max(12,Math.min(t,30)),t}_getRotation(e){const t=String(e?.type??"").toUpperCase(),o=Number(e?.rotation??0);if("TEXT"===t)return-o;if("MTEXT"===t)return-o;if("ATTDEF"===t||"ATTRIB"===t){if(0!==o)return-o;if(e?.startPoint&&e?.endPoint){const{x:t,y:o}=e.startPoint,{x:n,y:r}=e.endPoint;if(t!==n||o!==r)return-180*Math.atan2(r-o,n-t)/Math.PI}return-o}if(e?.startPoint&&e?.endPoint){const{x:t,y:o}=e.startPoint,{x:n,y:r}=e.endPoint;return-180*Math.atan2(r-o,n-t)/Math.PI}return-o}_getOffsets(e){return{xoffset:Number(e?.xScale??0),yoffset:Number(e?.yScale??0)}}_getAlignment(e,t,o,n){return{labelPlacement:t[Number(e?.attachmentPoint??1)]??"above-left",horizontal:o.get(Number(e?.halign??e?.horizontalJustification))??"left",vertical:n.get(Number(e?.valign??e?.verticalJustification))??"baseline"}}}export class DxfToGeoJsonInsertBlockMapper{dxfContext;constructor(e){this.dxfContext=e}async processInsertFunction(e){if(!e.name||!this.dxfContext.dxf.blocks?.[e.name])return;const t=this.dxfContext.dxf.blocks[e.name],o=e.rotation||0,n={x:e.xScale??1,y:e.yScale??1,z:e.zScale??1},r=e.position||{x:0,y:0},[s,i]=await this.dxfContext.convertToSpatialReference(r.x,r.y);this._createInsertPointFeature(e,t,o,s,i);const a=(e.layer||"default").toString();this.dxfContext.renderer_Object_Point[a]=this._createLayerSymbol(a,e),await this._processBlockEntities(t,e,o,n,r)}async processPoint(t){const[o,n]=await this.dxfContext.convertToSpatialReference(t.position.x,t.position.y),r=this.dxfContext.dxf.header?.$PDMODE||0;let s="circle";if(32&~r)if(64&~r)switch(7&r){case 0:case 1:s="circle";break;case 2:s="cross";break;case 3:s="x"}else s="square";else s="circle";const i=(t.layer||"default").toString(),a=this.dxfContext.dxf.tables?.layer?.layers?.[i],l=t.color??a?.color??d(this.dxfContext.colorIndex++,"point").color,c=l instanceof e?l.toRgba():Array.isArray(l)?l:this.dxfContext.intToRGB(Number(l??0));this.dxfContext.pointFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[o,n]},properties:{...t}}),this.dxfContext.renderer_Object_Point[i]={value:i,symbol:{type:"simple-marker",style:s,size:this.dxfContext.dxf.header?.$PDSIZE||5,color:c}}}async processInsert(e){const t={...e};t.xScale=e.xScale??1,t.yScale=e.yScale??1,t.zScale=e.zScale??1,t.rotation=e.rotation??0,await this.processInsertFunction(t)}pointToGeoJSON(){const e={type:"FeatureCollection",features:this.dxfContext.pointFeatures},t=new Blob([JSON.stringify(e)],{type:"application/json"}),o=URL.createObjectURL(t),n=new r({url:o,id:`dxf-points-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Points`,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:{type:"simple-marker",style:"circle",color:d(this.dxfContext.colorIndex++,"point").color,size:6},uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Point).map((e=>({value:e.value,symbol:{type:"simple-marker",style:"circle",size:e.symbol?.size||6,color:e.symbol.color??d(this.dxfContext.colorIndex++,"point").color}})))}});this.dxfContext.subLayers.push(n)}_createInsertPointFeature(e,t,o,n,r){this.dxfContext.pointFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[n,r]},properties:{layer:e.layer||"default",type:"INSERT",blockName:e.name,rotation:o,blockType:t?.name??e.name,color:e.color??this.dxfContext.dxf.tables?.layer?.layers?.[e.layer]?.color??d(this.dxfContext.colorIndex++,"polyline").color,text:t?.name??e.name}})}_createLayerSymbol(e,t){return{value:e,symbol:{type:"simple-marker",style:"circle",size:5,color:this.dxfContext.intToRGB(this.dxfContext.dxf.tables?.layer?.layers?.[t.layer]?.color??0)}}}_normalizeBlockEntities(e){const t=e.entities;return Array.isArray(t)?t:void 0===t?[]:"function"==typeof t[Symbol.iterator]?Array.from(t):Array.isArray(t.entities)?t.entities:"object"==typeof t&&void 0!==t?Object.values(t):[]}async _processBlockEntities(e,t,o,n,r){const s=this._normalizeBlockEntities(e);if(0!==s.length)for(const e of s){if(!e||"object"!=typeof e)continue;const s=e.type;if("BLOCK"===s||"ENDBLK"===s)continue;const i=JSON.parse(JSON.stringify(e));if(i.layer=e.layer&&"0"!==e.layer?e.layer:String(t.layer),0===e.color)i.color=t.color;else if(256===e.color||void 0===e.color){const e=this.dxfContext.dxf.tables?.layer?.layers?.[String(t.layer)];i.color=e?.color}try{this._transformEntityGeometry(i,n,o,r),this._adjustEntityAttributes(i,n,o,t.name),await this.dxfContext.dxfEntities([i])}catch{continue}}}_transformEntityGeometry(e,t,o,n){const r=o*Math.PI/180,s=(e,o)=>({x:e*t.x*Math.cos(r)-o*t.y*Math.sin(r)+n.x,y:e*t.x*Math.sin(r)+o*t.y*Math.cos(r)+n.y});e.vertices&&(e.vertices=e.vertices.map((e=>{const t=s(e.x,e.y);return{x:t.x,y:t.y,bulge:e.bulge}}))),e.center&&(e.center=s(e.center.x,e.center.y)),e.position&&(e.position=s(e.position.x,e.position.y))}_adjustEntityAttributes(e,t,o,n){e.radius&&(e.radius*=Math.max(t.x,t.y)),e.height&&(e.height*=t.y),void 0!==e.rotation&&(e.rotation=(e.rotation+o)%360),e.blockName=String(n)}}export function mapDXFLineTypeToEsri(e,t){if(!e)return"solid";const o=e.toUpperCase(),n=function(e,t){if(!e)return;const o=e.toUpperCase().trim(),n={BYLAYER:"solid",BYBLOCK:"solid",CONTINUOUS:"solid",HIDDEN:"dash",DASHED:"dash",DASHEDX2:"dash",DASHED2:"dash",CENTER:"dash-dot",CENTERX2:"dash-dot",CENTER2:"dash-dot",DASHDOT:"dash-dot",DOTTED:"dot",DIVIDE:"short-dash",DIVIDEX2:"short-dash-dot",DIVIDE2:"short-dash-dot"};if(n[o])return n[o];if(t?.length){const e=Math.abs(t[0]??0),o=Math.abs(t[1]??0);if(2===t.length)return e<8&&o<6?"short-dash":e>=8&&e<=15&&o>=6&&o<=15?"dash":"long-dash";if(4===t.length)return e<6&&o<6?"short-dash-dot":e>=6&&e<=15&&o>=6&&o<=15?"dash-dot":"long-dash-dot"}return}(o,t?.pattern?.map((e=>parseFloat(e))));if(n)return n;const r=function(e){const t=e.toUpperCase();return t.includes("LONG")?"long-dash":t.includes("DOUBLE")?"long-dash-dot":t.includes("PHANTOM")?"dash-dot":void 0}(o);if(r)return r;const s=function(e){if(e?.pattern&&Array.isArray(e.pattern)){const t=e.pattern,o=t.some((e=>parseFloat(e)>.2)),n=t.some((e=>0===parseFloat(e)));return o&&!n?"dash":!o&&n?"dot":o&&n?"dash-dot":"solid"}return}(t);return s||"solid"}export class DxfEntityProcessor{dxfContext;entityHandlers;constructor(e,t,o={}){const r={dxf:{header:{},tables:{viewPort:{handle:"",ownerHandle:"",viewPorts:[]},lineType:{handle:"",ownerHandle:"",lineTypes:{}},layer:{handle:"",ownerHandle:"",layers:{}}},entities:[],blocks:{}},renderer_Object_Point:{},renderer_Object_Line:{},renderer_Object_Polygon:{},sourceSR:e,targetSR:102100===t.wkid?t:n.WebMercator,subLayers:[],pointFeatures:[],lineFeatures:[],polygonFeatures:[],textFeatures:[],async dxfEntities(){},convertToSpatialReference:async()=>[0,0],projectMany:async()=>[],intToRGB:f,colorIndex:0,...o};r.dxfToGeoJsonLineMapper=new DxfToGeoJsonLineMapper(r),r.dxfToGeoJsonPolygonMapper=new DxfToGeoJsonPolygonMapper(r),r.dxfToGeoJsonTextMapper=new DxfToGeoJsonTextMapper(r),r.dxfToGeoJsonInsertBlockMapper=new DxfToGeoJsonInsertBlockMapper(r),this.dxfContext=r,this.dxfContext.convertToSpatialReference=(e,t)=>this.convertToSpatialReference(e,t),this.dxfContext.projectMany=e=>this.projectMany(e),this.dxfContext.dxfEntities=async e=>this.process(e),this.entityHandlers={POINT:e=>this.dxfContext.dxfToGeoJsonInsertBlockMapper.processPoint(e),INSERT:e=>this.dxfContext.dxfToGeoJsonInsertBlockMapper.processInsert(e),LINE:async e=>{e.vertices?.length>=2&&await this.dxfContext.dxfToGeoJsonLineMapper.processLine(e)},ARC:async e=>{e.center&&void 0!==e.radius&&await this.dxfContext.dxfToGeoJsonLineMapper.processArc(e)},LWPOLYLINE:async e=>{Array.isArray(e.vertices)&&await this.dxfContext.dxfToGeoJsonLineMapper.processLWPolyline(e)},POLYLINE:async e=>{Array.isArray(e.vertices)&&await this.dxfContext.dxfToGeoJsonLineMapper.processPolyline(e)},SOLID:async e=>{e.points.length>=3&&await this.dxfContext.dxfToGeoJsonPolygonMapper.processSolid(e)},CIRCLE:async e=>{e.center&&e.radius&&await this.dxfContext.dxfToGeoJsonPolygonMapper.processCircle(e)},TEXT:e=>this.dxfContext.dxfToGeoJsonTextMapper.processText(e),MTEXT:async e=>{e.position&&await this.dxfContext.dxfToGeoJsonTextMapper.processMText(e)},ATTDEF:async e=>{e.startPoint&&await this.dxfContext.dxfToGeoJsonTextMapper.processAttDef(e)}}}getContext(){return this.dxfContext}async convertToSpatialReference(e,t){const n=new o({x:e,y:t,spatialReference:this.dxfContext.sourceSR}),[r]=await c([n],this.dxfContext.targetSR);return r?[r.longitude??0,r.latitude??0]:[0,0]}async projectMany(e){return(await c(e,this.dxfContext.targetSR)).map(((t,o)=>{const n=e[o];return[t?.longitude??n.x,t?.latitude??n.y]}))}async process(e){const t=Array.isArray(e)?e:[e];for(const e of t){if(!e||"BLOCK"===e.type||"ENDBLK"===e.type)continue;const t=this.entityHandlers[e.type];t&&await t(e)}}async processAll(){if(this.dxfContext.dxf.entities?.length>0){const e=50;for(let t=0;t<this.dxfContext.dxf.entities.length;t+=e){const o=this.dxfContext.dxf.entities.slice(t,t+e);await x(),await this.process(o)}}return await Promise.all([this.dxfContext.polygonFeatures.length>0&&this.dxfContext.dxfToGeoJsonPolygonMapper.polygonToGeoJSON(),this.dxfContext.lineFeatures.length>0&&this.dxfContext.dxfToGeoJsonLineMapper.lineToGeoJSON(),this.dxfContext.pointFeatures.length>0&&this.dxfContext.dxfToGeoJsonInsertBlockMapper.pointToGeoJSON(),this.dxfContext.textFeatures.length>0&&this.dxfContext.dxfToGeoJsonTextMapper.AnnotationToGeoJSON()].filter(Boolean)),this.dxfContext.subLayers}}
1
+ import e from"@arcgis/core/Color";import t from"@arcgis/core/Graphic";import o from"@arcgis/core/geometry/Point";import n from"@arcgis/core/geometry/Polygon.js";import r from"@arcgis/core/geometry/SpatialReference";import i from"@arcgis/core/layers/FeatureLayer.js";import s from"@arcgis/core/layers/GeoJSONLayer";import a from"@arcgis/core/layers/GraphicsLayer";import l from"@arcgis/core/layers/support/Field.js";import c from"@arcgis/core/symbols/SimpleFillSymbol";import x from"@arcgis/core/symbols/SimpleLineSymbol";import d from"@arcgis/core/symbols/TextSymbol.js";import{project as y}from"../../utilities/geometry.js";import{delay as p}from"../../utilities/promise.js";import{getDefaultSymbol as f}from"../convert.js";import{normalizeFillStyle as h,normalizeLineOutline as u,intToRGB as m,deriveAnnotationMinScale as g,sanitizeSymbolWidth as C}from"./_dxfFunctions.js";export class DxfToGeoJsonLineMapper{dxfContext;constructor(e){this.dxfContext=e,this.dxfContext.lastLineEnd=void 0,this.dxfContext.lastLineLayer=void 0}async processLine(e){const{vertices:t}=e;if(!t||t.length<2)return;const o=t[0],n=t[1];if(!o||!n)return;const[r,i]=await Promise.all([this.dxfContext.convertToSpatialReference(o.x,o.y),this.dxfContext.convertToSpatialReference(n.x,n.y)]),s=e.layer||"default",a={type:"Feature",geometry:{type:"LineString",coordinates:[r,i]},properties:{...e}};if(this.dxfContext.lastLineEnd&&this.dxfContext.lastLineLayer===s&&this._isSamePoint(this.dxfContext.lastLineEnd,r)){const e=this.dxfContext.lineFeatures.at(-1);if("LineString"===e?.geometry?.type){e.geometry.coordinates.push(i)}else this.dxfContext.lineFeatures.push(a)}else this.dxfContext.lineFeatures.push(a);this.dxfContext.lastLineEnd=i,this.dxfContext.lastLineLayer=s;const l=this.dxfContext.dxf.tables?.layer?.layers?.[s],c=e.color??l?.color??f(this.dxfContext.colorIndex++,"polyline").color,x=this._getLayerColor(e,c),d=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Line[d]={value:e.layer||"default",symbol:{type:"simple-line",color:x,width:e.lineweight||1.5,style:(()=>{const t=e.lineType&&this.dxfContext.dxf.tables?.lineType?.lineTypes?.[e.lineType];return"object"==typeof t&&t?.pattern?{pattern:t.pattern.map((e=>parseFloat(e)))}:"solid"})()}}}async processPolyline(t){const o=await this._getPolylineCoordinates(t),n=!!t.closed;n&&o.length>0&&this._ensureClosed(o);const r=this.dxfContext.dxf.tables?.layer?.layers?.[t.layer];let i;i=t.color,void 0!==i&&0!==i&&256!==i||(i=r?.color),void 0===i&&(i=f(this.dxfContext.colorIndex++,"polyline")?.color??new e("black"));const s="number"==typeof i?this.dxfContext.intToRGB(i):i,a=this._buildPolylineFeature(t,o,n,i);if(n)if(Array.isArray(s))this._applyPolygonRenderer(t,s,a);else if(s&&"object"==typeof s&&"r"in s){const e=[s.r,s.g,s.b,1];this._applyPolygonRenderer(t,e,a)}else{const o=f(this.dxfContext.colorIndex++,"polygon").color,n=o instanceof e?o.toRgba():o;this._applyPolygonRenderer(t,n,a)}else this._applyLineRenderer(t,a)}async processLWPolyline(e){const t=this._buildBulgeInterpolatedPoints(e),n=await this.dxfContext.projectMany(t.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR})))),r=n[0],i=n[n.length-1],s=!!r&&!!i&&Math.abs(r[0]-i[0])<1e-6&&Math.abs(r[1]-i[1])<1e-6,a=Boolean(e.shape&&(e.closed||s)),l=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer],c=e.color??l?.color??f(this.dxfContext.colorIndex++,"polyline").color,x=this._buildLWPolylineFeature(e,n,a,c);a?this._applyPolygonRenderer(e,this._getLayerColor(e,c),x):this._applyLineRenderer(e,x)}async processArc(e){const t=(e.startAngle??0)*(Math.PI/180),n=(e.endAngle??0)*(Math.PI/180),r=n-t,i=e.layer||"default",s=this.dxfContext.dxf.tables?.layer?.layers?.[i],a=Math.abs(n-t),l=Math.min(720,Math.max(48,Math.ceil(a*e.radius/2))),c=r/l,x=[];for(let n=0;n<=l;n++){const r=t+c*n,i=e.center.x+e.radius*Math.cos(r),s=e.center.y+e.radius*Math.sin(r);x.push(new o({x:i,y:s,spatialReference:this.dxfContext.sourceSR}))}const d=(await y(x,this.dxfContext.targetSR)).filter((e=>void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude])),p={type:"Feature",geometry:{type:"LineString",coordinates:d},properties:{...e}};if(this.dxfContext.lastLineEnd&&this.dxfContext.lastLineLayer===i&&d[0]&&this._isSamePoint(this.dxfContext.lastLineEnd,d[0])){const e=this.dxfContext.lineFeatures.at(-1);if("LineString"===e?.geometry?.type){e.geometry.coordinates.push(...d.slice(1))}else this.dxfContext.lineFeatures.push(p)}else this.dxfContext.lineFeatures.push(p);this.dxfContext.lastLineEnd=d.at(-1)??void 0,this.dxfContext.lastLineLayer=i;const h=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Line[h]={value:i,symbol:{type:"simple-line",color:this.dxfContext.intToRGB(Number(s?.color??f(this.dxfContext.colorIndex++,"polyline").color)),width:1.5,style:(()=>{const t=this.dxfContext.dxf.tables.lineType?.lineTypes?.[e.lineType],o="object"==typeof t&&void 0!==t?t:void 0;return o?.pattern?{pattern:o.pattern.map((e=>parseFloat(e)))}:"solid"})()}}}lineToGeoJSON(){this.dxfContext.lineFeatures=this._mergeConnectedLinesAndArcs(this.dxfContext.lineFeatures);const e={type:"FeatureCollection",features:this.dxfContext.lineFeatures},t=new Blob([JSON.stringify(e)],{type:"application/json"}),o=URL.createObjectURL(t),n=new s({url:o,id:`dxf-lines-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Lines`,visible:!0,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:{type:"simple-line",color:f(this.dxfContext.colorIndex++,"polyline").color,width:1.5,style:"solid"},uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Line).map((e=>{const t="object"==typeof e.symbol.style?"dash":e.symbol.style??"solid";return{value:e.value,symbol:{type:"simple-line",color:e.symbol.color??f(this.dxfContext.colorIndex++,"polyline").color,width:C(e.symbol?.width),style:t}}}))}});this.dxfContext.subLayers.push(n)}_getLayerColor(t,o){if("number"==typeof o)return this.dxfContext.intToRGB(o);if(Array.isArray(o))return o;if(o instanceof e)return o.toRgba();const n=f(this.dxfContext.colorIndex++,"polyline").color;if(n instanceof e)return n.toRgba();if(Array.isArray(n))return n;if("number"==typeof n)return this.dxfContext.intToRGB(n);const r=f(this.dxfContext.colorIndex++,"polyline").color;return r instanceof e?r.toRgba():Array.isArray(r)?r:[0,0,0,1]}_interpolateBulge(e,t,o,n=16){if(Math.abs(o)<1e-9)return[[t.x,t.y]];const r=t.x-e.x,i=t.y-e.y,s=Math.hypot(r,i);if(s<1e-9)return[[t.x,t.y]];const a=4*Math.atan(o),l=Math.abs(s/(2*Math.sin(a/2))),c=e.x+r/2,x=e.y+i/2,d=Math.sqrt(Math.max(0,l*l-s/2*(s/2))),y=c+d*(-i/s*Math.sign(o)),p=x+d*(r/s*Math.sign(o)),f=Math.atan2(e.y-p,e.x-y),h=[],u=a/n;for(let e=1;e<=n;e++){const t=f+e*u;h.push([y+l*Math.cos(t),p+l*Math.sin(t)])}return h}_buildBulgeInterpolatedPoints(e){const t=[];e.vertices.length>0&&e.vertices[0]&&t.push({x:e.vertices[0].x,y:e.vertices[0].y});for(let o=0;o<e.vertices.length-1;o++){const n=e.vertices[o],r=e.vertices[o+1];if(!n||!r)continue;const i=n.bulge??0,s=this._interpolateBulge(n,r,i,16);for(const[e,o]of s)t.push({x:e,y:o})}if((e.closed||e.shape)&&e.vertices.length>1){const o=e.vertices[0],n=e.vertices[e.vertices.length-1];if(o&&n&&(o.x!==n.x||o.y!==n.y)){const e=n.bulge??0,r=this._interpolateBulge(n,o,e,16);for(const[e,o]of r)t.push({x:e,y:o})}}return t}_buildLWPolylineFeature(e,t,o,n){return{type:"Feature",geometry:o?{type:"Polygon",coordinates:[t]}:{type:"LineString",coordinates:t},properties:{...e,color:n}}}async _getPolylineCoordinates(e){const t=e.vertices.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR})));return(await y(t,this.dxfContext.targetSR)).filter((e=>!!e&&void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude]))}_ensureClosed(e){const t=e[0],o=e[e.length-1];t&&o&&(t[0]!==o[0]||t[1]!==o[1])&&e.push(t)}_buildPolylineFeature(e,t,o,n){return{type:"Feature",geometry:o?{type:"Polygon",coordinates:[t]}:{type:"LineString",coordinates:t},properties:{...e,color:n}}}_applyPolygonRenderer(t,o,n){this.dxfContext.polygonFeatures.push(n);const r=`${t.layer}-${t.type}-${t.handle}`,i=o instanceof e?o.toRgba():o;this.dxfContext.renderer_Object_Polygon[r]={value:t.layer||"default",symbol:{type:"simple-fill",style:t.closed?"solid":"none",color:i,outline:{color:i,width:t.width??1.5}}}}_applyLineRenderer(t,o){this.dxfContext.lineFeatures.push(o);const n=o.properties?.color;let r;if(n instanceof e)r=n.toRgba();else if(Array.isArray(n)&&n.every((e=>"number"==typeof e)))r=n;else{const e="number"==typeof n?n:0;r=this.dxfContext.intToRGB(e)}const i=`${t.layer}-${t.type}-${t.handle}`;this.dxfContext.renderer_Object_Line[i]={value:t.layer||"default",symbol:{type:"simple-line",color:r,width:t.lineweight||1.5,style:(()=>{const e=t.lineType&&this.dxfContext.dxf.tables.lineType?.lineTypes[t.lineType],o="object"==typeof e&&void 0!==e?e:void 0;return mapDXFLineTypeToEsri(t.lineType,o)})()}}}_isSamePoint(e,t,o=1e-6){return Math.abs(e[0]-t[0])<=o&&Math.abs(e[1]-t[1])<=o}_mergeConnectedLinesAndArcs(e){const t=[];for(const o of e){const e=t[t.length-1],n="LineString"===e?.geometry?.type,r="LineString"===o?.geometry?.type,i=n?e.geometry.coordinates:void 0,s=r?o.geometry.coordinates:void 0,a=i?.at(-1),l=s?.at(0);e&&a&&l&&e.properties?.layer===o.properties?.layer&&this._isSamePoint(a,l)?e.geometry.coordinates.push(...o.geometry.coordinates.slice(1)):t.push(o)}return t}}export class DxfToFeatureLayerPolygonMapper{dxfContext;constructor(e){this.dxfContext=e}async processSolid(e){const t=e.points.map((e=>new o({x:e.x,y:e.y,spatialReference:this.dxfContext.sourceSR}))),n=(await y(t,this.dxfContext.targetSR)).filter((e=>!!e&&void 0!==e.longitude&&void 0!==e.latitude)).map((e=>[e.longitude,e.latitude]));if(n.length>0){const e=n[0],t=n[n.length-1];e[0]===t[0]&&e[1]===t[1]||n.push(e)}const r=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer],i={type:"Feature",geometry:{type:"Polygon",coordinates:[n]},properties:{...e}};this.dxfContext.polygonFeatures.push(i);const s=r?.color??f(this.dxfContext.colorIndex++,"polygon").color,a=this.dxfContext.intToRGB(Number(s??0)),l=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Polygon[l]={value:e.layer||"default",symbol:{type:"simple-fill",style:"solid",color:[...a.slice(0,3),.5],outline:{color:this.dxfContext.intToRGB(Number(s??0)),width:1.5}}}}async processCircle(e){const t=e.center.x,n=e.center.y,r=Math.min(64,Math.max(16,Math.ceil(e.radius/5))),i=2*Math.PI/r,s=[];for(let a=0;a<=r;a++){const r=a*i,l=t+e.radius*Math.cos(r),c=n+e.radius*Math.sin(r);s.push(new o({x:l,y:c,spatialReference:this.dxfContext.sourceSR}))}const a=(await this.dxfContext.projectMany(s)).map((e=>[e[0],e[1]])),l=a[0],c=a[a.length-1];l&&c&&(l[0]!==c[0]||l[1]!==c[1])&&a.push(l);const x={type:"Feature",geometry:{type:"Polygon",coordinates:[a]},properties:{...e}};this.dxfContext.polygonFeatures.push(x);const d=this.dxfContext.dxf.tables?.layer?.layers?.[e.layer||"default"],y=e.color??d?.color??f(this.dxfContext.colorIndex++,"polygon").color;let p;p=Array.isArray(y)?y:"object"==typeof y&&"toRgba"in y?y.toRgba():this.dxfContext.intToRGB(y);const h=`${e.layer}-${e.type}-${e.handle}`;this.dxfContext.renderer_Object_Polygon[h]={value:e.layer||"default",symbol:{type:"simple-fill",style:"solid",color:p,outline:{color:p}}}}polygonToFeatureLayer(){const o=[new l({name:"OBJECTID",alias:"OBJECTID",type:"oid"})],s=new Map,a=this.dxfContext.polygonFeatures.map(((e,i)=>{const a={OBJECTID:i+1};for(const[t,n]of Object.entries(e.properties||{})){if("OBJECTID"===t)continue;if(null==n)continue;let e="string";"number"==typeof n?(e="double",a[t]=n):"string"==typeof n||"boolean"==typeof n?(e="string",a[t]=String(n)):(e="string",a[t]=JSON.stringify(n)),s.has(t)||(s.set(t,e),o.push(new l({name:t,alias:t,type:e})))}return new t({geometry:new n({rings:e.geometry.coordinates,spatialReference:r.WGS84}),attributes:a})}));this.dxfContext.subLayers.push(new i({source:a,fields:o,objectIdField:"OBJECTID",geometryType:"polygon",spatialReference:this.dxfContext.mapSR,id:`dxf-polygons-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Polygons`,visible:!0,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:(()=>{let e;const t=f(this.dxfContext.colorIndex++,"polygon");return t?.toJSON&&(e=t.toJSON()),{type:"simple-fill",style:h(e?.style),color:e?.color??f(this.dxfContext.colorIndex++,"polygon").color,outline:u(e?.outline)}})(),uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Polygon).map((t=>{const o=new x({color:t.symbol.outline?.color?new e(t.symbol.outline.color):new e(t.symbol.color??f(this.dxfContext.colorIndex++,"polygon").color),width:t.symbol.outline?.width??1.5}),n=t.symbol.color?[...t.symbol.color.slice(0,3),.3]:f(this.dxfContext.colorIndex++,"polygon").color,r=new c({style:"solid",color:new e(n),outline:o});return{value:t.value,symbol:r}}))}}))}}export class DxfToGeoJsonTextMapper{dxfContext;constructor(e){this.dxfContext=e}async processText(e){if(e.block)return;const[t,o]=await this.dxfContext.convertToSpatialReference(e.startPoint.x,e.startPoint.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e}})}async processMText(e){const[t,o]=await this.dxfContext.convertToSpatialReference(e.position.x,e.position.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e}})}async processAttDef(e){const[t,o]=await this.dxfContext.convertToSpatialReference(e.startPoint.x,e.startPoint.y),n=e.endPoint??e.startPoint,[r,i]=await this.dxfContext.convertToSpatialReference(n.x,n.y);this.dxfContext.textFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[t,o]},properties:{...e,startPoint:{x:t,y:o},endPoint:{x:r,y:i}}})}AnnotationToGeoJSON(){const e={1:"above-left",2:"above-center",3:"above-right",4:"center-left",5:"center-center",6:"center-right",7:"below-left",8:"below-center",9:"below-right"},t=new Map([[0,"left"],[2,"right"],[4,"center"]]),o=new Map([[0,"baseline"],[1,"bottom"],[2,"middle"],[3,"top"]]),n=this.dxfContext.textFeatures.map((n=>this._createTextGraphic(n,e,t,o))).filter((e=>null!==e)),r=new a({title:`${this.dxfContext.fileName??"dxf"} - Annotations`,id:`dxf-annotations-${this.dxfContext.sanitizedFileName??"dxf"}-${(new Date).getTime()}`,visible:!0,graphics:n});this.dxfContext.subLayers.push(r);const i=this.getMaximumFontSize(n);r.minScale=g(r.fullExtent??void 0,n.length,i),r.maxScale=0}getMaximumFontSize(e){let t=12;return e.forEach((e=>{if(!e)return;const o=e.attributes?.fontSize;"number"==typeof o&&Number.isFinite(o)&&(t=Math.max(t,o))})),t+2}_createTextGraphic(e,n,r,i){if("Point"!==e.geometry.type)return;const s=e.properties??{},a=this._getTextString(s);if(!a)return;const l=e.geometry.coordinates,c=new o({x:l[0],y:l[1],spatialReference:{wkid:4326}}),x=this._getTextColor(s),y=this._getFontSize(s),p=this._getRotation(s),{xoffset:f,yoffset:h}=this._getOffsets(s),{labelPlacement:u,horizontal:m,vertical:g}=this._getAlignment(s,n,r,i);return new t({geometry:c,symbol:new d({text:a,color:x,angle:p,xoffset:f,yoffset:h,horizontalAlignment:m,verticalAlignment:g,font:{family:"Arial",size:y}}),attributes:{...s,text:a,rotation:p,fontSize:y,horizontal:m,vertical:g,xoffset:f,yoffset:h,labelPlacement:u},popupTemplate:{title:"{text}",content:[{type:"fields",fieldInfos:Object.keys(s).map((e=>({fieldName:e,label:e})))}]}})}_getTextString(e){if(!e)return"";const t=String(e.text??"").trim(),o=String(e.prompt??"").trim(),n=t||o;return n||""}_getTextColor(e){const t=String(e?.layer||"0"),o=e?.color??this.dxfContext.dxf.tables?.layer?.layers?.[t]?.color??f(this.dxfContext.colorIndex++,"point").color;return this.dxfContext.intToRGB(o)}_getFontSize(e){let t=4*(e?.height??e?.textHeight??3);return t=Math.max(12,Math.min(t,30)),t}_getRotation(e){const t=String(e?.type??"").toUpperCase(),o=Number(e?.rotation??0);if("TEXT"===t)return-o;if("MTEXT"===t)return-o;if("ATTDEF"===t||"ATTRIB"===t){if(0!==o)return-o;if(e?.startPoint&&e?.endPoint){const{x:t,y:o}=e.startPoint,{x:n,y:r}=e.endPoint;if(t!==n||o!==r)return-180*Math.atan2(r-o,n-t)/Math.PI}return-o}if(e?.startPoint&&e?.endPoint){const{x:t,y:o}=e.startPoint,{x:n,y:r}=e.endPoint;return-180*Math.atan2(r-o,n-t)/Math.PI}return-o}_getOffsets(e){return{xoffset:Number(e?.xScale??0),yoffset:Number(e?.yScale??0)}}_getAlignment(e,t,o,n){return{labelPlacement:t[Number(e?.attachmentPoint??1)]??"above-left",horizontal:o.get(Number(e?.halign??e?.horizontalJustification))??"left",vertical:n.get(Number(e?.valign??e?.verticalJustification))??"baseline"}}}export class DxfToGeoJsonInsertBlockMapper{dxfContext;constructor(e){this.dxfContext=e}async processInsertFunction(e){if(!e.name||!this.dxfContext.dxf.blocks?.[e.name])return;const t=this.dxfContext.dxf.blocks[e.name],o=e.rotation||0,n={x:e.xScale??1,y:e.yScale??1,z:e.zScale??1},r=e.position||{x:0,y:0},[i,s]=await this.dxfContext.convertToSpatialReference(r.x,r.y);this._createInsertPointFeature(e,t,o,i,s);const a=(e.layer||"default").toString();this.dxfContext.renderer_Object_Point[a]=this._createLayerSymbol(a,e),await this._processBlockEntities(t,e,o,n,r)}async processPoint(t){const[o,n]=await this.dxfContext.convertToSpatialReference(t.position.x,t.position.y),r=this.dxfContext.dxf.header?.$PDMODE||0;let i="circle";if(32&~r)if(64&~r)switch(7&r){case 0:case 1:i="circle";break;case 2:i="cross";break;case 3:i="x"}else i="square";else i="circle";const s=(t.layer||"default").toString(),a=this.dxfContext.dxf.tables?.layer?.layers?.[s],l=t.color??a?.color??f(this.dxfContext.colorIndex++,"point").color,c=l instanceof e?l.toRgba():Array.isArray(l)?l:this.dxfContext.intToRGB(Number(l??0));this.dxfContext.pointFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[o,n]},properties:{...t}}),this.dxfContext.renderer_Object_Point[s]={value:s,symbol:{type:"simple-marker",style:i,size:this.dxfContext.dxf.header?.$PDSIZE||5,color:c}}}async processInsert(e){const t={...e};t.xScale=e.xScale??1,t.yScale=e.yScale??1,t.zScale=e.zScale??1,t.rotation=e.rotation??0,await this.processInsertFunction(t)}pointToGeoJSON(){const e={type:"FeatureCollection",features:this.dxfContext.pointFeatures},t=new Blob([JSON.stringify(e)],{type:"application/json"}),o=URL.createObjectURL(t),n=new s({url:o,id:`dxf-points-${this.dxfContext.sanitizedFileName}-${(new Date).getTime()}`,title:`${this.dxfContext.fileName} - Points`,labelsVisible:!0,renderer:{type:"unique-value",field:"layer",defaultSymbol:{type:"simple-marker",style:"circle",color:f(this.dxfContext.colorIndex++,"point").color,size:6},uniqueValueInfos:Object.values(this.dxfContext.renderer_Object_Point).map((e=>({value:e.value,symbol:{type:"simple-marker",style:"circle",size:e.symbol?.size||6,color:e.symbol.color??f(this.dxfContext.colorIndex++,"point").color}})))}});this.dxfContext.subLayers.push(n)}_createInsertPointFeature(e,t,o,n,r){this.dxfContext.pointFeatures.push({type:"Feature",geometry:{type:"Point",coordinates:[n,r]},properties:{layer:e.layer||"default",type:"INSERT",blockName:e.name,rotation:o,blockType:t?.name??e.name,color:e.color??this.dxfContext.dxf.tables?.layer?.layers?.[e.layer]?.color??f(this.dxfContext.colorIndex++,"polyline").color,text:t?.name??e.name}})}_createLayerSymbol(e,t){return{value:e,symbol:{type:"simple-marker",style:"circle",size:5,color:this.dxfContext.intToRGB(this.dxfContext.dxf.tables?.layer?.layers?.[t.layer]?.color??0)}}}_normalizeBlockEntities(e){const t=e.entities;return Array.isArray(t)?t:void 0===t?[]:"function"==typeof t[Symbol.iterator]?Array.from(t):Array.isArray(t.entities)?t.entities:"object"==typeof t&&void 0!==t?Object.values(t):[]}async _processBlockEntities(e,t,o,n,r){const i=this._normalizeBlockEntities(e);if(0!==i.length)for(const e of i){if(!e||"object"!=typeof e)continue;const i=e.type;if("BLOCK"===i||"ENDBLK"===i)continue;const s=JSON.parse(JSON.stringify(e));if(s.layer=e.layer&&"0"!==e.layer?e.layer:String(t.layer),0===e.color)s.color=t.color;else if(256===e.color||void 0===e.color){const e=this.dxfContext.dxf.tables?.layer?.layers?.[String(t.layer)];s.color=e?.color}try{this._transformEntityGeometry(s,n,o,r),this._adjustEntityAttributes(s,n,o,t.name),await this.dxfContext.dxfEntities([s])}catch{continue}}}_transformEntityGeometry(e,t,o,n){const r=o*Math.PI/180,i=(e,o)=>({x:e*t.x*Math.cos(r)-o*t.y*Math.sin(r)+n.x,y:e*t.x*Math.sin(r)+o*t.y*Math.cos(r)+n.y});e.vertices&&(e.vertices=e.vertices.map((e=>{const t=i(e.x,e.y);return{x:t.x,y:t.y,bulge:e.bulge}}))),e.center&&(e.center=i(e.center.x,e.center.y)),e.position&&(e.position=i(e.position.x,e.position.y))}_adjustEntityAttributes(e,t,o,n){e.radius&&(e.radius*=Math.max(t.x,t.y)),e.height&&(e.height*=t.y),void 0!==e.rotation&&(e.rotation=(e.rotation+o)%360),e.blockName=String(n)}}export function mapDXFLineTypeToEsri(e,t){if(!e)return"solid";const o=e.toUpperCase(),n=function(e,t){if(!e)return;const o=e.toUpperCase().trim(),n={BYLAYER:"solid",BYBLOCK:"solid",CONTINUOUS:"solid",HIDDEN:"dash",DASHED:"dash",DASHEDX2:"dash",DASHED2:"dash",CENTER:"dash-dot",CENTERX2:"dash-dot",CENTER2:"dash-dot",DASHDOT:"dash-dot",DOTTED:"dot",DIVIDE:"short-dash",DIVIDEX2:"short-dash-dot",DIVIDE2:"short-dash-dot"};if(n[o])return n[o];if(t?.length){const e=Math.abs(t[0]??0),o=Math.abs(t[1]??0);if(2===t.length)return e<8&&o<6?"short-dash":e>=8&&e<=15&&o>=6&&o<=15?"dash":"long-dash";if(4===t.length)return e<6&&o<6?"short-dash-dot":e>=6&&e<=15&&o>=6&&o<=15?"dash-dot":"long-dash-dot"}return}(o,t?.pattern?.map((e=>parseFloat(e))));if(n)return n;const r=function(e){const t=e.toUpperCase();return t.includes("LONG")?"long-dash":t.includes("DOUBLE")?"long-dash-dot":t.includes("PHANTOM")?"dash-dot":void 0}(o);if(r)return r;const i=function(e){if(e?.pattern&&Array.isArray(e.pattern)){const t=e.pattern,o=t.some((e=>parseFloat(e)>.2)),n=t.some((e=>0===parseFloat(e)));return o&&!n?"dash":!o&&n?"dot":o&&n?"dash-dot":"solid"}return}(t);return i||"solid"}export class DxfEntityProcessor{dxfContext;entityHandlers;constructor(e,t,o={}){const n={dxf:{header:{},tables:{viewPort:{handle:"",ownerHandle:"",viewPorts:[]},lineType:{handle:"",ownerHandle:"",lineTypes:{}},layer:{handle:"",ownerHandle:"",layers:{}}},entities:[],blocks:{}},renderer_Object_Point:{},renderer_Object_Line:{},renderer_Object_Polygon:{},mapSR:t,sourceSR:e,targetSR:102100===t.wkid?t:r.WebMercator,subLayers:[],pointFeatures:[],lineFeatures:[],polygonFeatures:[],textFeatures:[],async dxfEntities(){},convertToSpatialReference:async()=>[0,0],projectMany:async()=>[],intToRGB:m,colorIndex:0,...o};n.dxfToGeoJsonLineMapper=new DxfToGeoJsonLineMapper(n),n.dxfToFeatureLayerPolygonMapper=new DxfToFeatureLayerPolygonMapper(n),n.dxfToGeoJsonTextMapper=new DxfToGeoJsonTextMapper(n),n.dxfToGeoJsonInsertBlockMapper=new DxfToGeoJsonInsertBlockMapper(n),this.dxfContext=n,this.dxfContext.convertToSpatialReference=(e,t)=>this.convertToSpatialReference(e,t),this.dxfContext.projectMany=e=>this.projectMany(e),this.dxfContext.dxfEntities=async e=>this.process(e),this.entityHandlers={POINT:e=>this.dxfContext.dxfToGeoJsonInsertBlockMapper.processPoint(e),INSERT:e=>this.dxfContext.dxfToGeoJsonInsertBlockMapper.processInsert(e),LINE:async e=>{e.vertices?.length>=2&&await this.dxfContext.dxfToGeoJsonLineMapper.processLine(e)},ARC:async e=>{e.center&&void 0!==e.radius&&await this.dxfContext.dxfToGeoJsonLineMapper.processArc(e)},LWPOLYLINE:async e=>{Array.isArray(e.vertices)&&await this.dxfContext.dxfToGeoJsonLineMapper.processLWPolyline(e)},POLYLINE:async e=>{Array.isArray(e.vertices)&&await this.dxfContext.dxfToGeoJsonLineMapper.processPolyline(e)},SOLID:async e=>{e.points.length>=3&&await this.dxfContext.dxfToFeatureLayerPolygonMapper.processSolid(e)},CIRCLE:async e=>{e.center&&e.radius&&await this.dxfContext.dxfToFeatureLayerPolygonMapper.processCircle(e)},TEXT:e=>this.dxfContext.dxfToGeoJsonTextMapper.processText(e),MTEXT:async e=>{e.position&&await this.dxfContext.dxfToGeoJsonTextMapper.processMText(e)},ATTDEF:async e=>{e.startPoint&&await this.dxfContext.dxfToGeoJsonTextMapper.processAttDef(e)}}}getContext(){return this.dxfContext}async convertToSpatialReference(e,t){const n=new o({x:e,y:t,spatialReference:this.dxfContext.sourceSR}),[r]=await y([n],this.dxfContext.targetSR);return r?[r.longitude??0,r.latitude??0]:[0,0]}async projectMany(e){return(await y(e,this.dxfContext.targetSR)).map(((t,o)=>{const n=e[o];return[t?.longitude??n.x,t?.latitude??n.y]}))}async process(e){const t=Array.isArray(e)?e:[e];for(const e of t){if(!e||"BLOCK"===e.type||"ENDBLK"===e.type)continue;const t=this.entityHandlers[e.type];t&&await t(e)}}async processAll(){if(this.dxfContext.dxf.entities?.length>0){const e=50;for(let t=0;t<this.dxfContext.dxf.entities.length;t+=e){const o=this.dxfContext.dxf.entities.slice(t,t+e);await p(),await this.process(o)}}return await Promise.all([this.dxfContext.polygonFeatures.length>0&&this.dxfContext.dxfToFeatureLayerPolygonMapper.polygonToFeatureLayer(),this.dxfContext.lineFeatures.length>0&&this.dxfContext.dxfToGeoJsonLineMapper.lineToGeoJSON(),this.dxfContext.pointFeatures.length>0&&this.dxfContext.dxfToGeoJsonInsertBlockMapper.pointToGeoJSON(),this.dxfContext.textFeatures.length>0&&this.dxfContext.dxfToGeoJsonTextMapper.AnnotationToGeoJSON()].filter(Boolean)),this.dxfContext.subLayers}}
@@ -4,7 +4,7 @@ import type FeatureLayer from "@arcgis/core/layers/FeatureLayer";
4
4
  import type GeoJSONLayer from "@arcgis/core/layers/GeoJSONLayer";
5
5
  import type GraphicsLayer from "@arcgis/core/layers/GraphicsLayer";
6
6
  import type { IEntity, IPolylineEntity, ILwpolylineEntity, ILineEntity } from "dxf-parser";
7
- import type { DxfToGeoJsonLineMapper, DxfToGeoJsonPolygonMapper, DxfToGeoJsonTextMapper, DxfToGeoJsonInsertBlockMapper } from "./_dxfConverters";
7
+ import type { DxfToGeoJsonLineMapper, DxfToFeatureLayerPolygonMapper, DxfToGeoJsonTextMapper, DxfToGeoJsonInsertBlockMapper } from "./_dxfConverters";
8
8
  /**
9
9
  * A single coordinate point in 2D or 3D space.
10
10
  */
@@ -814,6 +814,10 @@ export interface IDxfJsonComponentContext {
814
814
  * Renderer for polygon features.
815
815
  */
816
816
  renderer_Object_Polygon: RendererObjectPolygon;
817
+ /**
818
+ * The spatial reference used for map display.
819
+ */
820
+ mapSR: SpatialReference;
817
821
  /**
818
822
  * Source spatial reference.
819
823
  */
@@ -833,7 +837,7 @@ export interface IDxfJsonComponentContext {
833
837
  /**
834
838
  * DxfContext responsible for polygon entity processing.
835
839
  */
836
- dxfToGeoJsonPolygonMapper: DxfToGeoJsonPolygonMapper;
840
+ dxfToFeatureLayerPolygonMapper: DxfToFeatureLayerPolygonMapper;
837
841
  /**
838
842
  * DxfContext responsible for text entity processing.
839
843
  */
@@ -1 +1 @@
1
- window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA7V9aXMbybHtf5G+2n7XHr/l+hvFRaKHEGkCksb3hYPRBIpgjxrdmO4GRfrF/e8vqtdasjJPFTAfHGMRec7Jylq69vq//+9dq17bd397d7Zeq6a5UGWuNpd1XdXv/vBun7XP7/72bldtDoVq/odn8qfndle8+8O773m5efe3v/zh3fo5Lza1Kt/97f8ixOsiaxqSWJD681/+z3//67//MGvU28NOlW3IcfNnzGmacHLYImToQ44u8qbJy63gr2kV5TZN73pv0cuaobTcHtrbp/us3CohOY5hVIqCIm6iXBFI3E3auiqf8q2fkv7vkOPnDkVetqp+ytYzyzlF9j//F+PGS1bn2aPhSP+fP/7ZJvnpL1ZiNlmbvaOdfLhXRdbmVdk853s/uRr5YNlASY8mDSv8lVZ4ytZtVb9RkZHoB6gXMSPqtcpaNXM/Hcp1Bxe5e6RN/b/+amUGHRujcAgabl7bBca0vKurvarbXDUpOjOa0zvP6k1eZkXeGnnRvu1pfsPaIf2P//zff/6fZh58VJUmeMwaFadBAyU5k2L1tleAkAuRJJ7qanfZ1PnZPidTxJYyGuwVtFmtrZK1KChbpB9WuuZdvraqbPKqDNV42wpqSELEY5tPEnM6up3/g01/pbL2UKulatu83DYxIg5UlFqun9Uui1HoESLxhILqPBsvrN53mGSxCI179aRqVa5VpMSE8xXsLsz64/VyqeqXfK2gYswgwP4MoGgVDE4R9sYuNAwMydREj7hstzKlbbP1s+6zhfJgMsBCTvDZEZ75QtRO/Car6/KpYgJFEWsIV+5nSygvKAmsgrUVFRnn22Dwm/bsB+E822ePeZHbnltZaJpg3WmS042GRctoOCVuXZUvqg4Vt+FXyM2Pqtqptn67qupdZhCq8rBz6GxTm90sbOeqKC76Lnwg1SPjaMll+sXr06q6yd5UPdXL5nbfZbgswIA5zavt5jFdlEOzqnW1O29ecB3LXmJePmd79ZQXKorfRUkqv9wsf4kSMAAc983++2t6jnBo9otexeSHac2zxueFj+EVovLBMud4v+yLKtvoGgtzexCOf5nv9oVavu0eq4Ic0YyspqE0jrm6vry5ePh8trh8uL/8ePlLcAw+FUsHwIy8t0OTqMdTn1S2UXUj0hMYbmzfvKyqud8e/OyN7I49M+LqLOfswZhne4Z5Q7S6Ij0FYjSeqEZWFCFRjMpWtRfqKTsUrVsoAwIugOH+vis+qddVN3g9rwpzijBA7iF49vjwUCBGo6CaVVGERDEq+6xu1M+Lm/Oq6ob3rZI1CAygAOaxbc7wNmOTHVWDSRSmElGbSRQ7P3PevIisnRXL8nH/CrB83L+yLNPHEOCabFlG/QUEyLQZw3OYQhmV5TSM0XktmtcoBRcgckcUJRfADrUGFwIjl+FXaOTiMVlD5JGJZLQHx4MJMnh1WLFh65Vq18/djKXaDEC56zorBcGsZjdGw1VMc473rlaNKlvdrTlr2zp/PLRIvEgY2xM8v72/fOh6YsEO1Uhu2DIdqVo1VfGinFAGC/dITsPYpsQrmAHqyZJvMOts/5yvAbbBEql+N3kTmjwwLGKqoc1IVcWOMchOVkltFlEtXQWweuZFq+rzIjs0zKStJWEg2EJc1W0M72zPNycd4rza7bNaXQ2lgRwuEXFxYOLgaWzo1CZfW4uMvMwEkAR0mi/yWmGJsKxpaqK0L7OX0Eq/qTCZxZR7gpsq/DM3L+au61OfeNJ395MueK2Eyqr5QtRkVV2q9vJFla1cS23qHgSU96WKaQpsEXQiP7i0Fgg5sYomxp1btHOZI9brHNO4UJFqWOt5V+0P+/OqbPV2onE4d14VhVujJXWBCMu46lCvhb5lbxOTafcq23g9KYbah0FbRC4ur86+3KyWUn8nrDIyML0gvS4fCBbdrwireVRIx4OMZahohKT5LSWB5EEiZOEIs8fUMkIHHT50kG913srzxaSaCY2oRx+yBqpL2i6qESTYyWZwZhf07KbQ3BxCtUSCFg1H2t6JI7pc0ImM/Wy1tcp2Qo51NlG55bCS0etZGQ06YJ1hTLAIHThIuSo20mYJ2wgLU4DXjpPNy8k4kbIsoVBxUuiISBWbVC00P8jvfSBbSFsodwQVK5NoFUDbzrLBFokfze0RsBsae+N79ZQoc6+eovt36WkT6Pgi84+Dqt/65hHYsRGwhoqNqOSmNiSGOeGkE9iOHL3FmdxWyVO+tzFD5/XP//nXn/7jr0d6+94BIdxUoYtQseCInr2tNkJpANoaofxlOlmuWfRWdqaL5XHzYu60hLsx1PKb2gMa8PZJfzG+5e3zWb3ONuqXe7VVrzLt+xAulK+TvZnMaDEKHFJkt84O7PJm2e6LioymByrHXvzIR43YTQ1ohO5GQ5ogssIiTwz1dsi3yCJGvzbNYb+vuj125EGUzevTeb8AZm36sErRQPFgG0M14+L16bJs8/btrq70ybLgBGNAw8dz5azbJ/dRVX9vqvK6bFTdfiiq9fdFtt+reOEwFerDTV6qY8VnDlT1riretlV5rLBFg2qv1Gt7rPDMwanusv3FL1c6OvpD1e8mCc4CBVQpDv7Ixeb1aVxzQGrLZAtVln472FVeFMv2raAXKWh2BymtVnw9u7m+eLi6vrl5WK7+eXMZnqyj5Tw8M1W3UXX+os7Ksmq7r84iL5frjNnyQEuGaJhFx7xsV9X9xw+RSiOMYd5lunORr8eSE6ngwnmltFJuqcmF3FK8bqq7rG1VzWyDCmoZYF5l9GiwjldyCBi1Uu8LKPJ/U3ULUvMJEDXt4O2hLfIyWc+g4PZOZWXe5v8edpJ+yzftc6QgwSA2hNdT9wRoCWdjtN/QfW/DnaEA+QgU9uL3nYoU9h4p0OvPmF6irkpwCiWsF6ASHLircvNwCS7XAQVyp/3GyYkW2ya/Pmv1xtPE3LHQrIweGnaHpOI1JigrcPH6xJ8dCdEPQIncKhXdRNRrfHaHiFjxbsdrvFQHk4mbxFwxwLKI/mgcJTQT8GJ5qfrC2I0zN2qToOdxiJJ2jyRGiDhP7dD/2FfFW3GKdAWYWPmFHhqkNg4GmBW5O1EKaR5WuitS8V+JAcdTT4lPT5HPwUp+zdWPu6pOaJdGJESfWJEtOCekK4bTZwQ1JiRHf68DWat6GG5flm0dX7gpEnbOaR4vdh2+vy9vP0eLUiSy6CKrv6u6R1z8cpWo6rBwsrrUDntK9abdaEEHj+Tl7eOvat3eWP3+wBieyMQZLY3jbYTT54sVpHp+omJX3I7R7AjkLZAP2/3r5eu+Ch4WnuQmQ2ic8XH/OizDi3tSCAUPzRWOj3e/PHwGZloM+g7BzK18jST8ytPpObdy3J20qi4LxR5RJwRoBmbk+njIi83H/euqzszBnqxkAVEBp4ZEqhAVhJT6lr3tU4VGLCPTX3b0cf96Ua0PsRnkgRmhrWo/aqB4JI7QcbGiTBfhC9Ws63xvr9+gYi4DJnm9SVS63mACn7MdMPtDSmgoJrLKk0U0lJtaUnXezUQlFjgKz88s6YOV0xy91NpbxlCL39cAfZTeGcmG0mJLOHA2Kdl0bYc0Q2ZYQok422zmO0HgL5epQjFwX6/Z+LLUH5kNOA9gaZIcrOpqdXb+aXH5efWw+ufd5cPl/f3tvXD+nVQO83DfQzNGYkEx9SwkU7s2qlCtOqPKCaDiobnFkGa208N857AHoEYycC1Hz2GgLje53iQfpRpkiVKOiyuBZ9TM63muuLO8lJQLZtuT4Ui+uX/jyr2QkWxewkBsMh7QJRd5GV3UJXfLzoCzb7iKigIJjYmDoM1FgtbGHXOjoS+CQL+Vli2W3rcy2+XrrpVeqDbTdPeq2VcldxSQ1uO42FGTqoatH2qjbyTCZtVtbYqD0+y/8doS6yLYag6aaTnUa1tn67afUs5boOmwlTy80Fkcbmy5qLMfd3Ve1dzdlLRigIVttbb9zaDwaqFnj20M7X28V82hAGYcfRGLgN9SpXuEcHJsYywt1ws9q3aTfweqmcNvYPn91kU1zMHES8xYtObq/jJWcx0tioSfZPmaFYf4sA04dh5YjwPy3TGR8ykAwZvsURXn+qOSqjczAHLjBF2q2IiPkDoqcRZJhOjHujowN0Fjoh0JINpPVAOXqvKyDg0r/Fb3I9QL9ZTrvR3cltiQqs8hSaLtL6EUann/YLaL3ZJKFwW7dSQmnv2G0QZLU93n14tuxi9ZzkFDet10+BGKDh7QXFZFvvE/N5CehUW1lm1dfVepajMa0esCoTfNNHrje/CGcUbTZwB09ZJRj7TPLkCSNlhU09+Ss7rO6EvauU94h4L4r8v9gV9Zovg7FMTffXubaIEeJino/Y7LnkVtmEsZA0oEPEGxK0FHynYckrbZxYjRM3ExGvFZ56NBPat1S1C08KDm1MIl6E3YGK2+fUtV69GoXmogoyI4N2cJSjNYUrvL13od1twXkNzuS1ySL+7GiGRHWCLMi7nPc6QXASLMi5Nki0AleTKXpWQPAhTy9oX4KdvUuVpWKdQbp8RkB5xZkZQp2fS5WEEtlFJaEHGjS204vYGEnvDxFYn3vQfsZfxDnfLLE5Fa0KHk4NslmBiuQQyzMQkTaCvY+d58F67WMk3APKc4rZUEizMs4L5SM9shxxCCIvxpUzM87vbcMTDkzls6GltVqjprlbk3g6B5b9mFikQPoM+QD2SzCRdLZt+xxcPNYMxKQm54nmEnP6azsjA3fO9Mlhe6T1RtiGpl/AhlMEnWf35NqjAt8Yn99LZXdZGX3333pp8g5wiisbzMRAFKu8RMRkKGELRotlyXL1mRb273uiLkVRm4H5I0g6IhCIyRoQUAWXdF87pVO/rKivEXzG2Ppn8JZiKh2czcM/c7UMtkE4NpyO7A0PV4l+2JbzvJ6prz3FX1fZfV5B5Kk3MwY7mYm38NKvnW38nGvlWXY/Nv1KUZA5eF+4T8JeGzmXM9GEtJXAzmsgZu06JpmWu0HN6PqlpXG3pJ2mAczXiuujqUsJOONct8k5XbQ7ZV96rprgwid98Y3J69wG4+uSBSm8Yyb3fDt1S0DEuWcYHX9QVazxeqPEhcqjyIHNoe4NH/ZLmEm8lIYuAuMkeFvpyJJA9fKeVwLg+PRUxR8uxZ9tAojqTmRonObopfm46N3BQ6XY7QFdC/N9ToUeMfCEts2ymnYHRogiKysNO/Gb6BTFoMCygNJKPru0kaFrC63tl+X7x115dUA4LKdI/dh3EnDHqLVWV7z9BbCIb512jHf2V9JvJQKpSuWUxuTiB7nBfI1lmCgnOZHE5KP3rBVOTBzIe83IrxMm2wYNGsXpQsYk7Graz6EEtebpdrVSrRfdIYa4YO7XNV5+VWP+nZv2LQ3fkgJIsW5MjYrek+Trfmp/Jh5GJLoxBvUB3KCeKtCcvr82e1/v5YvSZ5IPDJrqRnf0SO96ZHqGACerqjW8w7QsniwCS/5bW6qrNdWgkO8GDS4ZZUEgNbU5Nm7MahTZNpj7WyshobVEsQdcVpic+XX6X21zTBdqWSnG5SLFpGw945Vq27TqGu+BH0LoyPybyJTZ8gqbjYUKboCQFGw00MKQNo2/cg6F02CToTjiO/y3RNFls9UsDCCllT7bK85DJkMgA3g2/UpttbQjF73s/kFJDfRj3aJ0hI5DOI79Ua5DaELzbPSr+nsImMEIHjZO6zchubCQ4GCxH5/SAjI+0TmC2p7QFhXmwngD42MXRxuPJuW2FtT4jZC7VDzovZDbXeSZ4k4iLZVkdvnD0vqsPmQ9521xYjXS9XkWPB1O9Ve6jL47RdDky5ax+OE3YoMF1K0iz3QbWgEFEFLgv1Ak1T+YZQReD4jcQQ7KIglZryJa+rUi/+cEmxrbCvmA7s2zeVtc9SMXDpPSj/ESuq+kO2/r7t5vgjlXwwv0AdiJakwwfQeTR0u00Lm4vkv2x5mabiIjmVZVn9SFNxkazKobzJt896p0ekiA0UNBLj5SI5la953R6yIi01BJifDKSrjNnGOApsRfF30JKpYOgZzz1yMisY7nAGhF+snG/VZ5pG0hbbRsKruNlNCyHy9ENVcppiUwL5b3otFdFtf2+ZsGBgklkIccGAedXXY7YQ7ILBuBdA6B64ZjGRBmYyPHpBL/gIp5yEwSgmAR5vwP2RmlWi3hjjvB5/xxz22TxfJ8IQtf/mBztAIwix4Zl+QVwYm5kmWACqemdcX9LfiSYExNQI4vlOUL37kNV6G8hynZWlqoGJIk82wCAJn1e7x+pD9Zoi6WElsYusVfoSq7t8/T0tlQEGSfjydV+rpoHmLT1NHyzJ9duEkkqPC5WkumPNaVIuVJJKCB0asPtsk1cfDm1blU1KsSDxoqix/SQtggEGSXj5I2/XzynpdJCSkD4Ec1arLEXKwyJiiQ2JC+W/efrtmeXtZ6nP4ZpBH4Awt5sIj17Q8xPR3c3CJ2AywWZT9LYkIfYW6QzgMteE8NPbFrkL4yQWh6LNu9s0I7y3QeKsWQTzHUbanVGNop0QErG+jTySeYSgWUn2xoI5KI1RTdtgXy/IjhwK3A72/dM47CjJ0vFx8ljJgGAiPo4dNn1U1f1yCbRgphXagNHMRPmxyHkxt/Ui5lJs10MzJwGvgelMgzLIHtrm1wPCWTnzeSA+H3UXSsxGywiOB8VLxcSgZpXc4yi7bKuWqn7J1+LwnbSFEiKouOmhhRB54nL3vNzeHwqhGaW5PQI8ll+VPpIaE1EHER3XoCKXVlcUd8g71tSqrT7at1mo5llMN22NpVlS8tIbEMOccNPZqh2XsOFnLCUel+f6SBfgdZz7eXEjRd40gZykOV1HLVpGw3HYuauK8ZuwxNbYszbrn8GW+62Uho9ndzf0d2ZqEBA0Uo9gABQX5BbnCMFFeLezvRw4LrjK0wCUmgdnh5P9DGjMrA2lGaQBtO/V5tB1Ec6LQyOu7TPqFFGM/lJBKyaIBxaVOGt7+6LqOne3fEK6LpzT+nuVl92hGrvCxSkGSPj9MUwLhGjKDZOvp6cu08qyB+e0buuNqj+8nRfZoUmIpgfntP5xUPXb0RkYYhE3rKVF04LyGrrOHpMyioFTPDqUkVEcy1T/CMTwvECCaoiG/YYFkmlMGcifZmneYPryjLvQg9MT7HfLREuSbsMblToKLAnq9i86aSZIElip3b6qs+JLmbfRQhRYXt+TOrSRB6qKqtpdPj2pdTs+pQsU8o4+AGX3mxSHOlWMQrJatd5KUqqmSVRk8PxetLKts6ZNUw2j2QajrvbL52xT/UhT5fDsvGmdvTX6Rdw0WQbOqX46qHt9BjdRlYHz28315eppkiGs2DECx2hzVwgZlN3us7V+ATMpKUEwu3NON93JGRZGs5q6YF0o/Zqb3nPQYWHFAJbVU/s8S0wgDWWHnYyQ+9npP9gSvd9BIELGUCOU/HZmoijDhPyH1yZFPuw3aput39xjz4hKEIhJTjcNZUW8bAgsSRuz+x0uuCIwC7oQZvFoq9pAUoLsLkRcmkLd/hXyuDujKCymzZyGNbsqssj24MICYQn15lgFt/2hRGRhZ8JyoTY5NbVnJ8cyQtfr6vEuQyEZNrkLZJfXA84LEmxy3PhUTZav/fUWOz6WEZbTAV7PdZuaVXJcv92rUl8UpVp6MtVKAm0MJUXScZMUkII88JPotZfhBHqmaPI8IN+lI6VCNHxHj0ue8R2BFeXh6XygSoooYQkFlFVwY0mJyMJOMeluexL21Fo2+K5ieZ7OJrZA0tazTOjwOtQTQmwzY722QMAMbZdKYbbNVvCA/E6iPbg51BZxcbJGxEoNJRW1QhMopYAONOOr93Sqzb1aV/WmiZWh0ZwecCTdlsAOpOt37aZyHuxX28w+SOpPd+U9QsGyl8j7Luxw+Vywe2oLWBi2kzrPy8OHXDkI1BJimm72s7IRPjmN/fgwFpdgwwRKoHUvkJAqk9vDsROP+iLbD7XKvkeq+EBMpqFDBWo1TBT9w73piaPRomCKDEx+n+2E6/t88hEjki/bKpp8xIjkX8r8t4Pq2lqdWuEb7QtReHauV2XtLtsnlDQCKe6F7jqFxxVwkQdz4ip/VZtl/m91Vmz1A6XPwsaogA80DeaCSckPWALiLgEo+/HDUWF38Jjocl9k7XGh9ilA6bZW7fr5qDQTHJi4UR2PciDAwzpRq021y8usXCdpB+Dy/tfoEh1Tju+Hy2EjPx8ujF1o6B4RSgiZD+Rl/g3sInEE/g3tHtF2kbQIZeSHz4SwO0GGZfqEiFNQVqrOymaf6cnLt8jYU1BUKjJwFJSTMhqH7psYIUVBQamrutot27ekmiLRgC505w7SZCcoKBVZWggkKHRcNNEg9lvtu9mcBMEAmhXMm0NWfM3qXG8Ti/xA0GBOzhvYBScK+PEg9Jqrrjj5U97fNLlQ7XPFXz3gD9gCaHEaJNuWeXvYKHF7lCVJwiQtutspi9E4SS1OI5UZC5eLEBWGvkaEgoOQFPz6IGv4mHgVLDU0Tl7ZgO4ET7gLHL372qGW7rq2XN9nbZ7Nz65zCSBMsWSwGl5iKBlA201Y95CNmCm2FZacELOXEoecF3P9l69yjr69Gbuw2aLlr2Um94mMkOAEtMVJAMUtHXEKv6LkzWAibO+wyG0MO3++PDzqhgc6AUvaonnMqRCZTQgh8s4FeB3glOKgD0SEsarjWsZEF65Inogs7Kape5KXS8pkgG3rrvR6qOD4TDmbsxPAWVFU0iUmBqthz9JeL6jkc8QmwqP+Q/+k37u/vduofa3WeuHxHaWHfqoIYeETZWyifG3rw2Z4dvqnC6S6zHIhMLvuPz21HatGIvktBtLyucleyWvm1+vxbftY30kkv7v6UU2phWU8FCsxPTceo+CAUIG4cJFIdtdH1qo6z/AqagL47STNc3SQXBC7o+TxV7Vu08IUwLJyh1a+o8aUmO3ZyfKsfU5LA4lkpfK1Pmc1twa4FIUEpBZZ/V3VaWIuVlz2iC5sHoqX6K4yShDxcPxCRv/M5NzswUo0FBEza0O0nAuWFzgSCiAFlIXmxjBSyAbKQknlnIayYt/1WuDlZquEmXZTxcaw9PpRpkh2C8KS65n21N5ZCMwKGjWOn/E1hRwQIgDu/SVU4O2+MzZSAyHXdxGmfYFIJCaVoCGRf9Vvkq+z4vbpqZEuIDYYfZi4VcbmNmYjzQHFaChNdhIVjmYMVTOPscf85QIhNW0xXvfbx/GS37sgL7+Tnas/0QrB+WROBZkgp0o3R497H+c27685QbHyZ/Kt+YlVYNaenp4g2Ny6NxOGqEMzk519cF5vZnMh4oQkSvwrxNnq34VJyJnTsGanH/WOA73VmssqwwTLLZLTyzCTltFwZr5WeaE20x5d8HwcD8ISBep6yeSlozyjQhFz/2AYgIcg8iZCRhL2hko2fjYyZI4nOeqUZFAO9MNNrPfArp04+s3cQGLEx3onuvBbvP+y+kZ634ROmJQJhCXkMqvgek+JyMJumnL1g7hB2U6NaQOl4zzbqToT3LdYZwS/DYX0lqfm3Hei8U09Lti36GcD7GDDfl8MW0Pu6mqvO8nSuNBQCKK5EH2oqu+7rBbeSjZUTAA7nZ2t8yJv37qCJe+nMhRIJCtVVHp/kvw4niliY9h5dH3JUFYsW/GjbfC7IHbmWb2oIj5OPoyfc953aY6ScEGCAHhXmi0A35J2V6tGlfPeGUjABbFTc9oTmHmy5qeqWhWfsx6KlSjE6xNN6gK4LVFfs9YZ4vXJhghbZdfqvCqf8u2hjstMGsputWy7puSzan9UEY2cD+NEqM8AQx78KARI+eknkliafvqWb7aqxT8thj04bOzBwaGYwe2BmFHej85AGOYZ3KY9O9D7ph67HWD8t3wygb7mn5S+8kzf6FdAtX9mJ5BCUSGcZxWYxDA52kG4uM+cBJDP185EztlZwcZIuYt0w10zeAwEZa9NbcKEvAX7956EkBxbZrFaJqTChAld5SvxIQrTBAr9tyvEZ5PVQLDRIJ2VmMEh1LeFHIlFbCRITs9hk5bR8B0Gdoc5Vqjb2K4wl5wX6/y3L/kst4dsq8bl08ZPg2cCJYAh7nZNkcSC1J//8n841+ehHRkuQG5m4PO9C+8f9Z0ZSl+MQKf/TdV3o4UT0g7/0OMfDEswsgTzGNMgc1DFDepkJoQTUeLiSWraZb1fUUCEiKIeutG2ByxVq1//JYp7SG5ExObRgMOzahLy/wbm3GCdmIGMPpafY/sTn6WTtE8Ryl2rWlb6Ok0iS7u/YxnXmd6r5lC0dNR6LtOOnSH5/PXs/vrs82omexkOhExck41N9JO56LZRrVq3N04C507gQGWaMZ3KrSLvcxlItm4T4WIXWbt+zsttr9PwVI4xw7zP6kaJSTSsuM33bAq9RtDpFe+y/b6vs1QZ6Uts93afvjLJL28D/MExxFsOgntsNULcnBTRUEyW9yrb3JbF23L9rHZZqp7NgqsfpxqrJjSImGjEN81xdEC+fcjLTV5uhzv6j3CFoxWdm3YuxTswQY+MgPtZOCLV0qaF4SPj5z+gHMxxf/PM/f3D8vzT5eLs4f7y7OLh9vPNP6mGPyRH4b2PgtlQOQTnVTG8MHO92xdww2TDEpqpkK5QnR1d3Cldya0wjP0FpFH2bKEEMwpeKn0FQdNutEZjsXEM68gt4/Lw6MHnkMeKMlRISqNbaCDCsX3VY4Xj9MDWNywHtcGjMbVRC9DAXoVtaZW508UoOWi2U3ZWrz9eLyNqegCArTdLYm69CIlBTti1woaYb5wjFRRzhGbFvWLbDKIkR4Yn5JJzuQUNButypEtY/bbBJ/UEnZwangQAKohrCdWMML1bEj16Xs8ubq4tGEpRE8vGAXWkKKa1UU/ZoWhdkqtMb0B647qPni5PxfYkx80rTGkZLLBS4tF5pWOko3md0jDYoBnicoO5Plj3b5uFPpgeeW8uTz9+OOSFHqucV7t9VaqyjfiWyVgsWyJc8DJMdiHWSyeTQ2ipI3yMZ3JPWWZHS+UpAgh/BQam7sKDhIJG46IKmSQdysaAdIxndA5aSLRQxXiDFyaaNbIgJQUqtgDN1/9ElB4CFFV0WNFQTlGisEN0Ns0wdJ40zhl83pThjSw1kWECP50ewe/iVaQziYMVyKeYIQtZr+Lb5OOa44SWONy2JLW/I2h4YdVfg033w6GM8Qau0aITEbX4yJY/ImPSqszJ/UE/O+uqe8IyXBkGA6jof1TVTrX1W/+oBsb53gP1En/983/+9af/MNcYV9V58+Kt4rDcDiTMvHzO9uopL1QsPwEMq/xys/wlVsDGhLjXzcuqGiol1er6s4OjDI3klnrHFCcKcnhGttVZifB3hizRlGcY3WTOkup8wvi0JUP1WjSviaENQNlp3vPlV7S36ZliR6rCAm7T7wsIknZr7xmDrSogizan9qM0QEwDACiyopgb35AY5IQd6wAEjHikI2j0vZKP5oIAhHIDFndzRRKPcs7OpavLs9WX+8uH89ubm8vz1fXt54ebs39e3j+s/nl3yU11ij5xxOzE58AcmTPp+RGZC3TsIyJOAcBaEeEC1ss0oSfzIbIy2kz2CSIos4kTRBEZbgtCmd4Jgq6EMx+dwMBcwCcuTNRptOM0NfyYsubJ24Rocbf4TupPgJmvDB9V9ffl7We01SPN0SEYJ+SWAFoIkLcLAAkAox7hQkS075fLiGB71misGRki1L6MrO0F2rPH44zpY5Xt4vLq7MvN6uHj5e3D/XL58GV1fXO9YrffkR4EeNg+xMc62z/n6wbOYdIey2NBystlWgrxwMlpEoHmdYwXWH5/vD+7+3R9vgQ7kCEPfBYhp6tDuYGy2DIE8zZA7meqTc6KudlomcL5xwqCOdaBjlKMEbrJvwfX8Gl2jZD2uw1bLBwCYLOGK8kSiWVwjzc1njFcFoMiVHl0RURhv1w65shuN1AZ2+JGACNKK+AG2l/oLreq39A8Js2hXBaE3GjTQoC8HWcSAEY6woXIaE/nt/GI+5CYqHOCgcgTgqArZA74oLhciHEHa7pduHxkA3dFOsdhlYmyVdtav+ig74CHiwWDwkoGJOsVDk4W98kpIgwOLSWpfqE19+fFDZo1nimUH4yAmwm+gCBph9szBmMMyMaNn35e3CBjJ1+XIGC7MT8vbiL2QFDWaBZG7HwgZWRtLy9Tt57A+tgOeQqJFyzME7SyojU1oZqe1XX29q3O9nu1oQINSLwPcoSWuI9Iz3sPi4lQWRcvZ7Fgwu7EbbzoxBAjGDwvmqrvE7LuHBVvPMzEYTBYxcTaImbdW2T786ps2jrLy5ZJjG0H1b0QtduyOtSckt2a2pZg68WqYR9Efdvp8q1ck6mTJQk43z4uoDM7i9jzOjQtkTszbVjDy5nJ7vJFAQGiNXoslxeL+JNAQTUs97sb0WO/3pZmiAFYMepPlNzVaqNvrQ3OYllyNFSazlrQh5wYnQVzrol4Olf90Jf1QcyjsUTa32LITe9ZtLM5QNxv+Y2gngDymHKR7bshKdpxoO3RSs9KEdWfkkI88JoEAoFXWdwLrBpbWKikix7ETCOMwIiBThASlfERQ56wIOgKXQJSxx0J7sQVhcgtzrg/6EBoke0/V62CVwtpe7Q4sFJEWaCkEA+8UkAg8JDjXoCZf3b38Pl2dYkuF4ZcIGjYSY6RJ64BoCFROR7XAAQEQVforPdA0u6fBD/krUBBKN6li3UK6+oF4ZGVJMIxuIFSmzyDWyffGCuonIhXNAgRUdgpCL45GmlMHI3u7V6Vy7ZW+mo8eBmXAUHRhkTdqHOisEN2LjAwMDcSnUJzp3uF9byoDhs0a0IIKF9kOTdTgnKYH3Z2hDBgXkT7gn2sHfSJnUFLwn11aOGxGmEM5T8r4mY9JSIK2xlOmEufZVBV/hQTIDBrQRew0nV/+2V1CXYDSWEHz/b/ok7Pp56ajzotT4lEno5PP4MOiqNVVLf12Q4OL2GNxZeV8QJMycjaTohne6l+SnrAXYAEA5qhaGLhLMUHSmkDpOCFdRj9ex8fWts5OinvKQZYDVm8QnWhtSxuYiVSOEoPWD4T5MKLaL6atBQqSInroEcVTrxkQuNhXJWnCy9MLg+PegY2aktrGIO15oCk18aGJVFvvJtPbVTsNY8xHsVf9uhRiB+hCHegy2kDbOhnKSW/Ij5RmiGueScRMeU1YkIvKIf5QeZF6nWkqC/JZRS9xgV1BC6dqTOK0bmDzSeG0HE1BvcKvu/YRJ/YGbTGNof9vqpDT/U8fO+ggbo7YB+0laNiKARvNgeIQ1CodQiB+XPGsjbHy1UOOQ5Efqe7w+e732GJyhi8JoJ3xkdnD+eBwC60YElN17F+8bkVu4tz9IbGnWTjaChjApKIJ+6t2hQCbCaTvEm9Rto74hbKDuj24UB+oHchp2i/F8lDwyXRHSZvQh5hUXLy5KJPgd0YwsHh0FDuYPKhOsPK4765b38MSK/ViQ1LiCAmMrITQnCCTkQ56YboabwcsX7JuVmS0RnbHmtI9aO2l5u8vcvqbIc1W46MQ8H1KrPRlHx7TNCZwbaEcw+ZdMI3FDzkQC/f+v0Oyu8l6lDTJ/nCZG/AHSg+7NEROCDpLZ0gyKSa1kQ8odJ8kzfMU5WktgmB0jq5pT9JjGqo6fJVeUZx9HCs/HGKVN/rCO1Qd8v24qmudhPU3jAdbtd8dY+GbeG6LwlQrHq78Ni32q5lkmq7hkrjj6fGu+ttukISau61Es/CRuWu2h/2K7XbF1mrgjcVh5LJocMRTO+8HNVrkWWZhi6oDLrkPUUdc/4+8eB9zIl7QiLujH3y4XpIGTzFgp+j51RjtrxrUMTUOGkOZ2bEpDgtBMj7uZo6xxrhAp69kVOrsg/oBMGXcmgKFLxVLgiBMhwQdDM9LAi64g6lvirdlsU0VSEElGRZzk1xUA7zwy7sIQxY1qJ9QYveN/UYkwWkORR/QcgNPi0EyNthJwFgzCNcgKN9BV9d6JliUQ4LeBH2BARJJ7KuMRpVWRaO5gKPpmuKRTMs4EXTExAknWi6xmg0ZdmIaEZ0NihrNKYRXQ1SRtb2gpu6TAPrYyvLFBLPacwTrL9jIE/kAF7OVhHV1rUFy1hYwi9hnoSk6pYu1xoOKKDMR9WM606VhyawLr9Q5YGIskY86N/AY0YmyRTHmcRncs8NlQcpNjYbfsyqPFy3aselUf8Op9Mm89PakdGsfpq1DZxuizk2/cvWuuOADkJnFBUJhzbod8/M6UTtJtFE4embTnmcQjFM4ZSxUzRB9rBSIE8iUmCYR+VPXEpMFV51aGPMVH2u2qtu1aGuq9pPk/UzlIYA4VjlbEKG3h1e3lV1mxVf6tx3cvoJPFfmEY3OzUQBSrstyJurQ1G8/eOQFflTrjYE8zwXOzMGYd7kqykFkyN0bZXkeRDGThsLW8z6p7ylzZNjXk/7bDgYuMEF0R2LBqaLO+UW7wfV1Lm++LEuM2LL3SRvmjF77oaFXb2Wy5AZVgzXdrgf/B8HRTV7E5tlx/D9JvD8RuDpLFyPF0h1kqt8118q1K4qfWEOVZYdEZ6ALdUPtfrtoJr2PFs/E5/oScg0wxJVqKx2WIkEWLwzhqn0W+U6K9GOCCkQTXu2z//esPXVsMKOf/b259VGbb5mxYHur5D0HpQ98+gaX1S7LKdHkZhaTwBoLrL9sPNCl7zr8qmKVvUpAN37rNymJtPAAkrHJi8+bcM26HilHgcouIHr14o4bjJcxPrQmfDNO8M/bh90r8rlI0IxUBrmXARcQjvpA56k8S4U660+ZzvvOjGSThtKlN3L8E3eKshNx1oiX+a7fYExm6ZApg9dhq7Z/aSKvSK64fN2Vs84ZhMeq+X2dCitMA+/k5eRpQolQS+n3C6pvvm9avZV2fBNAyg9csEueE/JpmgPJPww9Twr16oo9GH9cDkyjKDyQ5K6BcYkDQo4z4AOZnyfmyKWdo/3dqvquwpWV5+2M5dagnVnmj+9cf0ok3sCMH2zyeZb3j6fPVZ1u8y31kgA1HDwbM9NjyXCZUT/Cq4EFsXPZfWjHDZuz5SqPOwcQtfYVrBy8Fl3NboLUNlq09Eaxlyd7OZidYjGSW6+RnbUPoZTcG5U6brPGz1zljdtvgbkBIIjtK+6vn3Zdp3U4z2x6Y7w61PetNW2znZHuzQxHeHNTfaoiqM96ViO9eL4POppjvBD/7/j3ehYOC/GqmVfLxtSM6051g+HvNB3mXfXqNCXB9hfhI49iBL7n3MbdJ4VxWO2/s4KEfaARN12F6zZwyma3TAVia8XN3mplm+7x6rgeU1LgLYrGhivYQoRF2/bqkSpDWOAvDckrs+g6R1zeaQSmmyg6PmJBYJ8nHE8e2pVfbbZdEXsU1ZuCrPjTUpx0Ehh58sty1Ffb0lEr3VEC02gSLF7tateVGo0fTQu/0E9VbVKy0oSGyudnPQQHHeA7AeymuHOICYTl0IfiIvGpCoyPbE1A64UF3r7flXvMp55NhMJ86bVw5cvZS5QGoYiqdywYs1pbyX2GmYzkbDOfuTldlUJXy3DTqLUCzhqM5ypuFfNoeADSdgnSFh/8jbPS4I2GpG/ylWxacSOj22KEDdgyBowVIV66eYnhOMFNn8ABItRb0nQCshDEpdNnTsr+BTlaAXTXag2ywshFI6xSA73uKP62vCnIKbpv5pXXIFC51lH08t5SENAoeuNKlu9FQDSmK1B+q4unBEnmsMaDiRNKFXtCElvghgWpWeFWVn7ihVByb8xhSc/z/bZY17kYpMXAsWIga0rDQGFvMsBwgL0vQACcUK5o5Fxsveq6R5Eaj4cdNMVIesgRVn9MUYzyraFqMW+2WQl0X1U1U619ZvIaBqKpP22mE9C53Y2kwjNF53BsNIQUah8VrXupQGdacdWpvaeuEWTwiFF2VbtoJ6CaQiRVrt9Viuc27ZHJPQjeii9YYtQ36vNYY07b5sjAqtuSxFIbxpL5N0E912RrdVOGurapjLxm6r1JrDzWmUtMP1AAWCRC9W0dfUWoWIiRBlVbttncXg9m4mEeamyWlvyddWwIyn/0C/1dve77GulX+XbvLN03CsfSBHqQgfC6SrrliQOgs+TmURYVOusrfQsaa30evWqutF/0Z0x96ofQkdEx8kfI54qvTxst6ppE4RppCQLvlhnCUa9T2dJWQ8FSRqWMUCuq7D+n9QrsE1FYr3cI3ZeJiuRrmqyfL1Q7XMld7JcY4z8dq/qrgiA/Ja9JPE5e8m3nfX80qyoEwJJYv4DO2AJ5YCi6KHdH9q7/FUVYsIcW4kaeGmGEEEflCHkjNthYDESI0vpUwuhQ1ykjg/ARcSMsU1F4lo1qmyz0GWYlAAJkYTIXcIEe3hHMEHZtKq+GnYygd6HQJiYOF08m4mExrGO7rwAmoAwLkbyvhIG6a6xTE5vTSSpmQ2IIWJ/w2WYObCh0t+GO72IAwafAkAi+pMLDt0Je1jiU96u+vRLk8E0RBTqp2zQZQ7fHNsYfZUXRb8JYtm+CeWURIgyRb5RX/Mmfxzu6hCy3TMXBeaXedCiRSFEmS7J4jdhNpMIgXusLGb45ipTQh+/aFX9khXyoM+zluidK2/AdARRolyufvzlYu7cCTKuNUIvNRhgd16b7XWHSiTrrGS6Ju/m2N/EMbVtKhH3z8iD+eYaY+S6UHV1ur59/FWt+YjQEEzoW77ZqraBVSx7QKJrxfFQOeaAQGw9oiGi0NUSXudxbAHqYblBbCVtU4C4S6XYJTQN8Q03M+X8WGJgr41N+pM4D/bD2TS/ytvCDHpAkIa54taRgH7HTvhSz5HftoOOCYSo3dMeDjWnZB/5sC2FCzogNfS6jn7xv1nkrzlzfM+0giJG07rxsmjDGnasnnu7mdU/XmJT9f+wKZ3jJNdl3uZZkf9bF0V7idkNhWcKxYMRcIPiCwiSdngsY7b8CELc9nQP2k3m88UVSFfPEiUM1hVAHLusaoIZdxAjJ+QYB3wmzIFvWV3m5VY+ZsRpmyTxstLCGKqMrpnlRMy4hsDXpxjwpsF6cOWVuQmCQ8U3GEFZtu1wZXGfmBZFuKzuGEf4D9VccAL3/XjSCr/5J0geDPBAzoq5F6VUj40eWj4W6ktr7SR0k+AYQkm4nTDCR9cld4BsSeg/rGzOu/QDhmtbvmXt+vkyWz8jDanL74JFoWQRQKBrzFZZvVXBAZhLbUDEJZMJipLPCJx7+A6+3WmBaB0TLU7OdKnW45+rutrF6PlIcQZBn0JKkfKA4ljtWfk9Al7DgEjs626LhlcR/U+fq2EBvS/eLFBWbf701p8MieE3cQx9RZRhmXz+9x//zJFb590AWu/Am0PX1fs4xg7CkP6IpfyBEOoGMJpUg0Riu3eJMvvdSZv6WbH9No/02b3cwKO7jcz7EcN2/u5VtrktizexC+R+wQUg9EWHxd0vvCQe5ZzbiVmqmhheuuk3raDEmgB+fGxRuzCu9zJ+mi7UE/vxtwQMEPfhp6MikTNRsk+6z04Evykhr+Xl/tl25FDcLHtIyAIDa3tzyesmEBE1D4XK4AmKSkXWNPmW3Azgtz+Wigtk2jbX9Kx5K9fJQh2aUXvKi1bVf1/efk5IFQVmtLaqHS5lghVmCMSLu25geGYTlRCiIAOjmjexYZoQLCvdZonU4UbL4m9S2E0Q29NrnqtDsbl8XReHjYrObRLNqLUV+e0QVCwU282QFy2ilivkhYqJDlmcGG2AOV6PNzSja6b+0HpLcW7yJxMo/XlDX87l59fMa2OI3DI9brPme+h++/PqUHp7Ysb0dMAHwwRKD0lpRN9nDSs4sd+qal3pK2MCqekvcfvYWVG3+/XSE8uDbQ+l7uzi4v5yuXy4ur68uUhSeO9S9Hr+u6fL89v7y2OEbIKQTChoYy0UlLgYUrcTjpbCUkiUKrp8iJeMqDIxGHvTKCK5DbS1/hq4YPLy6uzLzWpJrUmjOiOHt0Bt9KzqajeeReyOIFLtEqrnkbGfF7wkunps6QtlElPmAulxP/X26GcE0bs2ItS4o7qkYmSN8vSwJcXhKIt9gVg/RAkqGBhpkBJoX4FCbiHZvRfMJ9xlj/2UhxrTcKUxP+pcW+p91vP+kP9b6Lp/MZUjwUMwlV7jPR68GS4Y0BusX3KmQZ0keDj25QU9sFsL1IMYB91JJhvb7Tw/MkAkR0KUBF+gUNG+RPvrBm28/a+7HrpUZTtynRe5/le+UdFBTOCEgnqUr4Egp/h6dPrgTBi2vp8uBwKEx4Vf9DI29iEvj0uWG/UjSviRBfmI8soox5Q+JgrdBz70+pzZw0jyiWAXt5ySHMwjjKdxUnoekrjb/nz5tUvaTxepFVdkwMoX7keomIl+RHrqVb4BPsc+7YMN8kSFDfZJCJ7kU5LvbiA3/UzkaCx3M13ASXt9MZrvRVJ+ruS4nh7iUog55Nfv0Zmi/UxTivY7tRmLdDosE/L4+JaWdhHhlXw6tknjPZPZQ/6Zl4KdOm4oN+LbySsLTI54d8o8RXhDPn1UlV40/V1yE+VGfPt9akOcAuPn/XI4+3QyvxjGoB/DS4InL2AQccgr8xK1E/kjUIY8+Xlxc/LQSJwhX9zLb07pE8od8s25jeS0jQJMHvLuvjq0p29DZdbgwt50VcLJvzggtezZabMQ4ZV9OmXuyaxBf+bbCH6fT0yUQNDL/pnF320cEMMP+njSGGLUIc/Gg8knDxtELHl1ykBJnEFfFj1uvHG6fKpO5RHEzPh14skCntH2418nH/VALNBMSqQ/gSkmzJ8Er93ppRMNzDCa6AAeMZEOepTiOBfDtEZDZIiOXNrMpuxHpKduqE4zqoVY0D1FMf4Ewob5k+A1F75je0URXNGhPHaGPca35HQQwU2eLWCwaPBk7XCwgtqwX14wjp+ykCmw0ER4EoqQ7Emss268UpuyYxqv1OYqpAk3SV6yo5aTBXlk8di6A2DgCdwA4Ihb1lCUA/yB2Nr8jJpbgEZTYXurJ0QfEeaTkqrBaibvpIXlTruhFpaN21cbjLG3RxR1gNoISynCbU5SYxNWkRM2CQnKQsLoO5gETfw2JlZNqO6WmuxCqPJ7T/MIiaTf5+HT52kISRs1WE37q5A3g3EeOuglaNkEfH07ZhWDA2NBhdRDEebUcdfcwnTcagqLhmIC6geCwutHeOeG5TQLOxALFKZIfwLhwvxJ8NoN34nWnjAaKICxHgUiCHqU4rgbw2NXyAQ8FDXYh0C4JB+ifPTukTjFkh1Cgh2ZjfImEC/Im3iXw5FLrZkiQ2TMUuuj7Eekp+FQpdVCAR8ZprRaKPkQ5aMXoNMtveJUWNgSPAtFEPcsNRFeXE+2WAwzYVGN9ysUVNivxBQIIU0spABJSiATCybiTbzLbuROsPYuU0BRi/EkEDPAk1hnQ/FKK2IsOipKaYWK14/wzgvLCTYoABxYiGJ8CQUK8CXaXyJoybsnGCwapOTDvZw27FcfDDMcv+lix941Yj4FFYpQx/Lg20ecf6Fl7GAEZSRl6pYO0xq6VyBCHb2tYzgS08+8rfR82/ioF1sgTU+C4JizR7ID4YwIOxDlIHDiPCosFDD1eHlUOEhh2KmEM+QRsYllO9XR8YgoRrt4XJrCB5cjwnpM9JKCFBKEkxxMMHpAOcqPY84lTwTgoeRox444i5xWWHjwMadpwcIjOBDlYOqR2d6VY87Lpn002aOpDGXEcdkTOBKgO+Js7NGeJWhEHuY8xjuZEj5/eIwbHFnCgb5jXMFogdN7p/AkxIUcjztanyODTsUdIx4iijoCd4wDEiF4ouwYF8JUMcfHjnYDIQVPaJ3GDVg8OAd+lB8Ia8y5pqOc4fmg40LH6IeIsLMvEfJBWNopA6zHFxYF3YnYC4+FASA4duM7FhrEkWhnmd3tcTEiUbGb2uOiQUtivsgb2cGUB3GJu9bB1IdlUY+8zYVpHZkgLHpjXETyw6KgO+xmOCzhJCR+5xuWYFoMcAHa3oYlmIWm72XDAsCLR7jmBqQz1VtvN/jqAY2BQiDJUWkPyCFe2BNoNCJiRSHKE3RloUOzxzIMcfxABkUbjG5PG1Igy4xwOsIgjzl7kUgd1kk+byGpnPaYhaQWd7qCjiJXqClR6URFRNsZ31YGyLk0TPycGpcG7uQEoQOfmWBEgjXSEhFkyfopHJIwpGKOR9DUwVSM1GEdooW+UE/dU8OBd3J5kRnMZ3zSpEkAlLKjGPvshwQhR5BtwxGJF+HJu4UjAiI7EemmsO01NjTHBCQpDKHExyT5yEkrGX/krlUwJrIbsZ4i+yjBGDHI5E2TYFw4adwvdqcfFgQSEr+tD0s2LQa44O+8alRWd2/Epj1t0cMjHrYY39xYdkAptgM9B41YrJW07VAj2rhjqSvUgxdHLFEnRZxbFw4SMst4p/IgWnvoRR0tTPOEJ+aT0nxECU8q2wG9lPIcH2cCEdNNj0gmpSSq+w8ca1t2LmOQMyyxzx/FTCbEZA6q0I4L8w6WQMykRjo7o5U8sQEInXZuAxCMm94IxNMbI8rC0hRHVGVNqKchfj4pc++NU2STwk11kFrwZAenw1RYS0eSpquvMONhycXMeQTYmcSM7IyWexVEb8pfBEFqmFCg1iwP261q7MkVLk6TeUyoCA2+RBsygq5bqonxS1ylFQmSh2dR31/Aj1hX3VoyvNz7P/oBko380uaF9GkaX/4N4qFIXb7us3LTo89qlYmP88LqNDNVfsio1NOcGh+M0Q/HPjyoW2XNd/5V49kCCiFF6IXN4AzSe8Ewx7LkYHerqr83VNsxIR9Gm6hdIXmplm3dP6bsp4gg94B+0rxNMItD0ebJUg4a1etuxEiR6oC4SvG2DbS3ok4HBZRSkoKmIi0BuO/uEYQwp3TgQTV1vqo82vljTVBbGO8rPXNve4tVddnUOchtYdgewMO2+42pubsCq7W7gut9O4yzNZdPQ4hMD+lk74o/TbZcKHcFFsZd8afJlg9f99n9475WjSKacoOzM3zoDaGArmuVteqqyNpWlaq/O+eXm7xpBectoSAJE6Uec6+e4oXu1RNbktsP2fp7Xm47P2LoHSgjkjfXrapDneYQ/4xiqTvxe/V0+dshkwqlw29BWZGxM5em46IZqbZaZHviQJYsYyOBGkJ0nVxurKvYhfFb3j7fqK0qN5elzrPNsK/mTWp6BiGehGuRVvlOnf3Ihj23oJwN4ugfs0btsn1zVqvL3w75S1aoEqrvzZ9IKF8ZJ7v12+ptr66q+sbJK06QIeBl+/5xDZXrTmYEcLR1dSg3KXGjkIzQc9YsdtkebsCaP5kItt5/yMvtIts3EdwOiKcPHQGDpUIEkOzHujrsUyUtMCQ3r3rHas1IVmg8s4bSj/Ys6WWhXrrNglHUNooVME8MoPQmBia3J/lwAX9izxExt/OjAiZGIr9v4iqgAeGpzT3oMLkJEuirQ0yrZCL43pSxexylNjEI+Sov4oqki+NFylZt66xVm4VqnuN0fCgrNe4+R/lHe4k0tt00IHJ/FiWVPUU7Z4AO2DtzHFhk+65oRKXLAkH0sdnh4iSRbuN+bBpmEESfkAYLx4uoTZ7FJWBCsMS3e1XqHVuqXUR1wigkK+RcWouqODBWYt6wibLPCH4AGd33Afs8xl45mHmGQINemBcphsPqSPy30QMiMglJMGGshP7Sbfo2pF/ji0oOjZYFF9k+Wc7BimLRCggtPViXuMOjdUfgq1q3VR3tvQNjJb6px2h+E8OTDzsfYeLBniddRJIuMNLY6mVABOpVrMMryONVgssrxOfePmGugwDyc3flYfdILZcb1L0JNHeXN58PO1Xn6+uy24Akuj1w+zje62q7Zl2utmvI39vt+nO2U80+M/d4qPKw8+hMU5vb3NLxcVd8VTV1+5VDNxtKK0/fnhqMcjaUKH+ox4Wq11lb1WdFnjXmLuZ545hD74OYjWJ66nDfbM+rjTRHoKkNa35i8eOu+LzECDtTrv6WT6qmsitI6iD4wfquIApWmNoCMMzVdr2sm37Zaim1OprZBvC1al9Xv6o1v8g12EC1y+MjvRwZSWbXxXv1pGpVrtV5dShbtfmUlZuC2Pxl8NMQKAHDhmd/E49MP0D5vTkPL27hI/x/Ies07bAu95tHrEiPvBaGj/6P73zh+PEdKxj9Su63n1eCi5pvsmVqhbb59j3frKpv36XiNnJO9iJvq83yDcw72DO8P7QNsEqtOSdbNmuyep1t2HrQW0DZc38ozzrry1e9GqjLxV1WZztp3X+QCMK5dbG86THLdZ3v27PmrVzzwRnECBwT+Np3DVIhcIKKdiRZigIL2V9nb3zu15m77Bm4urLa7bNaYTs9elobwuXy+vlQfpfCoCk7Q24HQy8JUfWmMhlU6AxGqbCt9QcB4zuwK5JP/eYOhGowFdZR9x+EqdqebDDlSnpWbqFM6Aw5IrWrXjCmzpKvDTpj/D0iRK0wDaHa0eX5Pw7qQGwJD/HOGG4zeGeuk3xbW/uG3a6+zW2jpH7/uirXmVQkLf4ewX0id3tp3t9m7AAc4Ut/4T1OqAFc7cmLVhqg24w9gqUshe6AS1hy3YGnvJb2fLl8Nbu/C2swbEqx4Xiq6susOxCLk/YQjrSudlGMdbUT6JZ5uS3UdauiiWckI7HL9jG8u2zPkDXVTmr0LDZtz233yr5H0Wl7dvfYmd2vABh7CNs8j/uYuJZ5tIEaZWFPlcD+PgTvNf2Ds4P9p6z56QLZTjWp+UBxj+ayzcpNVm8+9FBQiMTyMyuO8bXQvk1SFDRKafV82D2WWV6I+8UYTZNEWN9KiaeHi9H4y0Wqyl8u2Hp0njXqumz0Ds02f1G3j42qX3QtXGTEVW6zIIfDhgiQsN8tYoVxr9xZlPWzWn8/q7dcmkcbrJNXbw87VbbnGiTuAZ2oHRg3DtKRqdvPuuvCF46J3EBwjYYXCpaUjopTzNZVUag1fXbQ4JyssCL0rAcEly9CQ+2wvrdhoQY6NIQF+F1kSOLsqVW17imQCaHLyaxFodlhMzLaNfhPOeT1aelxr9UyTZi7unplJyYcU3CKIkBPNDkOPSvnPLxim2ITIoJecIrEjt7+7bb8VuetOofqHgkAI8lKUfGkpAAHvFtespYdmuvfoSRc6NMvVb3L2IZkontv2Yeq92zU8oujFG/LXrti2VG3kMIiFpiTW6q2zctthIaBCBL3t0U83J3dL68/f3y4ur1fnJk3ULAaQXBI7vL+/mF1vbh8+K/bz5cP15+/nt1cX2BiIWhISs/i90HuDu+tq7pVrzFFjCcIyT5FKDxJZL0a8AWcOV1IiHoI4MPF2eoSY3YQIeK8+ZoV5joLxzkbC3R6s89/VSXW2Lz3QSH6fVZTl2lQpKNpiOpO/x6VVw6C9fFLy+6VcNzsrUOETVRL0sityFa1i6psn/XaN98P6WhNc36U+U2p75vsDec1AGzfRm8O4ZKvfwf3yjjFnfKuYxssebes1UTCLW8FMbyEfFYUV7kqNvrxVmFuo6N1IXzOnBXFtGa+6UDdxgdYhwKz4/Gzts3Wz3pk1pxXZSvupeq0KBirojevbL5mxUFdVLssFyZfBw0XJCgUlTBcnGgL9+4rl+vQtNUuJhwWguXWi9W3j/LOj4F4NudZp5XQGK89lKARQSyyjVdbKYxxNkdY9WnMGFptz/PqyoQxakuZK6qyWQh+Z5WqdqqVlogG2tGYZ+yPYGGEvS3L123D7k476NYQorUhLHtnFRNaEyAwN8LqzsTYcGs6edPdMLK37w3h+CZzlvUOJiSuH/G4nItHWDbiuhGCr8hLrEqOxgLj/rCPyWcTIDOv1G5fWGNwiXpECNx1mxXy4ttEPJqzrOYDGzEhIXD8zP0+a/Ns7mFAIi6IVVip1zYmBYY9y/s1Vz/wCjdZM5xFlSGfA23G7uvINkhT3dnxHdzxLgp28DFbgX1w/2VZ8LoMQ4llYbMteOA+xQmZDPLFOol/jB80EeTDfFrtGAcIFr5TPBzgT9H0sEgnbp4sTdYVmBAvjtWOUDSP6acoknhJcTy8nyjowYXO5HigMEnOR8tdzeEYfooeiWcVx/PsKWoelu9Emoe2U+RoAkjzmOYvyCF369OT6qPlrvR8iDlFMkTBd7COatdj23PjZHKSHAHn9dwzxUmqQRJE+5iCG6LgO7TjMdQURR/Mao2HU1OkPCyvtDhCycVKSsfkGQUX9FbHJM0Fs132J3tKye+tP/kzSYGOemepbwzpj0X8cq+26nWmpg4t9uQk0Ja0b7gf7c2xY7yah2Yk9bS2c9jjSt+ML0/I9aIcnp+KN72MlSSx/Dy86ySqFoDKU5D89eq+jANiBYYDyx1EnowdFVwUPO0RESwPxlfScSk5+MwRO+Du4f0zR8xt2NJ2j4EmYdeHtUHD37BiElsgbuuPuEeD3PsTlOLehJV2akBKI4yjD+wIEPktHCdAr2KL/CaMDY+034Rslc1A0QRMw0zvdJB0TBRD7i+lS8QNmcsWqbBLhmw1DAUSzjRR0E4ZSZQhYaTd3TKSypNECC3Hm4yhVXlgBwpIPQIZCWcXikTcmUt01oYRiPFLy+8H7QHId2SwTN75517d4dDOEFvBbPw/d1eSRBKboDC1ztBI4hni0v7La9yRfX4DvQ2Awh3S4Fp4R4ZVtVr7qNbRoQ22k2bE5HtvBvKI22/MQoB1SwZyB8h1TRI+44MI/CF3vInt/9BpwvpAPSiujFl6SNmK76gMEmhXJarwDtzAxz3ikzeQih89/PMxMNIfEOtlHeeVlWDFaqgHVeiKhWw79FmR/Yf9qy4xVXYQcIAnrrKDCFxlI4rGQB0oGmZOtvkOGbNpMygX508ZFumO2AKdOMqdwO84vun40UbDSmhsm+uHCmtvNSSutZ2UkJb2mDFbJxQ/ZotqezsNoOU9dpzT6fzu45xO5YRNfscXavDTep8n7HZC5O899DE72ymB4DfGDNDW27Pok2/JrYr8A2ow3/sZEAoA8yYbSG5BBZngo2yglo9HBJ0dhDFaIxSTcTYXxgmNYEEqLTFgOlKTAHhPvCImkpuYELG/fVuiNRBhUn+/sUxrYMLE9nZbmXSwZwiJXbcArYkKk0eWthnAUUaWMRPC09pbcTHeARMiXtVZ2fRfRuE4rk3u4UIC51VVb/JST+e/Na3afeheLeL6yZMQDeV6yx9Vte23stv+2c98kh3BSZXj4HqFIdyyVftT6I88rA+Xtx/vz+4+XZ8/fLj98vlC6JPOmi6O6TV+u/zwsLi8Pz9b3d7HqRBIRufx8PQk3SMxUffGTP+wvzvmvK6aRi9QfinFLQITNwVllDaq1FlW5P9WyMGbScbDCSsU4LOdEz/6bCf4dqXLy75fCd6M6nCe7HZUi/fEN6Q63PItqRHPok7c/LOo1uYHt30VeFuqUfXuNlrXSpVRpdlBcfzY26Yzc/B9U2M0iFzRPDGGrmg29/vr2xn/qzvSiMbWwjDc4K25Ey92c+7YVxs271/WdcUuC1D26JiNEfK/7qSQrO5etJED92DmMVdgepfRCHzvZ0C464Ne2GMzw9f1IBdf5vidl/IVlfkpb6fMT3gxZX66Oynzk15HmZ/4Jso87hJK9NbIPPrCyEKV2xZ1tjdm2MRL63Ls5slabQ7SAbeJqjdm2OR7LHP2CkuzwULf2058btt69RpgfW/CQu1L8N1rRMAHhwe3yK3GvoKFC5MH3r7GFFxwWCb8+jWmROBDYqH3rxEhDxue35UfwI54/5p8P5llfG9DQsGgHzbmmR1MOFOBt4d5JZ5CFg68PoyKunBZkHqDD1WzsGEp/wViScBAMPOkgTeIJXIPF5agXyGWBBwURm+/QxwjMSDZuV/iJWJJwkGx9P5bxAC7AWLI6deIRXoHxgn4by7K7AaG+cqRLxJL5A5KpCde3QMlTCQjw71KLCqR4LCY/y6xpGAgWNr4NtUGCf0NnFb2Fn2dGFLieJhFGPp9YknRhckC8dlCIMMy3DO8khCJFZaWqId4JR0fyHQ6E77W4FeafDNX5LZAcmc5ghnJXubdXIDfg4pCSclwgGER6e1cSSuIFySDr+dCgj6al0vQkImDD9xK9D4wLEI/cSspOCiG3nuPVqSeESxtfLG1QRy59yatTL2CvKZepUW4Ab/Zd2l5DRrKjKkrdldQUWFbh2+q7Y16UcZQ2j1woZlGK5vSvg28bKpC3VTbLb95VdNZxtwyfG9hj2BoytlS4FtkZQa4OFsKfJeltfmFXJIfCDtTbtXdjR5H5nnmUS1U02RbcEvumGYLgwncq6Y61OskIQcrB+cq082qEXD3/a85PIOpw+k9+nVTbT3PA6S0lx6jnm5ycpKa8tWkkyk7Fd1IV2RqKmKi156DHqW8EIYYXYRI7rQkPC/RoDgz3btsvxc2Pw4m6MSh7lJE3WE38tNYJiB5Az2hM/JP5iyl7lNKC1gzY2/NEi5w/7xnZtyLM9RjBFtvLRF2A4wIys6eLVKLbD9thsIej6ARUIGTxPwvT0AM8cFd195lLbt9Uv8OpSJ7UXUmvWLZsQ2W7Jamba1Us6rus02elcIOiI7UhXANZW+xqi56DMDuQrgmbnh86kK95M4exyC9h+H4D8LSas/o3p7uFHD53GbEgU35yQWD7ISPLpis6LML9LFkntvBINTCeychdv7NE+BEaZQU9PJJ6CwpogQcGBHffzBZT/UChMkJvgGBHGwxaYFDk9M1Nnx9Hlgna7ZeV86F8b6TFXFHfKBe99fJOyMXt8878Bm2Ur93o9T+rGnyrdA0DsyzOfvFUPvzQrwdwqDsrAXG/g6js3IzfVZheh8arQW8KsYKSg9rI3umBgFxx9RWteO8/oVqukfkpUcWBmoSyfb4LuW3kgfuwZZluyuyvETeWZg4DcQxO4wGPr4zX03VKpc6KgOfhRCZf1ZvMbTanOFsgf3hA19Lbws32zL4Jc74pzfhtzZtauE1TWv8MD1OiDxqaBN7aG6+Y5Ht8ccTPR3w5US9hUfbSLM2Hn+P8qnpfF7yW9Usw8h8tqi5fNbUjJCdz0vVJuazJvbQXBYsVZuSz4MOmM9L1Ubm88CP5PO+e6WAy+DeAsrZ+ckD841lt3MyEJrGUu9ktr3JzWfARWptjpNb29JEbu89ZnI2cbb/1O7kh6AHFQrIfzHJ0DMKNgTktqMPsvt5EORHw+Ng2MnNOu+OU6GvdwwKBI79xkbSmwD2e7uvq13OD8YGE2xCSHc/r4qsFef7RlYTwfaWi0zo/42MnSlDpcT97yOT4ve+i729kYfv7u2zOisKVcj78kc+E8ER19Ve6OhNjNqUXWeQt7yPXOKOd305RnUQet4j22DMFuLfDoo/ZN4ZQAV4XR2k42c9WWfIJNLxKUxE+Ga3MP3CwhUwcOupLAAbt3uVbW7L4g2b7fatoYhyIn6fjBCRdN3Z7dFeGEAYZlHpEAYPJm1QwnW5Nq4dZmebLEPI7bz5hy4VeglpY95uzJckWyfEwRauWpUbVQt7+ycjMC3nOt4fapV9b+4HqJSQUYAEs/2Gi7yjy+q3eC0fy0tV7YU+LNGmSHlYVuqT6r618ToOkBWJZ4dol/luX6h4chvHSnwp898OqjtQG69DgIUG+LeDatpPqtjzaweWIVRXLtRTdijagALVbpkKFJobEwdkyHGkTcqlzBlLNuusUPd6TMu2KYYZFKnlZC84bhLPIHZora24sapHKY9Vf6ii+LmsfpRLKhzU3RimCIW2Fe3b2173Wbnpj9evqg7D1wZTiwDzs8mf1WsbqWGieHIqmwH2UEa7V3fys1joOctN/gTtPdF8s+2R8/2a7ATHo3safleJrlaN2wsMkZnWDOlBvmZFsx3IK1Xirl+NuHdVXh83r1s93fq4yYqujyPrnKe6HJZn9mEhgXW2U8Wq+lk9Zo/nmXQt46DhgphStc4adV02Xccqf1Hn7s0NrAoFxbW6k7nCwJ2W6pHc3EezzvbqXm0vX4URwCBgAhje7zqiq+pcxxfODRfEV8633WPFTiT3FuhA4nrRXYHosJLe9rwOhu1Enl8vugM2sfQGSObvrnOLVzBgvEa+iyMf7V3WP/S9zW4Sb1+rtT6Y985NTmw6evs//plfNH5t68NmyLCfLpwzA6wEBWW1rvKiSBHycKzK9XrMuzgVD8eq3GSPanIKVLAwPPtUh3ByAwJzx8THw/FbY1XzPN0mFFNwfaCoExkpE8Jy93sZUmJFIPnll6x9TtHxcLxKvtaH0+fqhKq4OERlkdXfVZ2iYyKFRau8bJMKGYGUlSKLmYUR2LsPTmJKCCyiFp0aCyUq6OtOkxPkg4Epr+hi7cIAjej+kAsDNBIqjg/kdaK4UT64KEFlaKVnLGL8nAEs79eqOOhyJe0unXhnAMurj0+0b0Vc6bBBbN9+JbyWsYp5JoOb5FyNLzDwyzEtfF+xbYn5GCAnpxwd/hUn58yWHszLHn3PD+7djgF3v5g0fkQ1zReXyp4bzjabbvnoLquznRJnozSjB2GL59ljUxWHVn2RrrfU1Ja50G9Zf8+2KOtsLSyM6OWzF5TVMGdX5/UtoLFBplDsHpSoOFvmbO0/HHL2pWP9O1RUt6pU+tqXLwfpPt2O0jRnHfyRtWv2vFRnALlYlfMq9rgDut+mxzvcK4TR3J7fUt5YMtILG0qq8lacmR6pbql5afvtkxdV01fLDT9AEfVI5hWQkYak6960+9f/B8BkLGAaPAMA"
1
+ window.navigationData = "data:application/octet-stream;base64,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"