@twinmatrix/spatialverse-sdk-web 0.0.2 → 0.0.3

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.
Files changed (125) hide show
  1. package/lib/cjs/index.js +9 -9
  2. package/lib/cjs/index.js.map +1 -1
  3. package/lib/cjs/meta-atlas-sdk/3DMap/CustomThreeJsWrapper/CustomThreeJsWrapper.js +213 -294
  4. package/lib/cjs/meta-atlas-sdk/3DMap/CustomThreeJsWrapper/CustomThreeJsWrapper.js.map +1 -1
  5. package/lib/cjs/meta-atlas-sdk/3DMap/CustomThreeJsWrapper/utility/utils.js +43 -45
  6. package/lib/cjs/meta-atlas-sdk/3DMap/CustomThreeJsWrapper/utility/utils.js.map +1 -1
  7. package/lib/cjs/meta-atlas-sdk/3DMap/MainMap.js +241 -271
  8. package/lib/cjs/meta-atlas-sdk/3DMap/MainMap.js.map +1 -1
  9. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/fetch-published-json.js +167 -215
  10. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/fetch-published-json.js.map +1 -1
  11. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/fetchMapObjectsData.js +28 -30
  12. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/fetchMapObjectsData.js.map +1 -1
  13. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/meta-atlas-sdk-core.js +876 -1188
  14. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/meta-atlas-sdk-core.js.map +1 -1
  15. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/index.js +173 -163
  16. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/index.js.map +1 -1
  17. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/interfaces.js +6 -6
  18. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/interfaces.js.map +1 -1
  19. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/mapObjectsHelper.js +6 -6
  20. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/mapObjectsHelper.js.map +1 -1
  21. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/routeLayers.js +3 -3
  22. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/routeLayers.js.map +1 -1
  23. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/routing-helpers.js +546 -620
  24. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/routing-helpers.js.map +1 -1
  25. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/utils.js +155 -160
  26. package/lib/cjs/meta-atlas-sdk/MetaAtlasCore/routing-core/utils.js.map +1 -1
  27. package/lib/cjs/meta-atlas-sdk/customStyles.js +2 -2
  28. package/lib/cjs/meta-atlas-sdk/customStyles.js.map +1 -1
  29. package/lib/cjs/meta-atlas-sdk/customerLayer.js +15 -29
  30. package/lib/cjs/meta-atlas-sdk/customerLayer.js.map +1 -1
  31. package/lib/cjs/meta-atlas-sdk/customerLayerVariant.js +5 -5
  32. package/lib/cjs/meta-atlas-sdk/customerLayerVariant.js.map +1 -1
  33. package/lib/cjs/meta-atlas-sdk/meta-atlas-sdk.js +832 -1060
  34. package/lib/cjs/meta-atlas-sdk/meta-atlas-sdk.js.map +1 -1
  35. package/lib/cjs/meta-atlas-sdk/utils/helpers.js +33 -50
  36. package/lib/cjs/meta-atlas-sdk/utils/helpers.js.map +1 -1
  37. package/lib/cjs/meta-atlas-sdk/utils/local-storage.js +18 -36
  38. package/lib/cjs/meta-atlas-sdk/utils/local-storage.js.map +1 -1
  39. package/lib/cjs/meta-atlas-sdk/utils/mapobjects-store.js +6 -6
  40. package/lib/cjs/meta-atlas-sdk/utils/mapobjects-store.js.map +1 -1
  41. package/lib/cjs/meta-atlas-sdk/utils/routing-store.js +6 -6
  42. package/lib/cjs/meta-atlas-sdk/utils/routing-store.js.map +1 -1
  43. package/lib/cjs/meta-atlas-sdk/utils/routing-visualizer/index.js +428 -556
  44. package/lib/cjs/meta-atlas-sdk/utils/routing-visualizer/index.js.map +1 -1
  45. package/lib/cjs/react/MetaAtlasMap.js +127 -0
  46. package/lib/cjs/react/MetaAtlasMap.js.map +1 -0
  47. package/lib/cjs/react/hooks/useDrawing/index.js +17 -18
  48. package/lib/cjs/react/hooks/useDrawing/index.js.map +1 -1
  49. package/lib/cjs/react/hooks/useFocus/index.js +48 -55
  50. package/lib/cjs/react/hooks/useFocus/index.js.map +1 -1
  51. package/lib/cjs/react/hooks/useMapEvents/index.js +40 -50
  52. package/lib/cjs/react/hooks/useMapEvents/index.js.map +1 -1
  53. package/lib/cjs/react/hooks/useMapOverlays/index.js +20 -21
  54. package/lib/cjs/react/hooks/useMapOverlays/index.js.map +1 -1
  55. package/lib/cjs/react/hooks/useMetaAtlas/index.js +77 -95
  56. package/lib/cjs/react/hooks/useMetaAtlas/index.js.map +1 -1
  57. package/lib/cjs/react/hooks/useMetaAtlas.js +78 -96
  58. package/lib/cjs/react/hooks/useMetaAtlas.js.map +1 -1
  59. package/lib/cjs/react/hooks/useRouting/index.js +21 -20
  60. package/lib/cjs/react/hooks/useRouting/index.js.map +1 -1
  61. package/lib/cjs/react/hooks/useSearch/index.js +35 -34
  62. package/lib/cjs/react/hooks/useSearch/index.js.map +1 -1
  63. package/lib/cjs/react/hooks/useStampRally/index.js +30 -29
  64. package/lib/cjs/react/hooks/useStampRally/index.js.map +1 -1
  65. package/lib/cjs/react/hooks/useStampRally/utils.js +2 -2
  66. package/lib/cjs/react/hooks/useStampRally/utils.js.map +1 -1
  67. package/lib/cjs/react/index.js +31 -31
  68. package/lib/cjs/react/index.js.map +1 -1
  69. package/lib/cjs/react/stores/useMapDataStore.js +53 -64
  70. package/lib/cjs/react/stores/useMapDataStore.js.map +1 -1
  71. package/lib/cjs/react/stores/useMetaAtlasStore.js +27 -40
  72. package/lib/cjs/react/stores/useMetaAtlasStore.js.map +1 -1
  73. package/lib/esm/index.js +3 -7
  74. package/lib/esm/index.js.map +1 -1
  75. package/lib/esm/meta-atlas-sdk/3DMap/CustomThreeJsWrapper/CustomThreeJsWrapper.js +2 -1
  76. package/lib/esm/meta-atlas-sdk/3DMap/CustomThreeJsWrapper/CustomThreeJsWrapper.js.map +1 -1
  77. package/lib/esm/meta-atlas-sdk/3DMap/CustomThreeJsWrapper/utility/utils.js +10 -9
  78. package/lib/esm/meta-atlas-sdk/3DMap/CustomThreeJsWrapper/utility/utils.js.map +1 -1
  79. package/lib/esm/meta-atlas-sdk/3DMap/MainMap.js +2 -2
  80. package/lib/esm/meta-atlas-sdk/3DMap/MainMap.js.map +1 -1
  81. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/fetch-published-json.js +3 -3
  82. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/fetch-published-json.js.map +1 -1
  83. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/fetchMapObjectsData.js +4 -3
  84. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/fetchMapObjectsData.js.map +1 -1
  85. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/meta-atlas-sdk-core.js +22 -14
  86. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/meta-atlas-sdk-core.js.map +1 -1
  87. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/routing-core/index.js +8 -8
  88. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/routing-core/index.js.map +1 -1
  89. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/routing-core/mapObjectsHelper.js +3 -3
  90. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/routing-core/mapObjectsHelper.js.map +1 -1
  91. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/routing-core/routing-helpers.js +18 -11
  92. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/routing-core/routing-helpers.js.map +1 -1
  93. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/routing-core/utils.js +4 -3
  94. package/lib/esm/meta-atlas-sdk/MetaAtlasCore/routing-core/utils.js.map +1 -1
  95. package/lib/esm/meta-atlas-sdk/customerLayer.js +4 -1
  96. package/lib/esm/meta-atlas-sdk/customerLayer.js.map +1 -1
  97. package/lib/esm/meta-atlas-sdk/meta-atlas-sdk.js +80 -61
  98. package/lib/esm/meta-atlas-sdk/meta-atlas-sdk.js.map +1 -1
  99. package/lib/esm/meta-atlas-sdk/utils/helpers.js +3 -1
  100. package/lib/esm/meta-atlas-sdk/utils/helpers.js.map +1 -1
  101. package/lib/esm/meta-atlas-sdk/utils/routing-visualizer/index.js +19 -15
  102. package/lib/esm/meta-atlas-sdk/utils/routing-visualizer/index.js.map +1 -1
  103. package/lib/esm/react/MetaAtlasMap.js +120 -0
  104. package/lib/esm/react/MetaAtlasMap.js.map +1 -0
  105. package/lib/esm/react/hooks/useDrawing/index.js +2 -2
  106. package/lib/esm/react/hooks/useDrawing/index.js.map +1 -1
  107. package/lib/esm/react/hooks/useFocus/index.js +4 -3
  108. package/lib/esm/react/hooks/useFocus/index.js.map +1 -1
  109. package/lib/esm/react/hooks/useMapEvents/index.js +3 -3
  110. package/lib/esm/react/hooks/useMapEvents/index.js.map +1 -1
  111. package/lib/esm/react/hooks/useMapOverlays/index.js +2 -2
  112. package/lib/esm/react/hooks/useMapOverlays/index.js.map +1 -1
  113. package/lib/esm/react/hooks/useMetaAtlas/index.js +162 -60
  114. package/lib/esm/react/hooks/useMetaAtlas/index.js.map +1 -1
  115. package/lib/esm/react/hooks/useMetaAtlas.js +162 -60
  116. package/lib/esm/react/hooks/useMetaAtlas.js.map +1 -1
  117. package/lib/esm/react/hooks/useRouting/index.js +2 -2
  118. package/lib/esm/react/hooks/useRouting/index.js.map +1 -1
  119. package/lib/esm/react/hooks/useSearch/index.js +2 -2
  120. package/lib/esm/react/hooks/useSearch/index.js.map +1 -1
  121. package/lib/esm/react/hooks/useStampRally/index.js +8 -7
  122. package/lib/esm/react/hooks/useStampRally/index.js.map +1 -1
  123. package/lib/esm/react/index.js +11 -15
  124. package/lib/esm/react/index.js.map +1 -1
  125. package/package.json +9 -6
@@ -1 +1 @@
1
- {"version":3,"file":"routing-helpers.js","names":["point","lineString","length","booleanDisjoint","booleanPointInPolygon","getCoord","getCoords","lineIntersect","lineSlice","cloneDeep","DISTANCE_UNIT","WALK_SPEED","Zone","RoutingCore","getImmigrationPolygonFeaturesForWhereTaxonomy","getEdge","ManeuverType","createDefaultSegment","pathSegment","startMapObj","edges","endMapObj","segment","maneuverType","Static","coordinates","distance","features","time","startEdge","mapObjectId","whereDimension","startFloor","whatDimension","what","name","endEdge","endFloor","isPortal","instructions","patchNumber","zone","cost","description","isOverviewSegment","RouteOverview","SectionOverview","updateFeatureHighlightState","isHighlighted","index","feature","properties","highlight","highlightRouteSegment","pathFeatures","segmentToHighlight","highlightNodeOnly","segmentNumber","startPoint","getRouteNode","dimension_where","isNode","node","getRouteLine","line","featureBelongsToLineString","endPoint","push","getLineStringFeaturesOfRouteSegment","routeSegment","lineFeatures","generateOverviewSegment","route","indexOffset","overviewSegment","segments","initialWhereDimension","j","coord","isNonHighlightedOverview","walkingTime","transportTime","walkingDistance","transportDistance","createRoute","startMapObjectId","endMapObjectId","wheelChairAccessibleRouteOnly","shouldAddOverviewSegment","path","getRoute","pathSegments","routes","optimizedPath","endSegment","segmentIndex","currentZone","geojson","geometry","lastManeuverType","firstSegment","prevPathSegment","prevZone","prevPath","pathPoint","ChangeZone","midPoint","currentManeuverType","ContinueStraight","removeExtraChangeZoneSegment","lastSegmentAdded","Transit","pop","undefined","immigrationPolygonFeatures","immigrationPolygonFeature","intersects","lineBeforeImmigration","lengthOfLineBeforeImmigration","units","segmentBeforeImmigration","coordsOfLastSegment","secondLastSegmentAdded","concat","immigrationLine","immigrationSegment","PassThroughImmigration","lineCoords","lineAfterImmigration","segmentAfterImmigration","startPointWithinPolygon","changeZoneSegment","previousLine","enterPortalSegment","EnterPortal","exitPortalSegment","ExitPortal","portalPath","travelPortalSegment","TravelPortal","distanceUnit","speed","addOverviewSegment","initialIndex","dummySegment","unshift","routeSegmentCoords","segmentDistance","startEdgeFeatures","nextRouteSegment","portalCost","splice","getPatch","routefeatures","getFeaturesForPatch","overviewSegmentInfo","includeOverviewFeatures","nonHighlightedOverviewFeatures","highlightedOverviewFeatures","patchNumberForOverviewFeatures","overviewSegmentFeatures","MovingPortal","NonMovingPortal","isMovingPortalTaxonomy","Object","values","includes","isNonMovingPortalTaxonomy","isPortalTaxonomy","isCrossTerminalPortal","Skytrain","Bus","getPortalName","getTerminalAndLevelName","regex","subDimension","split","slice","join","toUpperCase","match","terminalIndicator","terminalName","terminal","levelIdentifier","levelName","level","substring","Terminal","Level","getWhereDimensionNameForPortal","portalDimension","terminalAndLevelName","Escalator","Lift","convertSecondsToMinutes","timeInSeconds","minutes","Math","floor","remainingSeconds","formatTime","value","generateInstructions","isFirstSegment","getImmigrationInstruction","toLowerCase","rotueSegment","instruction","Public","postfix","ceil"],"sources":["../../../../../src/meta-atlas-sdk/MetaAtlasCore/routing-core/routing-helpers.ts"],"sourcesContent":["import {\n point, lineString, Units,\n} from '@turf/helpers';\nimport { Feature, Position } from 'geojson';\nimport length from '@turf/length';\nimport {\n booleanDisjoint, booleanPointInPolygon, getCoord, getCoords, lineIntersect, lineSlice,\n} from '@turf/turf';\nimport { cloneDeep } from 'lodash';\nimport {\n CalculationResult, DISTANCE_UNIT, RouteResult, UserPosition, WALK_SPEED, Zone,\n} from './interfaces';\nimport RoutingCore from '.';\nimport { getImmigrationPolygonFeaturesForWhereTaxonomy, getEdge } from './mapObjectsHelper';\n\nexport enum ManeuverType {\n RouteOverview = 'Route Overview',\n SectionOverview = 'Section Overview',\n LeftHairPinTurn = 'Left hairpin turn',\n RightHairPinTurn = 'Right hairpin turn',\n LeftTurn = 'Turn left',\n RightTurn = 'Turn right',\n ContinueStraight = 'Continue straight',\n EnterPortal = 'Enter Portal',\n TravelPortal = 'Travel Portal',\n ExitPortal = 'Exit Portal',\n Static = 'Static',\n ChangeZone = 'Change Zone',\n PassThroughImmigration = 'Pass Through Immigration'\n}\ntype Edge = {\n mapObjectId: string;\n whereDimension: string;\n whatDimension: string;\n name: string;\n};\n\nexport interface RouteSegment {\n maneuverType: ManeuverType;\n coordinates: Position[];\n distance: number;\n time: number;\n features: Feature[];\n startEdge: Edge;\n endEdge: Edge;\n isPortal: boolean;\n instructions: string[];\n patchNumber: number;\n whereDimension: string;\n zone: string;\n cost: number;\n description: string | null;\n}\n\nfunction createDefaultSegment(pathSegment: RouteResult) {\n const startMapObj = getEdge(pathSegment.edges[0]);\n const endMapObj = getEdge(pathSegment.edges[1]);\n const segment: RouteSegment = {\n maneuverType: ManeuverType.Static,\n coordinates: [],\n distance: 0,\n features: [],\n time: 0,\n startEdge: {\n mapObjectId: pathSegment.edges[0],\n whereDimension: pathSegment.startFloor,\n whatDimension: startMapObj ? startMapObj.what : '',\n name: startMapObj ? startMapObj.name : 'Your Location',\n },\n endEdge: {\n mapObjectId: pathSegment.edges[1],\n whereDimension: pathSegment.endFloor,\n whatDimension: endMapObj ? endMapObj.what : '',\n name: endMapObj ? endMapObj.name : '',\n },\n isPortal: pathSegment.isPortal,\n instructions: [],\n patchNumber: -1,\n whereDimension: '',\n zone: '',\n cost: pathSegment.cost,\n description: pathSegment.description,\n };\n\n return segment;\n}\nexport interface Route {\n segments: RouteSegment[];\n walkingDistance: number;\n transportDistance: number;\n walkingTime: number;\n transportTime: number;\n\n distanceUnit: 'meters';\n speed: number;\n}\n\nexport function isOverviewSegment(segment: RouteSegment) {\n return segment.maneuverType === ManeuverType.RouteOverview || segment.maneuverType === ManeuverType.SectionOverview;\n}\n\nfunction updateFeatureHighlightState(\n features: Feature[],\n isHighlighted: boolean,\n) {\n for (let index = 0; index < features.length; index += 1) {\n const feature = features[index];\n if (isHighlighted) {\n (feature.properties as any).highlight = true;\n } else {\n (feature.properties as any).highlight = false;\n }\n }\n return features;\n}\n\nexport function highlightRouteSegment(\n pathFeatures: Feature[],\n segmentToHighlight: number,\n highlightNodeOnly = false,\n) {\n for (let index = 0; index < pathFeatures.length; index += 1) {\n const segment = pathFeatures[index];\n if ((segment.properties as any).segmentNumber === segmentToHighlight) {\n if (highlightNodeOnly) {\n if ((segment.properties as any).startPoint === true) {\n updateFeatureHighlightState([segment], true);\n }\n } else {\n updateFeatureHighlightState([segment], true);\n }\n } else {\n updateFeatureHighlightState([segment], false);\n }\n }\n return pathFeatures;\n}\n\nfunction getRouteNode(\n coordinates: Position,\n segmentNumber: number,\n isHighlighted: boolean,\n patchNumber: number,\n whereDimension = '',\n) {\n if (coordinates.length === 0) {\n return [];\n }\n\n const properties = {\n segmentNumber,\n dimension_where: whereDimension,\n patchNumber,\n isNode: true,\n };\n const node = point(coordinates, properties);\n const features = [node] as Feature[];\n updateFeatureHighlightState(features, isHighlighted);\n return features;\n}\n\nfunction getRouteLine(\n coordinates: Position[],\n segmentNumber: number,\n isHighlighted: boolean,\n patchNumber: number,\n zone: string,\n whereDimension = '',\n) {\n if (coordinates.length === 0) {\n return [];\n }\n\n const properties = {\n segmentNumber,\n dimension_where: whereDimension,\n patchNumber,\n isNode: false,\n zone,\n };\n // const curved = smooth(coordinates, {iteration: 1});\n const line = lineString(coordinates, {\n ...properties,\n featureBelongsToLineString: true,\n });\n\n const startPoint = point(coordinates[0], {\n ...properties,\n featureBelongsToLineString: false,\n });\n const endPoint = point(coordinates[coordinates.length - 1], {\n ...properties,\n featureBelongsToLineString: false,\n });\n const features = [] as Feature[];\n features.push(startPoint, line, endPoint);\n updateFeatureHighlightState(features, isHighlighted);\n return features;\n}\n\nexport function getLineStringFeaturesOfRouteSegment(\n routeSegment: RouteSegment,\n whereDimension = '',\n) {\n const lineFeatures: Feature[] = [];\n for (let index = 0; index < routeSegment.features.length; index += 1) {\n const feature = routeSegment.features[index];\n if (feature.properties!.featureBelongsToLineString) {\n if (whereDimension !== '') {\n if (\n feature.properties!.dimension_where\n && feature.properties!.dimension_where === whereDimension\n ) {\n lineFeatures.push(feature);\n }\n } else {\n lineFeatures.push(feature);\n }\n }\n }\n return lineFeatures;\n}\n\nexport function generateOverviewSegment(route: Route, indexOffset = 0) {\n const overviewSegment = cloneDeep(route.segments[1]);\n const initialWhereDimension = route.segments.length > 1 ? route.segments[1].startEdge.whereDimension : '';\n overviewSegment.coordinates = [];\n overviewSegment.features = [];\n overviewSegment.time = 0;\n overviewSegment.distance = 0;\n overviewSegment.isPortal = false;\n overviewSegment.maneuverType = ManeuverType.RouteOverview;\n overviewSegment.patchNumber = indexOffset;\n overviewSegment.instructions = ['Overview'];\n for (let index = 1; index < route.segments.length; index += 1) {\n if (route.segments[index].maneuverType !== ManeuverType.SectionOverview) {\n for (let j = 0; j < route.segments[index].coordinates.length; j += 1) {\n const coord = route.segments[index].coordinates[j];\n overviewSegment.coordinates.push(coord);\n }\n\n for (let j = 0; j < route.segments[index].features.length; j += 1) {\n const feature = cloneDeep(route.segments[index].features[j]) as Feature;\n if (feature.properties && !feature.properties.isNode) {\n // isNonHighlightedOverview is used in layer styling to decide the color of lines\n // features which are not on initialWhereDimension should be colored accordingly\n if (feature.properties.dimension_where !== initialWhereDimension) feature.properties.isNonHighlightedOverview = '1';\n else feature.properties.isNonHighlightedOverview = '0';\n\n feature.properties.dimension_where = initialWhereDimension; // hardcode where dimension of first segment\n feature.properties.patchNumber = overviewSegment.patchNumber;\n feature.properties.segmentNumber = overviewSegment.patchNumber;\n overviewSegment.features.push(feature);\n }\n }\n }\n }\n\n overviewSegment.endEdge = cloneDeep(route.segments[route.segments.length - 1].endEdge);\n overviewSegment.time = route.walkingTime + route.transportTime;\n overviewSegment.distance = route.walkingDistance + route.transportDistance;\n\n return overviewSegment;\n}\n\nexport async function createRoute(\n startMapObjectId: string | UserPosition,\n endMapObjectId: string,\n wheelChairAccessibleRouteOnly: boolean,\n shouldAddOverviewSegment = true,\n indexOffset = 0, // offset for patch and segment numbers calculation\n): Promise<Route> {\n const path: CalculationResult = RoutingCore.getRoute(\n startMapObjectId,\n endMapObjectId,\n wheelChairAccessibleRouteOnly,\n );\n const pathSegments = path.routes;\n\n // Find optimized path (i.e. combine straight segments) & maneuvers list\n const optimizedPath: RouteSegment[] = [];\n let endSegment;\n for (\n let segmentIndex = 0; pathSegments\n && segmentIndex < pathSegments.length;\n segmentIndex += 1\n ) {\n const pathSegment = pathSegments![segmentIndex];\n const currentZone = pathSegment.geojson!.properties!.zone;\n if (!pathSegment.isPortal) {\n const path = pathSegment.geojson!.geometry.coordinates;\n\n // Reset state for each segment of the path\n let lastManeuverType = ManeuverType.Static;\n\n // Only add the starting static node for the very first node of route\n if (optimizedPath.length === 0) {\n const firstSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.Static,\n coordinates: [path[0]],\n };\n optimizedPath.push(firstSegment);\n }\n\n if (segmentIndex > 0 && optimizedPath.length > 0) {\n const prevPathSegment = pathSegments![segmentIndex - 1];\n const prevZone = prevPathSegment.geojson!.properties!.zone;\n if (currentZone !== prevZone) {\n const prevPath = prevPathSegment.geojson!.geometry.coordinates;\n const pathPoint = {\n ...createDefaultSegment(prevPathSegment),\n maneuverType: ManeuverType.ChangeZone,\n zone: currentZone,\n coordinates: [prevPath[prevPath.length - 1]],\n };\n optimizedPath.push(pathPoint);\n lastManeuverType = ManeuverType.ChangeZone;\n }\n }\n\n if (path.length > 2) {\n for (let index = 0; index < path.length - 2; index += 1) {\n const startPoint = path[index];\n const midPoint = path[index + 1];\n const endPoint = path[index + 2];\n\n // Keep updating endSegment on each iteration\n endSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.Static,\n coordinates: [endPoint],\n zone: currentZone,\n };\n\n // const line = lineString([startPoint, midPoint]);\n // const segmentDistance = length(line, { units: DISTANCE_UNIT });\n\n // Determine the maneuver type based on the angle of the turn\n let currentManeuverType: ManeuverType;\n currentManeuverType = ManeuverType.ContinueStraight;\n // if ((index === 0 || index === path.length - 3) && segmentDistance < 3) {\n // currentManeuverType = ManeuverType.ContinueStraight;\n // }\n // else {\n // // Calculate the bearings between the points\n // const bearing1 = bearing(startPoint, midPoint);\n // const bearing2 = bearing(midPoint, endPoint);\n\n // // Calculate the angle between the bearings\n // let angle = bearing2 - bearing1;\n // if (angle < -180) {\n // angle += 360;\n // } else if (angle > 180) {\n // angle -= 360;\n // }\n\n // if (angle < -140) {\n // currentManeuverType = ManeuverType.LeftHairPinTurn;\n // } else if (angle > 140) {\n // currentManeuverType = ManeuverType.RightHairPinTurn;\n // } else if (angle < -50) {\n // currentManeuverType = ManeuverType.LeftTurn;\n // } else if (angle > 50) {\n // currentManeuverType = ManeuverType.RightTurn;\n // // } else if (angle < -10) {\n // // currentManeuverType = 'Veer left';\n // // } else if (angle > 10) {\n // // currentManeuverType = 'Veer right';\n // } else {\n // currentManeuverType = ManeuverType.ContinueStraight;\n // }\n // }\n\n const pathPoint = {\n ...createDefaultSegment(pathSegment),\n maneuverType: currentManeuverType,\n zone: currentZone,\n };\n if (lastManeuverType === ManeuverType.ContinueStraight) {\n // If last iteration of loop then use the end point as segment end else use mid point\n // Use index + 3 because last two points are skipped by loop\n if (index + 3 === path.length) {\n optimizedPath[optimizedPath.length - 1].coordinates.push(\n midPoint,\n endPoint,\n );\n } else {\n optimizedPath[optimizedPath.length - 1].coordinates.push(midPoint);\n }\n\n optimizedPath[optimizedPath.length - 1].maneuverType = currentManeuverType;\n } else {\n pathPoint.coordinates.push(startPoint, midPoint);\n optimizedPath.push(pathPoint);\n\n // If reached end of path then add a ContinueStraight segment at end of path\n // Use index + 3 because last two points are skipped by loop\n if (index + 3 === path.length) {\n // if a ContinueStraight segment was just added then extend that, else add a new ContinueStraight segment at end\n if (currentManeuverType === ManeuverType.ContinueStraight) {\n optimizedPath[optimizedPath.length - 1].coordinates.push(\n endPoint,\n );\n } else {\n optimizedPath.push({\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n coordinates: [midPoint, endPoint],\n zone: currentZone,\n });\n }\n }\n }\n\n lastManeuverType = currentManeuverType;\n }\n } else {\n const pathPoint = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n coordinates: path,\n zone: currentZone,\n };\n optimizedPath.push(pathPoint);\n }\n\n const removeExtraChangeZoneSegment = () => {\n // When going from public to transit, hide the ChangeZone instruction, if the next step is PassThroughImmigration.\n if (optimizedPath.length > 0) {\n const lastSegmentAdded = optimizedPath[optimizedPath.length - 1];\n if (lastSegmentAdded.maneuverType === ManeuverType.ChangeZone) {\n if (lastSegmentAdded.zone === Zone.Transit) optimizedPath.pop();\n }\n }\n };\n // Check if there are immigration crossings\n let lastSegmentAdded = optimizedPath.length > 0 ? optimizedPath[optimizedPath.length - 1] : undefined;\n if (lastSegmentAdded && lastSegmentAdded.maneuverType === ManeuverType.ContinueStraight) {\n // Will add new segment, search for immigration crossings on the current non-vertical segment\n const immigrationPolygonFeatures = getImmigrationPolygonFeaturesForWhereTaxonomy(lastSegmentAdded.startEdge.whereDimension);\n const line = lineString(lastSegmentAdded.coordinates);\n for (let index = 0; index < immigrationPolygonFeatures.length; index += 1) {\n const immigrationPolygonFeature = immigrationPolygonFeatures[index];\n if (!booleanDisjoint(line, immigrationPolygonFeature)) {\n const intersects = lineIntersect(line, immigrationPolygonFeature);\n if (intersects.features.length > 1) {\n optimizedPath.pop();\n const lineBeforeImmigration = lineSlice(getCoords(line)[0], getCoord(intersects.features[0]), line);\n const lengthOfLineBeforeImmigration = length(lineBeforeImmigration, { units: 'meters' });\n // Only add if length greater then min limit\n if (lengthOfLineBeforeImmigration >= 10) {\n const segmentBeforeImmigration = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n zone: currentZone,\n coordinates: getCoords(lineBeforeImmigration),\n };\n optimizedPath.push(segmentBeforeImmigration);\n } else if (optimizedPath.length > 0) {\n lastSegmentAdded = optimizedPath[optimizedPath.length - 1];\n // If lastSegmentAdded is a change zone segment then move both lastSegmentAdded and also the second last segment\n if (lastSegmentAdded.maneuverType === ManeuverType.ChangeZone) {\n const coordsOfLastSegment = getCoords(lineBeforeImmigration);\n lastSegmentAdded.coordinates = [coordsOfLastSegment[coordsOfLastSegment.length - 1]];\n if (optimizedPath.length > 1) {\n const secondLastSegmentAdded = optimizedPath[optimizedPath.length - 2];\n secondLastSegmentAdded.coordinates = secondLastSegmentAdded.coordinates.concat(getCoords(lineBeforeImmigration));\n }\n } else {\n lastSegmentAdded.coordinates.concat(getCoords(lineBeforeImmigration));\n }\n }\n\n const immigrationLine = lineSlice(getCoord(intersects.features[0]), getCoord(intersects.features[1]), line);\n const immigrationSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.PassThroughImmigration,\n zone: currentZone,\n coordinates: getCoords(immigrationLine),\n };\n // The lineBeforeImmigration might not have been added due to length limit\n // And if lineBeforeImmigration was supposed to be the the first segment then prepend this segment with coordinates of lineBeforeImmigration\n if (optimizedPath.length === 0) {\n immigrationSegment.coordinates = lineBeforeImmigration.geometry.coordinates.concat(immigrationSegment.coordinates);\n }\n\n // When going from public to transit, hide the ChangeZone instruction, if the next step is PassThroughImmigration.\n removeExtraChangeZoneSegment();\n optimizedPath.push(immigrationSegment);\n\n const lineCoords = getCoords(line);\n const lineAfterImmigration = lineSlice(getCoord(intersects.features[1]), lineCoords[lineCoords.length - 1], line);\n const segmentAfterImmigration = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n zone: currentZone,\n coordinates: getCoords(lineAfterImmigration),\n };\n optimizedPath.push(segmentAfterImmigration);\n // line = segmentAfterImmigration;\n } else if (intersects.features.length > 0) {\n // check if start point outside polygon then end inside polygon - valid\n const startPointWithinPolygon = booleanPointInPolygon(getCoords(line)[0], immigrationPolygonFeature);\n if (startPointWithinPolygon) {\n optimizedPath.pop();\n\n // One intersection point and start point is within polygon\n // Means line start inside and exits the polygon\n const immigrationLine = lineSlice(getCoords(line)[0], getCoord(intersects.features[0]), line);\n const immigrationSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.PassThroughImmigration,\n zone: currentZone,\n coordinates: getCoords(immigrationLine),\n };\n\n lastSegmentAdded = optimizedPath.length > 0 ? optimizedPath[optimizedPath.length - 1] : undefined;\n if (lastSegmentAdded && lastSegmentAdded.maneuverType === ManeuverType.ChangeZone) {\n // Remove change zone segment\n const changeZoneSegment = optimizedPath.pop();\n if (optimizedPath.length > 1) {\n const secondLastSegmentAdded = optimizedPath[optimizedPath.length - 1];\n if (secondLastSegmentAdded.maneuverType === ManeuverType.PassThroughImmigration) {\n optimizedPath.pop();\n\n // Re add the change zone segment with updated coordinates\n (changeZoneSegment as RouteSegment).coordinates = [secondLastSegmentAdded.coordinates[0]];\n optimizedPath.push(changeZoneSegment as RouteSegment);\n immigrationSegment.coordinates = secondLastSegmentAdded.coordinates.concat(immigrationSegment.coordinates);\n }\n }\n }\n // When going from public to transit, hide the ChangeZone instruction, if the next step is PassThroughImmigration.\n removeExtraChangeZoneSegment();\n optimizedPath.push(immigrationSegment);\n\n const lineCoords = getCoords(line);\n const lineAfterImmigration = lineSlice(getCoord(intersects.features[0]), lineCoords[lineCoords.length - 1], line);\n const segmentAfterImmigration = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n zone: currentZone,\n coordinates: getCoords(lineAfterImmigration),\n };\n optimizedPath.push(segmentAfterImmigration);\n } else {\n // line starts outside immigration and ends inside immigration\n // this is not a valid case but lines are still divided into segments as the segments are used\n // by the logic under case 2(startPointWithinPolygon)\n const previousLine = lineSlice(getCoords(line)[0], getCoord(intersects.features[0]), line);\n (lastSegmentAdded as RouteSegment).coordinates = getCoords(previousLine);\n\n const lineCoords = getCoords(line);\n const lineAfterImmigration = lineSlice(getCoord(intersects.features[0]), lineCoords[lineCoords.length - 1], line);\n const segmentAfterImmigration = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.PassThroughImmigration,\n zone: currentZone,\n coordinates: getCoords(lineAfterImmigration),\n };\n optimizedPath.push(segmentAfterImmigration);\n // line = segmentAfterImmigration;\n }\n }\n }\n }\n }\n } else {\n // Keep updating endSegment on each iteration\n endSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.Static,\n coordinates: [pathSegment.geojson!.geometry.coordinates[1]],\n zone: currentZone,\n isPortal: false,\n };\n\n const enterPortalSegment: RouteSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.EnterPortal,\n coordinates: [pathSegment.geojson!.geometry.coordinates[0]],\n };\n // // Only add this EnterPortal segment if previously same what dimension portal is not being continued\n // // This is done to ensure Take Lift at A, Exit Lift at B, Take lift at B, Exit Lift at C is generated only as Take lift at A, Exit lift at C\n // let lastSegmentAdded = (optimizedPath.length > 0) ? optimizedPath[optimizedPath.length - 1] : undefined;\n // if (!lastSegmentAdded\n // || (lastSegmentAdded && lastSegmentAdded.maneuverType !== ManeuverType.ExitPortal)\n // || (lastSegmentAdded && lastSegmentAdded.maneuverType === ManeuverType.ExitPortal && lastSegmentAdded.startEdge.whatDimension !== enterPortalSegment.startEdge.whatDimension)) {\n // optimizedPath.push(enterPortalSegment);\n // lastSegmentAdded = enterPortalSegment;\n // }\n\n optimizedPath.push(enterPortalSegment);\n\n const exitPortalSegment: RouteSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ExitPortal,\n coordinates: [pathSegment.geojson!.geometry.coordinates[1]],\n };\n // // This logic is tied to the above similar logic for EnterPortal\n // // Only add this ExitPortal segment if previously same what dimension portal is not being continued\n // // This is done to ensure Take Lift at A, Exit Lift at B, Take lift at B, Exit Lift at C is generated only as Take lift at A, Exit lift at C\n // if (lastSegmentAdded && lastSegmentAdded.maneuverType !== ManeuverType.ExitPortal) {\n // if (pathSegment.portalPath) {\n // const travelPortalSegment: RouteSegment = {\n // ...createDefaultSegment(pathSegment),\n // maneuverType: ManeuverType.TravelPortal,\n // coordinates: pathSegment.portalPath.geometry.coordinates,\n // zone: currentZone,\n // };\n // optimizedPath.push(travelPortalSegment);\n // }\n\n // optimizedPath.push(exitPortalSegment);\n // } else\n optimizedPath.push(exitPortalSegment);\n\n const lastSegmentAdded = (optimizedPath.length > 0) ? optimizedPath[optimizedPath.length - 1] : undefined;\n if (lastSegmentAdded && lastSegmentAdded.maneuverType === ManeuverType.ExitPortal) {\n optimizedPath.pop();\n\n if (pathSegment.portalPath) {\n const travelPortalSegment: RouteSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.TravelPortal,\n coordinates: pathSegment.portalPath.geometry.coordinates,\n zone: currentZone,\n };\n optimizedPath.push(travelPortalSegment);\n }\n optimizedPath.push(exitPortalSegment);\n }\n }\n }\n if (endSegment) optimizedPath.push(endSegment as RouteSegment);\n\n const route: Route = {\n segments: optimizedPath,\n walkingDistance: 0,\n transportDistance: 0,\n walkingTime: 0,\n transportTime: 0,\n distanceUnit: DISTANCE_UNIT,\n speed: WALK_SPEED,\n };\n\n // A patch denotes the segments which are directly connected to each other i.e. no portal in between, portal enter/exit can be part of the patch\n if (route.segments.length > 0) {\n const addOverviewSegment = shouldAddOverviewSegment;\n let initialIndex = 0;\n\n if (addOverviewSegment) {\n // Dummy overview segment at start of route\n const dummySegment = cloneDeep(route.segments[0]);\n dummySegment.maneuverType = ManeuverType.RouteOverview;\n route.segments.unshift(dummySegment);\n\n initialIndex = 1; // Because overview segment will be at 0th index of route\n }\n\n // A patch denotes the segments which are directly connected to each other i.e. no portal in between, portal enter/exit can be part of the patch\n let patchNumber = indexOffset + initialIndex;\n let whereDimension = route.segments.length > initialIndex ? route.segments[initialIndex].startEdge.whereDimension : '';\n for (let index = initialIndex; index < route.segments.length; index += 1) {\n const highlight = false;\n const segment = route.segments[index];\n const segmentNumber = indexOffset + index;\n if (!segment.isPortal) {\n // point feature if ManeuverType.Static else line feature\n if (segment.maneuverType === ManeuverType.Static || segment.maneuverType === ManeuverType.ChangeZone) {\n segment.features = getRouteNode(\n segment.coordinates[0],\n segmentNumber,\n highlight,\n patchNumber,\n segment.endEdge.whereDimension,\n );\n segment.patchNumber = patchNumber;\n segment.whereDimension = whereDimension;\n } else {\n segment.features = getRouteLine(\n segment.coordinates,\n segmentNumber,\n highlight,\n patchNumber,\n segment.zone,\n segment.startEdge.whereDimension,\n );\n segment.patchNumber = patchNumber;\n segment.whereDimension = whereDimension;\n }\n const routeSegmentCoords = segment.coordinates;\n let segmentDistance;\n if (routeSegmentCoords.length > 1) {\n segmentDistance = length(lineString(routeSegmentCoords), { units: route.distanceUnit });\n } else {\n segmentDistance = 0;\n }\n segment.distance = segmentDistance;\n if (segment.maneuverType !== ManeuverType.PassThroughImmigration) {\n segment.time = segment.distance / route.speed;\n } else {\n segment.time = 0;\n }\n } else {\n // if (\n // segment.maneuverType !== ManeuverType.EnterPortal\n // && segment.maneuverType !== ManeuverType.ExitPortal\n // ) {\n // console.warn('unexpected state in createRoute');\n // }\n\n if (segment.maneuverType === ManeuverType.EnterPortal) {\n const startEdgeFeatures = getRouteNode(\n segment.coordinates[0],\n segmentNumber,\n highlight,\n patchNumber,\n segment.startEdge.whereDimension,\n );\n\n const features = [] as Feature[];\n // eslint-disable-next-line no-restricted-syntax\n for (const feature of startEdgeFeatures) {\n features.push(feature);\n }\n\n segment.features = features;\n segment.patchNumber = patchNumber;\n segment.whereDimension = whereDimension;\n\n // read next segment, if next segment is TravelPortal then do not include time of this enter portal segment\n const nextRouteSegment = route.segments.length >= index + 2 ? route.segments[index + 1] : undefined;\n if (nextRouteSegment && nextRouteSegment.maneuverType !== ManeuverType.TravelPortal) {\n const portalCost = segment.cost;\n segment.time = portalCost || 0;\n } else {\n segment.time = 0;\n }\n\n segment.distance = 0;\n }\n\n if (segment.maneuverType === ManeuverType.TravelPortal) {\n segment.features = getRouteLine(\n segment.coordinates,\n segmentNumber,\n highlight,\n patchNumber,\n segment.zone,\n segment.startEdge.whereDimension,\n );\n segment.patchNumber = patchNumber;\n segment.whereDimension = whereDimension;\n\n const portalCost = segment.cost;\n segment.time = portalCost || 0;\n\n let segmentDistance;\n if (segment.coordinates.length > 1) {\n segmentDistance = length(lineString(segment.coordinates), { units: route.distanceUnit });\n } else {\n segmentDistance = 0;\n }\n segment.distance = segmentDistance;\n\n // Set time of previous enter portal instruction to zero, so that time in not shown in UI\n if (index > 0) route.segments[index - 1].time = 0;\n }\n\n if (segment.maneuverType === ManeuverType.ExitPortal) {\n // increment patch number to next value\n patchNumber += 1;\n whereDimension = segment.endEdge.whereDimension;\n\n // Remove ExitPortal segment from route, because its only used to calculate patch information since ATOMS-207\n route.segments.splice(index, 1);\n index -= 1;\n }\n\n // read next segment\n const nextRouteSegment = route.segments.length >= index + 2 ? route.segments[index + 1] : undefined;\n if (nextRouteSegment && nextRouteSegment.maneuverType === ManeuverType.TravelPortal) {\n patchNumber += 1;\n }\n }\n\n if (segment.maneuverType === ManeuverType.TravelPortal) {\n route.transportDistance += segment.distance;\n route.transportTime += segment.time;\n } else {\n route.walkingDistance += segment.distance;\n route.walkingTime += segment.time;\n }\n }\n\n if (addOverviewSegment) {\n // Generate and add actual overview segment\n const overviewSegment = generateOverviewSegment(route, indexOffset);\n route.segments[0] = overviewSegment;\n }\n }\n\n return route;\n}\n\nexport function getPatch(route: Route, patchNumber = 0) {\n let routefeatures = [] as Feature[];\n\n for (let index = 0; index < route.segments.length; index += 1) {\n const routeSegment = route.segments[index];\n if (routeSegment.patchNumber === patchNumber) {\n routefeatures = routefeatures.concat(routeSegment.features);\n }\n }\n\n return routefeatures;\n}\n\nexport function getFeaturesForPatch(\n route: Route,\n patchNumber: number,\n overviewSegmentInfo: {\n includeOverviewFeatures : boolean,\n patchNumberForOverviewFeatures: number},\n) {\n let routefeatures = [] as Feature[];\n\n for (let index = 0; index < route.segments.length; index += 1) {\n const routeSegment = route.segments[index];\n if (overviewSegmentInfo.includeOverviewFeatures) {\n // Return all features in default case\n if (isOverviewSegment(routeSegment)) {\n const nonHighlightedOverviewFeatures = [];\n const highlightedOverviewFeatures = [];\n for (let j = 0; j < routeSegment.features.length; j++) {\n const feature = routeSegment.features[j];\n if (feature.properties?.patchNumber !== undefined && feature.properties.patchNumber === overviewSegmentInfo.patchNumberForOverviewFeatures) {\n if (feature.properties.isNonHighlightedOverview !== undefined) {\n if (feature.properties.isNonHighlightedOverview === '1') {\n nonHighlightedOverviewFeatures.push(feature);\n } else {\n highlightedOverviewFeatures.push(feature);\n }\n }\n }\n }\n // Sort the features such that non hihglighted features come first in the array\n // because on map they should be sorted below highlighted features in z dimension\n const overviewSegmentFeatures = nonHighlightedOverviewFeatures.concat(highlightedOverviewFeatures);\n routefeatures = routefeatures.concat(overviewSegmentFeatures);\n }\n } else if (routeSegment.patchNumber === patchNumber) {\n // Return only non-overview features\n if (!isOverviewSegment(routeSegment)) routefeatures = routefeatures.concat(routeSegment.features);\n }\n }\n\n return routefeatures;\n}\n\nenum MovingPortal {\n Skytrain = 'what.transport.skytrain',\n Bus = 'what.service.airport_transfer',\n Escalator = 'what.infra.escalator',\n Lift = 'what.infra.lift',\n}\nenum NonMovingPortal {\n Entrance = 'what.infra.entrance',\n Exit = 'what.infra.exit',\n}\nexport function isMovingPortalTaxonomy(whatDimension: string) {\n if (Object.values(MovingPortal).includes(whatDimension as any)) return true;\n return false;\n}\nexport function isNonMovingPortalTaxonomy(whatDimension: string) {\n if (Object.values(NonMovingPortal).includes(whatDimension as any)) return true;\n return false;\n}\nexport function isPortalTaxonomy(whatDimension: string) {\n if (isMovingPortalTaxonomy(whatDimension) || isNonMovingPortalTaxonomy(whatDimension)) return true;\n return false;\n}\n\nfunction isCrossTerminalPortal(whatDimension: string) {\n if (whatDimension === MovingPortal.Skytrain || whatDimension === MovingPortal.Bus) return true;\n\n return false;\n}\n\nfunction getPortalName(whatDimension: string) {\n switch (whatDimension) {\n case 'what.transport.skytrain':\n return 'Skytrain';\n case 'what.service.airport_transfer':\n return 'Bus';\n case 'what.infra.escalator':\n return 'Escalator';\n case 'what.infra.lift':\n return 'Lift';\n case 'what.infra.entrance':\n return '';\n case 'what.infra.exit':\n return '';\n\n default:\n return whatDimension;\n }\n}\n\nfunction getTerminalAndLevelName(whereDimension: string) {\n const regex = /^(T\\d+|JEWEL)([A-Za-z]\\d+[A-Za-z]?)$/;\n const subDimension = whereDimension.split('.').slice(-2).join('').toUpperCase();\n const match = subDimension.match(regex);\n\n if (match) {\n const terminalIndicator = match[1][0];\n let terminalName;\n switch (terminalIndicator) {\n case 'T':\n terminalName = 'Terminal';\n break;\n case 'J':\n terminalName = 'Jewel';\n break;\n\n default:\n terminalName = 'Level';\n break;\n }\n const terminal = terminalName === 'Terminal' ? `${terminalName} ${match[1][1]}` : `${terminalName}`;\n\n const levelIdentifier = match[2][0];\n let levelName;\n switch (levelIdentifier) {\n case 'L':\n levelName = 'Level';\n break;\n case 'B':\n levelName = 'Basement';\n break;\n\n default:\n levelName = 'Level';\n break;\n }\n\n const level = `${levelName} ${match[2].substring(1)}`;\n return {\n Terminal: terminal,\n Level: level,\n };\n }\n return null; // Return null if the input doesn't match the expected format\n}\n\nfunction getWhereDimensionNameForPortal(portalDimension: string, whereDimension: string) {\n const terminalAndLevelName = getTerminalAndLevelName(whereDimension);\n if (terminalAndLevelName) {\n if (isCrossTerminalPortal(portalDimension)) {\n return terminalAndLevelName.Terminal;\n }\n if (portalDimension === MovingPortal.Escalator || portalDimension === MovingPortal.Lift) {\n return terminalAndLevelName.Level;\n }\n\n if (isNonMovingPortalTaxonomy(portalDimension)) {\n return terminalAndLevelName.Terminal;\n }\n }\n\n return whereDimension.split('.').slice(-2).join(' ').toUpperCase();\n}\n\nfunction convertSecondsToMinutes(timeInSeconds: number): number {\n // Calculate minutes\n let minutes: number = Math.floor(timeInSeconds / 60);\n\n // Check for remaining seconds\n const remainingSeconds: number = timeInSeconds % 60;\n\n // If there are remaining seconds and they are greater than 30, increment minutes\n if (remainingSeconds > 30) {\n minutes += 1;\n }\n\n return minutes;\n}\n\nexport function formatTime(value: number) {\n if (value < 60) return '<1 minute';\n return `~${convertSecondsToMinutes(value)} ${convertSecondsToMinutes(value) > 1 ? 'minutes' : 'minute'}`;\n}\n\nexport function generateInstructions(route: Route) {\n const isFirstSegment = (index: number) => {\n if (index === 0\n || (index === 1 && route.segments[index - 1].maneuverType === ManeuverType.RouteOverview)) return true;\n\n return false;\n };\n\n const getImmigrationInstruction = (segment: RouteSegment) => {\n if (segment.startEdge.whereDimension.toLowerCase().includes('l1')) {\n return 'Clear Arrival Immigration';\n }\n\n return 'Clear Departure Immigration';\n };\n\n for (let index = 0; index < route.segments.length; index += 1) {\n const rotueSegment = route.segments[index];\n rotueSegment.instructions = []; // clear instructions array\n\n if (rotueSegment.maneuverType === ManeuverType.RouteOverview) {\n const instruction = 'Overview';\n rotueSegment.instructions.push(instruction);\n }\n if (index > 0 && rotueSegment.maneuverType === ManeuverType.ChangeZone) {\n let instruction = '';\n if (route.segments[index - 1].zone === Zone.Public && rotueSegment.zone === Zone.Transit) {\n instruction = getImmigrationInstruction(rotueSegment);\n } else if (route.segments[index - 1].zone === Zone.Transit && rotueSegment.zone === Zone.Public) {\n instruction = 'Exit Baggage Claim Hall';\n }\n\n rotueSegment.instructions.push(instruction);\n } else\n if (rotueSegment.maneuverType === ManeuverType.ContinueStraight\n || rotueSegment.maneuverType === ManeuverType.PassThroughImmigration) {\n const postfix = rotueSegment.maneuverType === ManeuverType.ContinueStraight\n ? `Walk for ${Math.ceil(rotueSegment.distance)} ${route.distanceUnit}`\n : getImmigrationInstruction(rotueSegment);\n\n // 0th index if overview segment was not included, else 1st index\n // if (index === 0\n // || (index === 1 && route.segments[index - 1].maneuverType === ManeuverType.RouteOverview)) {\n // rotueSegment.instructions.push(\n // `Start at ${\n // rotueSegment.startEdge.name\n // } on ${\n // rotueSegment.startEdge.whereDimension.split('.').slice(-2).join(' ').toUpperCase()\n // } \\n& ${postfix}`,\n // );\n // } else {\n let instruction;\n if (route.segments[index - 1].maneuverType === ManeuverType.ChangeZone || route.segments[index - 1].maneuverType === ManeuverType.PassThroughImmigration) {\n instruction = postfix;\n // eslint-disable-next-line brace-style\n }\n // else if (route.segments[index - 1].maneuverType === ManeuverType.EnterPortal || route.segments[index - 1].maneuverType === ManeuverType.TravelPortal) {\n // // for exit portal\n // instruction = postfix;\n // // `Exit ${\n // // rotueSegment.startEdge.name\n // // } at ${\n // // getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.startEdge.whereDimension)\n // // } \\n& ${postfix}`;\n\n // // if (isNonMovingPortalTaxonomy(rotueSegment.startEdge.whatDimension)) {\n // // instruction = `Enter ${\n // // rotueSegment.startEdge.whereDimension.split('.').slice(-2).join(' ').toUpperCase()\n // // } \\n& ${postfix}`;\n // // }\n // // else\n // // if (isMovingPortalTaxonomy(rotueSegment.startEdge.whatDimension)) {\n // // const name = getPortalName(rotueSegment.startEdge.whatDimension);\n\n // // // if (isCrossTerminalPortal(rotueSegment.startEdge.whatDimension)) {\n // // // postfix = ` on ${\n // // // getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.endEdge.whereDimension)\n // // // } \\n& ${postfix}`;\n // // // } else {\n // // // postfix = ` \\n& ${postfix}`;\n // // // }\n\n // // instruction = `Exit ${\n // // name\n // // } \\n& ${postfix}`;\n // // }\n // }\n else {\n instruction = postfix;\n }\n rotueSegment.instructions.push(instruction);\n // }\n } else if (rotueSegment.maneuverType === ManeuverType.Static) {\n if (isFirstSegment(index)) {\n rotueSegment.instructions.push(\n `Start at ${rotueSegment.startEdge.name}`\n );\n }\n\n if (index === route.segments.length - 1) {\n rotueSegment.instructions.push(\n `Arrive at ${rotueSegment.endEdge.name\n }`,\n );\n }\n } else if (rotueSegment.maneuverType === ManeuverType.EnterPortal) {\n let instruction = `Enter ${rotueSegment.startEdge.name\n } at ${rotueSegment.startEdge.whereDimension.split('.').slice(-2).join(' ').toUpperCase()}`;\n\n if (isNonMovingPortalTaxonomy(rotueSegment.startEdge.whatDimension)) {\n instruction = `Continue to ${getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.endEdge.whereDimension)}`;\n rotueSegment.instructions.push(instruction);\n } else if (isMovingPortalTaxonomy(rotueSegment.startEdge.whatDimension)) {\n const nextRouteSegment = index + 1 <= route.segments.length - 1 ? route.segments[index + 1] : undefined;\n if (nextRouteSegment && nextRouteSegment.maneuverType === ManeuverType.TravelPortal) {\n // push the current enter portal instruction and increment index, since we want to skip the iteration on TravelPortal segment\n rotueSegment.instructions.push(instruction);\n index += 1;\n\n const name = getPortalName(nextRouteSegment.startEdge.whatDimension);\n instruction = `Take ${\n name\n } to ${getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.endEdge.whereDimension)}`;\n nextRouteSegment.instructions.push(instruction);\n if (rotueSegment.description) nextRouteSegment.instructions.push(rotueSegment.description);\n } else {\n const name = getPortalName(rotueSegment.startEdge.whatDimension);\n\n instruction = `Take ${\n name\n } to ${getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.endEdge.whereDimension)}`;\n rotueSegment.instructions.push(instruction);\n }\n }\n }\n }\n}\n"],"mappings":"AAAA,SACEA,KAAK,EAAEC,UAAU,QACZ,eAAe;AAEtB,OAAOC,MAAM,MAAM,cAAc;AACjC,SACEC,eAAe,EAAEC,qBAAqB,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,aAAa,EAAEC,SAAS,QAChF,YAAY;AACnB,SAASC,SAAS,QAAQ,QAAQ;AAClC,SACqBC,aAAa,EAA6BC,UAAU,EAAEC,IAAI,QACxE,cAAc;AACrB,OAAOC,WAAW,MAAM,GAAG;AAC3B,SAASC,6CAA6C,EAAEC,OAAO,QAAQ,oBAAoB;AAE3F,WAAYC,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA;AAuCxB,SAASC,oBAAoBA,CAACC,WAAwB,EAAE;EACtD,MAAMC,WAAW,GAAGJ,OAAO,CAACG,WAAW,CAACE,KAAK,CAAC,CAAC,CAAC,CAAC;EACjD,MAAMC,SAAS,GAAGN,OAAO,CAACG,WAAW,CAACE,KAAK,CAAC,CAAC,CAAC,CAAC;EAC/C,MAAME,OAAqB,GAAG;IAC5BC,YAAY,EAAEP,YAAY,CAACQ,MAAM;IACjCC,WAAW,EAAE,EAAE;IACfC,QAAQ,EAAE,CAAC;IACXC,QAAQ,EAAE,EAAE;IACZC,IAAI,EAAE,CAAC;IACPC,SAAS,EAAE;MACTC,WAAW,EAAEZ,WAAW,CAACE,KAAK,CAAC,CAAC,CAAC;MACjCW,cAAc,EAAEb,WAAW,CAACc,UAAU;MACtCC,aAAa,EAAEd,WAAW,GAAGA,WAAW,CAACe,IAAI,GAAG,EAAE;MAClDC,IAAI,EAAEhB,WAAW,GAAGA,WAAW,CAACgB,IAAI,GAAG;IACzC,CAAC;IACDC,OAAO,EAAE;MACPN,WAAW,EAAEZ,WAAW,CAACE,KAAK,CAAC,CAAC,CAAC;MACjCW,cAAc,EAAEb,WAAW,CAACmB,QAAQ;MACpCJ,aAAa,EAAEZ,SAAS,GAAGA,SAAS,CAACa,IAAI,GAAG,EAAE;MAC9CC,IAAI,EAAEd,SAAS,GAAGA,SAAS,CAACc,IAAI,GAAG;IACrC,CAAC;IACDG,QAAQ,EAAEpB,WAAW,CAACoB,QAAQ;IAC9BC,YAAY,EAAE,EAAE;IAChBC,WAAW,EAAE,CAAC,CAAC;IACfT,cAAc,EAAE,EAAE;IAClBU,IAAI,EAAE,EAAE;IACRC,IAAI,EAAExB,WAAW,CAACwB,IAAI;IACtBC,WAAW,EAAEzB,WAAW,CAACyB;EAC3B,CAAC;EAED,OAAOrB,OAAO;AAChB;AAYA,OAAO,SAASsB,iBAAiBA,CAACtB,OAAqB,EAAE;EACvD,OAAOA,OAAO,CAACC,YAAY,KAAKP,YAAY,CAAC6B,aAAa,IAAIvB,OAAO,CAACC,YAAY,KAAKP,YAAY,CAAC8B,eAAe;AACrH;AAEA,SAASC,2BAA2BA,CAClCpB,QAAmB,EACnBqB,aAAsB,EACtB;EACA,KAAK,IAAIC,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGtB,QAAQ,CAACzB,MAAM,EAAE+C,KAAK,IAAI,CAAC,EAAE;IACvD,MAAMC,OAAO,GAAGvB,QAAQ,CAACsB,KAAK,CAAC;IAC/B,IAAID,aAAa,EAAE;MAChBE,OAAO,CAACC,UAAU,CAASC,SAAS,GAAG,IAAI;IAC9C,CAAC,MAAM;MACJF,OAAO,CAACC,UAAU,CAASC,SAAS,GAAG,KAAK;IAC/C;EACF;EACA,OAAOzB,QAAQ;AACjB;AAEA,OAAO,SAAS0B,qBAAqBA,CACnCC,YAAuB,EACvBC,kBAA0B,EAC1BC,iBAAiB,GAAG,KAAK,EACzB;EACA,KAAK,IAAIP,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGK,YAAY,CAACpD,MAAM,EAAE+C,KAAK,IAAI,CAAC,EAAE;IAC3D,MAAM3B,OAAO,GAAGgC,YAAY,CAACL,KAAK,CAAC;IACnC,IAAK3B,OAAO,CAAC6B,UAAU,CAASM,aAAa,KAAKF,kBAAkB,EAAE;MACpE,IAAIC,iBAAiB,EAAE;QACrB,IAAKlC,OAAO,CAAC6B,UAAU,CAASO,UAAU,KAAK,IAAI,EAAE;UACnDX,2BAA2B,CAAC,CAACzB,OAAO,CAAC,EAAE,IAAI,CAAC;QAC9C;MACF,CAAC,MAAM;QACLyB,2BAA2B,CAAC,CAACzB,OAAO,CAAC,EAAE,IAAI,CAAC;MAC9C;IACF,CAAC,MAAM;MACLyB,2BAA2B,CAAC,CAACzB,OAAO,CAAC,EAAE,KAAK,CAAC;IAC/C;EACF;EACA,OAAOgC,YAAY;AACrB;AAEA,SAASK,YAAYA,CACnBlC,WAAqB,EACrBgC,aAAqB,EACrBT,aAAsB,EACtBR,WAAmB,EACnBT,cAAc,GAAG,EAAE,EACnB;EACA,IAAIN,WAAW,CAACvB,MAAM,KAAK,CAAC,EAAE;IAC5B,OAAO,EAAE;EACX;EAEA,MAAMiD,UAAU,GAAG;IACjBM,aAAa;IACbG,eAAe,EAAE7B,cAAc;IAC/BS,WAAW;IACXqB,MAAM,EAAE;EACV,CAAC;EACD,MAAMC,IAAI,GAAG9D,KAAK,CAACyB,WAAW,EAAE0B,UAAU,CAAC;EAC3C,MAAMxB,QAAQ,GAAG,CAACmC,IAAI,CAAc;EACpCf,2BAA2B,CAACpB,QAAQ,EAAEqB,aAAa,CAAC;EACpD,OAAOrB,QAAQ;AACjB;AAEA,SAASoC,YAAYA,CACnBtC,WAAuB,EACvBgC,aAAqB,EACrBT,aAAsB,EACtBR,WAAmB,EACnBC,IAAY,EACZV,cAAc,GAAG,EAAE,EACnB;EACA,IAAIN,WAAW,CAACvB,MAAM,KAAK,CAAC,EAAE;IAC5B,OAAO,EAAE;EACX;EAEA,MAAMiD,UAAU,GAAG;IACjBM,aAAa;IACbG,eAAe,EAAE7B,cAAc;IAC/BS,WAAW;IACXqB,MAAM,EAAE,KAAK;IACbpB;EACF,CAAC;EACD;EACA,MAAMuB,IAAI,GAAG/D,UAAU,CAACwB,WAAW,EAAE;IACnC,GAAG0B,UAAU;IACbc,0BAA0B,EAAE;EAC9B,CAAC,CAAC;EAEF,MAAMP,UAAU,GAAG1D,KAAK,CAACyB,WAAW,CAAC,CAAC,CAAC,EAAE;IACvC,GAAG0B,UAAU;IACbc,0BAA0B,EAAE;EAC9B,CAAC,CAAC;EACF,MAAMC,QAAQ,GAAGlE,KAAK,CAACyB,WAAW,CAACA,WAAW,CAACvB,MAAM,GAAG,CAAC,CAAC,EAAE;IAC1D,GAAGiD,UAAU;IACbc,0BAA0B,EAAE;EAC9B,CAAC,CAAC;EACF,MAAMtC,QAAQ,GAAG,EAAe;EAChCA,QAAQ,CAACwC,IAAI,CAACT,UAAU,EAAEM,IAAI,EAAEE,QAAQ,CAAC;EACzCnB,2BAA2B,CAACpB,QAAQ,EAAEqB,aAAa,CAAC;EACpD,OAAOrB,QAAQ;AACjB;AAEA,OAAO,SAASyC,mCAAmCA,CACjDC,YAA0B,EAC1BtC,cAAc,GAAG,EAAE,EACnB;EACA,MAAMuC,YAAuB,GAAG,EAAE;EAClC,KAAK,IAAIrB,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGoB,YAAY,CAAC1C,QAAQ,CAACzB,MAAM,EAAE+C,KAAK,IAAI,CAAC,EAAE;IACpE,MAAMC,OAAO,GAAGmB,YAAY,CAAC1C,QAAQ,CAACsB,KAAK,CAAC;IAC5C,IAAIC,OAAO,CAACC,UAAU,CAAEc,0BAA0B,EAAE;MAClD,IAAIlC,cAAc,KAAK,EAAE,EAAE;QACzB,IACEmB,OAAO,CAACC,UAAU,CAAES,eAAe,IAChCV,OAAO,CAACC,UAAU,CAAES,eAAe,KAAK7B,cAAc,EACzD;UACAuC,YAAY,CAACH,IAAI,CAACjB,OAAO,CAAC;QAC5B;MACF,CAAC,MAAM;QACLoB,YAAY,CAACH,IAAI,CAACjB,OAAO,CAAC;MAC5B;IACF;EACF;EACA,OAAOoB,YAAY;AACrB;AAEA,OAAO,SAASC,uBAAuBA,CAACC,KAAY,EAAEC,WAAW,GAAG,CAAC,EAAE;EACrE,MAAMC,eAAe,GAAGjE,SAAS,CAAC+D,KAAK,CAACG,QAAQ,CAAC,CAAC,CAAC,CAAC;EACpD,MAAMC,qBAAqB,GAAGJ,KAAK,CAACG,QAAQ,CAACzE,MAAM,GAAG,CAAC,GAAGsE,KAAK,CAACG,QAAQ,CAAC,CAAC,CAAC,CAAC9C,SAAS,CAACE,cAAc,GAAG,EAAE;EACzG2C,eAAe,CAACjD,WAAW,GAAG,EAAE;EAChCiD,eAAe,CAAC/C,QAAQ,GAAG,EAAE;EAC7B+C,eAAe,CAAC9C,IAAI,GAAG,CAAC;EACxB8C,eAAe,CAAChD,QAAQ,GAAG,CAAC;EAC5BgD,eAAe,CAACpC,QAAQ,GAAG,KAAK;EAChCoC,eAAe,CAACnD,YAAY,GAAGP,YAAY,CAAC6B,aAAa;EACzD6B,eAAe,CAAClC,WAAW,GAAGiC,WAAW;EACzCC,eAAe,CAACnC,YAAY,GAAG,CAAC,UAAU,CAAC;EAC3C,KAAK,IAAIU,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGuB,KAAK,CAACG,QAAQ,CAACzE,MAAM,EAAE+C,KAAK,IAAI,CAAC,EAAE;IAC7D,IAAIuB,KAAK,CAACG,QAAQ,CAAC1B,KAAK,CAAC,CAAC1B,YAAY,KAAKP,YAAY,CAAC8B,eAAe,EAAE;MACvE,KAAK,IAAI+B,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,KAAK,CAACG,QAAQ,CAAC1B,KAAK,CAAC,CAACxB,WAAW,CAACvB,MAAM,EAAE2E,CAAC,IAAI,CAAC,EAAE;QACpE,MAAMC,KAAK,GAAGN,KAAK,CAACG,QAAQ,CAAC1B,KAAK,CAAC,CAACxB,WAAW,CAACoD,CAAC,CAAC;QAClDH,eAAe,CAACjD,WAAW,CAAC0C,IAAI,CAACW,KAAK,CAAC;MACzC;MAEA,KAAK,IAAID,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,KAAK,CAACG,QAAQ,CAAC1B,KAAK,CAAC,CAACtB,QAAQ,CAACzB,MAAM,EAAE2E,CAAC,IAAI,CAAC,EAAE;QACjE,MAAM3B,OAAO,GAAGzC,SAAS,CAAC+D,KAAK,CAACG,QAAQ,CAAC1B,KAAK,CAAC,CAACtB,QAAQ,CAACkD,CAAC,CAAC,CAAY;QACvE,IAAI3B,OAAO,CAACC,UAAU,IAAI,CAACD,OAAO,CAACC,UAAU,CAACU,MAAM,EAAE;UACpD;UACA;UACA,IAAIX,OAAO,CAACC,UAAU,CAACS,eAAe,KAAKgB,qBAAqB,EAAE1B,OAAO,CAACC,UAAU,CAAC4B,wBAAwB,GAAG,GAAG,CAAC,KAC/G7B,OAAO,CAACC,UAAU,CAAC4B,wBAAwB,GAAG,GAAG;UAEtD7B,OAAO,CAACC,UAAU,CAACS,eAAe,GAAGgB,qBAAqB,CAAC,CAAC;UAC5D1B,OAAO,CAACC,UAAU,CAACX,WAAW,GAAGkC,eAAe,CAAClC,WAAW;UAC5DU,OAAO,CAACC,UAAU,CAACM,aAAa,GAAGiB,eAAe,CAAClC,WAAW;UAC9DkC,eAAe,CAAC/C,QAAQ,CAACwC,IAAI,CAACjB,OAAO,CAAC;QACxC;MACF;IACF;EACF;EAEAwB,eAAe,CAACtC,OAAO,GAAG3B,SAAS,CAAC+D,KAAK,CAACG,QAAQ,CAACH,KAAK,CAACG,QAAQ,CAACzE,MAAM,GAAG,CAAC,CAAC,CAACkC,OAAO,CAAC;EACtFsC,eAAe,CAAC9C,IAAI,GAAG4C,KAAK,CAACQ,WAAW,GAAGR,KAAK,CAACS,aAAa;EAC9DP,eAAe,CAAChD,QAAQ,GAAG8C,KAAK,CAACU,eAAe,GAAGV,KAAK,CAACW,iBAAiB;EAE1E,OAAOT,eAAe;AACxB;AAEA,OAAO,eAAeU,WAAWA,CAC/BC,gBAAuC,EACvCC,cAAsB,EACtBC,6BAAsC,EACtCC,wBAAwB,GAAG,IAAI,EAC/Bf,WAAW,GAAG,CAAC,CAAE;AAAA,EACD;EAChB,MAAMgB,IAAuB,GAAG5E,WAAW,CAAC6E,QAAQ,CAClDL,gBAAgB,EAChBC,cAAc,EACdC,6BACF,CAAC;EACD,MAAMI,YAAY,GAAGF,IAAI,CAACG,MAAM;;EAEhC;EACA,MAAMC,aAA6B,GAAG,EAAE;EACxC,IAAIC,UAAU;EACd,KACE,IAAIC,YAAY,GAAG,CAAC,EAAEJ,YAAY,IAC/BI,YAAY,GAAGJ,YAAY,CAACzF,MAAM,EACrC6F,YAAY,IAAI,CAAC,EACjB;IACA,MAAM7E,WAAW,GAAGyE,YAAY,CAAEI,YAAY,CAAC;IAC/C,MAAMC,WAAW,GAAG9E,WAAW,CAAC+E,OAAO,CAAE9C,UAAU,CAAEV,IAAI;IACzD,IAAI,CAACvB,WAAW,CAACoB,QAAQ,EAAE;MACzB,MAAMmD,IAAI,GAAGvE,WAAW,CAAC+E,OAAO,CAAEC,QAAQ,CAACzE,WAAW;;MAEtD;MACA,IAAI0E,gBAAgB,GAAGnF,YAAY,CAACQ,MAAM;;MAE1C;MACA,IAAIqE,aAAa,CAAC3F,MAAM,KAAK,CAAC,EAAE;QAC9B,MAAMkG,YAAY,GAAG;UACnB,GAAGnF,oBAAoB,CAACC,WAAW,CAAC;UACpCK,YAAY,EAAEP,YAAY,CAACQ,MAAM;UACjCC,WAAW,EAAE,CAACgE,IAAI,CAAC,CAAC,CAAC;QACvB,CAAC;QACDI,aAAa,CAAC1B,IAAI,CAACiC,YAAY,CAAC;MAClC;MAEA,IAAIL,YAAY,GAAG,CAAC,IAAIF,aAAa,CAAC3F,MAAM,GAAG,CAAC,EAAE;QAChD,MAAMmG,eAAe,GAAGV,YAAY,CAAEI,YAAY,GAAG,CAAC,CAAC;QACvD,MAAMO,QAAQ,GAAGD,eAAe,CAACJ,OAAO,CAAE9C,UAAU,CAAEV,IAAI;QAC1D,IAAIuD,WAAW,KAAKM,QAAQ,EAAE;UAC5B,MAAMC,QAAQ,GAAGF,eAAe,CAACJ,OAAO,CAAEC,QAAQ,CAACzE,WAAW;UAC9D,MAAM+E,SAAS,GAAG;YAChB,GAAGvF,oBAAoB,CAACoF,eAAe,CAAC;YACxC9E,YAAY,EAAEP,YAAY,CAACyF,UAAU;YACrChE,IAAI,EAAEuD,WAAW;YACjBvE,WAAW,EAAE,CAAC8E,QAAQ,CAACA,QAAQ,CAACrG,MAAM,GAAG,CAAC,CAAC;UAC7C,CAAC;UACD2F,aAAa,CAAC1B,IAAI,CAACqC,SAAS,CAAC;UAC7BL,gBAAgB,GAAGnF,YAAY,CAACyF,UAAU;QAC5C;MACF;MAEA,IAAIhB,IAAI,CAACvF,MAAM,GAAG,CAAC,EAAE;QACnB,KAAK,IAAI+C,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGwC,IAAI,CAACvF,MAAM,GAAG,CAAC,EAAE+C,KAAK,IAAI,CAAC,EAAE;UACvD,MAAMS,UAAU,GAAG+B,IAAI,CAACxC,KAAK,CAAC;UAC9B,MAAMyD,QAAQ,GAAGjB,IAAI,CAACxC,KAAK,GAAG,CAAC,CAAC;UAChC,MAAMiB,QAAQ,GAAGuB,IAAI,CAACxC,KAAK,GAAG,CAAC,CAAC;;UAEhC;UACA6C,UAAU,GAAG;YACX,GAAG7E,oBAAoB,CAACC,WAAW,CAAC;YACpCK,YAAY,EAAEP,YAAY,CAACQ,MAAM;YACjCC,WAAW,EAAE,CAACyC,QAAQ,CAAC;YACvBzB,IAAI,EAAEuD;UACR,CAAC;;UAED;UACA;;UAEA;UACA,IAAIW,mBAAiC;UACrCA,mBAAmB,GAAG3F,YAAY,CAAC4F,gBAAgB;UACnD;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA,MAAMJ,SAAS,GAAG;YAChB,GAAGvF,oBAAoB,CAACC,WAAW,CAAC;YACpCK,YAAY,EAAEoF,mBAAmB;YACjClE,IAAI,EAAEuD;UACR,CAAC;UACD,IAAIG,gBAAgB,KAAKnF,YAAY,CAAC4F,gBAAgB,EAAE;YACtD;YACA;YACA,IAAI3D,KAAK,GAAG,CAAC,KAAKwC,IAAI,CAACvF,MAAM,EAAE;cAC7B2F,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC,CAACuB,WAAW,CAAC0C,IAAI,CACtDuC,QAAQ,EACRxC,QACF,CAAC;YACH,CAAC,MAAM;cACL2B,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC,CAACuB,WAAW,CAAC0C,IAAI,CAACuC,QAAQ,CAAC;YACpE;YAEAb,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC,CAACqB,YAAY,GAAGoF,mBAAmB;UAC5E,CAAC,MAAM;YACLH,SAAS,CAAC/E,WAAW,CAAC0C,IAAI,CAACT,UAAU,EAAEgD,QAAQ,CAAC;YAChDb,aAAa,CAAC1B,IAAI,CAACqC,SAAS,CAAC;;YAE7B;YACA;YACA,IAAIvD,KAAK,GAAG,CAAC,KAAKwC,IAAI,CAACvF,MAAM,EAAE;cAC7B;cACA,IAAIyG,mBAAmB,KAAK3F,YAAY,CAAC4F,gBAAgB,EAAE;gBACzDf,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC,CAACuB,WAAW,CAAC0C,IAAI,CACtDD,QACF,CAAC;cACH,CAAC,MAAM;gBACL2B,aAAa,CAAC1B,IAAI,CAAC;kBACjB,GAAGlD,oBAAoB,CAACC,WAAW,CAAC;kBACpCK,YAAY,EAAEP,YAAY,CAAC4F,gBAAgB;kBAC3CnF,WAAW,EAAE,CAACiF,QAAQ,EAAExC,QAAQ,CAAC;kBACjCzB,IAAI,EAAEuD;gBACR,CAAC,CAAC;cACJ;YACF;UACF;UAEAG,gBAAgB,GAAGQ,mBAAmB;QACxC;MACF,CAAC,MAAM;QACL,MAAMH,SAAS,GAAG;UAChB,GAAGvF,oBAAoB,CAACC,WAAW,CAAC;UACpCK,YAAY,EAAEP,YAAY,CAAC4F,gBAAgB;UAC3CnF,WAAW,EAAEgE,IAAI;UACjBhD,IAAI,EAAEuD;QACR,CAAC;QACDH,aAAa,CAAC1B,IAAI,CAACqC,SAAS,CAAC;MAC/B;MAEA,MAAMK,4BAA4B,GAAGA,CAAA,KAAM;QACzC;QACA,IAAIhB,aAAa,CAAC3F,MAAM,GAAG,CAAC,EAAE;UAC5B,MAAM4G,gBAAgB,GAAGjB,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC;UAChE,IAAI4G,gBAAgB,CAACvF,YAAY,KAAKP,YAAY,CAACyF,UAAU,EAAE;YAC7D,IAAIK,gBAAgB,CAACrE,IAAI,KAAK7B,IAAI,CAACmG,OAAO,EAAElB,aAAa,CAACmB,GAAG,CAAC,CAAC;UACjE;QACF;MACF,CAAC;MACD;MACA,IAAIF,gBAAgB,GAAGjB,aAAa,CAAC3F,MAAM,GAAG,CAAC,GAAG2F,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC,GAAG+G,SAAS;MACrG,IAAIH,gBAAgB,IAAIA,gBAAgB,CAACvF,YAAY,KAAKP,YAAY,CAAC4F,gBAAgB,EAAE;QACvF;QACA,MAAMM,0BAA0B,GAAGpG,6CAA6C,CAACgG,gBAAgB,CAACjF,SAAS,CAACE,cAAc,CAAC;QAC3H,MAAMiC,IAAI,GAAG/D,UAAU,CAAC6G,gBAAgB,CAACrF,WAAW,CAAC;QACrD,KAAK,IAAIwB,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGiE,0BAA0B,CAAChH,MAAM,EAAE+C,KAAK,IAAI,CAAC,EAAE;UACzE,MAAMkE,yBAAyB,GAAGD,0BAA0B,CAACjE,KAAK,CAAC;UACnE,IAAI,CAAC9C,eAAe,CAAC6D,IAAI,EAAEmD,yBAAyB,CAAC,EAAE;YACrD,MAAMC,UAAU,GAAG7G,aAAa,CAACyD,IAAI,EAAEmD,yBAAyB,CAAC;YACjE,IAAIC,UAAU,CAACzF,QAAQ,CAACzB,MAAM,GAAG,CAAC,EAAE;cAClC2F,aAAa,CAACmB,GAAG,CAAC,CAAC;cACnB,MAAMK,qBAAqB,GAAG7G,SAAS,CAACF,SAAS,CAAC0D,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE3D,QAAQ,CAAC+G,UAAU,CAACzF,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAEqC,IAAI,CAAC;cACnG,MAAMsD,6BAA6B,GAAGpH,MAAM,CAACmH,qBAAqB,EAAE;gBAAEE,KAAK,EAAE;cAAS,CAAC,CAAC;cACxF;cACA,IAAID,6BAA6B,IAAI,EAAE,EAAE;gBACvC,MAAME,wBAAwB,GAAG;kBAC/B,GAAGvG,oBAAoB,CAACC,WAAW,CAAC;kBACpCK,YAAY,EAAEP,YAAY,CAAC4F,gBAAgB;kBAC3CnE,IAAI,EAAEuD,WAAW;kBACjBvE,WAAW,EAAEnB,SAAS,CAAC+G,qBAAqB;gBAC9C,CAAC;gBACDxB,aAAa,CAAC1B,IAAI,CAACqD,wBAAwB,CAAC;cAC9C,CAAC,MAAM,IAAI3B,aAAa,CAAC3F,MAAM,GAAG,CAAC,EAAE;gBACnC4G,gBAAgB,GAAGjB,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC;gBAC1D;gBACA,IAAI4G,gBAAgB,CAACvF,YAAY,KAAKP,YAAY,CAACyF,UAAU,EAAE;kBAC7D,MAAMgB,mBAAmB,GAAGnH,SAAS,CAAC+G,qBAAqB,CAAC;kBAC5DP,gBAAgB,CAACrF,WAAW,GAAG,CAACgG,mBAAmB,CAACA,mBAAmB,CAACvH,MAAM,GAAG,CAAC,CAAC,CAAC;kBACpF,IAAI2F,aAAa,CAAC3F,MAAM,GAAG,CAAC,EAAE;oBAC5B,MAAMwH,sBAAsB,GAAG7B,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC;oBACtEwH,sBAAsB,CAACjG,WAAW,GAAGiG,sBAAsB,CAACjG,WAAW,CAACkG,MAAM,CAACrH,SAAS,CAAC+G,qBAAqB,CAAC,CAAC;kBAClH;gBACF,CAAC,MAAM;kBACLP,gBAAgB,CAACrF,WAAW,CAACkG,MAAM,CAACrH,SAAS,CAAC+G,qBAAqB,CAAC,CAAC;gBACvE;cACF;cAEA,MAAMO,eAAe,GAAGpH,SAAS,CAACH,QAAQ,CAAC+G,UAAU,CAACzF,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAEtB,QAAQ,CAAC+G,UAAU,CAACzF,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAEqC,IAAI,CAAC;cAC3G,MAAM6D,kBAAkB,GAAG;gBACzB,GAAG5G,oBAAoB,CAACC,WAAW,CAAC;gBACpCK,YAAY,EAAEP,YAAY,CAAC8G,sBAAsB;gBACjDrF,IAAI,EAAEuD,WAAW;gBACjBvE,WAAW,EAAEnB,SAAS,CAACsH,eAAe;cACxC,CAAC;cACD;cACA;cACA,IAAI/B,aAAa,CAAC3F,MAAM,KAAK,CAAC,EAAE;gBAC9B2H,kBAAkB,CAACpG,WAAW,GAAG4F,qBAAqB,CAACnB,QAAQ,CAACzE,WAAW,CAACkG,MAAM,CAACE,kBAAkB,CAACpG,WAAW,CAAC;cACpH;;cAEA;cACAoF,4BAA4B,CAAC,CAAC;cAC9BhB,aAAa,CAAC1B,IAAI,CAAC0D,kBAAkB,CAAC;cAEtC,MAAME,UAAU,GAAGzH,SAAS,CAAC0D,IAAI,CAAC;cAClC,MAAMgE,oBAAoB,GAAGxH,SAAS,CAACH,QAAQ,CAAC+G,UAAU,CAACzF,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAEoG,UAAU,CAACA,UAAU,CAAC7H,MAAM,GAAG,CAAC,CAAC,EAAE8D,IAAI,CAAC;cACjH,MAAMiE,uBAAuB,GAAG;gBAC9B,GAAGhH,oBAAoB,CAACC,WAAW,CAAC;gBACpCK,YAAY,EAAEP,YAAY,CAAC4F,gBAAgB;gBAC3CnE,IAAI,EAAEuD,WAAW;gBACjBvE,WAAW,EAAEnB,SAAS,CAAC0H,oBAAoB;cAC7C,CAAC;cACDnC,aAAa,CAAC1B,IAAI,CAAC8D,uBAAuB,CAAC;cAC3C;YACF,CAAC,MAAM,IAAIb,UAAU,CAACzF,QAAQ,CAACzB,MAAM,GAAG,CAAC,EAAE;cACzC;cACA,MAAMgI,uBAAuB,GAAG9H,qBAAqB,CAACE,SAAS,CAAC0D,IAAI,CAAC,CAAC,CAAC,CAAC,EAAEmD,yBAAyB,CAAC;cACpG,IAAIe,uBAAuB,EAAE;gBAC3BrC,aAAa,CAACmB,GAAG,CAAC,CAAC;;gBAEnB;gBACA;gBACA,MAAMY,eAAe,GAAGpH,SAAS,CAACF,SAAS,CAAC0D,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE3D,QAAQ,CAAC+G,UAAU,CAACzF,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAEqC,IAAI,CAAC;gBAC7F,MAAM6D,kBAAkB,GAAG;kBACzB,GAAG5G,oBAAoB,CAACC,WAAW,CAAC;kBACpCK,YAAY,EAAEP,YAAY,CAAC8G,sBAAsB;kBACjDrF,IAAI,EAAEuD,WAAW;kBACjBvE,WAAW,EAAEnB,SAAS,CAACsH,eAAe;gBACxC,CAAC;gBAEDd,gBAAgB,GAAGjB,aAAa,CAAC3F,MAAM,GAAG,CAAC,GAAG2F,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC,GAAG+G,SAAS;gBACjG,IAAIH,gBAAgB,IAAIA,gBAAgB,CAACvF,YAAY,KAAKP,YAAY,CAACyF,UAAU,EAAE;kBACjF;kBACA,MAAM0B,iBAAiB,GAAGtC,aAAa,CAACmB,GAAG,CAAC,CAAC;kBAC7C,IAAInB,aAAa,CAAC3F,MAAM,GAAG,CAAC,EAAE;oBAC5B,MAAMwH,sBAAsB,GAAG7B,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC;oBACtE,IAAIwH,sBAAsB,CAACnG,YAAY,KAAKP,YAAY,CAAC8G,sBAAsB,EAAE;sBAC/EjC,aAAa,CAACmB,GAAG,CAAC,CAAC;;sBAEnB;sBACCmB,iBAAiB,CAAkB1G,WAAW,GAAG,CAACiG,sBAAsB,CAACjG,WAAW,CAAC,CAAC,CAAC,CAAC;sBACzFoE,aAAa,CAAC1B,IAAI,CAACgE,iBAAiC,CAAC;sBACrDN,kBAAkB,CAACpG,WAAW,GAAGiG,sBAAsB,CAACjG,WAAW,CAACkG,MAAM,CAACE,kBAAkB,CAACpG,WAAW,CAAC;oBAC5G;kBACF;gBACF;gBACA;gBACAoF,4BAA4B,CAAC,CAAC;gBAC9BhB,aAAa,CAAC1B,IAAI,CAAC0D,kBAAkB,CAAC;gBAEtC,MAAME,UAAU,GAAGzH,SAAS,CAAC0D,IAAI,CAAC;gBAClC,MAAMgE,oBAAoB,GAAGxH,SAAS,CAACH,QAAQ,CAAC+G,UAAU,CAACzF,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAEoG,UAAU,CAACA,UAAU,CAAC7H,MAAM,GAAG,CAAC,CAAC,EAAE8D,IAAI,CAAC;gBACjH,MAAMiE,uBAAuB,GAAG;kBAC9B,GAAGhH,oBAAoB,CAACC,WAAW,CAAC;kBACpCK,YAAY,EAAEP,YAAY,CAAC4F,gBAAgB;kBAC3CnE,IAAI,EAAEuD,WAAW;kBACjBvE,WAAW,EAAEnB,SAAS,CAAC0H,oBAAoB;gBAC7C,CAAC;gBACDnC,aAAa,CAAC1B,IAAI,CAAC8D,uBAAuB,CAAC;cAC7C,CAAC,MAAM;gBACL;gBACA;gBACA;gBACA,MAAMG,YAAY,GAAG5H,SAAS,CAACF,SAAS,CAAC0D,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE3D,QAAQ,CAAC+G,UAAU,CAACzF,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAEqC,IAAI,CAAC;gBACzF8C,gBAAgB,CAAkBrF,WAAW,GAAGnB,SAAS,CAAC8H,YAAY,CAAC;gBAExE,MAAML,UAAU,GAAGzH,SAAS,CAAC0D,IAAI,CAAC;gBAClC,MAAMgE,oBAAoB,GAAGxH,SAAS,CAACH,QAAQ,CAAC+G,UAAU,CAACzF,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAEoG,UAAU,CAACA,UAAU,CAAC7H,MAAM,GAAG,CAAC,CAAC,EAAE8D,IAAI,CAAC;gBACjH,MAAMiE,uBAAuB,GAAG;kBAC9B,GAAGhH,oBAAoB,CAACC,WAAW,CAAC;kBACpCK,YAAY,EAAEP,YAAY,CAAC8G,sBAAsB;kBACjDrF,IAAI,EAAEuD,WAAW;kBACjBvE,WAAW,EAAEnB,SAAS,CAAC0H,oBAAoB;gBAC7C,CAAC;gBACDnC,aAAa,CAAC1B,IAAI,CAAC8D,uBAAuB,CAAC;gBAC3C;cACF;YACF;UACF;QACF;MACF;IACF,CAAC,MAAM;MACL;MACAnC,UAAU,GAAG;QACX,GAAG7E,oBAAoB,CAACC,WAAW,CAAC;QACpCK,YAAY,EAAEP,YAAY,CAACQ,MAAM;QACjCC,WAAW,EAAE,CAACP,WAAW,CAAC+E,OAAO,CAAEC,QAAQ,CAACzE,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3DgB,IAAI,EAAEuD,WAAW;QACjB1D,QAAQ,EAAE;MACZ,CAAC;MAED,MAAM+F,kBAAgC,GAAG;QACvC,GAAGpH,oBAAoB,CAACC,WAAW,CAAC;QACpCK,YAAY,EAAEP,YAAY,CAACsH,WAAW;QACtC7G,WAAW,EAAE,CAACP,WAAW,CAAC+E,OAAO,CAAEC,QAAQ,CAACzE,WAAW,CAAC,CAAC,CAAC;MAC5D,CAAC;MACD;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MAEAoE,aAAa,CAAC1B,IAAI,CAACkE,kBAAkB,CAAC;MAEtC,MAAME,iBAA+B,GAAG;QACtC,GAAGtH,oBAAoB,CAACC,WAAW,CAAC;QACpCK,YAAY,EAAEP,YAAY,CAACwH,UAAU;QACrC/G,WAAW,EAAE,CAACP,WAAW,CAAC+E,OAAO,CAAEC,QAAQ,CAACzE,WAAW,CAAC,CAAC,CAAC;MAC5D,CAAC;MACD;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MAEA;MACA;MACAoE,aAAa,CAAC1B,IAAI,CAACoE,iBAAiB,CAAC;MAErC,MAAMzB,gBAAgB,GAAIjB,aAAa,CAAC3F,MAAM,GAAG,CAAC,GAAI2F,aAAa,CAACA,aAAa,CAAC3F,MAAM,GAAG,CAAC,CAAC,GAAG+G,SAAS;MACzG,IAAIH,gBAAgB,IAAIA,gBAAgB,CAACvF,YAAY,KAAKP,YAAY,CAACwH,UAAU,EAAE;QACjF3C,aAAa,CAACmB,GAAG,CAAC,CAAC;QAEnB,IAAI9F,WAAW,CAACuH,UAAU,EAAE;UAC1B,MAAMC,mBAAiC,GAAG;YACxC,GAAGzH,oBAAoB,CAACC,WAAW,CAAC;YACpCK,YAAY,EAAEP,YAAY,CAAC2H,YAAY;YACvClH,WAAW,EAAEP,WAAW,CAACuH,UAAU,CAACvC,QAAQ,CAACzE,WAAW;YACxDgB,IAAI,EAAEuD;UACR,CAAC;UACDH,aAAa,CAAC1B,IAAI,CAACuE,mBAAmB,CAAC;QACzC;QACA7C,aAAa,CAAC1B,IAAI,CAACoE,iBAAiB,CAAC;MACvC;IACF;EACF;EACA,IAAIzC,UAAU,EAAED,aAAa,CAAC1B,IAAI,CAAC2B,UAA0B,CAAC;EAE9D,MAAMtB,KAAY,GAAG;IACnBG,QAAQ,EAAEkB,aAAa;IACvBX,eAAe,EAAE,CAAC;IAClBC,iBAAiB,EAAE,CAAC;IACpBH,WAAW,EAAE,CAAC;IACdC,aAAa,EAAE,CAAC;IAChB2D,YAAY,EAAElI,aAAa;IAC3BmI,KAAK,EAAElI;EACT,CAAC;;EAED;EACA,IAAI6D,KAAK,CAACG,QAAQ,CAACzE,MAAM,GAAG,CAAC,EAAE;IAC7B,MAAM4I,kBAAkB,GAAGtD,wBAAwB;IACnD,IAAIuD,YAAY,GAAG,CAAC;IAEpB,IAAID,kBAAkB,EAAE;MACtB;MACA,MAAME,YAAY,GAAGvI,SAAS,CAAC+D,KAAK,CAACG,QAAQ,CAAC,CAAC,CAAC,CAAC;MACjDqE,YAAY,CAACzH,YAAY,GAAGP,YAAY,CAAC6B,aAAa;MACtD2B,KAAK,CAACG,QAAQ,CAACsE,OAAO,CAACD,YAAY,CAAC;MAEpCD,YAAY,GAAG,CAAC,CAAC,CAAC;IACpB;;IAEA;IACA,IAAIvG,WAAW,GAAGiC,WAAW,GAAGsE,YAAY;IAC5C,IAAIhH,cAAc,GAAGyC,KAAK,CAACG,QAAQ,CAACzE,MAAM,GAAG6I,YAAY,GAAGvE,KAAK,CAACG,QAAQ,CAACoE,YAAY,CAAC,CAAClH,SAAS,CAACE,cAAc,GAAG,EAAE;IACtH,KAAK,IAAIkB,KAAK,GAAG8F,YAAY,EAAE9F,KAAK,GAAGuB,KAAK,CAACG,QAAQ,CAACzE,MAAM,EAAE+C,KAAK,IAAI,CAAC,EAAE;MACxE,MAAMG,SAAS,GAAG,KAAK;MACvB,MAAM9B,OAAO,GAAGkD,KAAK,CAACG,QAAQ,CAAC1B,KAAK,CAAC;MACrC,MAAMQ,aAAa,GAAGgB,WAAW,GAAGxB,KAAK;MACzC,IAAI,CAAC3B,OAAO,CAACgB,QAAQ,EAAE;QACrB;QACA,IAAIhB,OAAO,CAACC,YAAY,KAAKP,YAAY,CAACQ,MAAM,IAAIF,OAAO,CAACC,YAAY,KAAKP,YAAY,CAACyF,UAAU,EAAE;UACpGnF,OAAO,CAACK,QAAQ,GAAGgC,YAAY,CAC7BrC,OAAO,CAACG,WAAW,CAAC,CAAC,CAAC,EACtBgC,aAAa,EACbL,SAAS,EACTZ,WAAW,EACXlB,OAAO,CAACc,OAAO,CAACL,cAClB,CAAC;UACDT,OAAO,CAACkB,WAAW,GAAGA,WAAW;UACjClB,OAAO,CAACS,cAAc,GAAGA,cAAc;QACzC,CAAC,MAAM;UACLT,OAAO,CAACK,QAAQ,GAAGoC,YAAY,CAC7BzC,OAAO,CAACG,WAAW,EACnBgC,aAAa,EACbL,SAAS,EACTZ,WAAW,EACXlB,OAAO,CAACmB,IAAI,EACZnB,OAAO,CAACO,SAAS,CAACE,cACpB,CAAC;UACDT,OAAO,CAACkB,WAAW,GAAGA,WAAW;UACjClB,OAAO,CAACS,cAAc,GAAGA,cAAc;QACzC;QACA,MAAMmH,kBAAkB,GAAG5H,OAAO,CAACG,WAAW;QAC9C,IAAI0H,eAAe;QACnB,IAAID,kBAAkB,CAAChJ,MAAM,GAAG,CAAC,EAAE;UACjCiJ,eAAe,GAAGjJ,MAAM,CAACD,UAAU,CAACiJ,kBAAkB,CAAC,EAAE;YAAE3B,KAAK,EAAE/C,KAAK,CAACoE;UAAa,CAAC,CAAC;QACzF,CAAC,MAAM;UACLO,eAAe,GAAG,CAAC;QACrB;QACA7H,OAAO,CAACI,QAAQ,GAAGyH,eAAe;QAClC,IAAI7H,OAAO,CAACC,YAAY,KAAKP,YAAY,CAAC8G,sBAAsB,EAAE;UAChExG,OAAO,CAACM,IAAI,GAAGN,OAAO,CAACI,QAAQ,GAAG8C,KAAK,CAACqE,KAAK;QAC/C,CAAC,MAAM;UACLvH,OAAO,CAACM,IAAI,GAAG,CAAC;QAClB;MACF,CAAC,MAAM;QACL;QACA;QACA;QACA;QACA;QACA;;QAEA,IAAIN,OAAO,CAACC,YAAY,KAAKP,YAAY,CAACsH,WAAW,EAAE;UACrD,MAAMc,iBAAiB,GAAGzF,YAAY,CACpCrC,OAAO,CAACG,WAAW,CAAC,CAAC,CAAC,EACtBgC,aAAa,EACbL,SAAS,EACTZ,WAAW,EACXlB,OAAO,CAACO,SAAS,CAACE,cACpB,CAAC;UAED,MAAMJ,QAAQ,GAAG,EAAe;UAChC;UACA,KAAK,MAAMuB,OAAO,IAAIkG,iBAAiB,EAAE;YACvCzH,QAAQ,CAACwC,IAAI,CAACjB,OAAO,CAAC;UACxB;UAEA5B,OAAO,CAACK,QAAQ,GAAGA,QAAQ;UAC3BL,OAAO,CAACkB,WAAW,GAAGA,WAAW;UACjClB,OAAO,CAACS,cAAc,GAAGA,cAAc;;UAEvC;UACA,MAAMsH,gBAAgB,GAAG7E,KAAK,CAACG,QAAQ,CAACzE,MAAM,IAAI+C,KAAK,GAAG,CAAC,GAAGuB,KAAK,CAACG,QAAQ,CAAC1B,KAAK,GAAG,CAAC,CAAC,GAAGgE,SAAS;UACnG,IAAIoC,gBAAgB,IAAIA,gBAAgB,CAAC9H,YAAY,KAAKP,YAAY,CAAC2H,YAAY,EAAE;YACnF,MAAMW,UAAU,GAAGhI,OAAO,CAACoB,IAAI;YAC/BpB,OAAO,CAACM,IAAI,GAAG0H,UAAU,IAAI,CAAC;UAChC,CAAC,MAAM;YACLhI,OAAO,CAACM,IAAI,GAAG,CAAC;UAClB;UAEAN,OAAO,CAACI,QAAQ,GAAG,CAAC;QACtB;QAEA,IAAIJ,OAAO,CAACC,YAAY,KAAKP,YAAY,CAAC2H,YAAY,EAAE;UACtDrH,OAAO,CAACK,QAAQ,GAAGoC,YAAY,CAC7BzC,OAAO,CAACG,WAAW,EACnBgC,aAAa,EACbL,SAAS,EACTZ,WAAW,EACXlB,OAAO,CAACmB,IAAI,EACZnB,OAAO,CAACO,SAAS,CAACE,cACpB,CAAC;UACDT,OAAO,CAACkB,WAAW,GAAGA,WAAW;UACjClB,OAAO,CAACS,cAAc,GAAGA,cAAc;UAEvC,MAAMuH,UAAU,GAAGhI,OAAO,CAACoB,IAAI;UAC/BpB,OAAO,CAACM,IAAI,GAAG0H,UAAU,IAAI,CAAC;UAE9B,IAAIH,eAAe;UACnB,IAAI7H,OAAO,CAACG,WAAW,CAACvB,MAAM,GAAG,CAAC,EAAE;YAClCiJ,eAAe,GAAGjJ,MAAM,CAACD,UAAU,CAACqB,OAAO,CAACG,WAAW,CAAC,EAAE;cAAE8F,KAAK,EAAE/C,KAAK,CAACoE;YAAa,CAAC,CAAC;UAC1F,CAAC,MAAM;YACLO,eAAe,GAAG,CAAC;UACrB;UACA7H,OAAO,CAACI,QAAQ,GAAGyH,eAAe;;UAElC;UACA,IAAIlG,KAAK,GAAG,CAAC,EAAEuB,KAAK,CAACG,QAAQ,CAAC1B,KAAK,GAAG,CAAC,CAAC,CAACrB,IAAI,GAAG,CAAC;QACnD;QAEA,IAAIN,OAAO,CAACC,YAAY,KAAKP,YAAY,CAACwH,UAAU,EAAE;UACpD;UACAhG,WAAW,IAAI,CAAC;UAChBT,cAAc,GAAGT,OAAO,CAACc,OAAO,CAACL,cAAc;;UAE/C;UACAyC,KAAK,CAACG,QAAQ,CAAC4E,MAAM,CAACtG,KAAK,EAAE,CAAC,CAAC;UAC/BA,KAAK,IAAI,CAAC;QACZ;;QAEA;QACA,MAAMoG,gBAAgB,GAAG7E,KAAK,CAACG,QAAQ,CAACzE,MAAM,IAAI+C,KAAK,GAAG,CAAC,GAAGuB,KAAK,CAACG,QAAQ,CAAC1B,KAAK,GAAG,CAAC,CAAC,GAAGgE,SAAS;QACnG,IAAIoC,gBAAgB,IAAIA,gBAAgB,CAAC9H,YAAY,KAAKP,YAAY,CAAC2H,YAAY,EAAE;UACnFnG,WAAW,IAAI,CAAC;QAClB;MACF;MAEA,IAAIlB,OAAO,CAACC,YAAY,KAAKP,YAAY,CAAC2H,YAAY,EAAE;QACtDnE,KAAK,CAACW,iBAAiB,IAAI7D,OAAO,CAACI,QAAQ;QAC3C8C,KAAK,CAACS,aAAa,IAAI3D,OAAO,CAACM,IAAI;MACrC,CAAC,MAAM;QACL4C,KAAK,CAACU,eAAe,IAAI5D,OAAO,CAACI,QAAQ;QACzC8C,KAAK,CAACQ,WAAW,IAAI1D,OAAO,CAACM,IAAI;MACnC;IACF;IAEA,IAAIkH,kBAAkB,EAAE;MACtB;MACA,MAAMpE,eAAe,GAAGH,uBAAuB,CAACC,KAAK,EAAEC,WAAW,CAAC;MACnED,KAAK,CAACG,QAAQ,CAAC,CAAC,CAAC,GAAGD,eAAe;IACrC;EACF;EAEA,OAAOF,KAAK;AACd;AAEA,OAAO,SAASgF,QAAQA,CAAChF,KAAY,EAAEhC,WAAW,GAAG,CAAC,EAAE;EACtD,IAAIiH,aAAa,GAAG,EAAe;EAEnC,KAAK,IAAIxG,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGuB,KAAK,CAACG,QAAQ,CAACzE,MAAM,EAAE+C,KAAK,IAAI,CAAC,EAAE;IAC7D,MAAMoB,YAAY,GAAGG,KAAK,CAACG,QAAQ,CAAC1B,KAAK,CAAC;IAC1C,IAAIoB,YAAY,CAAC7B,WAAW,KAAKA,WAAW,EAAE;MAC5CiH,aAAa,GAAGA,aAAa,CAAC9B,MAAM,CAACtD,YAAY,CAAC1C,QAAQ,CAAC;IAC7D;EACF;EAEA,OAAO8H,aAAa;AACtB;AAEA,OAAO,SAASC,mBAAmBA,CACjClF,KAAY,EACZhC,WAAmB,EACnBmH,mBAEuC,EACvC;EACA,IAAIF,aAAa,GAAG,EAAe;EAEnC,KAAK,IAAIxG,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGuB,KAAK,CAACG,QAAQ,CAACzE,MAAM,EAAE+C,KAAK,IAAI,CAAC,EAAE;IAC7D,MAAMoB,YAAY,GAAGG,KAAK,CAACG,QAAQ,CAAC1B,KAAK,CAAC;IAC1C,IAAI0G,mBAAmB,CAACC,uBAAuB,EAAE;MAC/C;MACA,IAAIhH,iBAAiB,CAACyB,YAAY,CAAC,EAAE;QACnC,MAAMwF,8BAA8B,GAAG,EAAE;QACzC,MAAMC,2BAA2B,GAAG,EAAE;QACtC,KAAK,IAAIjF,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGR,YAAY,CAAC1C,QAAQ,CAACzB,MAAM,EAAE2E,CAAC,EAAE,EAAE;UACrD,MAAM3B,OAAO,GAAGmB,YAAY,CAAC1C,QAAQ,CAACkD,CAAC,CAAC;UACxC,IAAI3B,OAAO,CAACC,UAAU,EAAEX,WAAW,KAAKyE,SAAS,IAAI/D,OAAO,CAACC,UAAU,CAACX,WAAW,KAAKmH,mBAAmB,CAACI,8BAA8B,EAAE;YAC1I,IAAI7G,OAAO,CAACC,UAAU,CAAC4B,wBAAwB,KAAKkC,SAAS,EAAE;cAC7D,IAAI/D,OAAO,CAACC,UAAU,CAAC4B,wBAAwB,KAAK,GAAG,EAAE;gBACvD8E,8BAA8B,CAAC1F,IAAI,CAACjB,OAAO,CAAC;cAC9C,CAAC,MAAM;gBACL4G,2BAA2B,CAAC3F,IAAI,CAACjB,OAAO,CAAC;cAC3C;YACF;UACF;QACF;QACA;QACA;QACA,MAAM8G,uBAAuB,GAAGH,8BAA8B,CAAClC,MAAM,CAACmC,2BAA2B,CAAC;QAClGL,aAAa,GAAGA,aAAa,CAAC9B,MAAM,CAACqC,uBAAuB,CAAC;MAC/D;IACF,CAAC,MAAM,IAAI3F,YAAY,CAAC7B,WAAW,KAAKA,WAAW,EAAE;MACnD;MACA,IAAI,CAACI,iBAAiB,CAACyB,YAAY,CAAC,EAAEoF,aAAa,GAAGA,aAAa,CAAC9B,MAAM,CAACtD,YAAY,CAAC1C,QAAQ,CAAC;IACnG;EACF;EAEA,OAAO8H,aAAa;AACtB;AAAC,IAEIQ,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA,EAAZA,YAAY;AAAA,IAMZC,eAAe,0BAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA,EAAfA,eAAe;AAIpB,OAAO,SAASC,sBAAsBA,CAAClI,aAAqB,EAAE;EAC5D,IAAImI,MAAM,CAACC,MAAM,CAACJ,YAAY,CAAC,CAACK,QAAQ,CAACrI,aAAoB,CAAC,EAAE,OAAO,IAAI;EAC3E,OAAO,KAAK;AACd;AACA,OAAO,SAASsI,yBAAyBA,CAACtI,aAAqB,EAAE;EAC/D,IAAImI,MAAM,CAACC,MAAM,CAACH,eAAe,CAAC,CAACI,QAAQ,CAACrI,aAAoB,CAAC,EAAE,OAAO,IAAI;EAC9E,OAAO,KAAK;AACd;AACA,OAAO,SAASuI,gBAAgBA,CAACvI,aAAqB,EAAE;EACtD,IAAIkI,sBAAsB,CAAClI,aAAa,CAAC,IAAIsI,yBAAyB,CAACtI,aAAa,CAAC,EAAE,OAAO,IAAI;EAClG,OAAO,KAAK;AACd;AAEA,SAASwI,qBAAqBA,CAACxI,aAAqB,EAAE;EACpD,IAAIA,aAAa,KAAKgI,YAAY,CAACS,QAAQ,IAAIzI,aAAa,KAAKgI,YAAY,CAACU,GAAG,EAAE,OAAO,IAAI;EAE9F,OAAO,KAAK;AACd;AAEA,SAASC,aAAaA,CAAC3I,aAAqB,EAAE;EAC5C,QAAQA,aAAa;IACnB,KAAK,yBAAyB;MAC5B,OAAO,UAAU;IACnB,KAAK,+BAA+B;MAClC,OAAO,KAAK;IACd,KAAK,sBAAsB;MACzB,OAAO,WAAW;IACpB,KAAK,iBAAiB;MACpB,OAAO,MAAM;IACf,KAAK,qBAAqB;MACxB,OAAO,EAAE;IACX,KAAK,iBAAiB;MACpB,OAAO,EAAE;IAEX;MACE,OAAOA,aAAa;EACxB;AACF;AAEA,SAAS4I,uBAAuBA,CAAC9I,cAAsB,EAAE;EACvD,MAAM+I,KAAK,GAAG,sCAAsC;EACpD,MAAMC,YAAY,GAAGhJ,cAAc,CAACiJ,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC,CAACC,WAAW,CAAC,CAAC;EAC/E,MAAMC,KAAK,GAAGL,YAAY,CAACK,KAAK,CAACN,KAAK,CAAC;EAEvC,IAAIM,KAAK,EAAE;IACT,MAAMC,iBAAiB,GAAGD,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,IAAIE,YAAY;IAChB,QAAQD,iBAAiB;MACvB,KAAK,GAAG;QACNC,YAAY,GAAG,UAAU;QACzB;MACF,KAAK,GAAG;QACNA,YAAY,GAAG,OAAO;QACtB;MAEF;QACEA,YAAY,GAAG,OAAO;QACtB;IACJ;IACA,MAAMC,QAAQ,GAAGD,YAAY,KAAK,UAAU,GAAG,GAAGA,YAAY,IAAIF,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAGE,YAAY,EAAE;IAEnG,MAAME,eAAe,GAAGJ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,IAAIK,SAAS;IACb,QAAQD,eAAe;MACrB,KAAK,GAAG;QACNC,SAAS,GAAG,OAAO;QACnB;MACF,KAAK,GAAG;QACNA,SAAS,GAAG,UAAU;QACtB;MAEF;QACEA,SAAS,GAAG,OAAO;QACnB;IACJ;IAEA,MAAMC,KAAK,GAAG,GAAGD,SAAS,IAAIL,KAAK,CAAC,CAAC,CAAC,CAACO,SAAS,CAAC,CAAC,CAAC,EAAE;IACrD,OAAO;MACLC,QAAQ,EAAEL,QAAQ;MAClBM,KAAK,EAAEH;IACT,CAAC;EACH;EACA,OAAO,IAAI,CAAC,CAAC;AACf;AAEA,SAASI,8BAA8BA,CAACC,eAAuB,EAAEhK,cAAsB,EAAE;EACvF,MAAMiK,oBAAoB,GAAGnB,uBAAuB,CAAC9I,cAAc,CAAC;EACpE,IAAIiK,oBAAoB,EAAE;IACxB,IAAIvB,qBAAqB,CAACsB,eAAe,CAAC,EAAE;MAC1C,OAAOC,oBAAoB,CAACJ,QAAQ;IACtC;IACA,IAAIG,eAAe,KAAK9B,YAAY,CAACgC,SAAS,IAAIF,eAAe,KAAK9B,YAAY,CAACiC,IAAI,EAAE;MACvF,OAAOF,oBAAoB,CAACH,KAAK;IACnC;IAEA,IAAItB,yBAAyB,CAACwB,eAAe,CAAC,EAAE;MAC9C,OAAOC,oBAAoB,CAACJ,QAAQ;IACtC;EACF;EAEA,OAAO7J,cAAc,CAACiJ,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,CAACC,WAAW,CAAC,CAAC;AACpE;AAEA,SAASgB,uBAAuBA,CAACC,aAAqB,EAAU;EAC9D;EACA,IAAIC,OAAe,GAAGC,IAAI,CAACC,KAAK,CAACH,aAAa,GAAG,EAAE,CAAC;;EAEpD;EACA,MAAMI,gBAAwB,GAAGJ,aAAa,GAAG,EAAE;;EAEnD;EACA,IAAII,gBAAgB,GAAG,EAAE,EAAE;IACzBH,OAAO,IAAI,CAAC;EACd;EAEA,OAAOA,OAAO;AAChB;AAEA,OAAO,SAASI,UAAUA,CAACC,KAAa,EAAE;EACxC,IAAIA,KAAK,GAAG,EAAE,EAAE,OAAO,WAAW;EAClC,OAAO,IAAIP,uBAAuB,CAACO,KAAK,CAAC,IAAIP,uBAAuB,CAACO,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,QAAQ,EAAE;AAC1G;AAEA,OAAO,SAASC,oBAAoBA,CAACnI,KAAY,EAAE;EACjD,MAAMoI,cAAc,GAAI3J,KAAa,IAAK;IACxC,IAAIA,KAAK,KAAK,CAAC,IACTA,KAAK,KAAK,CAAC,IAAIuB,KAAK,CAACG,QAAQ,CAAC1B,KAAK,GAAG,CAAC,CAAC,CAAC1B,YAAY,KAAKP,YAAY,CAAC6B,aAAc,EAAE,OAAO,IAAI;IAExG,OAAO,KAAK;EACd,CAAC;EAED,MAAMgK,yBAAyB,GAAIvL,OAAqB,IAAK;IAC3D,IAAIA,OAAO,CAACO,SAAS,CAACE,cAAc,CAAC+K,WAAW,CAAC,CAAC,CAACxC,QAAQ,CAAC,IAAI,CAAC,EAAE;MACjE,OAAO,2BAA2B;IACpC;IAEA,OAAO,6BAA6B;EACtC,CAAC;EAED,KAAK,IAAIrH,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGuB,KAAK,CAACG,QAAQ,CAACzE,MAAM,EAAE+C,KAAK,IAAI,CAAC,EAAE;IAC7D,MAAM8J,YAAY,GAAGvI,KAAK,CAACG,QAAQ,CAAC1B,KAAK,CAAC;IAC1C8J,YAAY,CAACxK,YAAY,GAAG,EAAE,CAAC,CAAC;;IAEhC,IAAIwK,YAAY,CAACxL,YAAY,KAAKP,YAAY,CAAC6B,aAAa,EAAE;MAC5D,MAAMmK,WAAW,GAAG,UAAU;MAC9BD,YAAY,CAACxK,YAAY,CAAC4B,IAAI,CAAC6I,WAAW,CAAC;IAC7C;IACA,IAAI/J,KAAK,GAAG,CAAC,IAAI8J,YAAY,CAACxL,YAAY,KAAKP,YAAY,CAACyF,UAAU,EAAE;MACtE,IAAIuG,WAAW,GAAG,EAAE;MACpB,IAAIxI,KAAK,CAACG,QAAQ,CAAC1B,KAAK,GAAG,CAAC,CAAC,CAACR,IAAI,KAAK7B,IAAI,CAACqM,MAAM,IAAIF,YAAY,CAACtK,IAAI,KAAK7B,IAAI,CAACmG,OAAO,EAAE;QACxFiG,WAAW,GAAGH,yBAAyB,CAACE,YAAY,CAAC;MACvD,CAAC,MAAM,IAAIvI,KAAK,CAACG,QAAQ,CAAC1B,KAAK,GAAG,CAAC,CAAC,CAACR,IAAI,KAAK7B,IAAI,CAACmG,OAAO,IAAIgG,YAAY,CAACtK,IAAI,KAAK7B,IAAI,CAACqM,MAAM,EAAE;QAC/FD,WAAW,GAAG,yBAAyB;MACzC;MAEAD,YAAY,CAACxK,YAAY,CAAC4B,IAAI,CAAC6I,WAAW,CAAC;IAC7C,CAAC,MACD,IAAID,YAAY,CAACxL,YAAY,KAAKP,YAAY,CAAC4F,gBAAgB,IAC1DmG,YAAY,CAACxL,YAAY,KAAKP,YAAY,CAAC8G,sBAAsB,EAAE;MACtE,MAAMoF,OAAO,GAAGH,YAAY,CAACxL,YAAY,KAAKP,YAAY,CAAC4F,gBAAgB,GACvE,YAAY0F,IAAI,CAACa,IAAI,CAACJ,YAAY,CAACrL,QAAQ,CAAC,IAAI8C,KAAK,CAACoE,YAAY,EAAE,GACpEiE,yBAAyB,CAACE,YAAY,CAAC;;MAE3C;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,IAAIC,WAAW;MACf,IAAIxI,KAAK,CAACG,QAAQ,CAAC1B,KAAK,GAAG,CAAC,CAAC,CAAC1B,YAAY,KAAKP,YAAY,CAACyF,UAAU,IAAIjC,KAAK,CAACG,QAAQ,CAAC1B,KAAK,GAAG,CAAC,CAAC,CAAC1B,YAAY,KAAKP,YAAY,CAAC8G,sBAAsB,EAAE;QACxJkF,WAAW,GAAGE,OAAO;QACvB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MAEA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MAEA;MACA;MACA;MACA;MACA;MACA;MACA;;MAEE;MACA;MACA;MACA;MACA;MAAA,KACK;QACHF,WAAW,GAAGE,OAAO;MACvB;MACAH,YAAY,CAACxK,YAAY,CAAC4B,IAAI,CAAC6I,WAAW,CAAC;MAC3C;IACF,CAAC,MAAM,IAAID,YAAY,CAACxL,YAAY,KAAKP,YAAY,CAACQ,MAAM,EAAE;MAC5D,IAAIoL,cAAc,CAAC3J,KAAK,CAAC,EAAE;QACzB8J,YAAY,CAACxK,YAAY,CAAC4B,IAAI,CAC5B,YAAY4I,YAAY,CAAClL,SAAS,CAACM,IAAI,EACzC,CAAC;MACH;MAEA,IAAIc,KAAK,KAAKuB,KAAK,CAACG,QAAQ,CAACzE,MAAM,GAAG,CAAC,EAAE;QACvC6M,YAAY,CAACxK,YAAY,CAAC4B,IAAI,CAC5B,aAAa4I,YAAY,CAAC3K,OAAO,CAACD,IAAI,EAExC,CAAC;MACH;IACF,CAAC,MAAM,IAAI4K,YAAY,CAACxL,YAAY,KAAKP,YAAY,CAACsH,WAAW,EAAE;MACjE,IAAI0E,WAAW,GAAG,SAASD,YAAY,CAAClL,SAAS,CAACM,IAAI,OAC7C4K,YAAY,CAAClL,SAAS,CAACE,cAAc,CAACiJ,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,CAACC,WAAW,CAAC,CAAC,EAAE;MAE/F,IAAIZ,yBAAyB,CAACwC,YAAY,CAAClL,SAAS,CAACI,aAAa,CAAC,EAAE;QACnE+K,WAAW,GAAG,eAAelB,8BAA8B,CAACiB,YAAY,CAAClL,SAAS,CAACI,aAAa,EAAE8K,YAAY,CAAC3K,OAAO,CAACL,cAAc,CAAC,EAAE;QACxIgL,YAAY,CAACxK,YAAY,CAAC4B,IAAI,CAAC6I,WAAW,CAAC;MAC7C,CAAC,MAAM,IAAI7C,sBAAsB,CAAC4C,YAAY,CAAClL,SAAS,CAACI,aAAa,CAAC,EAAE;QACvE,MAAMoH,gBAAgB,GAAGpG,KAAK,GAAG,CAAC,IAAIuB,KAAK,CAACG,QAAQ,CAACzE,MAAM,GAAG,CAAC,GAAGsE,KAAK,CAACG,QAAQ,CAAC1B,KAAK,GAAG,CAAC,CAAC,GAAGgE,SAAS;QACvG,IAAIoC,gBAAgB,IAAIA,gBAAgB,CAAC9H,YAAY,KAAKP,YAAY,CAAC2H,YAAY,EAAE;UACnF;UACAoE,YAAY,CAACxK,YAAY,CAAC4B,IAAI,CAAC6I,WAAW,CAAC;UAC3C/J,KAAK,IAAI,CAAC;UAEV,MAAMd,IAAI,GAAGyI,aAAa,CAACvB,gBAAgB,CAACxH,SAAS,CAACI,aAAa,CAAC;UACpE+K,WAAW,GAAG,QACZ7K,IAAI,OACC2J,8BAA8B,CAACiB,YAAY,CAAClL,SAAS,CAACI,aAAa,EAAE8K,YAAY,CAAC3K,OAAO,CAACL,cAAc,CAAC,EAAE;UAClHsH,gBAAgB,CAAC9G,YAAY,CAAC4B,IAAI,CAAC6I,WAAW,CAAC;UAC/C,IAAID,YAAY,CAACpK,WAAW,EAAE0G,gBAAgB,CAAC9G,YAAY,CAAC4B,IAAI,CAAC4I,YAAY,CAACpK,WAAW,CAAC;QAC5F,CAAC,MAAM;UACL,MAAMR,IAAI,GAAGyI,aAAa,CAACmC,YAAY,CAAClL,SAAS,CAACI,aAAa,CAAC;UAEhE+K,WAAW,GAAG,QACZ7K,IAAI,OACC2J,8BAA8B,CAACiB,YAAY,CAAClL,SAAS,CAACI,aAAa,EAAE8K,YAAY,CAAC3K,OAAO,CAACL,cAAc,CAAC,EAAE;UAClHgL,YAAY,CAACxK,YAAY,CAAC4B,IAAI,CAAC6I,WAAW,CAAC;QAC7C;MACF;IACF;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"routing-helpers.js","names":["point","lineString","length","booleanDisjoint","booleanPointInPolygon","getCoord","getCoords","lineIntersect","lineSlice","cloneDeep","DISTANCE_UNIT","WALK_SPEED","Zone","RoutingCore","getImmigrationPolygonFeaturesForWhereTaxonomy","getEdge","ManeuverType","createDefaultSegment","pathSegment","startMapObj","edges","endMapObj","segment","maneuverType","Static","coordinates","distance","features","time","startEdge","mapObjectId","whereDimension","startFloor","whatDimension","what","name","endEdge","endFloor","isPortal","instructions","patchNumber","zone","cost","description","isOverviewSegment","RouteOverview","SectionOverview","updateFeatureHighlightState","isHighlighted","index","feature","properties","highlight","highlightRouteSegment","pathFeatures","segmentToHighlight","highlightNodeOnly","arguments","undefined","segmentNumber","startPoint","getRouteNode","dimension_where","isNode","node","getRouteLine","line","featureBelongsToLineString","endPoint","push","getLineStringFeaturesOfRouteSegment","routeSegment","lineFeatures","generateOverviewSegment","route","indexOffset","overviewSegment","segments","initialWhereDimension","j","coord","isNonHighlightedOverview","walkingTime","transportTime","walkingDistance","transportDistance","createRoute","startMapObjectId","endMapObjectId","wheelChairAccessibleRouteOnly","shouldAddOverviewSegment","path","getRoute","pathSegments","routes","optimizedPath","endSegment","segmentIndex","currentZone","geojson","geometry","lastManeuverType","firstSegment","prevPathSegment","prevZone","prevPath","pathPoint","ChangeZone","midPoint","currentManeuverType","ContinueStraight","removeExtraChangeZoneSegment","lastSegmentAdded","Transit","pop","immigrationPolygonFeatures","immigrationPolygonFeature","intersects","lineBeforeImmigration","lengthOfLineBeforeImmigration","units","segmentBeforeImmigration","coordsOfLastSegment","secondLastSegmentAdded","concat","immigrationLine","immigrationSegment","PassThroughImmigration","lineCoords","lineAfterImmigration","segmentAfterImmigration","startPointWithinPolygon","changeZoneSegment","previousLine","enterPortalSegment","EnterPortal","exitPortalSegment","ExitPortal","portalPath","travelPortalSegment","TravelPortal","distanceUnit","speed","addOverviewSegment","initialIndex","dummySegment","unshift","routeSegmentCoords","segmentDistance","startEdgeFeatures","nextRouteSegment","portalCost","splice","getPatch","routefeatures","getFeaturesForPatch","overviewSegmentInfo","includeOverviewFeatures","nonHighlightedOverviewFeatures","highlightedOverviewFeatures","patchNumberForOverviewFeatures","overviewSegmentFeatures","MovingPortal","NonMovingPortal","isMovingPortalTaxonomy","Object","values","includes","isNonMovingPortalTaxonomy","isPortalTaxonomy","isCrossTerminalPortal","Skytrain","Bus","getPortalName","getTerminalAndLevelName","regex","subDimension","split","slice","join","toUpperCase","match","terminalIndicator","terminalName","terminal","levelIdentifier","levelName","level","substring","Terminal","Level","getWhereDimensionNameForPortal","portalDimension","terminalAndLevelName","Escalator","Lift","convertSecondsToMinutes","timeInSeconds","minutes","Math","floor","remainingSeconds","formatTime","value","generateInstructions","isFirstSegment","getImmigrationInstruction","toLowerCase","rotueSegment","instruction","Public","postfix","ceil"],"sources":["../../../../../src/meta-atlas-sdk/MetaAtlasCore/routing-core/routing-helpers.ts"],"sourcesContent":["import {\n point, lineString, Units,\n} from '@turf/helpers';\nimport { Feature, Position } from 'geojson';\nimport length from '@turf/length';\nimport {\n booleanDisjoint, booleanPointInPolygon, getCoord, getCoords, lineIntersect, lineSlice,\n} from '@turf/turf';\nimport { cloneDeep } from 'lodash';\nimport {\n CalculationResult, DISTANCE_UNIT, RouteResult, UserPosition, WALK_SPEED, Zone,\n} from './interfaces';\nimport RoutingCore from '.';\nimport { getImmigrationPolygonFeaturesForWhereTaxonomy, getEdge } from './mapObjectsHelper';\n\nexport enum ManeuverType {\n RouteOverview = 'Route Overview',\n SectionOverview = 'Section Overview',\n LeftHairPinTurn = 'Left hairpin turn',\n RightHairPinTurn = 'Right hairpin turn',\n LeftTurn = 'Turn left',\n RightTurn = 'Turn right',\n ContinueStraight = 'Continue straight',\n EnterPortal = 'Enter Portal',\n TravelPortal = 'Travel Portal',\n ExitPortal = 'Exit Portal',\n Static = 'Static',\n ChangeZone = 'Change Zone',\n PassThroughImmigration = 'Pass Through Immigration'\n}\ntype Edge = {\n mapObjectId: string;\n whereDimension: string;\n whatDimension: string;\n name: string;\n};\n\nexport interface RouteSegment {\n maneuverType: ManeuverType;\n coordinates: Position[];\n distance: number;\n time: number;\n features: Feature[];\n startEdge: Edge;\n endEdge: Edge;\n isPortal: boolean;\n instructions: string[];\n patchNumber: number;\n whereDimension: string;\n zone: string;\n cost: number;\n description: string | null;\n}\n\nfunction createDefaultSegment(pathSegment: RouteResult) {\n const startMapObj = getEdge(pathSegment.edges[0]);\n const endMapObj = getEdge(pathSegment.edges[1]);\n const segment: RouteSegment = {\n maneuverType: ManeuverType.Static,\n coordinates: [],\n distance: 0,\n features: [],\n time: 0,\n startEdge: {\n mapObjectId: pathSegment.edges[0],\n whereDimension: pathSegment.startFloor,\n whatDimension: startMapObj ? startMapObj.what : '',\n name: startMapObj ? startMapObj.name : 'Your Location',\n },\n endEdge: {\n mapObjectId: pathSegment.edges[1],\n whereDimension: pathSegment.endFloor,\n whatDimension: endMapObj ? endMapObj.what : '',\n name: endMapObj ? endMapObj.name : '',\n },\n isPortal: pathSegment.isPortal,\n instructions: [],\n patchNumber: -1,\n whereDimension: '',\n zone: '',\n cost: pathSegment.cost,\n description: pathSegment.description,\n };\n\n return segment;\n}\nexport interface Route {\n segments: RouteSegment[];\n walkingDistance: number;\n transportDistance: number;\n walkingTime: number;\n transportTime: number;\n\n distanceUnit: 'meters';\n speed: number;\n}\n\nexport function isOverviewSegment(segment: RouteSegment) {\n return segment.maneuverType === ManeuverType.RouteOverview || segment.maneuverType === ManeuverType.SectionOverview;\n}\n\nfunction updateFeatureHighlightState(\n features: Feature[],\n isHighlighted: boolean,\n) {\n for (let index = 0; index < features.length; index += 1) {\n const feature = features[index];\n if (isHighlighted) {\n (feature.properties as any).highlight = true;\n } else {\n (feature.properties as any).highlight = false;\n }\n }\n return features;\n}\n\nexport function highlightRouteSegment(\n pathFeatures: Feature[],\n segmentToHighlight: number,\n highlightNodeOnly = false,\n) {\n for (let index = 0; index < pathFeatures.length; index += 1) {\n const segment = pathFeatures[index];\n if ((segment.properties as any).segmentNumber === segmentToHighlight) {\n if (highlightNodeOnly) {\n if ((segment.properties as any).startPoint === true) {\n updateFeatureHighlightState([segment], true);\n }\n } else {\n updateFeatureHighlightState([segment], true);\n }\n } else {\n updateFeatureHighlightState([segment], false);\n }\n }\n return pathFeatures;\n}\n\nfunction getRouteNode(\n coordinates: Position,\n segmentNumber: number,\n isHighlighted: boolean,\n patchNumber: number,\n whereDimension = '',\n) {\n if (coordinates.length === 0) {\n return [];\n }\n\n const properties = {\n segmentNumber,\n dimension_where: whereDimension,\n patchNumber,\n isNode: true,\n };\n const node = point(coordinates, properties);\n const features = [node] as Feature[];\n updateFeatureHighlightState(features, isHighlighted);\n return features;\n}\n\nfunction getRouteLine(\n coordinates: Position[],\n segmentNumber: number,\n isHighlighted: boolean,\n patchNumber: number,\n zone: string,\n whereDimension = '',\n) {\n if (coordinates.length === 0) {\n return [];\n }\n\n const properties = {\n segmentNumber,\n dimension_where: whereDimension,\n patchNumber,\n isNode: false,\n zone,\n };\n // const curved = smooth(coordinates, {iteration: 1});\n const line = lineString(coordinates, {\n ...properties,\n featureBelongsToLineString: true,\n });\n\n const startPoint = point(coordinates[0], {\n ...properties,\n featureBelongsToLineString: false,\n });\n const endPoint = point(coordinates[coordinates.length - 1], {\n ...properties,\n featureBelongsToLineString: false,\n });\n const features = [] as Feature[];\n features.push(startPoint, line, endPoint);\n updateFeatureHighlightState(features, isHighlighted);\n return features;\n}\n\nexport function getLineStringFeaturesOfRouteSegment(\n routeSegment: RouteSegment,\n whereDimension = '',\n) {\n const lineFeatures: Feature[] = [];\n for (let index = 0; index < routeSegment.features.length; index += 1) {\n const feature = routeSegment.features[index];\n if (feature.properties!.featureBelongsToLineString) {\n if (whereDimension !== '') {\n if (\n feature.properties!.dimension_where\n && feature.properties!.dimension_where === whereDimension\n ) {\n lineFeatures.push(feature);\n }\n } else {\n lineFeatures.push(feature);\n }\n }\n }\n return lineFeatures;\n}\n\nexport function generateOverviewSegment(route: Route, indexOffset = 0) {\n const overviewSegment = cloneDeep(route.segments[1]);\n const initialWhereDimension = route.segments.length > 1 ? route.segments[1].startEdge.whereDimension : '';\n overviewSegment.coordinates = [];\n overviewSegment.features = [];\n overviewSegment.time = 0;\n overviewSegment.distance = 0;\n overviewSegment.isPortal = false;\n overviewSegment.maneuverType = ManeuverType.RouteOverview;\n overviewSegment.patchNumber = indexOffset;\n overviewSegment.instructions = ['Overview'];\n for (let index = 1; index < route.segments.length; index += 1) {\n if (route.segments[index].maneuverType !== ManeuverType.SectionOverview) {\n for (let j = 0; j < route.segments[index].coordinates.length; j += 1) {\n const coord = route.segments[index].coordinates[j];\n overviewSegment.coordinates.push(coord);\n }\n\n for (let j = 0; j < route.segments[index].features.length; j += 1) {\n const feature = cloneDeep(route.segments[index].features[j]) as Feature;\n if (feature.properties && !feature.properties.isNode) {\n // isNonHighlightedOverview is used in layer styling to decide the color of lines\n // features which are not on initialWhereDimension should be colored accordingly\n if (feature.properties.dimension_where !== initialWhereDimension) feature.properties.isNonHighlightedOverview = '1';\n else feature.properties.isNonHighlightedOverview = '0';\n\n feature.properties.dimension_where = initialWhereDimension; // hardcode where dimension of first segment\n feature.properties.patchNumber = overviewSegment.patchNumber;\n feature.properties.segmentNumber = overviewSegment.patchNumber;\n overviewSegment.features.push(feature);\n }\n }\n }\n }\n\n overviewSegment.endEdge = cloneDeep(route.segments[route.segments.length - 1].endEdge);\n overviewSegment.time = route.walkingTime + route.transportTime;\n overviewSegment.distance = route.walkingDistance + route.transportDistance;\n\n return overviewSegment;\n}\n\nexport async function createRoute(\n startMapObjectId: string | UserPosition,\n endMapObjectId: string,\n wheelChairAccessibleRouteOnly: boolean,\n shouldAddOverviewSegment = true,\n indexOffset = 0, // offset for patch and segment numbers calculation\n): Promise<Route> {\n const path: CalculationResult = RoutingCore.getRoute(\n startMapObjectId,\n endMapObjectId,\n wheelChairAccessibleRouteOnly,\n );\n const pathSegments = path.routes;\n\n // Find optimized path (i.e. combine straight segments) & maneuvers list\n const optimizedPath: RouteSegment[] = [];\n let endSegment;\n for (\n let segmentIndex = 0; pathSegments\n && segmentIndex < pathSegments.length;\n segmentIndex += 1\n ) {\n const pathSegment = pathSegments![segmentIndex];\n const currentZone = pathSegment.geojson!.properties!.zone;\n if (!pathSegment.isPortal) {\n const path = pathSegment.geojson!.geometry.coordinates;\n\n // Reset state for each segment of the path\n let lastManeuverType = ManeuverType.Static;\n\n // Only add the starting static node for the very first node of route\n if (optimizedPath.length === 0) {\n const firstSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.Static,\n coordinates: [path[0]],\n };\n optimizedPath.push(firstSegment);\n }\n\n if (segmentIndex > 0 && optimizedPath.length > 0) {\n const prevPathSegment = pathSegments![segmentIndex - 1];\n const prevZone = prevPathSegment.geojson!.properties!.zone;\n if (currentZone !== prevZone) {\n const prevPath = prevPathSegment.geojson!.geometry.coordinates;\n const pathPoint = {\n ...createDefaultSegment(prevPathSegment),\n maneuverType: ManeuverType.ChangeZone,\n zone: currentZone,\n coordinates: [prevPath[prevPath.length - 1]],\n };\n optimizedPath.push(pathPoint);\n lastManeuverType = ManeuverType.ChangeZone;\n }\n }\n\n if (path.length > 2) {\n for (let index = 0; index < path.length - 2; index += 1) {\n const startPoint = path[index];\n const midPoint = path[index + 1];\n const endPoint = path[index + 2];\n\n // Keep updating endSegment on each iteration\n endSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.Static,\n coordinates: [endPoint],\n zone: currentZone,\n };\n\n // const line = lineString([startPoint, midPoint]);\n // const segmentDistance = length(line, { units: DISTANCE_UNIT });\n\n // Determine the maneuver type based on the angle of the turn\n let currentManeuverType: ManeuverType;\n currentManeuverType = ManeuverType.ContinueStraight;\n // if ((index === 0 || index === path.length - 3) && segmentDistance < 3) {\n // currentManeuverType = ManeuverType.ContinueStraight;\n // }\n // else {\n // // Calculate the bearings between the points\n // const bearing1 = bearing(startPoint, midPoint);\n // const bearing2 = bearing(midPoint, endPoint);\n\n // // Calculate the angle between the bearings\n // let angle = bearing2 - bearing1;\n // if (angle < -180) {\n // angle += 360;\n // } else if (angle > 180) {\n // angle -= 360;\n // }\n\n // if (angle < -140) {\n // currentManeuverType = ManeuverType.LeftHairPinTurn;\n // } else if (angle > 140) {\n // currentManeuverType = ManeuverType.RightHairPinTurn;\n // } else if (angle < -50) {\n // currentManeuverType = ManeuverType.LeftTurn;\n // } else if (angle > 50) {\n // currentManeuverType = ManeuverType.RightTurn;\n // // } else if (angle < -10) {\n // // currentManeuverType = 'Veer left';\n // // } else if (angle > 10) {\n // // currentManeuverType = 'Veer right';\n // } else {\n // currentManeuverType = ManeuverType.ContinueStraight;\n // }\n // }\n\n const pathPoint = {\n ...createDefaultSegment(pathSegment),\n maneuverType: currentManeuverType,\n zone: currentZone,\n };\n if (lastManeuverType === ManeuverType.ContinueStraight) {\n // If last iteration of loop then use the end point as segment end else use mid point\n // Use index + 3 because last two points are skipped by loop\n if (index + 3 === path.length) {\n optimizedPath[optimizedPath.length - 1].coordinates.push(\n midPoint,\n endPoint,\n );\n } else {\n optimizedPath[optimizedPath.length - 1].coordinates.push(midPoint);\n }\n\n optimizedPath[optimizedPath.length - 1].maneuverType = currentManeuverType;\n } else {\n pathPoint.coordinates.push(startPoint, midPoint);\n optimizedPath.push(pathPoint);\n\n // If reached end of path then add a ContinueStraight segment at end of path\n // Use index + 3 because last two points are skipped by loop\n if (index + 3 === path.length) {\n // if a ContinueStraight segment was just added then extend that, else add a new ContinueStraight segment at end\n if (currentManeuverType === ManeuverType.ContinueStraight) {\n optimizedPath[optimizedPath.length - 1].coordinates.push(\n endPoint,\n );\n } else {\n optimizedPath.push({\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n coordinates: [midPoint, endPoint],\n zone: currentZone,\n });\n }\n }\n }\n\n lastManeuverType = currentManeuverType;\n }\n } else {\n const pathPoint = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n coordinates: path,\n zone: currentZone,\n };\n optimizedPath.push(pathPoint);\n }\n\n const removeExtraChangeZoneSegment = () => {\n // When going from public to transit, hide the ChangeZone instruction, if the next step is PassThroughImmigration.\n if (optimizedPath.length > 0) {\n const lastSegmentAdded = optimizedPath[optimizedPath.length - 1];\n if (lastSegmentAdded.maneuverType === ManeuverType.ChangeZone) {\n if (lastSegmentAdded.zone === Zone.Transit) optimizedPath.pop();\n }\n }\n };\n // Check if there are immigration crossings\n let lastSegmentAdded = optimizedPath.length > 0 ? optimizedPath[optimizedPath.length - 1] : undefined;\n if (lastSegmentAdded && lastSegmentAdded.maneuverType === ManeuverType.ContinueStraight) {\n // Will add new segment, search for immigration crossings on the current non-vertical segment\n const immigrationPolygonFeatures = getImmigrationPolygonFeaturesForWhereTaxonomy(lastSegmentAdded.startEdge.whereDimension);\n const line = lineString(lastSegmentAdded.coordinates);\n for (let index = 0; index < immigrationPolygonFeatures.length; index += 1) {\n const immigrationPolygonFeature = immigrationPolygonFeatures[index];\n if (!booleanDisjoint(line, immigrationPolygonFeature)) {\n const intersects = lineIntersect(line, immigrationPolygonFeature);\n if (intersects.features.length > 1) {\n optimizedPath.pop();\n const lineBeforeImmigration = lineSlice(getCoords(line)[0], getCoord(intersects.features[0]), line);\n const lengthOfLineBeforeImmigration = length(lineBeforeImmigration, { units: 'meters' });\n // Only add if length greater then min limit\n if (lengthOfLineBeforeImmigration >= 10) {\n const segmentBeforeImmigration = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n zone: currentZone,\n coordinates: getCoords(lineBeforeImmigration),\n };\n optimizedPath.push(segmentBeforeImmigration);\n } else if (optimizedPath.length > 0) {\n lastSegmentAdded = optimizedPath[optimizedPath.length - 1];\n // If lastSegmentAdded is a change zone segment then move both lastSegmentAdded and also the second last segment\n if (lastSegmentAdded.maneuverType === ManeuverType.ChangeZone) {\n const coordsOfLastSegment = getCoords(lineBeforeImmigration);\n lastSegmentAdded.coordinates = [coordsOfLastSegment[coordsOfLastSegment.length - 1]];\n if (optimizedPath.length > 1) {\n const secondLastSegmentAdded = optimizedPath[optimizedPath.length - 2];\n secondLastSegmentAdded.coordinates = secondLastSegmentAdded.coordinates.concat(getCoords(lineBeforeImmigration));\n }\n } else {\n lastSegmentAdded.coordinates.concat(getCoords(lineBeforeImmigration));\n }\n }\n\n const immigrationLine = lineSlice(getCoord(intersects.features[0]), getCoord(intersects.features[1]), line);\n const immigrationSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.PassThroughImmigration,\n zone: currentZone,\n coordinates: getCoords(immigrationLine),\n };\n // The lineBeforeImmigration might not have been added due to length limit\n // And if lineBeforeImmigration was supposed to be the the first segment then prepend this segment with coordinates of lineBeforeImmigration\n if (optimizedPath.length === 0) {\n immigrationSegment.coordinates = lineBeforeImmigration.geometry.coordinates.concat(immigrationSegment.coordinates);\n }\n\n // When going from public to transit, hide the ChangeZone instruction, if the next step is PassThroughImmigration.\n removeExtraChangeZoneSegment();\n optimizedPath.push(immigrationSegment);\n\n const lineCoords = getCoords(line);\n const lineAfterImmigration = lineSlice(getCoord(intersects.features[1]), lineCoords[lineCoords.length - 1], line);\n const segmentAfterImmigration = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n zone: currentZone,\n coordinates: getCoords(lineAfterImmigration),\n };\n optimizedPath.push(segmentAfterImmigration);\n // line = segmentAfterImmigration;\n } else if (intersects.features.length > 0) {\n // check if start point outside polygon then end inside polygon - valid\n const startPointWithinPolygon = booleanPointInPolygon(getCoords(line)[0], immigrationPolygonFeature);\n if (startPointWithinPolygon) {\n optimizedPath.pop();\n\n // One intersection point and start point is within polygon\n // Means line start inside and exits the polygon\n const immigrationLine = lineSlice(getCoords(line)[0], getCoord(intersects.features[0]), line);\n const immigrationSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.PassThroughImmigration,\n zone: currentZone,\n coordinates: getCoords(immigrationLine),\n };\n\n lastSegmentAdded = optimizedPath.length > 0 ? optimizedPath[optimizedPath.length - 1] : undefined;\n if (lastSegmentAdded && lastSegmentAdded.maneuverType === ManeuverType.ChangeZone) {\n // Remove change zone segment\n const changeZoneSegment = optimizedPath.pop();\n if (optimizedPath.length > 1) {\n const secondLastSegmentAdded = optimizedPath[optimizedPath.length - 1];\n if (secondLastSegmentAdded.maneuverType === ManeuverType.PassThroughImmigration) {\n optimizedPath.pop();\n\n // Re add the change zone segment with updated coordinates\n (changeZoneSegment as RouteSegment).coordinates = [secondLastSegmentAdded.coordinates[0]];\n optimizedPath.push(changeZoneSegment as RouteSegment);\n immigrationSegment.coordinates = secondLastSegmentAdded.coordinates.concat(immigrationSegment.coordinates);\n }\n }\n }\n // When going from public to transit, hide the ChangeZone instruction, if the next step is PassThroughImmigration.\n removeExtraChangeZoneSegment();\n optimizedPath.push(immigrationSegment);\n\n const lineCoords = getCoords(line);\n const lineAfterImmigration = lineSlice(getCoord(intersects.features[0]), lineCoords[lineCoords.length - 1], line);\n const segmentAfterImmigration = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ContinueStraight,\n zone: currentZone,\n coordinates: getCoords(lineAfterImmigration),\n };\n optimizedPath.push(segmentAfterImmigration);\n } else {\n // line starts outside immigration and ends inside immigration\n // this is not a valid case but lines are still divided into segments as the segments are used\n // by the logic under case 2(startPointWithinPolygon)\n const previousLine = lineSlice(getCoords(line)[0], getCoord(intersects.features[0]), line);\n (lastSegmentAdded as RouteSegment).coordinates = getCoords(previousLine);\n\n const lineCoords = getCoords(line);\n const lineAfterImmigration = lineSlice(getCoord(intersects.features[0]), lineCoords[lineCoords.length - 1], line);\n const segmentAfterImmigration = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.PassThroughImmigration,\n zone: currentZone,\n coordinates: getCoords(lineAfterImmigration),\n };\n optimizedPath.push(segmentAfterImmigration);\n // line = segmentAfterImmigration;\n }\n }\n }\n }\n }\n } else {\n // Keep updating endSegment on each iteration\n endSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.Static,\n coordinates: [pathSegment.geojson!.geometry.coordinates[1]],\n zone: currentZone,\n isPortal: false,\n };\n\n const enterPortalSegment: RouteSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.EnterPortal,\n coordinates: [pathSegment.geojson!.geometry.coordinates[0]],\n };\n // // Only add this EnterPortal segment if previously same what dimension portal is not being continued\n // // This is done to ensure Take Lift at A, Exit Lift at B, Take lift at B, Exit Lift at C is generated only as Take lift at A, Exit lift at C\n // let lastSegmentAdded = (optimizedPath.length > 0) ? optimizedPath[optimizedPath.length - 1] : undefined;\n // if (!lastSegmentAdded\n // || (lastSegmentAdded && lastSegmentAdded.maneuverType !== ManeuverType.ExitPortal)\n // || (lastSegmentAdded && lastSegmentAdded.maneuverType === ManeuverType.ExitPortal && lastSegmentAdded.startEdge.whatDimension !== enterPortalSegment.startEdge.whatDimension)) {\n // optimizedPath.push(enterPortalSegment);\n // lastSegmentAdded = enterPortalSegment;\n // }\n\n optimizedPath.push(enterPortalSegment);\n\n const exitPortalSegment: RouteSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.ExitPortal,\n coordinates: [pathSegment.geojson!.geometry.coordinates[1]],\n };\n // // This logic is tied to the above similar logic for EnterPortal\n // // Only add this ExitPortal segment if previously same what dimension portal is not being continued\n // // This is done to ensure Take Lift at A, Exit Lift at B, Take lift at B, Exit Lift at C is generated only as Take lift at A, Exit lift at C\n // if (lastSegmentAdded && lastSegmentAdded.maneuverType !== ManeuverType.ExitPortal) {\n // if (pathSegment.portalPath) {\n // const travelPortalSegment: RouteSegment = {\n // ...createDefaultSegment(pathSegment),\n // maneuverType: ManeuverType.TravelPortal,\n // coordinates: pathSegment.portalPath.geometry.coordinates,\n // zone: currentZone,\n // };\n // optimizedPath.push(travelPortalSegment);\n // }\n\n // optimizedPath.push(exitPortalSegment);\n // } else\n optimizedPath.push(exitPortalSegment);\n\n const lastSegmentAdded = (optimizedPath.length > 0) ? optimizedPath[optimizedPath.length - 1] : undefined;\n if (lastSegmentAdded && lastSegmentAdded.maneuverType === ManeuverType.ExitPortal) {\n optimizedPath.pop();\n\n if (pathSegment.portalPath) {\n const travelPortalSegment: RouteSegment = {\n ...createDefaultSegment(pathSegment),\n maneuverType: ManeuverType.TravelPortal,\n coordinates: pathSegment.portalPath.geometry.coordinates,\n zone: currentZone,\n };\n optimizedPath.push(travelPortalSegment);\n }\n optimizedPath.push(exitPortalSegment);\n }\n }\n }\n if (endSegment) optimizedPath.push(endSegment as RouteSegment);\n\n const route: Route = {\n segments: optimizedPath,\n walkingDistance: 0,\n transportDistance: 0,\n walkingTime: 0,\n transportTime: 0,\n distanceUnit: DISTANCE_UNIT,\n speed: WALK_SPEED,\n };\n\n // A patch denotes the segments which are directly connected to each other i.e. no portal in between, portal enter/exit can be part of the patch\n if (route.segments.length > 0) {\n const addOverviewSegment = shouldAddOverviewSegment;\n let initialIndex = 0;\n\n if (addOverviewSegment) {\n // Dummy overview segment at start of route\n const dummySegment = cloneDeep(route.segments[0]);\n dummySegment.maneuverType = ManeuverType.RouteOverview;\n route.segments.unshift(dummySegment);\n\n initialIndex = 1; // Because overview segment will be at 0th index of route\n }\n\n // A patch denotes the segments which are directly connected to each other i.e. no portal in between, portal enter/exit can be part of the patch\n let patchNumber = indexOffset + initialIndex;\n let whereDimension = route.segments.length > initialIndex ? route.segments[initialIndex].startEdge.whereDimension : '';\n for (let index = initialIndex; index < route.segments.length; index += 1) {\n const highlight = false;\n const segment = route.segments[index];\n const segmentNumber = indexOffset + index;\n if (!segment.isPortal) {\n // point feature if ManeuverType.Static else line feature\n if (segment.maneuverType === ManeuverType.Static || segment.maneuverType === ManeuverType.ChangeZone) {\n segment.features = getRouteNode(\n segment.coordinates[0],\n segmentNumber,\n highlight,\n patchNumber,\n segment.endEdge.whereDimension,\n );\n segment.patchNumber = patchNumber;\n segment.whereDimension = whereDimension;\n } else {\n segment.features = getRouteLine(\n segment.coordinates,\n segmentNumber,\n highlight,\n patchNumber,\n segment.zone,\n segment.startEdge.whereDimension,\n );\n segment.patchNumber = patchNumber;\n segment.whereDimension = whereDimension;\n }\n const routeSegmentCoords = segment.coordinates;\n let segmentDistance;\n if (routeSegmentCoords.length > 1) {\n segmentDistance = length(lineString(routeSegmentCoords), { units: route.distanceUnit });\n } else {\n segmentDistance = 0;\n }\n segment.distance = segmentDistance;\n if (segment.maneuverType !== ManeuverType.PassThroughImmigration) {\n segment.time = segment.distance / route.speed;\n } else {\n segment.time = 0;\n }\n } else {\n // if (\n // segment.maneuverType !== ManeuverType.EnterPortal\n // && segment.maneuverType !== ManeuverType.ExitPortal\n // ) {\n // console.warn('unexpected state in createRoute');\n // }\n\n if (segment.maneuverType === ManeuverType.EnterPortal) {\n const startEdgeFeatures = getRouteNode(\n segment.coordinates[0],\n segmentNumber,\n highlight,\n patchNumber,\n segment.startEdge.whereDimension,\n );\n\n const features = [] as Feature[];\n // eslint-disable-next-line no-restricted-syntax\n for (const feature of startEdgeFeatures) {\n features.push(feature);\n }\n\n segment.features = features;\n segment.patchNumber = patchNumber;\n segment.whereDimension = whereDimension;\n\n // read next segment, if next segment is TravelPortal then do not include time of this enter portal segment\n const nextRouteSegment = route.segments.length >= index + 2 ? route.segments[index + 1] : undefined;\n if (nextRouteSegment && nextRouteSegment.maneuverType !== ManeuverType.TravelPortal) {\n const portalCost = segment.cost;\n segment.time = portalCost || 0;\n } else {\n segment.time = 0;\n }\n\n segment.distance = 0;\n }\n\n if (segment.maneuverType === ManeuverType.TravelPortal) {\n segment.features = getRouteLine(\n segment.coordinates,\n segmentNumber,\n highlight,\n patchNumber,\n segment.zone,\n segment.startEdge.whereDimension,\n );\n segment.patchNumber = patchNumber;\n segment.whereDimension = whereDimension;\n\n const portalCost = segment.cost;\n segment.time = portalCost || 0;\n\n let segmentDistance;\n if (segment.coordinates.length > 1) {\n segmentDistance = length(lineString(segment.coordinates), { units: route.distanceUnit });\n } else {\n segmentDistance = 0;\n }\n segment.distance = segmentDistance;\n\n // Set time of previous enter portal instruction to zero, so that time in not shown in UI\n if (index > 0) route.segments[index - 1].time = 0;\n }\n\n if (segment.maneuverType === ManeuverType.ExitPortal) {\n // increment patch number to next value\n patchNumber += 1;\n whereDimension = segment.endEdge.whereDimension;\n\n // Remove ExitPortal segment from route, because its only used to calculate patch information since ATOMS-207\n route.segments.splice(index, 1);\n index -= 1;\n }\n\n // read next segment\n const nextRouteSegment = route.segments.length >= index + 2 ? route.segments[index + 1] : undefined;\n if (nextRouteSegment && nextRouteSegment.maneuverType === ManeuverType.TravelPortal) {\n patchNumber += 1;\n }\n }\n\n if (segment.maneuverType === ManeuverType.TravelPortal) {\n route.transportDistance += segment.distance;\n route.transportTime += segment.time;\n } else {\n route.walkingDistance += segment.distance;\n route.walkingTime += segment.time;\n }\n }\n\n if (addOverviewSegment) {\n // Generate and add actual overview segment\n const overviewSegment = generateOverviewSegment(route, indexOffset);\n route.segments[0] = overviewSegment;\n }\n }\n\n return route;\n}\n\nexport function getPatch(route: Route, patchNumber = 0) {\n let routefeatures = [] as Feature[];\n\n for (let index = 0; index < route.segments.length; index += 1) {\n const routeSegment = route.segments[index];\n if (routeSegment.patchNumber === patchNumber) {\n routefeatures = routefeatures.concat(routeSegment.features);\n }\n }\n\n return routefeatures;\n}\n\nexport function getFeaturesForPatch(\n route: Route,\n patchNumber: number,\n overviewSegmentInfo: {\n includeOverviewFeatures : boolean,\n patchNumberForOverviewFeatures: number},\n) {\n let routefeatures = [] as Feature[];\n\n for (let index = 0; index < route.segments.length; index += 1) {\n const routeSegment = route.segments[index];\n if (overviewSegmentInfo.includeOverviewFeatures) {\n // Return all features in default case\n if (isOverviewSegment(routeSegment)) {\n const nonHighlightedOverviewFeatures = [];\n const highlightedOverviewFeatures = [];\n for (let j = 0; j < routeSegment.features.length; j++) {\n const feature = routeSegment.features[j];\n if (feature.properties?.patchNumber !== undefined && feature.properties.patchNumber === overviewSegmentInfo.patchNumberForOverviewFeatures) {\n if (feature.properties.isNonHighlightedOverview !== undefined) {\n if (feature.properties.isNonHighlightedOverview === '1') {\n nonHighlightedOverviewFeatures.push(feature);\n } else {\n highlightedOverviewFeatures.push(feature);\n }\n }\n }\n }\n // Sort the features such that non hihglighted features come first in the array\n // because on map they should be sorted below highlighted features in z dimension\n const overviewSegmentFeatures = nonHighlightedOverviewFeatures.concat(highlightedOverviewFeatures);\n routefeatures = routefeatures.concat(overviewSegmentFeatures);\n }\n } else if (routeSegment.patchNumber === patchNumber) {\n // Return only non-overview features\n if (!isOverviewSegment(routeSegment)) routefeatures = routefeatures.concat(routeSegment.features);\n }\n }\n\n return routefeatures;\n}\n\nenum MovingPortal {\n Skytrain = 'what.transport.skytrain',\n Bus = 'what.service.airport_transfer',\n Escalator = 'what.infra.escalator',\n Lift = 'what.infra.lift',\n}\nenum NonMovingPortal {\n Entrance = 'what.infra.entrance',\n Exit = 'what.infra.exit',\n}\nexport function isMovingPortalTaxonomy(whatDimension: string) {\n if (Object.values(MovingPortal).includes(whatDimension as any)) return true;\n return false;\n}\nexport function isNonMovingPortalTaxonomy(whatDimension: string) {\n if (Object.values(NonMovingPortal).includes(whatDimension as any)) return true;\n return false;\n}\nexport function isPortalTaxonomy(whatDimension: string) {\n if (isMovingPortalTaxonomy(whatDimension) || isNonMovingPortalTaxonomy(whatDimension)) return true;\n return false;\n}\n\nfunction isCrossTerminalPortal(whatDimension: string) {\n if (whatDimension === MovingPortal.Skytrain || whatDimension === MovingPortal.Bus) return true;\n\n return false;\n}\n\nfunction getPortalName(whatDimension: string) {\n switch (whatDimension) {\n case 'what.transport.skytrain':\n return 'Skytrain';\n case 'what.service.airport_transfer':\n return 'Bus';\n case 'what.infra.escalator':\n return 'Escalator';\n case 'what.infra.lift':\n return 'Lift';\n case 'what.infra.entrance':\n return '';\n case 'what.infra.exit':\n return '';\n\n default:\n return whatDimension;\n }\n}\n\nfunction getTerminalAndLevelName(whereDimension: string) {\n const regex = /^(T\\d+|JEWEL)([A-Za-z]\\d+[A-Za-z]?)$/;\n const subDimension = whereDimension.split('.').slice(-2).join('').toUpperCase();\n const match = subDimension.match(regex);\n\n if (match) {\n const terminalIndicator = match[1][0];\n let terminalName;\n switch (terminalIndicator) {\n case 'T':\n terminalName = 'Terminal';\n break;\n case 'J':\n terminalName = 'Jewel';\n break;\n\n default:\n terminalName = 'Level';\n break;\n }\n const terminal = terminalName === 'Terminal' ? `${terminalName} ${match[1][1]}` : `${terminalName}`;\n\n const levelIdentifier = match[2][0];\n let levelName;\n switch (levelIdentifier) {\n case 'L':\n levelName = 'Level';\n break;\n case 'B':\n levelName = 'Basement';\n break;\n\n default:\n levelName = 'Level';\n break;\n }\n\n const level = `${levelName} ${match[2].substring(1)}`;\n return {\n Terminal: terminal,\n Level: level,\n };\n }\n return null; // Return null if the input doesn't match the expected format\n}\n\nfunction getWhereDimensionNameForPortal(portalDimension: string, whereDimension: string) {\n const terminalAndLevelName = getTerminalAndLevelName(whereDimension);\n if (terminalAndLevelName) {\n if (isCrossTerminalPortal(portalDimension)) {\n return terminalAndLevelName.Terminal;\n }\n if (portalDimension === MovingPortal.Escalator || portalDimension === MovingPortal.Lift) {\n return terminalAndLevelName.Level;\n }\n\n if (isNonMovingPortalTaxonomy(portalDimension)) {\n return terminalAndLevelName.Terminal;\n }\n }\n\n return whereDimension.split('.').slice(-2).join(' ').toUpperCase();\n}\n\nfunction convertSecondsToMinutes(timeInSeconds: number): number {\n // Calculate minutes\n let minutes: number = Math.floor(timeInSeconds / 60);\n\n // Check for remaining seconds\n const remainingSeconds: number = timeInSeconds % 60;\n\n // If there are remaining seconds and they are greater than 30, increment minutes\n if (remainingSeconds > 30) {\n minutes += 1;\n }\n\n return minutes;\n}\n\nexport function formatTime(value: number) {\n if (value < 60) return '<1 minute';\n return `~${convertSecondsToMinutes(value)} ${convertSecondsToMinutes(value) > 1 ? 'minutes' : 'minute'}`;\n}\n\nexport function generateInstructions(route: Route) {\n const isFirstSegment = (index: number) => {\n if (index === 0\n || (index === 1 && route.segments[index - 1].maneuverType === ManeuverType.RouteOverview)) return true;\n\n return false;\n };\n\n const getImmigrationInstruction = (segment: RouteSegment) => {\n if (segment.startEdge.whereDimension.toLowerCase().includes('l1')) {\n return 'Clear Arrival Immigration';\n }\n\n return 'Clear Departure Immigration';\n };\n\n for (let index = 0; index < route.segments.length; index += 1) {\n const rotueSegment = route.segments[index];\n rotueSegment.instructions = []; // clear instructions array\n\n if (rotueSegment.maneuverType === ManeuverType.RouteOverview) {\n const instruction = 'Overview';\n rotueSegment.instructions.push(instruction);\n }\n if (index > 0 && rotueSegment.maneuverType === ManeuverType.ChangeZone) {\n let instruction = '';\n if (route.segments[index - 1].zone === Zone.Public && rotueSegment.zone === Zone.Transit) {\n instruction = getImmigrationInstruction(rotueSegment);\n } else if (route.segments[index - 1].zone === Zone.Transit && rotueSegment.zone === Zone.Public) {\n instruction = 'Exit Baggage Claim Hall';\n }\n\n rotueSegment.instructions.push(instruction);\n } else\n if (rotueSegment.maneuverType === ManeuverType.ContinueStraight\n || rotueSegment.maneuverType === ManeuverType.PassThroughImmigration) {\n const postfix = rotueSegment.maneuverType === ManeuverType.ContinueStraight\n ? `Walk for ${Math.ceil(rotueSegment.distance)} ${route.distanceUnit}`\n : getImmigrationInstruction(rotueSegment);\n\n // 0th index if overview segment was not included, else 1st index\n // if (index === 0\n // || (index === 1 && route.segments[index - 1].maneuverType === ManeuverType.RouteOverview)) {\n // rotueSegment.instructions.push(\n // `Start at ${\n // rotueSegment.startEdge.name\n // } on ${\n // rotueSegment.startEdge.whereDimension.split('.').slice(-2).join(' ').toUpperCase()\n // } \\n& ${postfix}`,\n // );\n // } else {\n let instruction;\n if (route.segments[index - 1].maneuverType === ManeuverType.ChangeZone || route.segments[index - 1].maneuverType === ManeuverType.PassThroughImmigration) {\n instruction = postfix;\n // eslint-disable-next-line brace-style\n }\n // else if (route.segments[index - 1].maneuverType === ManeuverType.EnterPortal || route.segments[index - 1].maneuverType === ManeuverType.TravelPortal) {\n // // for exit portal\n // instruction = postfix;\n // // `Exit ${\n // // rotueSegment.startEdge.name\n // // } at ${\n // // getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.startEdge.whereDimension)\n // // } \\n& ${postfix}`;\n\n // // if (isNonMovingPortalTaxonomy(rotueSegment.startEdge.whatDimension)) {\n // // instruction = `Enter ${\n // // rotueSegment.startEdge.whereDimension.split('.').slice(-2).join(' ').toUpperCase()\n // // } \\n& ${postfix}`;\n // // }\n // // else\n // // if (isMovingPortalTaxonomy(rotueSegment.startEdge.whatDimension)) {\n // // const name = getPortalName(rotueSegment.startEdge.whatDimension);\n\n // // // if (isCrossTerminalPortal(rotueSegment.startEdge.whatDimension)) {\n // // // postfix = ` on ${\n // // // getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.endEdge.whereDimension)\n // // // } \\n& ${postfix}`;\n // // // } else {\n // // // postfix = ` \\n& ${postfix}`;\n // // // }\n\n // // instruction = `Exit ${\n // // name\n // // } \\n& ${postfix}`;\n // // }\n // }\n else {\n instruction = postfix;\n }\n rotueSegment.instructions.push(instruction);\n // }\n } else if (rotueSegment.maneuverType === ManeuverType.Static) {\n if (isFirstSegment(index)) {\n rotueSegment.instructions.push(\n `Start at ${rotueSegment.startEdge.name}`\n );\n }\n\n if (index === route.segments.length - 1) {\n rotueSegment.instructions.push(\n `Arrive at ${rotueSegment.endEdge.name\n }`,\n );\n }\n } else if (rotueSegment.maneuverType === ManeuverType.EnterPortal) {\n let instruction = `Enter ${rotueSegment.startEdge.name\n } at ${rotueSegment.startEdge.whereDimension.split('.').slice(-2).join(' ').toUpperCase()}`;\n\n if (isNonMovingPortalTaxonomy(rotueSegment.startEdge.whatDimension)) {\n instruction = `Continue to ${getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.endEdge.whereDimension)}`;\n rotueSegment.instructions.push(instruction);\n } else if (isMovingPortalTaxonomy(rotueSegment.startEdge.whatDimension)) {\n const nextRouteSegment = index + 1 <= route.segments.length - 1 ? route.segments[index + 1] : undefined;\n if (nextRouteSegment && nextRouteSegment.maneuverType === ManeuverType.TravelPortal) {\n // push the current enter portal instruction and increment index, since we want to skip the iteration on TravelPortal segment\n rotueSegment.instructions.push(instruction);\n index += 1;\n\n const name = getPortalName(nextRouteSegment.startEdge.whatDimension);\n instruction = `Take ${\n name\n } to ${getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.endEdge.whereDimension)}`;\n nextRouteSegment.instructions.push(instruction);\n if (rotueSegment.description) nextRouteSegment.instructions.push(rotueSegment.description);\n } else {\n const name = getPortalName(rotueSegment.startEdge.whatDimension);\n\n instruction = `Take ${\n name\n } to ${getWhereDimensionNameForPortal(rotueSegment.startEdge.whatDimension, rotueSegment.endEdge.whereDimension)}`;\n rotueSegment.instructions.push(instruction);\n }\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -2,8 +2,8 @@ import * as turf from '@turf/turf';
2
2
  import GeoJSONRBush from 'geojson-rbush';
3
3
  import { Graph as DagreGraph, alg } from '@dagrejs/graphlib';
4
4
  import { cloneDeep, isEmpty } from 'lodash';
5
- import { PortalType } from './interfaces';
6
- import { getEdge } from './mapObjectsHelper';
5
+ import { PortalType } from "./interfaces.js";
6
+ import { getEdge } from "./mapObjectsHelper.js";
7
7
  const debugMode = false;
8
8
  export const minSnapDistance = 1e-3; // meters
9
9
 
@@ -22,7 +22,8 @@ function indexOfPointOnLine(feature, point) {
22
22
  if (debugMode) console.log('matchIndex: ', matchIndex);
23
23
  return matchIndex;
24
24
  }
25
- function addIntersectionToFeature(intersectedPoint, feature, doNearbyCheck = true) {
25
+ function addIntersectionToFeature(intersectedPoint, feature) {
26
+ let doNearbyCheck = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
26
27
  const addToLine = (point, line) => {
27
28
  const cleanedFeature = turf.cleanCoords(line);
28
29
  const nearestPoint1 = turf.nearestPointOnLine(cleanedFeature, point);
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["turf","GeoJSONRBush","Graph","DagreGraph","alg","cloneDeep","isEmpty","PortalType","getEdge","debugMode","minSnapDistance","indexOfPointOnLine","feature","point","matchIndex","coordEach","currentCoord","coordIndex","featureIndex","multiFeatureIndex","geometryIndex","lineVertex","dist","distance","units","console","log","addIntersectionToFeature","intersectedPoint","doNearbyCheck","addToLine","line","cleanedFeature","cleanCoords","nearestPoint1","nearestPointOnLine","properties","index","undefined","geometry","coordinates","splice","modified","indexOnLine","snap","a","b","getType","currentPoint","snappedPoint","existingVertexOnLine","distToExistingVertexOnLine","findIntersectionsWithSuperset","i","length","j","id","intersections","lineIntersect","features","intersectedFeature","optimized","tree","load","forEach","line1","bbox1","bbox","possibleMatches","search","title","match","line2","dimension_where","markAsModified","mapBoxDraw","add","getFirstPointFeature","type","getParentDimension","dimension","splitResult","split","lastChildName","parentDimensionValueStrict","replace","concat","DEFAULT_DIMENSION","getPortalEdgeData","portalLinks","allEdgeLines","portalEdgeData","addLink","link","container","cost","direction","wheelchair","description","property_portalLink","edge","property_secondRelatedId","lines","pathFeatures","property_routeData","filter","portalEdge","push","addNode","mapObjectId","links","portal","escalatorGraph","Object","keys","anchorId","escalator","linksForAnchor","lift","linksForNonAnchor","k","nestedLink","hasNode","setNode","where","taxonomy1Path","hasEdge","setEdge","extrapolateLinks","graph","components","component","reachableNodes","node1","node2","edgeData","nodeEdges","isParallelLink","nodeEdge","nodeToUse","v","w","nodeEdgeData","edgeAsObj","isParallel","removeEdge","addLinkUsingGraph","escalatorEdge","start","performance","now","escalatorGraphEdges","edges","hasOwnProperty","filterPortalEdgeDataByWhere","allPortalEdgeData","whereDimension","portalId","includes","filterPortalEdgeDataByList","portalIdList","has"],"sources":["../../../../../src/meta-atlas-sdk/MetaAtlasCore/routing-core/utils.ts"],"sourcesContent":["import { Feature, LineString, GeoJsonProperties, Point } from 'geojson';\nimport * as turf from '@turf/turf';\nimport { Position } from 'geojson';\nimport MapboxDraw from '@mapbox/mapbox-gl-draw';\nimport GeoJSONRBush from 'geojson-rbush';\nimport { Graph as DagreGraph, alg, Edge as GraphEdge } from '@dagrejs/graphlib';\nimport { cloneDeep, isEmpty } from 'lodash';\nimport {\n EdgeLine, Portal, PortalEdge, PortalEdgeData, PortalLinks, PortalType,\n} from './interfaces';\nimport { getEdge } from './mapObjectsHelper';\n\nconst debugMode = false;\n\nexport const minSnapDistance = 1e-3; // meters\ntype turfLineString = Feature<LineString, GeoJsonProperties>;\n\nfunction indexOfPointOnLine(feature: turfLineString, point: Feature<Point, GeoJsonProperties>) {\n let matchIndex = -1;\n turf.coordEach(feature, (currentCoord: number[], coordIndex: number, featureIndex: number, multiFeatureIndex: number, geometryIndex: number) => {\n if (matchIndex === -1) {\n const lineVertex = turf.point(currentCoord);\n const dist = turf.distance(point, lineVertex, {\n units: 'meters',\n });\n if (debugMode) console.log('coordIndex: ', coordIndex, dist);\n if (dist < minSnapDistance) matchIndex = coordIndex;\n }\n });\n\n if (debugMode) console.log('matchIndex: ', matchIndex);\n return matchIndex;\n}\n\nfunction addIntersectionToFeature(\n intersectedPoint: Feature<Point, GeoJsonProperties>,\n feature: turfLineString,\n doNearbyCheck = true,\n) {\n const addToLine = (point: Position, line: turfLineString) => {\n const cleanedFeature = turf.cleanCoords(line);\n const nearestPoint1 = turf.nearestPointOnLine(cleanedFeature, point);\n if (nearestPoint1.properties.index !== undefined) {\n feature.geometry.coordinates.splice(nearestPoint1.properties.index + 1, 0, intersectedPoint.geometry.coordinates);\n if (feature.properties) feature.properties.modified = 1;\n if (debugMode) console.log('added');\n } else if (debugMode) console.log('nearest point on line undefined');\n };\n\n if (doNearbyCheck) {\n const indexOnLine = indexOfPointOnLine(feature, intersectedPoint);\n if (indexOnLine === -1) {\n addToLine(intersectedPoint.geometry.coordinates, feature);\n } else {\n if (debugMode) console.log('should update vertex', indexOnLine);\n feature.geometry.coordinates[indexOnLine] = intersectedPoint.geometry.coordinates;\n if (feature.properties) feature.properties.modified = 1;\n }\n } else {\n addToLine(intersectedPoint.geometry.coordinates, feature);\n }\n}\n\nfunction snap(a: turfLineString, b: turfLineString) {\n if (turf.getType(a) === 'LineString') {\n turf.coordEach(a, (currentCoord: number[], coordIndex: number, featureIndex: number, multiFeatureIndex: number, geometryIndex: number) => {\n const currentPoint = turf.point(currentCoord);\n const cleanedFeature = turf.cleanCoords(b);\n const snappedPoint = turf.nearestPointOnLine(cleanedFeature, currentPoint, { units: 'meters' });\n\n if (snappedPoint\n && snappedPoint.properties.dist !== undefined && snappedPoint.properties.index !== undefined) {\n const existingVertexOnLine = turf.point(b.geometry.coordinates[snappedPoint.properties.index]);\n const distToExistingVertexOnLine = turf.distance(currentPoint, existingVertexOnLine, {\n units: 'meters',\n });\n // If the snappedPoint is close (< minSnapDistance) to a pre-existing vertex then use that vertex instead of adding new\n if (distToExistingVertexOnLine < minSnapDistance) {\n snappedPoint.geometry.coordinates = existingVertexOnLine.geometry.coordinates;\n a.geometry.coordinates[coordIndex] = snappedPoint.geometry.coordinates;\n if (a.properties) a.properties.modified = 1;\n } else\n // Add a new line vertex to b and move vertex of a to the same location\n if (snappedPoint.properties.dist < minSnapDistance) {\n a.geometry.coordinates[coordIndex] = snappedPoint.geometry.coordinates;\n b.geometry.coordinates.splice(snappedPoint.properties.index + 1, 0, snappedPoint.geometry.coordinates);\n if (a.properties) a.properties.modified = 1;\n }\n }\n });\n }\n}\n\n// if required to disable route_edge X route_edge intersection\n//! (a[i].properties.dimension_what === b[i].properties.dimension_what && a[i].properties.dimension_what === RouteDimension.Edge && b[i].properties.dimension_what === RouteDimension.Edge)\n\n// b is a superset which also includes a\nexport function findIntersectionsWithSuperset(a: turfLineString[], b: turfLineString[]) {\n for (let i = 0; i < a.length; i += 1) {\n for (let j = 0; j < b.length; j += 1) {\n if (a[i].id !== b[j].id) {\n // TODO: Optimize for two-way snapping in one call\n snap(a[i], b[j]);\n snap(b[j], a[i]);\n const intersections = turf.lineIntersect(a[i] as any, b[j] as any);\n if (debugMode) console.log('intersections for ', i, j, intersections);\n\n // Add intersection points to the respective LineStrings\n if (intersections.features.length > 0) {\n for (let index = 0; index < intersections.features.length; index += 1) {\n const intersectedFeature = intersections.features[index];\n\n addIntersectionToFeature(intersectedFeature, a[i]);\n addIntersectionToFeature(intersectedFeature, b[j]);\n }\n }\n } else {\n // since b is a super set and is also returned as the final output, so copy latest state in b\n b[j] = a[i];\n }\n }\n }\n\n return b;\n}\n\n// It updates the given feature data inplace, make sure params are passed by reference.\nexport function optimized(a: turfLineString[], b: turfLineString[]) {\n // Step 1: Build spatial index for the second set of LineStrings\n const tree = GeoJSONRBush();\n tree.load(b);\n\n // Step 2: Find potential intersecting pairs using bounding boxes\n a.forEach((line1) => {\n const bbox1 = turf.bbox(line1);\n const possibleMatches = tree.search(bbox1);\n\n if (debugMode) console.log('possible matches for ', line1.properties.title, possibleMatches);\n\n possibleMatches.features.forEach((match) => {\n const line2 = match;\n if (line1.properties && line1.properties.dimension_where\n && line2.properties && line2.properties.dimension_where\n && line1.properties.dimension_where === line2.properties.dimension_where\n ) {\n // Step 3: Perform detailed intersection check\n snap(line1, line2 as any);\n const intersections = turf.lineIntersect(line1 as any, line2 as any);\n if (debugMode) console.log('intersections', intersections);\n\n // Add intersection points to the respective LineStrings\n if (intersections.features.length > 0) {\n for (let j = 0; j < intersections.features.length; j += 1) {\n const intersectedFeature = intersections.features[j];\n\n addIntersectionToFeature(intersectedFeature, line1, false);\n addIntersectionToFeature(intersectedFeature, line2 as any, false);\n }\n }\n }\n });\n });\n}\n\nexport function markAsModified(features: Array<Feature>, mapBoxDraw: MapboxDraw) {\n if (features) {\n for (let index = 0; index < features.length; index += 1) {\n const feature = features[index];\n // modified key is used to mark that a feature was updated by mapboxDraw or custom logic like intersection during the respective editing session\n feature.properties.modified = 1;\n\n mapBoxDraw.add(feature as any);\n }\n }\n}\n\nexport function getFirstPointFeature(features: Feature[]) : Feature | undefined {\n for (let index = 0; index < features.length; index += 1) {\n const feature = features[index];\n const type = turf.getType(feature as any);\n\n if (type === 'Point') {\n return feature;\n }\n }\n\n return undefined;\n}\n\nexport function getParentDimension(dimension: string) {\n const splitResult = dimension.split('.');\n const lastChildName = splitResult[splitResult.length - 1];\n const parentDimensionValueStrict = dimension.replace('.'.concat(lastChildName), '');\n return parentDimensionValueStrict;\n}\n\nexport const DEFAULT_DIMENSION = 'where.singapore';\nexport function getPortalEdgeData(portalLinks: PortalLinks) {\n const allEdgeLines : EdgeLine[] = [];\n const portalEdgeData : { [key: string] : Portal} = {};\n\n const addLink = (link: any, container: PortalEdge[]) => {\n const {\n cost, direction, wheelchair, description,\n } = link.property_portalLink;\n const edge = getEdge(link.property_secondRelatedId);\n if (edge && edge.lines) {\n const pathFeatures = (link.property_routeData && link.property_routeData.features)\n ? (link.property_routeData.features.filter(\n (feature : Feature<LineString, any>) => feature.geometry !== undefined && turf.getType(feature) === 'LineString' && feature.geometry.coordinates.length > 0,\n ))\n : null;\n const portalEdge = {\n ...edge,\n cost,\n direction,\n wheelchair,\n pathFeatures,\n description,\n } as PortalEdge;\n container.push(portalEdge);\n\n allEdgeLines.push(...edge.lines);\n }\n };\n\n const addNode = (mapObjectId: any, links: PortalEdge[]) => {\n const edge = getEdge(mapObjectId);\n if (edge && edge.lines) {\n const portal = {\n ...edge,\n links,\n };\n portalEdgeData[mapObjectId] = portal;\n\n allEdgeLines.push(...edge.lines);\n\n return portal;\n }\n\n return undefined;\n };\n\n console.log('portalData input', portalLinks);\n const escalatorGraph = new DagreGraph();\n if (!isEmpty(portalLinks)) {\n Object.keys(portalLinks).forEach((anchorId) => {\n const { type, links } = portalLinks[anchorId];\n\n if (type !== PortalType.escalator) {\n const linksForAnchor : PortalEdge[] = [];\n for (let j = 0; j < links.length; j += 1) {\n const link = links[j];\n addLink(link, linksForAnchor);\n\n if (type === PortalType.lift) {\n // Extrapolate links for non-anchor lifts\n const linksForNonAnchor : PortalEdge[] = [];\n for (let k = 0; k < links.length; k += 1) {\n const nestedLink = links[k];\n if (nestedLink.property_secondRelatedId !== link.property_secondRelatedId) {\n addLink(nestedLink, linksForNonAnchor);\n }\n }\n if (linksForNonAnchor.length > 0) {\n // Add node for non-anchor lift\n addNode(link.property_secondRelatedId, linksForNonAnchor);\n }\n }\n }\n\n // Add node for anchor\n addNode(anchorId, linksForAnchor);\n } else {\n if (!escalatorGraph.hasNode(anchorId)) {\n const edge = getEdge(anchorId);\n if (edge) {\n escalatorGraph.setNode(anchorId, {\n where: edge.where,\n });\n }\n }\n\n for (let j = 0; j < links.length; j += 1) {\n const link = links[j];\n if (!escalatorGraph.hasNode(link.property_secondRelatedId)) {\n escalatorGraph.setNode(anchorId, {\n where: link.taxonomy1Path,\n });\n }\n\n if (!escalatorGraph.hasEdge(anchorId, link.property_secondRelatedId)) {\n escalatorGraph.setEdge(anchorId, link.property_secondRelatedId, {\n ...link.property_portalLink,\n });\n }\n }\n }\n });\n }\n\n // eslint-disable-next-line no-loop-func\n const extrapolateLinks = (graph: DagreGraph) => {\n const components = alg.components(graph);\n components.forEach((component) => {\n const reachableNodes = component;\n\n // Connect the node directly to each indirectly connected node\n for (let i = 0; i < reachableNodes.length; i += 1) {\n const node1 = reachableNodes[i];\n for (let j = i + 1; j < reachableNodes.length; j += 1) {\n const node2 = reachableNodes[j];\n if (node1 !== node2 && !graph.hasEdge(node1, node2)) {\n let edgeData = {\n cost: 120, direction: 2, wheelchair: true,\n };\n const nodeEdges = graph.nodeEdges(node1);\n let isParallelLink = false;\n if (nodeEdges && nodeEdges.length > 0) {\n for (let k = 0; !isParallelLink && k < nodeEdges.length; k += 1) {\n const nodeEdge = nodeEdges[k];\n\n // check sibling connection with node2\n const nodeToUse = nodeEdge.v === node1 ? nodeEdge.w : nodeEdge.v;\n if (graph.hasEdge(nodeToUse, node2)) {\n const nodeEdgeData = graph.edgeAsObj(nodeToUse, node2);\n if ('isParallel' in nodeEdgeData && nodeEdgeData.isParallel) {\n isParallelLink = true;\n }\n }\n }\n edgeData = graph.edgeAsObj(nodeEdges[0]) as any;\n }\n\n if (!isParallelLink) {\n if (graph.hasEdge(node2, node1)) {\n edgeData = cloneDeep(graph.edgeAsObj(node2, node1) as any);\n if ('direction' in edgeData && edgeData.direction) {\n if (edgeData.direction !== 2) edgeData.direction *= -1;\n }\n }\n graph.setEdge(node1, node2, edgeData);\n }\n }\n }\n }\n\n // Delete all parallel links from graph\n for (let i = 0; i < reachableNodes.length; i += 1) {\n const node1 = reachableNodes[i];\n const nodeEdges = graph.nodeEdges(node1);\n for (let k = 0; nodeEdges && k < nodeEdges.length; k += 1) {\n const nodeEdge = nodeEdges[k];\n const nodeEdgeData = graph.edgeAsObj(nodeEdge);\n if ('isParallel' in nodeEdgeData && nodeEdgeData.isParallel) {\n graph.removeEdge(nodeEdge.v, nodeEdge.w);\n }\n }\n }\n });\n };\n\n const addLinkUsingGraph = (portal: Portal, escalatorEdge: GraphEdge) => {\n const nodeEdgeData = escalatorGraph.edge(escalatorEdge);\n const {\n cost, direction, wheelchair, pathFeatures, description,\n } = nodeEdgeData;\n const edge = getEdge(escalatorEdge.w);\n if (edge && edge.lines) {\n const portalEdge = {\n ...edge,\n cost,\n direction,\n wheelchair,\n pathFeatures,\n description,\n } as PortalEdge;\n portal.links.push(portalEdge);\n allEdgeLines.push(...edge.lines);\n }\n };\n\n const start = performance.now();\n extrapolateLinks(escalatorGraph);\n console.log('time extrapolation: ', (performance.now() - start) / 1000);\n\n // Add escaaltor links to portalEdgeData using the escalator graph\n const escalatorGraphEdges = escalatorGraph.edges();\n for (let i = 0; i < escalatorGraphEdges.length; i += 1) {\n const escalatorEdge = escalatorGraphEdges[i];\n // eslint-disable-next-line no-prototype-builtins\n if (!portalEdgeData.hasOwnProperty(escalatorEdge.v)) {\n // Add node and then add link\n const portal = addNode(escalatorEdge.v, []);\n if (portal) {\n addLinkUsingGraph(portal, escalatorEdge);\n }\n } else {\n const portal = portalEdgeData[escalatorEdge.v];\n addLinkUsingGraph(portal, escalatorEdge);\n }\n }\n\n console.log('portalEdgeData', portalEdgeData);\n return {\n edgeData: portalEdgeData,\n lines: allEdgeLines,\n };\n}\n\nexport function filterPortalEdgeDataByWhere(allPortalEdgeData: PortalEdgeData, whereDimension: string) {\n const allEdgeLines : EdgeLine[] = [];\n const portalEdgeData : { [key: string] : Portal} = {};\n\n // eslint-disable-next-line no-restricted-syntax\n for (const portalId in allPortalEdgeData) {\n if (allPortalEdgeData[portalId].where.includes(whereDimension)) {\n const portal = allPortalEdgeData[portalId];\n portalEdgeData[portalId] = portal;\n allEdgeLines.push(...portal.lines);\n portal.links.forEach((link) => {\n allEdgeLines.push(...link.lines);\n });\n }\n }\n\n return {\n edgeData: portalEdgeData,\n lines: allEdgeLines,\n };\n}\n\nexport function filterPortalEdgeDataByList(allPortalEdgeData: PortalEdgeData, portalIdList: Set<string>) {\n const allEdgeLines : EdgeLine[] = [];\n const portalEdgeData : { [key: string] : Portal} = {};\n\n portalIdList.forEach((portalId) => {\n if (portalId in allPortalEdgeData && portalIdList.has(allPortalEdgeData[portalId].id)) {\n const portal = allPortalEdgeData[portalId];\n portalEdgeData[portalId] = portal;\n allEdgeLines.push(...portal.lines);\n portal.links.forEach((link) => {\n allEdgeLines.push(...link.lines);\n });\n }\n });\n\n return {\n edgeData: portalEdgeData,\n lines: allEdgeLines,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["turf","GeoJSONRBush","Graph","DagreGraph","alg","cloneDeep","isEmpty","PortalType","getEdge","debugMode","minSnapDistance","indexOfPointOnLine","feature","point","matchIndex","coordEach","currentCoord","coordIndex","featureIndex","multiFeatureIndex","geometryIndex","lineVertex","dist","distance","units","console","log","addIntersectionToFeature","intersectedPoint","doNearbyCheck","arguments","length","undefined","addToLine","line","cleanedFeature","cleanCoords","nearestPoint1","nearestPointOnLine","properties","index","geometry","coordinates","splice","modified","indexOnLine","snap","a","b","getType","currentPoint","snappedPoint","existingVertexOnLine","distToExistingVertexOnLine","findIntersectionsWithSuperset","i","j","id","intersections","lineIntersect","features","intersectedFeature","optimized","tree","load","forEach","line1","bbox1","bbox","possibleMatches","search","title","match","line2","dimension_where","markAsModified","mapBoxDraw","add","getFirstPointFeature","type","getParentDimension","dimension","splitResult","split","lastChildName","parentDimensionValueStrict","replace","concat","DEFAULT_DIMENSION","getPortalEdgeData","portalLinks","allEdgeLines","portalEdgeData","addLink","link","container","cost","direction","wheelchair","description","property_portalLink","edge","property_secondRelatedId","lines","pathFeatures","property_routeData","filter","portalEdge","push","addNode","mapObjectId","links","portal","escalatorGraph","Object","keys","anchorId","escalator","linksForAnchor","lift","linksForNonAnchor","k","nestedLink","hasNode","setNode","where","taxonomy1Path","hasEdge","setEdge","extrapolateLinks","graph","components","component","reachableNodes","node1","node2","edgeData","nodeEdges","isParallelLink","nodeEdge","nodeToUse","v","w","nodeEdgeData","edgeAsObj","isParallel","removeEdge","addLinkUsingGraph","escalatorEdge","start","performance","now","escalatorGraphEdges","edges","hasOwnProperty","filterPortalEdgeDataByWhere","allPortalEdgeData","whereDimension","portalId","includes","filterPortalEdgeDataByList","portalIdList","has"],"sources":["../../../../../src/meta-atlas-sdk/MetaAtlasCore/routing-core/utils.ts"],"sourcesContent":["import { Feature, LineString, GeoJsonProperties, Point } from 'geojson';\nimport * as turf from '@turf/turf';\nimport { Position } from 'geojson';\nimport MapboxDraw from '@mapbox/mapbox-gl-draw';\nimport GeoJSONRBush from 'geojson-rbush';\nimport { Graph as DagreGraph, alg, Edge as GraphEdge } from '@dagrejs/graphlib';\nimport { cloneDeep, isEmpty } from 'lodash';\nimport {\n EdgeLine, Portal, PortalEdge, PortalEdgeData, PortalLinks, PortalType,\n} from './interfaces';\nimport { getEdge } from './mapObjectsHelper';\n\nconst debugMode = false;\n\nexport const minSnapDistance = 1e-3; // meters\ntype turfLineString = Feature<LineString, GeoJsonProperties>;\n\nfunction indexOfPointOnLine(feature: turfLineString, point: Feature<Point, GeoJsonProperties>) {\n let matchIndex = -1;\n turf.coordEach(feature, (currentCoord: number[], coordIndex: number, featureIndex: number, multiFeatureIndex: number, geometryIndex: number) => {\n if (matchIndex === -1) {\n const lineVertex = turf.point(currentCoord);\n const dist = turf.distance(point, lineVertex, {\n units: 'meters',\n });\n if (debugMode) console.log('coordIndex: ', coordIndex, dist);\n if (dist < minSnapDistance) matchIndex = coordIndex;\n }\n });\n\n if (debugMode) console.log('matchIndex: ', matchIndex);\n return matchIndex;\n}\n\nfunction addIntersectionToFeature(\n intersectedPoint: Feature<Point, GeoJsonProperties>,\n feature: turfLineString,\n doNearbyCheck = true,\n) {\n const addToLine = (point: Position, line: turfLineString) => {\n const cleanedFeature = turf.cleanCoords(line);\n const nearestPoint1 = turf.nearestPointOnLine(cleanedFeature, point);\n if (nearestPoint1.properties.index !== undefined) {\n feature.geometry.coordinates.splice(nearestPoint1.properties.index + 1, 0, intersectedPoint.geometry.coordinates);\n if (feature.properties) feature.properties.modified = 1;\n if (debugMode) console.log('added');\n } else if (debugMode) console.log('nearest point on line undefined');\n };\n\n if (doNearbyCheck) {\n const indexOnLine = indexOfPointOnLine(feature, intersectedPoint);\n if (indexOnLine === -1) {\n addToLine(intersectedPoint.geometry.coordinates, feature);\n } else {\n if (debugMode) console.log('should update vertex', indexOnLine);\n feature.geometry.coordinates[indexOnLine] = intersectedPoint.geometry.coordinates;\n if (feature.properties) feature.properties.modified = 1;\n }\n } else {\n addToLine(intersectedPoint.geometry.coordinates, feature);\n }\n}\n\nfunction snap(a: turfLineString, b: turfLineString) {\n if (turf.getType(a) === 'LineString') {\n turf.coordEach(a, (currentCoord: number[], coordIndex: number, featureIndex: number, multiFeatureIndex: number, geometryIndex: number) => {\n const currentPoint = turf.point(currentCoord);\n const cleanedFeature = turf.cleanCoords(b);\n const snappedPoint = turf.nearestPointOnLine(cleanedFeature, currentPoint, { units: 'meters' });\n\n if (snappedPoint\n && snappedPoint.properties.dist !== undefined && snappedPoint.properties.index !== undefined) {\n const existingVertexOnLine = turf.point(b.geometry.coordinates[snappedPoint.properties.index]);\n const distToExistingVertexOnLine = turf.distance(currentPoint, existingVertexOnLine, {\n units: 'meters',\n });\n // If the snappedPoint is close (< minSnapDistance) to a pre-existing vertex then use that vertex instead of adding new\n if (distToExistingVertexOnLine < minSnapDistance) {\n snappedPoint.geometry.coordinates = existingVertexOnLine.geometry.coordinates;\n a.geometry.coordinates[coordIndex] = snappedPoint.geometry.coordinates;\n if (a.properties) a.properties.modified = 1;\n } else\n // Add a new line vertex to b and move vertex of a to the same location\n if (snappedPoint.properties.dist < minSnapDistance) {\n a.geometry.coordinates[coordIndex] = snappedPoint.geometry.coordinates;\n b.geometry.coordinates.splice(snappedPoint.properties.index + 1, 0, snappedPoint.geometry.coordinates);\n if (a.properties) a.properties.modified = 1;\n }\n }\n });\n }\n}\n\n// if required to disable route_edge X route_edge intersection\n//! (a[i].properties.dimension_what === b[i].properties.dimension_what && a[i].properties.dimension_what === RouteDimension.Edge && b[i].properties.dimension_what === RouteDimension.Edge)\n\n// b is a superset which also includes a\nexport function findIntersectionsWithSuperset(a: turfLineString[], b: turfLineString[]) {\n for (let i = 0; i < a.length; i += 1) {\n for (let j = 0; j < b.length; j += 1) {\n if (a[i].id !== b[j].id) {\n // TODO: Optimize for two-way snapping in one call\n snap(a[i], b[j]);\n snap(b[j], a[i]);\n const intersections = turf.lineIntersect(a[i] as any, b[j] as any);\n if (debugMode) console.log('intersections for ', i, j, intersections);\n\n // Add intersection points to the respective LineStrings\n if (intersections.features.length > 0) {\n for (let index = 0; index < intersections.features.length; index += 1) {\n const intersectedFeature = intersections.features[index];\n\n addIntersectionToFeature(intersectedFeature, a[i]);\n addIntersectionToFeature(intersectedFeature, b[j]);\n }\n }\n } else {\n // since b is a super set and is also returned as the final output, so copy latest state in b\n b[j] = a[i];\n }\n }\n }\n\n return b;\n}\n\n// It updates the given feature data inplace, make sure params are passed by reference.\nexport function optimized(a: turfLineString[], b: turfLineString[]) {\n // Step 1: Build spatial index for the second set of LineStrings\n const tree = GeoJSONRBush();\n tree.load(b);\n\n // Step 2: Find potential intersecting pairs using bounding boxes\n a.forEach((line1) => {\n const bbox1 = turf.bbox(line1);\n const possibleMatches = tree.search(bbox1);\n\n if (debugMode) console.log('possible matches for ', line1.properties.title, possibleMatches);\n\n possibleMatches.features.forEach((match) => {\n const line2 = match;\n if (line1.properties && line1.properties.dimension_where\n && line2.properties && line2.properties.dimension_where\n && line1.properties.dimension_where === line2.properties.dimension_where\n ) {\n // Step 3: Perform detailed intersection check\n snap(line1, line2 as any);\n const intersections = turf.lineIntersect(line1 as any, line2 as any);\n if (debugMode) console.log('intersections', intersections);\n\n // Add intersection points to the respective LineStrings\n if (intersections.features.length > 0) {\n for (let j = 0; j < intersections.features.length; j += 1) {\n const intersectedFeature = intersections.features[j];\n\n addIntersectionToFeature(intersectedFeature, line1, false);\n addIntersectionToFeature(intersectedFeature, line2 as any, false);\n }\n }\n }\n });\n });\n}\n\nexport function markAsModified(features: Array<Feature>, mapBoxDraw: MapboxDraw) {\n if (features) {\n for (let index = 0; index < features.length; index += 1) {\n const feature = features[index];\n // modified key is used to mark that a feature was updated by mapboxDraw or custom logic like intersection during the respective editing session\n feature.properties.modified = 1;\n\n mapBoxDraw.add(feature as any);\n }\n }\n}\n\nexport function getFirstPointFeature(features: Feature[]) : Feature | undefined {\n for (let index = 0; index < features.length; index += 1) {\n const feature = features[index];\n const type = turf.getType(feature as any);\n\n if (type === 'Point') {\n return feature;\n }\n }\n\n return undefined;\n}\n\nexport function getParentDimension(dimension: string) {\n const splitResult = dimension.split('.');\n const lastChildName = splitResult[splitResult.length - 1];\n const parentDimensionValueStrict = dimension.replace('.'.concat(lastChildName), '');\n return parentDimensionValueStrict;\n}\n\nexport const DEFAULT_DIMENSION = 'where.singapore';\nexport function getPortalEdgeData(portalLinks: PortalLinks) {\n const allEdgeLines : EdgeLine[] = [];\n const portalEdgeData : { [key: string] : Portal} = {};\n\n const addLink = (link: any, container: PortalEdge[]) => {\n const {\n cost, direction, wheelchair, description,\n } = link.property_portalLink;\n const edge = getEdge(link.property_secondRelatedId);\n if (edge && edge.lines) {\n const pathFeatures = (link.property_routeData && link.property_routeData.features)\n ? (link.property_routeData.features.filter(\n (feature : Feature<LineString, any>) => feature.geometry !== undefined && turf.getType(feature) === 'LineString' && feature.geometry.coordinates.length > 0,\n ))\n : null;\n const portalEdge = {\n ...edge,\n cost,\n direction,\n wheelchair,\n pathFeatures,\n description,\n } as PortalEdge;\n container.push(portalEdge);\n\n allEdgeLines.push(...edge.lines);\n }\n };\n\n const addNode = (mapObjectId: any, links: PortalEdge[]) => {\n const edge = getEdge(mapObjectId);\n if (edge && edge.lines) {\n const portal = {\n ...edge,\n links,\n };\n portalEdgeData[mapObjectId] = portal;\n\n allEdgeLines.push(...edge.lines);\n\n return portal;\n }\n\n return undefined;\n };\n\n console.log('portalData input', portalLinks);\n const escalatorGraph = new DagreGraph();\n if (!isEmpty(portalLinks)) {\n Object.keys(portalLinks).forEach((anchorId) => {\n const { type, links } = portalLinks[anchorId];\n\n if (type !== PortalType.escalator) {\n const linksForAnchor : PortalEdge[] = [];\n for (let j = 0; j < links.length; j += 1) {\n const link = links[j];\n addLink(link, linksForAnchor);\n\n if (type === PortalType.lift) {\n // Extrapolate links for non-anchor lifts\n const linksForNonAnchor : PortalEdge[] = [];\n for (let k = 0; k < links.length; k += 1) {\n const nestedLink = links[k];\n if (nestedLink.property_secondRelatedId !== link.property_secondRelatedId) {\n addLink(nestedLink, linksForNonAnchor);\n }\n }\n if (linksForNonAnchor.length > 0) {\n // Add node for non-anchor lift\n addNode(link.property_secondRelatedId, linksForNonAnchor);\n }\n }\n }\n\n // Add node for anchor\n addNode(anchorId, linksForAnchor);\n } else {\n if (!escalatorGraph.hasNode(anchorId)) {\n const edge = getEdge(anchorId);\n if (edge) {\n escalatorGraph.setNode(anchorId, {\n where: edge.where,\n });\n }\n }\n\n for (let j = 0; j < links.length; j += 1) {\n const link = links[j];\n if (!escalatorGraph.hasNode(link.property_secondRelatedId)) {\n escalatorGraph.setNode(anchorId, {\n where: link.taxonomy1Path,\n });\n }\n\n if (!escalatorGraph.hasEdge(anchorId, link.property_secondRelatedId)) {\n escalatorGraph.setEdge(anchorId, link.property_secondRelatedId, {\n ...link.property_portalLink,\n });\n }\n }\n }\n });\n }\n\n // eslint-disable-next-line no-loop-func\n const extrapolateLinks = (graph: DagreGraph) => {\n const components = alg.components(graph);\n components.forEach((component) => {\n const reachableNodes = component;\n\n // Connect the node directly to each indirectly connected node\n for (let i = 0; i < reachableNodes.length; i += 1) {\n const node1 = reachableNodes[i];\n for (let j = i + 1; j < reachableNodes.length; j += 1) {\n const node2 = reachableNodes[j];\n if (node1 !== node2 && !graph.hasEdge(node1, node2)) {\n let edgeData = {\n cost: 120, direction: 2, wheelchair: true,\n };\n const nodeEdges = graph.nodeEdges(node1);\n let isParallelLink = false;\n if (nodeEdges && nodeEdges.length > 0) {\n for (let k = 0; !isParallelLink && k < nodeEdges.length; k += 1) {\n const nodeEdge = nodeEdges[k];\n\n // check sibling connection with node2\n const nodeToUse = nodeEdge.v === node1 ? nodeEdge.w : nodeEdge.v;\n if (graph.hasEdge(nodeToUse, node2)) {\n const nodeEdgeData = graph.edgeAsObj(nodeToUse, node2);\n if ('isParallel' in nodeEdgeData && nodeEdgeData.isParallel) {\n isParallelLink = true;\n }\n }\n }\n edgeData = graph.edgeAsObj(nodeEdges[0]) as any;\n }\n\n if (!isParallelLink) {\n if (graph.hasEdge(node2, node1)) {\n edgeData = cloneDeep(graph.edgeAsObj(node2, node1) as any);\n if ('direction' in edgeData && edgeData.direction) {\n if (edgeData.direction !== 2) edgeData.direction *= -1;\n }\n }\n graph.setEdge(node1, node2, edgeData);\n }\n }\n }\n }\n\n // Delete all parallel links from graph\n for (let i = 0; i < reachableNodes.length; i += 1) {\n const node1 = reachableNodes[i];\n const nodeEdges = graph.nodeEdges(node1);\n for (let k = 0; nodeEdges && k < nodeEdges.length; k += 1) {\n const nodeEdge = nodeEdges[k];\n const nodeEdgeData = graph.edgeAsObj(nodeEdge);\n if ('isParallel' in nodeEdgeData && nodeEdgeData.isParallel) {\n graph.removeEdge(nodeEdge.v, nodeEdge.w);\n }\n }\n }\n });\n };\n\n const addLinkUsingGraph = (portal: Portal, escalatorEdge: GraphEdge) => {\n const nodeEdgeData = escalatorGraph.edge(escalatorEdge);\n const {\n cost, direction, wheelchair, pathFeatures, description,\n } = nodeEdgeData;\n const edge = getEdge(escalatorEdge.w);\n if (edge && edge.lines) {\n const portalEdge = {\n ...edge,\n cost,\n direction,\n wheelchair,\n pathFeatures,\n description,\n } as PortalEdge;\n portal.links.push(portalEdge);\n allEdgeLines.push(...edge.lines);\n }\n };\n\n const start = performance.now();\n extrapolateLinks(escalatorGraph);\n console.log('time extrapolation: ', (performance.now() - start) / 1000);\n\n // Add escaaltor links to portalEdgeData using the escalator graph\n const escalatorGraphEdges = escalatorGraph.edges();\n for (let i = 0; i < escalatorGraphEdges.length; i += 1) {\n const escalatorEdge = escalatorGraphEdges[i];\n // eslint-disable-next-line no-prototype-builtins\n if (!portalEdgeData.hasOwnProperty(escalatorEdge.v)) {\n // Add node and then add link\n const portal = addNode(escalatorEdge.v, []);\n if (portal) {\n addLinkUsingGraph(portal, escalatorEdge);\n }\n } else {\n const portal = portalEdgeData[escalatorEdge.v];\n addLinkUsingGraph(portal, escalatorEdge);\n }\n }\n\n console.log('portalEdgeData', portalEdgeData);\n return {\n edgeData: portalEdgeData,\n lines: allEdgeLines,\n };\n}\n\nexport function filterPortalEdgeDataByWhere(allPortalEdgeData: PortalEdgeData, whereDimension: string) {\n const allEdgeLines : EdgeLine[] = [];\n const portalEdgeData : { [key: string] : Portal} = {};\n\n // eslint-disable-next-line no-restricted-syntax\n for (const portalId in allPortalEdgeData) {\n if (allPortalEdgeData[portalId].where.includes(whereDimension)) {\n const portal = allPortalEdgeData[portalId];\n portalEdgeData[portalId] = portal;\n allEdgeLines.push(...portal.lines);\n portal.links.forEach((link) => {\n allEdgeLines.push(...link.lines);\n });\n }\n }\n\n return {\n edgeData: portalEdgeData,\n lines: allEdgeLines,\n };\n}\n\nexport function filterPortalEdgeDataByList(allPortalEdgeData: PortalEdgeData, portalIdList: Set<string>) {\n const allEdgeLines : EdgeLine[] = [];\n const portalEdgeData : { [key: string] : Portal} = {};\n\n portalIdList.forEach((portalId) => {\n if (portalId in allPortalEdgeData && portalIdList.has(allPortalEdgeData[portalId].id)) {\n const portal = allPortalEdgeData[portalId];\n portalEdgeData[portalId] = portal;\n allEdgeLines.push(...portal.lines);\n portal.links.forEach((link) => {\n allEdgeLines.push(...link.lines);\n });\n }\n });\n\n return {\n edgeData: portalEdgeData,\n lines: allEdgeLines,\n };\n}\n"],"mappings":"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","ignoreList":[]}