@itwin/core-geometry 5.3.0-dev.4 → 5.3.0-dev.6
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.
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
- package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/cjs/bspline/KnotVector.js.map +1 -1
- package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +5 -7
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.d.ts +2 -5
- package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
- package/lib/cjs/curve/CurveOps.js +2 -5
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/CurveTypes.js.map +1 -1
- package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/cjs/curve/GeometryQuery.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/OffsetOptions.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/PointString3d.js.map +1 -1
- package/lib/cjs/curve/ProxyCurve.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +50 -15
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +102 -84
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +44 -25
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +74 -39
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +8 -8
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +102 -92
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +2 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +2 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +2 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +2 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +9 -16
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +3 -3
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts +2 -2
- package/lib/cjs/geometry3d/PolylineOps.js +2 -2
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/geometry4d/Map4d.js.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
- package/lib/cjs/geometry4d/MomentData.js.map +1 -1
- package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/cjs/geometry4d/Point4d.js.map +1 -1
- package/lib/cjs/numerics/BandedSystem.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js +2 -2
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/numerics/Complex.js.map +1 -1
- package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/cjs/numerics/Newton.js.map +1 -1
- package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
- package/lib/cjs/numerics/PolarData.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/numerics/Quadrature.js.map +1 -1
- package/lib/cjs/numerics/Range1dArray.js.map +1 -1
- package/lib/cjs/numerics/SmallSystem.js.map +1 -1
- package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/cjs/numerics/UnionFind.js.map +1 -1
- package/lib/cjs/numerics/UsageSums.js.map +1 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/BoxTopology.js.map +1 -1
- package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
- package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
- package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/Merging.d.ts +15 -7
- package/lib/cjs/topology/Merging.d.ts.map +1 -1
- package/lib/cjs/topology/Merging.js +15 -10
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
- package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/Voronoi.js.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +5 -7
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.d.ts +2 -5
- package/lib/esm/curve/CurveOps.d.ts.map +1 -1
- package/lib/esm/curve/CurveOps.js +2 -5
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/CurveTypes.js.map +1 -1
- package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/esm/curve/GeometryQuery.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/OffsetOptions.js.map +1 -1
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/PointString3d.js.map +1 -1
- package/lib/esm/curve/ProxyCurve.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts +50 -15
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +102 -84
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +44 -25
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +72 -37
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +8 -8
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +102 -92
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +2 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +2 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +2 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +2 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +9 -16
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +3 -3
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Plane3d.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts +2 -2
- package/lib/esm/geometry3d/PolylineOps.js +2 -2
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray2d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/esm/geometry3d/Segment1d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/esm/geometry3d/XYZProps.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/geometry4d/Map4d.js.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
- package/lib/esm/geometry4d/MomentData.js.map +1 -1
- package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/esm/geometry4d/Point4d.js.map +1 -1
- package/lib/esm/numerics/BandedSystem.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js +2 -2
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/numerics/Complex.js.map +1 -1
- package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
- package/lib/esm/numerics/PolarData.js.map +1 -1
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/numerics/Quadrature.js.map +1 -1
- package/lib/esm/numerics/Range1dArray.js.map +1 -1
- package/lib/esm/numerics/SmallSystem.js.map +1 -1
- package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/esm/numerics/UnionFind.js.map +1 -1
- package/lib/esm/numerics/UsageSums.js.map +1 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/BoxTopology.js.map +1 -1
- package/lib/esm/polyface/FacetFaceData.js.map +1 -1
- package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/esm/polyface/FacetOrientation.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeLengthData.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
- package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/SolidPrimitive.js.map +1 -1
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/Merging.d.ts +15 -7
- package/lib/esm/topology/Merging.d.ts.map +1 -1
- package/lib/esm/topology/Merging.js +15 -10
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/SignedDataSummary.js.map +1 -1
- package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/Voronoi.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineString3d.js","sourceRoot":"","sources":["../../../src/curve/LineString3d.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAmB,QAAQ,EAA0B,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,oCAAoC,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAW,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAA+B,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EAAsC,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD;;;;;GAKG;AACH,SAAS,+BAA+B,CACtC,MAAwB,EACxB,OAAiB,EACjB,SAAiB,EACjB,aAAqB,EACrB,MAAc,EACd,MAAgB,EAChB,UAAoB;IAEpB,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;YAC9C,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC7C,IAAI,UAAU,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBAClC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC5C,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC;oBAC1D,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,wCAAwC;gBAC7E,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC;YACpB,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;YAC9C,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC7C,IAAI,UAAU,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBAClC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC5C,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC;oBAC1D,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,wCAAwC;gBAC7E,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,YAAa,SAAQ,cAAc;IAC9C,wCAAwC;IACxB,kBAAkB,GAAG,YAAY,CAAC;IAC1C,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACtC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACtC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACtC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9C,uDAAuD;IAChD,mBAAmB,CAAC,KAAoB;QAC7C,OAAO,KAAK,YAAY,YAAY,CAAC;IACvC,CAAC;IACD,iEAAiE;IACjE,IAAoB,yBAAyB;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IACO,OAAO,CAAmB;IAC1B,UAAU,CAAwB;IAClC,SAAS,CAAmB;IAC5B,YAAY,CAAoB;IAChC,eAAe,CAAoB;IACnC,aAAa,CAAwB;IACrC,UAAU,CAAwB;IAClC,cAAc,CAAwB;IAC9C,wCAAwC;IACxC,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC;IACD,mEAAmE;IACnE,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD;;;;;OAKG;IACH,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,wHAAwH;IACxH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,0HAA0H;IAC1H,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,4HAA4H;IAC5H,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IACD,2HAA2H;IAC3H,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,iIAAiI;IACjI,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0HAA0H;IAC1H,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,YAAoB,MAAyB;QAC3C,KAAK,EAAE,CAAC;QACR,IAAI,MAAM;YACR,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;;YAEtB,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAC1C,CAAC;IACD,yEAAyE;IAClE,gBAAgB,CAAC,SAAoB;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,MAAM,CAAC,GAAG,MAAa;QACnC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,+EAA+E;IACxE,MAAM,CAAC,aAAa,CAAC,MAAwB;QAClD,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,kFAAkF;IAC3E,MAAM,CAAC,QAAQ,CAAC,MAAe,EAAE,CAAS,EAAE,iBAA0B,KAAK;QAChF,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBAC/C,IAAI,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAC3C,GAAG,CAAC,GAAG,EAAE,CAAC,CAAG,mEAAmE;oBAChF,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;oBACzB,GAAG,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;;;;OASG;IACI,SAAS,CAAC,GAAG,MAAa;QAC/B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,uFAAuF;IAChF,gBAAgB,CAAC,MAAwB,EAAE,WAAmB,EAAE,IAAY,EAAE,MAAc;QACjG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;IACD;;;OAGG;IACI,QAAQ,CAAC,KAAc;QAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD;;;OAGG;IACI,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,IAAY,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IACD;;;OAGG;IACI,WAAW,CAAC,QAAgB;QACjC,IAAI,CAAC,IAAI,CAAC,UAAU;YAClB,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IACD,4GAA4G;IACrG,oBAAoB;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0GAA0G;IACnG,mBAAmB;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,+GAA+G;IACxG,yBAAyB;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC,eAAe,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IACD,+GAA+G;IACxG,sBAAsB;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,+GAA+G;IACxG,wBAAwB;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,+GAA+G;IACxG,oBAAoB;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,+GAA+G;IACxG,uBAAuB;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD;;;OAGG;IACI,UAAU,CAAC,OAAc;QAC9B,IAAI,CAAC,IAAI,CAAC,SAAS;YACjB,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD;;;OAGG;IACI,cAAc,CAAC,CAAS,EAAE,CAAS;QACxC,IAAI,CAAC,IAAI,CAAC,SAAS;YACjB,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD;;;OAGG;IACI,aAAa,CAAC,MAAgB;QACnC,IAAI,CAAC,IAAI,CAAC,YAAY;YACpB,IAAI,CAAC,YAAY,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC7C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IACD;;;OAGG;IACI,gBAAgB,CAAC,MAAgB;QACtC,IAAI,CAAC,IAAI,CAAC,eAAe;YACvB,IAAI,CAAC,eAAe,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAChD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,oEAAoE;IAC7D,eAAe;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7E,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,wEAAwE;IACjE,QAAQ;QACb,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,0FAA0F;IACnF,yBAAyB,CAAC,SAAoB;QACnD,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACvF,CAAC;IACD;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,iBAAiB,CAAC,MAAe,EAAE,EAAU,EAAE,EAAU,EAAE,SAAkB,IAAI;QAC7F,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACnB,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,MAAM;YACR,EAAE,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,sBAAsB,CAClC,MAAe,EAAE,SAAiB,EAAE,MAAc,EAAE,mBAA4B,IAAI;QAEpF,IAAI,SAAS,GAAG,CAAC;YACf,SAAS,GAAG,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAG,2CAA2C;QACnF,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,CAAC,CAAC;QACN,IAAI,CAAC,CAAC;QACN,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC,gBAAgB;YACnB,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC;YACrC,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9C,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9C,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD;;;;;;;;;OASG;IACI,OAAO,CAAC,KAAmB;QAChC,sFAAsF;QACtF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,YAAY;YACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;;YAEhE,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,IAAI,KAAK,CAAC,UAAU;YAClB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;;YAC7C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QACjC,IAAI,KAAK,CAAC,eAAe;YACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;;YAEzE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACnC,IAAI,KAAK,CAAC,SAAS;YACjB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;;YAEzC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IACD,mDAAmD;IAC5C,MAAM,CAAC,YAAY,CAAC,MAAiB;QAC1C,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC;QACV,KAAK,KAAK,IAAI,MAAM;YAClB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,uFAAuF;IAChF,MAAM,CAAC,mBAAmB,CAAC,MAAiB,EAAE,KAAe,EAAE,aAAsB,KAAK;QAC/F,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,KAAK;YACnB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,6DAA6D;QAC3F,IAAI,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAChC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,0EAA0E;IACnE,MAAM,CAAC,kBAAkB,CAAC,OAAqB;QACpD,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;YAC7C,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,yCAAyC;IAClC,KAAK;QACV,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,WAAW,CAAC,IAAU;QAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,GAAG,CAAC;YACR,KAAK,GAAG,IAAI,IAAI;gBACd,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD;;;OAGG;IACI,MAAM;QACX,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACrE,CAAC,EAAE,CAAC;QACN,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,QAAQ,CAAC,IAAU;QAC/B,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;QAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,EAAE,CAAC;IACjE,CAAC;IACD;;;;;OAKG;IACI,eAAe,CAAC,QAAgB,EAAE,MAAgB;QACvD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC;YACT,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC;YACT,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACrF,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,QAAQ,IAAI,EAAE;YAChB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAE,CAAC;QAChE,IAAI,QAAQ,GAAG,EAAE,IAAI,GAAG;YACtB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAE,CAAC;QAChF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,CAAE,CAAC;IAC9F,CAAC;IACD;;;;;;OAMG;IACI,4BAA4B,CAAC,QAAgB,EAAE,MAAc;QAClE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC;gBACT,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC;;gBACpE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,GAAG,GAAG,UAAU,CAAC;QAC5B,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;YACzB,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACnF,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9D,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,yBAAyB;QACzB,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,CAAC,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACpE,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,2EAA2E;IACpE,8BAA8B,CAAC,QAAgB,EAAE,MAAkC;QACxF,MAAM,GAAG,GAAG,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,GAAG,yBAAyB,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3G,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,wBAAwB,CAAC,KAAa,EAAE,aAAqB,EAAE,UAAkB;QAC7F,IAAI,UAAU,GAAG,CAAC;YAChB,OAAO,GAAG,CAAC;QACb,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,GAAG,UAAU,CAAC;IAC9C,CAAC;IACD;;;;;OAKG;IACI,4CAA4C,CAAC,KAAa,EAAE,aAAqB;QACtF,OAAO,YAAY,CAAC,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,wBAAwB,CAAC,cAAsB,EAAE,UAAkB;QAC/E,IAAI,UAAU,GAAG,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACrC,MAAM,oBAAoB,GAAG,cAAc,GAAG,UAAU,CAAC;QACzD,IAAI,YAAoB,CAAC;QACzB,IAAI,cAAc,IAAI,CAAC;YACrB,YAAY,GAAG,CAAC,CAAC;aACd,IAAI,cAAc,IAAI,CAAC;YAC1B,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC;aAC1B,0BAA0B;YAC9B,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAoB,GAAG,YAAY,EAAE,CAAC;IAChF,CAAC;IACD;;;;;;OAMG;IACI,4CAA4C,CAAC,cAAsB;QACxE,OAAO,YAAY,CAAC,wBAAwB,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,sEAAsE;IACtD,qBAAqB,CAAC,QAAgB,EAAE,MAAkB;QACxE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC;gBACT,OAAO,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC9F,OAAO,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,KAAK,CAAC;YACT,OAAO,SAAS,CAAC,UAAU,CACzB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EACxC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACtF,wBAAwB;QACxB,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,GAAG,GAAG,UAAU,CAAC;QAC5B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YACnB,aAAa,GAAG,QAAQ,GAAG,EAAE,CAAC;YAC9B,SAAS,GAAG,CAAC,CAAC;QAChB,CAAC;aAAM,IAAI,QAAQ,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;YAChC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,aAAa,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;YACtC,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,GAAG,CAAC,CAAE,CAAC;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAE,CAAC;QACzE,2FAA2F;QAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC,CAAE,oBAAoB;YAC1C,+BAA+B,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACpG,CAAC;aAAM,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,iBAAiB;YAChD,+BAA+B,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACrG,CAAC;aAAM,CAAC;YACN,+BAA+B,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YACrH,+BAA+B,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAChH,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/E,IAAI,MAAM;YACR,OAAO,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjE,OAAO,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IACD,kDAAkD;IAClC,UAAU,CAAC,MAAgB;QACzC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAC3B,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IACD,gDAAgD;IACzC,OAAO,CAAC,CAAS,EAAE,MAAgB;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,mFAAmF;IAC5E,aAAa,CAAC,CAAS,EAAE,CAAS,EAAE,MAAiB;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IACD,mEAAmE;IAC5D,YAAY,CAAC,CAAS,EAAE,MAAiB;QAC9C,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,sEAAsE;IAC/D,eAAe,CAAC,CAAS,EAAE,MAAiB;QACjD,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,eAAe,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,sDAAsD;IAC/C,SAAS;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD,qDAAqD;IAC9C,QAAQ;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,gDAAgD;IAChC,QAAQ,CAAC,MAAgB;QACvC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAC3B,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACvF,CAAC;IACD,gDAAgD;IACzC,cAAc;QACnB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;gBACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,IAAI,CAAC,SAAS;gBAChB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;gBACnC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,IAAI,CAAC,eAAe;gBACtB,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,aAAa;gBACpB,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,UAAU;gBACjB,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,cAAc;gBACrB,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IACD;;;;MAIE;IACK,mBAAmB,CAAC,SAAoB;QAC7C,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,YAAY;YACnB,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,eAAe;YACtB,IAAI,CAAC,eAAe,CAAC,qDAAqD,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,wDAAwD;IACxC,WAAW;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IACnC,CAAC;IACD,gFAAgF;IAChE,2BAA2B,CAAC,SAAiB,EAAE,SAAiB;QAC9E,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAK,SAAS,IAAI,WAAW,GAAG,CAAC;YAC5C,OAAO,GAAG,CAAC;QACb,IAAI,SAAS,GAAG,SAAS;YACvB,OAAO,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,CAAC;QAChD,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,MAAM,GAAG,eAAe,CAAC;QAChD,MAAM,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;QAChD,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;YACpB,mDAAmD;YACnD,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAE,CAAC;QAC5G,CAAC;aAAM,CAAC;YACN,mGAAmG;YACnG,8CAA8C;YAC9C,IAAI,GAAG,GAAG,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAE;kBAC3E,cAAc,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAE,CAAC;YAC5E,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;gBAClC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAE,CAAC;YACpD,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,kFAAkF;IAClE,qBAAqB,CAAC,SAAiB,EAAE,SAAiB,EAAE,SAAqB;QAC/F,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,IAAI,SAAS,GAAG,SAAS;YACvB,OAAO,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QACxD,MAAM,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;QAChD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QACxE,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACxC,IAAI,SAAS,KAAK,SAAS;YACzB,OAAO,KAAK,CAAC,CAAC,gBAAgB;QAChC,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QACxE,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC3D,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;;;;;OASG;IACa,8BAA8B,CAC5C,aAAqB,EAAE,cAAsB,EAAE,cAAqB,EAAE,MAA4B;QAElG,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,MAAM,cAAc,GAAG,aAAa,GAAG,WAAW,CAAC;QACnD,IAAI,cAAc,GAAG,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAE,uCAAuC;QAC1I,MAAM,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,aAAa,EAAE,cAAc,GAAG,CAAC,EAAE,YAAY,CAAC,WAAW,CAAE,CAAC;QACtH,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;QAEjF,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;YACzB,OAAO,cAAc,IAAI,WAAW,GAAG,CAAC;gBACtC,cAAc,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBACnE,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAAC;oBAC7D,OAAO,mBAAmB,CAAC,iDAAiD,CAC1E,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAC3F,CAAC;YACN,CAAC;YACD,oDAAoD;YACpD,IAAI,cAAc;gBAChB,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,CAAC,EAAE,WAAW,EACtE,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,CAAC,CAAC;YAC1C,OAAO,mBAAmB,CAAC,iDAAiD,CAC1E,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,CAC1F,CAAC;QACJ,CAAC;aAAM,CAAC,CAAC,qBAAqB;YAC5B,IAAI,aAAa,IAAI,GAAG;gBACtB,cAAc,EAAE,CAAC;YACnB,OAAO,cAAc,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC;gBAC7C,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBACnE,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAAC;oBAC7D,OAAO,mBAAmB,CAAC,iDAAiD,CAC1E,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAC3F,CAAC;YACN,CAAC;YACD,+DAA+D;YAC/D,IAAI,cAAc;gBAChB,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,WAAW,EAAE,GAAG,CAAC,CAAC;YAC5E,OAAO,mBAAmB,CAAC,iDAAiD,CAC1E,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,CAC9F,CAAC;QACJ,CAAC;IACH,CAAC;IACD,2EAA2E;IACpE,WAAW,KAAa,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC3D;;;;;;;;;OASG;IACI,eAAe,CAAC,MAAiB;QACtC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,IAAI,IAAI,GAAG,CAAC;YACV,IAAI,GAAG,CAAC,CAAC;QACX,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QACxE,IAAI,MAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE;YACrC,OAAO,MAAM,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,wGAAwG;IACxF,YAAY,CAC1B,UAAmB,EAAE,MAAmC,EAAE,MAA4B;QAEtF,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,kBAAkB,CAAC,mDAAmD,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClG,MAAM,OAAO,GAAG,kBAAkB,CAAC,mDAAmD,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClG,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACtC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;YACtF,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACjC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,IAAI,eAAe,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,CAAC;gBACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnC,eAAe,GAAG,UAAU,CAAC,0BAA0B,CACrD,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,CACrG,CAAC;oBACF,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;wBACxB,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC;4BACnB,eAAe,GAAG,GAAG,CAAC;oBAC1B,CAAC;yBAAM,IAAI,eAAe,GAAG,GAAG,EAAE,CAAC;wBACjC,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,SAAS;4BAC3B,eAAe,GAAG,GAAG,CAAC;oBAC1B,CAAC;oBACD,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC;yBAChD,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAChG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACvC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;wBACjB,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,4CAA4C,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CACvG,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,2DAA2D;IACpD,SAAS,CAAC,KAAmC;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC1E,CAAC;IACD,uDAAuD;IAC/C,MAAM,CAAC,aAAa,CAC1B,MAA6B,EAAE,OAAe,EAAE,EAAkB,EAAE,QAAgB,EAAE,KAAc;QAEpG,MAAM,MAAM,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC,CAAE,0CAA0C;YACrE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAC3E,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YAC9E,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD;;;;OAIG;IACa,6BAA6B,CAAC,KAA6B,EAAE,MAA6B;QACxG,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;YAC9E,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACxD,EAAE,GAAG,QAAQ,CAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACjE,IAAI,EAAE,KAAK,GAAG;gBACZ,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;iBACjF,CAAC;gBACJ,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAE,gDAAgD;oBACpE,eAAe,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,yDAAyD;oBAC3F,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;oBACpD,MAAM,MAAM,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC/G,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBACnD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpB,kBAAkB,GAAG,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC;IACvC,CAAC;IACD,uEAAuE;IAChE,WAAW,CAAC,aAAsB,EAAE,SAAqB;QAC9D,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IACD,+FAA+F;IAC/E,aAAa,CAAC,KAAoB;QAChD,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;OAKG;IACI,iBAAiB,CAAC,KAAc,EAAE,QAAiB;QACxD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,GAAG,GAAG,IAAI,CAAC;QACf,MAAM,WAAW,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;QAChF,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,IAAI,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAW,CAAC,IAAI,EAAE,CAAC;gBAC7E,GAAG,GAAG,KAAK,CAAC;YACd,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1E,GAAG,GAAG,KAAK,CAAC;QAChB,CAAC;QACD,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,WAAW;gBACb,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,uEAAuE;IAChE,qBAAqB,CAAC,YAAoB,QAAQ,CAAC,mBAAmB;QAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC;YACP,OAAO;QACT,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrC,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;oBAC/B,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/E,IAAI,IAAI,CAAC,YAAY;oBACnB,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5C,EAAE,EAAE,CAAC;YACP,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,UAAU;YACjB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,YAAY;YACnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IACD;;;;;;OAMG;IACI,qBAAqB,CAAC,KAAqB,EAAE,QAAgB;QAClE,IAAI,GAAsB,CAAC;QAC3B,IAAI,KAA0B,CAAC;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,GAAG,GAAG,KAAK,CAAC,4BAA4B,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC1E,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnF,OAAO;QACT,IAAI,GAAG;YACL,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU;YACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD;;;;;OAKG;IACI,KAAK;QACV,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,UAAU;YACjB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,YAAY;YACnB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,gBAAgB,CAAC,WAAmB,CAAC,EAAE,OAAkC;QACrF,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,QAAQ,GAAG,CAAC;YACd,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,EAAE,CAAC,UAAU,GAAG,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACnD,EAAE,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,EAAE,CAAC,YAAY,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACjD,EAAE,CAAC,eAAe,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD;;;;;;;OAOG;IACI,4BAA4B,CACjC,KAAqB,EAAE,UAAkB,EAAE,YAAoB,CAAC,EAAE,YAAoB,CAAC,EAAE,YAAqB,IAAI;QAElH,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC;QACxB,IAAI,SAAS,EAAE,CAAC;YACd,EAAE,GAAG,CAAC,CAAC;YACP,EAAE,GAAG,UAAU,CAAC;QAClB,CAAC;QACD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC;YAChD,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;gBAC3B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,SAAS,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD;;;;;;OAMG;IACI,8BAA8B,CAAC,UAAkB,EAAE,MAAe,EAAE,MAAe,EAAE,SAAkB;QAC5G,IAAI,SAAS;YACX,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,GAAG,GAAG,UAAU,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBACjB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QACD,IAAI,SAAS;YACX,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IACD,iDAAiD;IAC1C,WAAW,CAAC,IAAkB,EAAE,OAAuB;QAC5D,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,wBAAwB;YACxB,+DAA+D;YAC/D,0CAA0C;YAC1C,IAAI,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBACxC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;oBAC5D,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBACxD,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;oBACzE,IAAI,SAAS,GAAG,CAAC;wBACf,IAAI,CAAC,8BAA8B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;oBACxE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD;;;;OAIG;IACI,kBAAkB,CAAC,OAAuB,EAAE,OAAuB;QACxE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,qFAAqF;YACrF,yCAAyC;YACzC,IAAI,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAC1C,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CACjH,CAAC;oBACF,OAAO,CAAC,uBAAuB,CAC7B,IAAI,EACJ,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC,EACnD,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAC/C,SAAS,EACT,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EACZ,CAAC,GAAG,EAAE,CACP,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,OAAO,CAAC,uBAAuB,CAC7B,IAAI,EACJ,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,CAAC,EACnD,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAC/C,CAAC,EACD,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EACZ,CAAC,GAAG,EAAE,CACP,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IACD;;;OAGG;IACI,4BAA4B,CAAC,OAAuB;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACtC,IAAI,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;QAE9B,IAAI,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACxC,SAAS,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,SAAS,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;OAIG;IACa,qCAAqC,CAAC,OAAuB,EAAE,eAAgC;QAC7G,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACtC,MAAM,YAAY,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;QACvE,MAAM,MAAM,GAAG,cAAc,CAAC,yCAAyC,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QACnG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,CAAC;YACjE,MAAM,kBAAkB,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3F,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;QAChE,CAAC;QACD,cAAc,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACtE,CAAC;IACD,+EAA+E;IACxE,yBAAyB,CAAC,OAAwB;QACvD,OAAO,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,+FAA+F;IAC/F,6EAA6E;IAC7E;;;;;;OAMG;IACa,qBAAqB,CAAC,OAAgB,EAAE,QAA6C;QACnG,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC;YACP,OAAO,KAAK,CAAC;QACf,IAAI,eAAe,GAAG,GAAG,CAAC;QAC1B,IAAI,eAAe,GAAG,GAAG,CAAC;QAC1B,MAAM,OAAO,GAAG,CAAC,cAAsB,EAAE,cAAsB,EAAE,EAAE;YACjE,IAAI,QAAQ;gBACV,QAAQ,CACN,QAAQ,CAAC,WAAW,CAAC,eAAe,EAAE,cAAc,EAAE,eAAe,CAAC,EACtE,QAAQ,CAAC,WAAW,CAAC,eAAe,EAAE,cAAc,EAAE,eAAe,CAAC,EACtE,IAAI,CACL,CAAC;QACN,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,eAAe,EAAE,CAAC;YACtF,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACxD,eAAe,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,OAAO,CAAC,+BAA+B,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;gBAC5E,MAAM,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACO,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAE,qCAAqC;IACrF,gFAAgF;IACxE,gBAAgB,CAAC,KAAa,EAAE,QAAgB,EAAE,IAAsB;QAC9E,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QACpB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;YAC1E,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,KAAK,GAAG,CAAC;YACX,KAAK,GAAG,CAAC,CAAC;QACZ,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IACD;;;;;OAKG;IACa,iBAAiB,CAAC,SAAiB,EAAE,SAAiB;QACpE,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACjE,IAAI,WAAW;gBACb,WAAW,CAAC,cAAc,EAAE,CAAC;YAC/B,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC;YACP,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACrC,mCAAmC;YACnC,IAAI,SAAS,GAAG,CAAC;gBACf,SAAS,GAAG,CAAC,CAAC;YAChB,IAAI,SAAS,GAAG,CAAC;gBACf,SAAS,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,EAAE,MAAc,CAAC,CAAG,gDAAgD;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,4CAA4C,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,4CAA4C,CAAC,SAAS,CAAC,CAAC;QAC5E,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,CAAC,CAAC,wCAAwC;QACtD,CAAC;aAAM,IAAI,CAAC,IAAI,SAAS,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/F,CAAC;aAAM,CAAC,CAAC,gBAAgB;YACvB,MAAM,GAAG,CAAC,CAAC,CAAC,gCAAgC;QAC9C,CAAC;QACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,gCAAgC;QAChD,CAAC;aAAM,IAAI,CAAC,IAAI,SAAS,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACvF,CAAC;aAAM,CAAC,CAAE,gBAAgB;YACxB,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,uCAAuC;QACzD,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE,KAAK,IAAI,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAClD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,gEAAgE;IACzD,iBAAiB,CAAC,KAAa,EAAE,MAAsB;QAC5D,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;YAC/C,OAAO,aAAa,CAAC,MAAM,CACzB,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,KAAK,CAAE,EAAE,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,KAAK,GAAG,CAAC,CAAE,EAAE,MAAM,CACnH,CAAC;QACJ,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;;;;OAKG;IACa,uBAAuB,CAAC,YAAoB,QAAQ,CAAC,mBAAmB,EAAE,SAAkB,KAAK;QAC/G,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;YACtB,OAAO,KAAK,CAAC;QACf,IAAI,MAAM;YACR,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,CAAE,CAAC,CAAC,gCAAgC;QACvH,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,CAAE,CAAC;IACpF,CAAC;IACD,yEAAyE;IACzE,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACxC,CAAC;IAED;;;;;;;OAOG;IACa,8BAA8B,CAAC,GAAmB,EAAE,cAA4B;QAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,KAAK,SAAS,CAAC;QAC9D,MAAM,eAAe,GAAG,cAAc,CAAC,YAAY,KAAK,SAAS,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC;QACxC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACrC,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,KAAK,cAAc,EAAE,CAAC;YACpH,MAAM,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3E,MAAM,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;gBACtD,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACxC,MAAM,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC;gBAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;oBACvB,MAAM,cAAc,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACxD,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;oBACtE,IAAI,aAAa;wBACf,cAAc,CAAC,UAAW,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;oBACpD,IAAI,eAAe;wBACjB,cAAc,CAAC,YAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEhD,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC;IAChD,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,yBAAyB,CAAC,IAAgC;QACtE,MAAM,SAAS,GAAG,IAAI,oCAAoC,EAAE,CAAC;QAC7D,sBAAsB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,SAAS,CAAC,4BAA4B,EAAE,CAAC;QAChE,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,MAAM,MAAM,IAAI,cAAc;gBACjC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;OAKG;IACa,wBAAwB,CACtC,cAAgC,EAAE,2BAAoC,EAAE,qBAA8B,KAAK;QAE3G,IAAI,kBAAkB,EAAE,CAAC;YACvB,IAAI,OAAkC,CAAC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,EAAE;gBACtE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD;;;;;OAKG;IACa,iBAAiB,CAC/B,uBAA+C;QAE/C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACrE,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,IAAI,MAAM,YAAY,cAAc;oBAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;qBAClB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD;;;;;;;OAOG;IACa,uBAAuB,CAAC,GAAqB,EAAE,OAAiB;QAC9E,OAAO,yBAAyB,CAAC,kCAAkC,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1F,CAAC;IACD;;;;;;;;;;;;OAYG;IACI,MAAM,CAAC,0BAA0B,CAAC,MAA2B,EAAE,YAAoB,EAAE,UAAkB,EAAE,MAAqB,EAAE,KAA2B;QAChK,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,YAAY,CAAC;QACpC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3F,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;;AAGH;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IAChC,4CAA4C;IACrC,UAAU,CAAwB;IACzC,uGAAuG;IAChG,QAAQ,CAAoB;IACnC,8DAA8D;IACvD,OAAO,CAAoB;IAClC,8DAA8D;IACvD,OAAO,CAAoB;CACnC;AAED;;GAEG;AACH,MAAM,qBAAqB;IAClB,SAAS,CAAS,CAAG,sCAAsC;IAC3D,MAAM,CAAU,CAAM,oBAAoB;IAC1C,SAAS,CAAS,CAAG,gCAAgC;IACrD,cAAc,CAAS,CAAE,2BAA2B;IAC3D,gDAAgD;IAChD,YAAmB,MAAe,EAAE,SAAiB,EAAE,cAAsB;QAC3E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IACD,+FAA+F;IACxF,cAAc;QACnB,OAAO,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACrE,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC;IACpE,CAAC;IACD;;;;;;;;;;;;OAYG;IACI,aAAa,CAAC,MAAe,EAAE,SAAiB;QACrD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAClG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;QACnF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;;;;;;OAUG;IACI,qBAAqB,CAAC,MAAwB,EACnD,MAAc,EAAE,MAAc,EAC9B,SAAiB,EAAE,SAAiB;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG;YACN,OAAO,KAAK,CAAC;QACf,MAAM,iBAAiB,GAAG,QAAQ,CAAC,yBAAyB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC5E,IAAI,iBAAiB,KAAK,SAAS;YACjC,OAAO,KAAK,CAAC;QACf,6FAA6F;QAC7F,+EAA+E;QAC/E,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Curve\n */\nimport { Clipper } from \"../clipping/ClipUtils\";\nimport { AxisOrder, BeJSONFunctions, Geometry, PlaneAltitudeEvaluator } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { GeometryHandler, IStrokeHandler } from \"../geometry3d/GeometryHandler\";\nimport { GrowableFloat64Array } from \"../geometry3d/GrowableFloat64Array\";\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\nimport { MultiLineStringDataVariant } from \"../geometry3d/IndexedXYZCollection\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { PointStreamGrowableXYZArrayCollector, VariantPointDataStream } from \"../geometry3d/PointStreaming\";\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { XAndY, XYZProps } from \"../geometry3d/XYZProps\";\nimport { CurveExtendOptions, VariantCurveExtendParameter } from \"./CurveExtendMode\";\nimport { CurveIntervalRole, CurveLocationDetail, CurveSearchStatus } from \"./CurveLocationDetail\";\nimport { AnnounceNumberNumberCurvePrimitive, CurvePrimitive } from \"./CurvePrimitive\";\nimport { GeometryQuery } from \"./GeometryQuery\";\nimport { PlaneAltitudeRangeContext } from \"./internalContexts/PlaneAltitudeRangeContext\";\nimport { LineSegment3d } from \"./LineSegment3d\";\nimport { OffsetOptions } from \"./OffsetOptions\";\nimport { StrokeCountMap } from \"./Query/StrokeCountMap\";\nimport { StrokeOptions } from \"./StrokeOptions\";\n\n/**\n * Starting with the segment at (baseIndex, baseIndex + 1):\n * * If the segment vector and vectorA determine a normal, accumulate it (scaled) to normal, and return.\n * * Otherwise move to next/previous segment if stepDirection is positive/negative and repeat.\n * * Do nothing if everything is parallel through the end of the array.\n */\nfunction accumulateGoodUnitPerpendicular(\n points: GrowableXYZArray,\n vectorA: Vector3d,\n baseIndex: number,\n stepDirection: number,\n weight: number,\n normal: Vector3d,\n workVector: Vector3d,\n): boolean {\n const n = points.length;\n if (stepDirection > 0) {\n for (let i = baseIndex; i + 1 < n; i++) {\n points.vectorIndexIndex(i, i + 1, workVector);\n vectorA.crossProduct(workVector, workVector);\n if (workVector.normalizeInPlace()) {\n normal.addScaledInPlace(workVector, weight);\n if (normal.isAlmostEqualXYZ(0, 0, 0, Geometry.smallFraction))\n workVector.scale(-weight, normal); // Concavity changed! Revert to previous\n return true;\n }\n }\n } else {\n if (baseIndex + 1 >= n)\n baseIndex = n - 2;\n for (let i = baseIndex; i >= 0; i--) {\n points.vectorIndexIndex(i, i + 1, workVector);\n workVector.crossProduct(vectorA, workVector);\n if (workVector.normalizeInPlace()) {\n normal.addScaledInPlace(workVector, weight);\n if (normal.isAlmostEqualXYZ(0, 0, 0, Geometry.smallFraction))\n workVector.scale(-weight, normal); // Concavity changed! Revert to previous\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * * A LineString3d (sometimes called a PolyLine) is a sequence of xyz coordinates that are to be joined by line\n * segments.\n * * The point coordinates are stored in a GrowableXYZArray, not as full point objects.\n * * The parameterization of \"fraction along\" is\n * * In a linestring with `N` segments (i.e. `N+1` points), each segment (regardless of physical length) occupies\n * the same fraction (1/N) of the 0-to-1 fraction space.\n * * Within segment `i`, the fraction interval `i/N` to `(i+1)/N` is mapped proportionally to the segment\n * * Note that this `fraction` is therefore NOT fraction of true distance along.\n * * Use `moveSignedDistanceFromFraction` to do true-length evaluations.\n * @public\n */\nexport class LineString3d extends CurvePrimitive implements BeJSONFunctions {\n /** String name for schema properties */\n public readonly curvePrimitiveType = \"lineString\";\n private static _workPointA = Point3d.create();\n private static _workPointB = Point3d.create();\n private static _workPointC = Point3d.create();\n private static _workRay = Ray3d.createXAxis();\n /** test if `other` is an instance of `LineString3d` */\n public isSameGeometryClass(other: GeometryQuery): boolean {\n return other instanceof LineString3d;\n }\n /** A LineString3d extends along its first and final segments. */\n public override get isExtensibleFractionSpace(): boolean {\n return true;\n }\n private _points: GrowableXYZArray;\n private _fractions?: GrowableFloat64Array;\n private _uvParams?: GrowableXYArray;\n private _derivatives?: GrowableXYZArray;\n private _surfaceNormals?: GrowableXYZArray;\n private _pointIndices?: GrowableFloat64Array;\n private _uvIndices?: GrowableFloat64Array;\n private _normalIndices?: GrowableFloat64Array;\n /** Return the points array (cloned). */\n public get points(): Point3d[] {\n return this._points.getPoint3dArray();\n }\n /** Return (reference to) point data in packed GrowableXYZArray. */\n public get packedPoints(): GrowableXYZArray {\n return this._points;\n }\n /**\n * Return array of fraction parameters.\n * * These are only present during certain constructions such as faceting.\n * * When present, these fractions are fractions of some other curve being stroked, and are NOT related to the\n * linestring fraction parameters.\n */\n public get fractions(): GrowableFloat64Array | undefined {\n return this._fractions;\n }\n /** Return the (optional) array of derivatives. These are only present during certain constructions such as faceting. */\n public get packedDerivatives(): GrowableXYZArray | undefined {\n return this._derivatives;\n }\n /** Return the (optional) array of uv parameters. These are only present during certain constructions such as faceting. */\n public get packedUVParams(): GrowableXYArray | undefined {\n return this._uvParams;\n }\n /** Return the (optional) array of surface normals. These are only present during certain constructions such as faceting. */\n public get packedSurfaceNormals(): GrowableXYZArray | undefined {\n return this._surfaceNormals;\n }\n /** Return the (optional) array of normal indices. These are only present during certain constructions such as faceting. */\n public get normalIndices(): GrowableFloat64Array | undefined {\n return this._normalIndices;\n }\n /** Return the (optional) array of uv parameter indices. These are only present during certain constructions such as faceting. */\n public get paramIndices(): GrowableFloat64Array | undefined {\n return this._uvIndices;\n }\n /** Return the (optional) array of point indices. These are only present during certain constructions such as faceting. */\n public get pointIndices(): GrowableFloat64Array | undefined {\n return this._pointIndices;\n }\n private constructor(points?: GrowableXYZArray) {\n super();\n if (points)\n this._points = points;\n else\n this._points = new GrowableXYZArray();\n }\n /** Clone this linestring and apply the transform to the clone points. */\n public cloneTransformed(transform: Transform): LineString3d { // we know tryTransformInPlace succeeds.\n const c = this.clone();\n c.tryTransformInPlace(transform);\n return c;\n }\n /**\n * Create a linestring, using flex length arg list and any typical combination of points such as\n * Point3d, Point2d, `[1,2,3]', array of any of those, or GrowableXYZArray\n */\n public static create(...points: any[]): LineString3d {\n const result = new LineString3d();\n result.addPoints(points);\n return result;\n }\n /** Create a linestring, capturing the given GrowableXYZArray as the points. */\n public static createCapture(points: GrowableXYZArray): LineString3d {\n return new LineString3d(points);\n }\n /** Create a linestring from `XAndY` points, with a specified z applied to all. */\n public static createXY(points: XAndY[], z: number, enforceClosure: boolean = false): LineString3d {\n const result = new LineString3d();\n const xyz = result._points;\n for (const xy of points) {\n xyz.pushXYZ(xy.x, xy.y, z);\n }\n if (enforceClosure && points.length > 1) {\n const distance = xyz.distanceIndexIndex(0, xyz.length - 1);\n if (distance !== undefined && distance !== 0.0) {\n if (Geometry.isSameCoordinate(0, distance)) {\n xyz.pop(); // nonzero but small distance -- to be replaced by point 0 exactly.\n const xyzA = xyz.front();\n xyz.push(xyzA!);\n }\n }\n }\n return result;\n }\n /**\n * Add copies of points to the linestring.\n * Valid inputs are:\n * * a Point2d\n * * a point3d\n * * An array of 2 doubles\n * * An array of 3 doubles\n * * A GrowableXYZArray\n * * An array of any of the above\n */\n public addPoints(...points: any[]) {\n this._points.pushFrom(points);\n }\n /** Add points accessed by index in a GrowableXYZArray, with a specified index step. */\n public addSteppedPoints(source: GrowableXYZArray, pointIndex0: number, step: number, numAdd: number) {\n this._points.addSteppedPoints(source, pointIndex0, step, numAdd);\n }\n /**\n * Add a point to the linestring.\n * @param point\n */\n public addPoint(point: Point3d) {\n this._points.push(point);\n }\n /**\n * Add a point to the linestring.\n * @param point\n */\n public addPointXYZ(x: number, y: number, z: number = 0) {\n this._points.pushXYZ(x, y, z);\n }\n /**\n * Append a fraction to the fractions array.\n * @param fraction\n */\n public addFraction(fraction: number) {\n if (!this._fractions)\n this._fractions = new GrowableFloat64Array();\n this._fractions.push(fraction);\n }\n /** Ensure that the fraction array exists with no fractions but at least the capacity of the point array. */\n public ensureEmptyFractions(): GrowableFloat64Array {\n const n = this.numPoints();\n if (!this._fractions) {\n this._fractions = new GrowableFloat64Array(n);\n return this._fractions;\n }\n this._fractions.clear();\n this._fractions.ensureCapacity(n);\n return this._fractions;\n }\n /** Ensure that the parameter array exists with no points but at least the capacity of the point array. */\n public ensureEmptyUVParams(): GrowableXYArray {\n const n = this.numPoints();\n if (!this._uvParams) {\n this._uvParams = new GrowableXYArray(n);\n return this._uvParams;\n }\n this._uvParams.clear();\n this._uvParams.ensureCapacity(n);\n return this._uvParams;\n }\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\n public ensureEmptySurfaceNormals(): GrowableXYZArray {\n const n = this.numPoints();\n if (!this._surfaceNormals) {\n this._surfaceNormals = new GrowableXYZArray(n);\n return this._surfaceNormals;\n }\n this._surfaceNormals.clear();\n this._surfaceNormals.ensureCapacity(n);\n return this._surfaceNormals;\n }\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\n public ensureEmptyDerivatives(): GrowableXYZArray {\n const n = this.numPoints();\n if (!this._derivatives) {\n this._derivatives = new GrowableXYZArray(n);\n return this._derivatives;\n }\n this._derivatives.clear();\n this._derivatives.ensureCapacity(n);\n return this._derivatives;\n }\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\n public ensureEmptyNormalIndices(): GrowableFloat64Array {\n const n = this.numPoints();\n if (!this._normalIndices) {\n this._normalIndices = new GrowableFloat64Array(n);\n return this._normalIndices;\n }\n this._normalIndices.clear();\n this._normalIndices.ensureCapacity(n);\n return this._normalIndices;\n }\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\n public ensureEmptyUVIndices(): GrowableFloat64Array {\n const n = this.numPoints();\n if (!this._uvIndices) {\n this._uvIndices = new GrowableFloat64Array(n);\n return this._uvIndices;\n }\n this._uvIndices.clear();\n this._uvIndices.ensureCapacity(n);\n return this._uvIndices;\n }\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\n public ensureEmptyPointIndices(): GrowableFloat64Array {\n const n = this.numPoints();\n if (!this._pointIndices) {\n this._pointIndices = new GrowableFloat64Array(n);\n return this._pointIndices;\n }\n this._pointIndices.clear();\n this._pointIndices.ensureCapacity(n);\n return this._pointIndices;\n }\n /**\n * Append a uv coordinate to the uvParams array\n * @param uv\n */\n public addUVParam(uvParam: XAndY) {\n if (!this._uvParams)\n this._uvParams = new GrowableXYArray();\n this._uvParams.pushXY(uvParam.x, uvParam.y);\n }\n /**\n * Append a uv coordinate to the uvParams array\n * @param uv\n */\n public addUVParamAsUV(u: number, v: number) {\n if (!this._uvParams)\n this._uvParams = new GrowableXYArray();\n this._uvParams.pushXY(u, v);\n }\n /**\n * Append a derivative to the derivative array\n * @param vector\n */\n public addDerivative(vector: Vector3d) {\n if (!this._derivatives)\n this._derivatives = new GrowableXYZArray();\n this._derivatives.push(vector);\n }\n /**\n * Append a surface normal to the surface normal array.\n * @param vector\n */\n public addSurfaceNormal(vector: Vector3d) {\n if (!this._surfaceNormals)\n this._surfaceNormals = new GrowableXYZArray();\n this._surfaceNormals.push(vector);\n }\n /** If the linestring is not already closed, add a closure point. */\n public addClosurePoint() {\n const distance = this._points.distanceIndexIndex(0, this._points.length - 1);\n if (distance !== undefined && !Geometry.isSameCoordinate(distance, 0))\n this._points.pushWrap(1);\n }\n /** Eliminate (but do not return!!) the final point of the linestring */\n public popPoint() {\n this._points.pop();\n }\n /** Compute `uvParams` array as (xy parts of) a linear transform of the xyz coordinates */\n public computeUVFromXYZTransform(transform: Transform) {\n this._uvParams = GrowableXYArray.createFromGrowableXYZArray(this._points, transform);\n }\n /**\n * Create the linestring for a rectangle parallel to the xy plane.\n * * The z coordinate from `point0` is used for all points.\n * * `ax` and `ay` are signed.\n * * The point sequence is:\n * * Start at `point0`\n * * move by (signed !) `ax` in the x direction.\n * * move by (signed !) `ay` in the y direction.\n * * move by (signed !) negative `ax` in the x direction.\n * * move by (signed !) negative `ay` in the y direction.\n * * (this returns to `point0`)\n */\n public static createRectangleXY(point0: Point3d, ax: number, ay: number, closed: boolean = true): LineString3d {\n const ls = LineString3d.create();\n const x0 = point0.x;\n const x1 = point0.x + ax;\n const y0 = point0.y;\n const y1 = point0.y + ay;\n const z = point0.z;\n ls.addPointXYZ(x0, y0, z);\n ls.addPointXYZ(x1, y0, z);\n ls.addPointXYZ(x1, y1, z);\n ls.addPointXYZ(x0, y1, z);\n if (closed)\n ls.addClosurePoint();\n return ls;\n }\n /**\n * Create a regular polygon centered\n * @param center center of the polygon.\n * @param edgeCount number of edges.\n * @param radius distance to vertex or edge (see `radiusToVertices`)\n * @param radiusToVertices true if polygon is inscribed in circle (radius measured to vertices); false if polygon\n * is outside circle (radius to edges)\n */\n public static createRegularPolygonXY(\n center: Point3d, edgeCount: number, radius: number, radiusToVertices: boolean = true,\n ): LineString3d {\n if (edgeCount < 3)\n edgeCount = 3;\n const ls = LineString3d.create();\n const i0 = radiusToVertices ? 0 : -1; // offset to make first vector (radius,0,0)\n const radiansStep = Math.PI / edgeCount;\n let c;\n let s;\n let radians;\n if (!radiusToVertices)\n radius = radius / Math.cos(radiansStep);\n for (let i = 0; i < edgeCount; i++) {\n radians = (i0 + 2 * i) * radiansStep;\n c = Angle.cleanupTrigValue(Math.cos(radians));\n s = Angle.cleanupTrigValue(Math.sin(radians));\n ls.addPointXYZ(center.x + radius * c, center.y + radius * s, center.z);\n }\n ls.addClosurePoint();\n return ls;\n }\n /**\n * Copy coordinate data from another linestring.\n * * The copied content is:\n * * points\n * * derivatives (if present)\n * * fractions (if present)\n * * surfaceNormals (if present)\n * * uvParams (if present)\n * @param other\n */\n public setFrom(other: LineString3d) {\n // ugly -- \"clone\" methods are inconsistent about 'reuse' and 'result' parameter . . .\n this._points = other._points.clone(this._points);\n if (other._derivatives)\n this._derivatives = other._derivatives.clone(this._derivatives);\n else\n this._derivatives = undefined;\n if (other._fractions)\n this._fractions = other._fractions.clone(false);\n else this._fractions = undefined;\n if (other._surfaceNormals)\n this._surfaceNormals = other._surfaceNormals.clone(this._surfaceNormals);\n else\n this._surfaceNormals = undefined;\n if (other._uvParams)\n this._uvParams = other._uvParams.clone();\n else\n this._uvParams = undefined;\n }\n /** Create a linestring from an array of points. */\n public static createPoints(points: Point3d[]): LineString3d {\n const ls = new LineString3d();\n let point;\n for (point of points)\n ls._points.push(point);\n return ls;\n }\n /** Create a linestring, taking points at specified indices from an array of points. */\n public static createIndexedPoints(points: Point3d[], index: number[], addClosure: boolean = false): LineString3d {\n const ls = new LineString3d();\n for (const i of index)\n ls._points.push(points[i]); // no clone needed -- we know this reformats to packed array.\n if (addClosure && index.length > 1)\n ls._points.push(points[index[0]]);\n return ls;\n }\n /** Create a LineString3d from xyz coordinates packed in a Float64Array */\n public static createFloat64Array(xyzData: Float64Array): LineString3d {\n const ls = new LineString3d();\n for (let i = 0; i + 3 <= xyzData.length; i += 3)\n ls._points.push(Point3d.create(xyzData[i], xyzData[i + 1], xyzData[i + 2]));\n return ls;\n }\n /** Return a clone of this linestring. */\n public clone(): LineString3d {\n const retVal = new LineString3d();\n retVal.setFrom(this);\n return retVal;\n }\n /**\n * Set point coordinates from a json array, e.g. `[[1,2,3],[4,5,6] . . .]`\n * * The `json` parameter must be an array.\n * * Each member `i` of the array is converted to a point with `Point3d.fromJSON(json[i]`)\n */\n public setFromJSON(json?: any) {\n this._points.clear();\n if (Array.isArray(json)) {\n let xyz;\n for (xyz of json)\n this._points.push(Point3d.fromJSON(xyz));\n }\n }\n /**\n * Convert an LineString3d to a JSON object.\n * * The returned object is an array of arrays of x,y,z coordinates, `[[x,y,z],...[x,y,z]]`\n */\n public toJSON(): XYZProps[] {\n const value = [];\n let i = 0;\n while (this._points.isIndexValid(i)) {\n value.push(this._points.getPoint3dAtUncheckedPointIndex(i).toJSON());\n i++;\n }\n return value;\n }\n /**\n * Construct a new linestring.\n * * See `LineString3d.setFromJSON ()` for remarks on `json` structure.\n */\n public static fromJSON(json?: any): LineString3d {\n const ls = new LineString3d(); ls.setFromJSON(json); return ls;\n }\n /**\n * Evaluate a point a fractional position along this linestring.\n * * See `LineString3d` class comments for description of how fraction relates to the linestring points.\n * @param fraction fractional position\n * @param result optional result\n */\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\n const n = this._points.length;\n if (n === 0)\n return Point3d.createZero();\n if (n === 1)\n return Point3d.createFrom(this._points.getPoint3dAtUncheckedPointIndex(0), result);\n const df = 1.0 / (n - 1);\n if (fraction <= df)\n return this._points.interpolate(0, fraction / df, 1, result)!;\n if (fraction + df >= 1.0)\n return this._points.interpolate(n - 1, (1.0 - fraction) / df, n - 2, result)!;\n const index0 = Math.floor(fraction / df);\n return this._points.interpolate(index0, (fraction - index0 * df) / df, index0 + 1, result)!;\n }\n /**\n * Evaluate a point a fractional position and derivative with respect to fraction along this linestring.\n * * See `LineString3d` class comments for description of how fraction relates to the linestring points.\n * * At interior corners and the end point, the left derivative is returned; at the start point, the right derivative is returned.\n * @param fraction fractional position\n * @param result optional result\n */\n public fractionToPointAndDerivative(fraction: number, result?: Ray3d): Ray3d {\n result = result ? result : Ray3d.createZero();\n const n = this._points.length;\n if (n <= 1) {\n result.direction.setZero();\n if (n === 1)\n result.origin.setFrom(this._points.getPoint3dAtUncheckedPointIndex(0));\n else result.origin.setZero();\n return result;\n }\n const numSegment = n - 1;\n const df = 1.0 / numSegment;\n if (fraction <= df) {\n result = result ? result : Ray3d.createZero();\n this._points.interpolate(0, fraction / df, 1, result.origin);\n this._points.vectorIndexIndex(0, 1, result.direction);\n result.direction.scaleInPlace(1.0 / df);\n return result;\n }\n if (fraction + df >= 1.0) {\n result = result ? result : Ray3d.createZero();\n this._points.interpolate(n - 2, 1.0 - (1.0 - fraction) / df, n - 1, result.origin);\n this._points.vectorIndexIndex(n - 2, n - 1, result.direction);\n result.direction.scaleInPlace(1.0 / df);\n return result;\n }\n /* true interior point */\n result = result ? result : Ray3d.createZero();\n const index0 = Math.floor(fraction / df);\n const localFraction = (fraction - index0 * df) / df;\n this._points.interpolate(index0, localFraction, index0 + 1, result.origin);\n this._points.vectorIndexIndex(index0, index0 + 1, result.direction);\n result.direction.scaleInPlace(1.0 / df);\n return result;\n }\n /** Return point and derivative at fraction, with 000 second derivative. */\n public fractionToPointAnd2Derivatives(fraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n const ray = this.fractionToPointAndDerivative(fraction);\n result = Plane3dByOriginAndVectors.createCapture(ray.origin, ray.direction, Vector3d.createZero(), result);\n return result;\n }\n /**\n * Convert a segment index and local fraction to a global linestring fraction.\n * @param index index of segment being evaluated\n * @param localFraction local fraction in [0,1] within the segment\n * @param numSegment number N of segments in the linestring\n * @return global fraction f in [0,1] such that the segment is parameterized by index/N <= f <= (index+1)/N.\n */\n public static mapLocalToGlobalFraction(index: number, localFraction: number, numSegment: number): number {\n if (numSegment < 1)\n return 0.0;\n return (index + localFraction) / numSegment;\n }\n /**\n * Convert a segment index and local fraction to a global linestring fraction.\n * @param index index of segment being evaluated\n * @param localFraction local fraction relative to the segment, typically in [0,1]. Fraction may be negative (or greater than 1) to represent extension of the first (or last) segment.\n * @return global fraction f such that the segment is parameterized by index/N <= f <= (index+1)/N.\n */\n public segmentIndexAndLocalFractionToGlobalFraction(index: number, localFraction: number): number {\n return LineString3d.mapLocalToGlobalFraction(index, localFraction, this._points.length - 1);\n }\n /**\n * Convert a global linestring fraction to a segment index and local fraction.\n * @param globalFraction a fraction f in the linestring parameterization, where the i_th segment\n * (0 <= i < N) is parameterized by i/N <= f <= (i+1)/N. If `globalFraction` is negative (or greater than 1),\n * so is the returned local fraction, which corresponds to the first (last) segment.\n * @param numSegment number N of segments in the linestring\n * @returns segment index and local fraction\n */\n public static mapGlobalToLocalFraction(globalFraction: number, numSegment: number): { index: number, fraction: number } {\n if (numSegment < 1)\n return { index: 0, fraction: 0.0 };\n const scaledGlobalFraction = globalFraction * numSegment;\n let segmentIndex: number;\n if (globalFraction <= 0)\n segmentIndex = 0;\n else if (globalFraction >= 1)\n segmentIndex = numSegment - 1;\n else // globalFraction in (0,1)\n segmentIndex = Math.floor(scaledGlobalFraction);\n return { index: segmentIndex, fraction: scaledGlobalFraction - segmentIndex };\n }\n /**\n * Convert a global linestring fraction to a segment index and local fraction.\n * @param globalFraction a fraction f in the linestring parameterization, where the i_th segment\n * (0 <= i < N) is parameterized by i/N <= f <= (i+1)/N. If `globalFraction` is negative (or greater than 1),\n * so is the returned local fraction, which corresponds to the first (last) segment.\n * @returns segment index and local fraction\n */\n public globalFractionToSegmentIndexAndLocalFraction(globalFraction: number): { index: number, fraction: number } {\n return LineString3d.mapGlobalToLocalFraction(globalFraction, this._points.length - 1);\n }\n /** Return a frenet frame, using nearby points to estimate a plane. */\n public override fractionToFrenetFrame(fraction: number, result?: Transform): Transform {\n const n = this._points.length;\n if (n <= 1) {\n if (n === 1)\n return Transform.createTranslation(this._points.getPoint3dAtUncheckedPointIndex(0), result);\n return Transform.createIdentity(result);\n }\n if (n === 2)\n return Transform.createRefs(\n this._points.interpolate(0, fraction, 1),\n Matrix3d.createRigidHeadsUp(this._points.vectorIndexIndex(0, 1)!, AxisOrder.XYZ));\n /** 3 or more points. */\n const numSegment = n - 1;\n const df = 1.0 / numSegment;\n let baseIndex = 0;\n let localFraction = 0;\n if (fraction <= df) {\n localFraction = fraction / df;\n baseIndex = 0;\n } else if (fraction + df >= 1.0) {\n baseIndex = n - 2;\n localFraction = 1.0 - (1.0 - fraction) / df;\n } else {\n baseIndex = Math.floor(fraction / df);\n localFraction = fraction * numSegment - baseIndex;\n }\n const origin = this._points.interpolate(baseIndex, localFraction, baseIndex + 1)!;\n const vectorA = this._points.vectorIndexIndex(baseIndex, baseIndex + 1)!;\n // tricky stuff to handle colinear points. But if vectorA is zero it is still a mess . ..\n const normal = Vector3d.create();\n const workVector = Vector3d.create();\n if (baseIndex === 0) { // only look forward\n accumulateGoodUnitPerpendicular(this._points, vectorA, baseIndex + 1, 1, 1.0, normal, workVector);\n } else if (baseIndex + 2 >= n) { // only look back\n accumulateGoodUnitPerpendicular(this._points, vectorA, baseIndex - 1, -1, 1.0, normal, workVector);\n } else {\n accumulateGoodUnitPerpendicular(this._points, vectorA, baseIndex - 1, -1, (1.0 - localFraction), normal, workVector);\n accumulateGoodUnitPerpendicular(this._points, vectorA, baseIndex + 1, 1, (localFraction), normal, workVector);\n }\n const matrix = Matrix3d.createRigidFromColumns(normal, vectorA, AxisOrder.ZXY);\n if (matrix)\n return Transform.createOriginAndMatrix(origin, matrix, result);\n return Transform.createTranslation(origin, result);\n }\n /** Evaluate the start point of the linestring. */\n public override startPoint(result?: Point3d) {\n if (this._points.length === 0)\n return Point3d.createZero(result);\n return this._points.getPoint3dAtUncheckedPointIndex(0, result);\n }\n /** If i is a valid index, return that point. */\n public pointAt(i: number, result?: Point3d): Point3d | undefined {\n if (this._points.isIndexValid(i))\n return this._points.getPoint3dAtUncheckedPointIndex(i, result);\n return undefined;\n }\n /** If i and j are both valid indices, return the vector from point i to point j */\n public vectorBetween(i: number, j: number, result?: Vector3d): Vector3d | undefined {\n return this._points.vectorIndexIndex(i, j, result);\n }\n /** If i is a valid index, return that stored derivative vector. */\n public derivativeAt(i: number, result?: Vector3d): Vector3d | undefined {\n if (this._derivatives && this._derivatives.isIndexValid(i))\n return this._derivatives.getVector3dAtCheckedVectorIndex(i, result);\n return undefined;\n }\n /** If i is a valid index, return that stored surfaceNormal vector. */\n public surfaceNormalAt(i: number, result?: Vector3d): Vector3d | undefined {\n if (this._surfaceNormals && this._surfaceNormals.isIndexValid(i))\n return this._surfaceNormals.getVector3dAtCheckedVectorIndex(i, result);\n return undefined;\n }\n /** Return the number of points in this linestring. */\n public numPoints(): number {\n return this._points.length;\n }\n /** Return the number of edges in this linestring. */\n public numEdges(): number {\n return this._points.length > 0 ? this._points.length - 1 : 0;\n }\n /** Evaluate the end point of the linestring. */\n public override endPoint(result?: Point3d) {\n if (this._points.length === 0)\n return Point3d.createZero(result);\n return this._points.getPoint3dAtUncheckedPointIndex(this._points.length - 1, result);\n }\n /** Reverse the points within the linestring. */\n public reverseInPlace(): void {\n if (this._points.length >= 2) {\n this._points.reverseInPlace();\n if (this._fractions) {\n this._fractions.reverseInPlace();\n for (let i = 0; i < this._fractions.length; ++i)\n this._fractions.reassign(i, 1.0 - this._fractions.atUncheckedIndex(i));\n }\n if (this._uvParams)\n this._uvParams.reverseInPlace();\n if (this._derivatives) {\n this._derivatives.reverseInPlace();\n this._derivatives.scaleInPlace(-1.0);\n }\n if (this._surfaceNormals)\n this._surfaceNormals.reverseInPlace();\n if (this._pointIndices)\n this._pointIndices.reverseInPlace();\n if (this._uvIndices)\n this._uvIndices.reverseInPlace();\n if (this._normalIndices)\n this._normalIndices.reverseInPlace();\n }\n }\n /**\n * Apply `transform` to each point of this linestring.\n * * Note that this method always returns true. If transforming the surface normals fails (due to singular matrix or zero\n * normal), the original normal(s) are left unchanged.\n */\n public tryTransformInPlace(transform: Transform): boolean {\n this._points.multiplyTransformInPlace(transform);\n if (this._derivatives)\n this._derivatives.multiplyMatrix3dInPlace(transform.matrix);\n if (this._surfaceNormals)\n this._surfaceNormals.multiplyAndRenormalizeMatrix3dInverseTransposeInPlace(transform.matrix);\n return true;\n }\n /** Sum the lengths of segments within the linestring */\n public override curveLength(): number {\n return this._points.sumLengths();\n }\n /** Sum the lengths of segments between fractional positions on a linestring. */\n public override curveLengthBetweenFractions(fraction0: number, fraction1: number): number {\n const numSegments = this._points.length - 1;\n if (fraction1 === fraction0 || numSegments < 1)\n return 0.0;\n if (fraction1 < fraction0)\n return this.curveLengthBetweenFractions(fraction1, fraction0);\n const scaledFraction0 = fraction0 * numSegments;\n const scaledFraction1 = fraction1 * numSegments;\n const index0 = Math.max(1, Math.ceil(scaledFraction0));\n const index1 = Math.min(Math.floor(scaledFraction1), numSegments - 1);\n const localFraction0 = index0 - scaledFraction0;\n const localFraction1 = scaledFraction1 - index1;\n if (index0 > index1) {\n // the interval is entirely within a single segment\n return Math.abs(scaledFraction1 - scaledFraction0) * this._points.distanceIndexIndex(index0 - 1, index0)!;\n } else {\n // there is leading partial interval, 0 or more complete segments, and a trailing partial interval.\n // (either or both partial may be zero length)\n let sum = localFraction0 * this._points.distanceIndexIndex(index0 - 1, index0)!\n + localFraction1 * (this._points.distanceIndexIndex(index1, index1 + 1))!;\n for (let i = index0; i < index1; i++)\n sum += this._points.distanceIndexIndex(i, i + 1)!;\n return sum;\n }\n }\n /** Compute the range of points between fractional positions on the linestring. */\n public override rangeBetweenFractions(fraction0: number, fraction1: number, transform?: Transform): Range3d {\n const range = Range3d.create();\n if (this.points.length < 1)\n return range;\n if (fraction1 < fraction0)\n return this.rangeBetweenFractions(fraction1, fraction0, transform);\n const numSegments = this._points.length - 1;\n const scaledFraction0 = fraction0 * numSegments;\n const index0 = Math.max(0, Math.floor(scaledFraction0));\n const localFraction0 = scaledFraction0 - index0;\n const workPoint = Point3d.create();\n this._points.interpolate(index0, localFraction0, index0 + 1, workPoint);\n range.extendPoint(workPoint, transform);\n if (fraction1 === fraction0)\n return range; // 1-point range\n const scaledFraction1 = fraction1 * numSegments;\n const index1 = Math.min(Math.floor(scaledFraction1), numSegments - 1);\n const localFraction1 = scaledFraction1 - index1;\n this._points.interpolate(index1, localFraction1, index1 + 1, workPoint);\n range.extendPoint(workPoint, transform);\n for (let i = index0 + 1; i <= index1; i++) {\n this._points.getPoint3dAtUncheckedPointIndex(i, workPoint);\n range.extendPoint(workPoint, transform);\n }\n return range;\n }\n /**\n * * Implementation of `CurvePrimitive.moveSignedDistanceFromFraction`. (see comments there!)\n * * Find the segment that contains the start fraction\n * * Move point-by-point from that position to the start or end (respectively for negative or positive signedDistance)\n * * Optionally extrapolate\n * @param startFraction\n * @param signedDistance\n * @param allowExtension\n * @param result\n */\n public override moveSignedDistanceFromFraction(\n startFraction: number, signedDistance: number, allowExtension: false, result?: CurveLocationDetail,\n ): CurveLocationDetail {\n const numSegments = this._points.length - 1;\n const scaledFraction = startFraction * numSegments;\n let leftPointIndex = Geometry.restrictToInterval(Math.floor(scaledFraction), 0, numSegments - 1); // lower point index on active segment.\n const localFraction = scaledFraction - leftPointIndex;\n const point0 = this._points.interpolate(leftPointIndex, localFraction, leftPointIndex + 1, LineString3d._workPointA)!;\n const point1 = LineString3d._workPointB;\n const context = new MoveByDistanceContext(point0, startFraction, signedDistance);\n\n if (signedDistance > 0.0) {\n for (; leftPointIndex <= numSegments;) {\n leftPointIndex++;\n this._points.getPoint3dAtCheckedPointIndex(leftPointIndex, point1);\n if (context.announcePoint(point1, leftPointIndex / numSegments))\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\n this, context.fraction0, context.point0, signedDistance, CurveSearchStatus.success, result,\n );\n }\n // fall through for extrapolation from final segment\n if (allowExtension)\n context.announceExtrapolation(this._points, numSegments - 1, numSegments,\n (numSegments - 1) / numSegments, 1.0);\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\n this, context.fraction0, context.point0, signedDistance, context.distanceStatus(), result,\n );\n } else { // (moving backwards)\n if (localFraction <= 0.0)\n leftPointIndex--;\n for (; leftPointIndex >= 0; leftPointIndex--) {\n this._points.getPoint3dAtCheckedPointIndex(leftPointIndex, point1);\n if (context.announcePoint(point1, leftPointIndex / numSegments))\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\n this, context.fraction0, context.point0, signedDistance, CurveSearchStatus.success, result,\n );\n }\n // fall through for backward extrapolation from initial segment\n if (allowExtension)\n context.announceExtrapolation(this._points, 1, 0, 1.0 / numSegments, 0.0);\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\n this, context.fraction0, context.point0, -context.distance0, context.distanceStatus(), result,\n );\n }\n }\n /** Sum lengths of segments in the linestring. (This is a true length.) */\n public quickLength(): number { return this.curveLength(); }\n /**\n * Compute and normalize cross product among 3 points on the linestring.\n * * Essentially 3 random points are used to form the cross product.\n * * This is appropriate for a polygon known to be convex.\n * * No test for convexity or colinearity is performed.\n * * If the polygon is not convex, the returned normal may be reversed.\n * * If the random points used in the cross product are colinear, undefined is returned.\n * @param result pre-allocated object to populate and return\n * @returns unit normal, or undefined if normalization failed\n */\n public quickUnitNormal(result?: Vector3d): Vector3d | undefined {\n let step = Math.floor(this._points.length / 3);\n if (step < 1)\n step = 1;\n result = this._points.crossProductIndexIndexIndex(0, step, step + step);\n if (result && result.normalizeInPlace())\n return result;\n return undefined;\n }\n /** Find the point on the linestring (including its segment interiors) that is closest to spacePoint. */\n public override closestPoint(\n spacePoint: Point3d, extend: VariantCurveExtendParameter, result?: CurveLocationDetail,\n ): CurveLocationDetail {\n result = CurveLocationDetail.create(this, result);\n const extend0 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0);\n const extend1 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1);\n const numPoints = this._points.length;\n if (numPoints > 0) {\n const lastIndex = numPoints - 1;\n result.setFP(1.0, this._points.getPoint3dAtUncheckedPointIndex(lastIndex), undefined);\n result.setDistanceTo(spacePoint);\n if (numPoints > 1) {\n let segmentFraction = 0;\n let d = 0;\n for (let i = 1; i < numPoints; i++) {\n segmentFraction = spacePoint.fractionOfProjectionToLine(\n this._points.getPoint3dAtUncheckedPointIndex(i - 1), this._points.getPoint3dAtUncheckedPointIndex(i),\n );\n if (segmentFraction < 0) {\n if (!extend0 || i > 1)\n segmentFraction = 0.0;\n } else if (segmentFraction > 1.0) {\n if (!extend1 || i < lastIndex)\n segmentFraction = 1.0;\n }\n this._points.getPoint3dAtUncheckedPointIndex(i - 1)\n .interpolate(segmentFraction, this._points.getPoint3dAtUncheckedPointIndex(i), result.pointQ);\n d = result.pointQ.distance(spacePoint);\n if (d < result.a) {\n result.setFP(\n this.segmentIndexAndLocalFractionToGlobalFraction(i - 1, segmentFraction), result.pointQ, undefined, d,\n );\n }\n }\n }\n }\n return result;\n }\n /** Test if all points of the linestring are in a plane. */\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\n return this._points.isCloseToPlane(plane, Geometry.smallMetricDistance);\n }\n /** Push a hit, fixing up the prior entry if needed. */\n private static pushVertexHit(\n result: CurveLocationDetail[], counter: number, cp: CurvePrimitive, fraction: number, point: Point3d,\n ): void {\n const detail = CurveLocationDetail.createCurveFractionPoint(cp, fraction, point);\n result.push(detail);\n if (counter === 0) {\n detail.setIntervalRole(CurveIntervalRole.isolatedAtVertex);\n } else if (counter === 1) { // last entry must be isolatedAtVertex !!!\n result[result.length - 2].setIntervalRole(CurveIntervalRole.intervalStart);\n detail.setIntervalRole(CurveIntervalRole.intervalEnd);\n } else {\n result[result.length - 2].setIntervalRole(CurveIntervalRole.intervalInterior);\n detail.setIntervalRole(CurveIntervalRole.intervalEnd);\n }\n }\n /**\n * Find intersections with a plane.\n * Intersections within segments are recorded as CurveIntervalRole.isolated\n * Intersections at isolated \"on\" vertex are recoded as CurveIntervalRole.isolatedAtVertex.\n */\n public override appendPlaneIntersectionPoints(plane: PlaneAltitudeEvaluator, result: CurveLocationDetail[]): number {\n if (this._points.length < 1) return 0;\n const initialLength = result.length;\n const n = this._points.length;\n const divisor = n === 1 ? 1.0 : n - 1;\n const pointA = LineString3d._workPointA;\n const pointB = LineString3d._workPointB;\n const pointC = LineString3d._workPointC;\n this._points.getPoint3dAtUncheckedPointIndex(0, pointA);\n let hB = 0;\n let numConsecutiveZero = 0;\n let hA = 0;\n let segmentFraction = 0;\n for (let i = 0; i < this._points.length; i++, pointA.setFrom(pointB), hA = hB) {\n this._points.getPoint3dAtUncheckedPointIndex(i, pointB);\n hB = Geometry.correctSmallMetricDistance(plane.altitude(pointB));\n if (hB === 0.0)\n LineString3d.pushVertexHit(result, numConsecutiveZero++, this, i / divisor, pointB);\n else {\n if (hA * hB < 0.0) { // at point0, hA=0 will keep us out of here . ..\n segmentFraction = hA / (hA - hB); // this division is safe because the signs are different.\n pointA.interpolate(segmentFraction, pointB, pointC);\n const detail = CurveLocationDetail.createCurveFractionPoint(this, (i - 1 + segmentFraction) / divisor, pointC);\n detail.setIntervalRole(CurveIntervalRole.isolated);\n result.push(detail);\n numConsecutiveZero = 0;\n }\n }\n }\n return result.length - initialLength;\n }\n /** Extend `rangeToExtend` to include all points of this linestring. */\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\n this._points.extendRange(rangeToExtend, transform);\n }\n /** Test if each point of this linestring isAlmostEqual with corresponding point in `other`. */\n public override isAlmostEqual(other: GeometryQuery): boolean {\n if (!(other instanceof LineString3d))\n return false;\n if (!GrowableXYZArray.isAlmostEqual(this._points, other._points))\n return false;\n return true;\n }\n /**\n * Append (clone of) one point.\n * @param point the point to append. If same as the last point, nothing is appended.\n * @param fraction optional associated fraction to append. If same as the last fraction, nothing is appended.\n * It is assumed that both fractions refer to the same CurvePrimitive.\n */\n public appendStrokePoint(point: Point3d, fraction?: number): void {\n const n = this._points.length;\n let add = true;\n const addFraction = (fraction !== undefined) && (this._fractions !== undefined);\n if (n > 0) {\n if (addFraction && Geometry.isSmallRelative(fraction - this._fractions!.back()))\n add = false;\n if (point.isAlmostEqual(this._points.getPoint3dAtUncheckedPointIndex(n - 1)))\n add = false;\n }\n if (add) {\n this._points.push(point);\n if (addFraction)\n this.addFraction(fraction);\n }\n }\n /** Compress out duplicate points (according to point.isAlmostEqual) */\n public removeDuplicatePoints(tolerance: number = Geometry.smallMetricDistance) {\n const n = this._points.length;\n if (n < 2)\n return;\n let n1 = 1;\n for (let i = 1; i < n; i++) {\n const q = this._points.distanceIndexIndex(i, n1 - 1);\n if (q !== undefined && q > tolerance) {\n this._points.moveIndexToIndex(i, n1);\n if (this._fractions !== undefined)\n this._fractions.setAtUncheckedIndex(n1, this._fractions.atUncheckedIndex(i));\n if (this._derivatives)\n this._derivatives.moveIndexToIndex(i, n1);\n n1++;\n }\n }\n this._points.resize(n1);\n if (this._fractions)\n this._fractions.resize(n1);\n if (this._derivatives)\n this._derivatives.resize(n1);\n }\n /**\n * Append a suitable evaluation of a curve.\n * * If the computed point is the same as the last point, nothing is appended.\n * * Otherwise, the point is appended, as well as the fraction and derivative (if those arrays are present).\n * @param curve the curve to evaluate.\n * @param fraction the fraction at which to evaluate the curve.\n */\n public appendFractionToPoint(curve: CurvePrimitive, fraction: number) {\n let ray: Ray3d | undefined;\n let point: Point3d | undefined;\n const n = this._points.length;\n if (this._derivatives) {\n ray = curve.fractionToPointAndDerivative(fraction, LineString3d._workRay);\n point = ray.origin;\n } else {\n point = curve.fractionToPoint(fraction, LineString3d._workPointA);\n }\n if (n > 0 && point.isAlmostEqual(this._points.getPoint3dAtUncheckedPointIndex(n - 1)))\n return;\n if (ray)\n this._derivatives?.push(ray.direction);\n if (this._fractions)\n this._fractions.push(fraction);\n this._points.push(point);\n }\n /**\n * Clear all array data:\n * * points\n * * optional fractions.\n * * optional derivatives.\n */\n public clear() {\n this._points.clear();\n if (this._fractions)\n this._fractions.clear();\n if (this._derivatives)\n this._derivatives.clear();\n }\n /**\n * * options.needParams triggers creation of fraction array and uvParams array.\n * * options.needNormals triggers creation of derivatives array\n * @param capacity if positive, initial capacity of arrays\n * @param options optional, to indicate if fraction and derivative arrays are required.\n */\n public static createForStrokes(capacity: number = 0, options: StrokeOptions | undefined): LineString3d {\n const ls = LineString3d.create();\n if (capacity > 0)\n ls._points.ensureCapacity(capacity);\n if (options) {\n if (options.needParams) {\n ls._fractions = new GrowableFloat64Array(capacity);\n ls._uvParams = new GrowableXYArray(capacity);\n }\n if (options.needNormals) {\n ls._derivatives = new GrowableXYZArray(capacity);\n ls._surfaceNormals = new GrowableXYZArray(capacity);\n }\n }\n return ls;\n }\n /**\n * Evaluate a curve at uniform fractions. Append the evaluations to this linestring.\n * @param curve primitive to evaluate.\n * @param numStrokes number of strokes (edges).\n * @param fraction0 starting fraction coordinate\n * @param fraction1 end fraction coordinate\n * @param include01 if false, points at fraction0 and fraction1 are omitted.\n */\n public appendFractionalStrokePoints(\n curve: CurvePrimitive, numStrokes: number, fraction0: number = 0, fraction1: number = 1, include01: boolean = true,\n ): void {\n let i0 = 1;\n let i1 = numStrokes - 1;\n if (include01) {\n i0 = 0;\n i1 = numStrokes;\n }\n if (numStrokes >= 1) {\n const df = (fraction1 - fraction0) / numStrokes;\n for (let i = i0; i <= i1; i++)\n this.appendFractionToPoint(curve, fraction0 + i * df);\n }\n }\n /**\n * Append points constructed as interpolation between two points.\n * @param numStrokes number of strokes.\n * @param point0 first point\n * @param point1 last point\n * @param include01 if false, OMIT both start and end points (i.e. only compute and add true interior points)\n */\n public appendInterpolatedStrokePoints(numStrokes: number, point0: Point3d, point1: Point3d, include01: boolean): void {\n if (include01)\n this.appendStrokePoint(point0, 0.0);\n if (numStrokes > 1) {\n const df = 1.0 / numStrokes;\n for (let i = 1; i < numStrokes; i++) {\n const f = i * df;\n this.appendStrokePoint(point0.interpolate(f, point1), f);\n }\n }\n if (include01)\n this.appendStrokePoint(point1, 1.0);\n }\n /** Emit strokes to caller-supplied linestring */\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\n const n = this._points.length;\n const pointA = LineString3d._workPointA;\n const pointB = LineString3d._workPointB;\n if (n > 0) {\n // This is a linestring.\n // There is no need for chordTol and angleTol within a segment.\n // Do NOT apply min strokes per primitive.\n if (options && options.hasMaxEdgeLength) {\n dest.appendStrokePoint(this._points.getPoint3dAtUncheckedPointIndex(0));\n for (let i = 1; i < n; i++) {\n this._points.getPoint3dAtUncheckedPointIndex(i - 1, pointA);\n this._points.getPoint3dAtUncheckedPointIndex(i, pointB);\n const numStroke = options.applyMaxEdgeLength(1, pointA.distance(pointB));\n if (numStroke > 1)\n dest.appendInterpolatedStrokePoints(numStroke, pointA, pointB, false);\n dest.appendStrokePoint(pointB);\n }\n } else {\n for (let i = 0; i < n; i++) {\n dest.appendStrokePoint(this._points.getPoint3dAtUncheckedPointIndex(i));\n }\n }\n }\n }\n /**\n * Emit strokable parts of the curve to a caller-supplied handler.\n * If the stroke options does not have a maxEdgeLength, one stroke is emitted for each segment of the linestring.\n * If the stroke options has a maxEdgeLength, smaller segments are emitted as needed.\n */\n public emitStrokableParts(handler: IStrokeHandler, options?: StrokeOptions): void {\n const n = this._points.length;\n handler.startCurvePrimitive(this);\n if (n > 1) {\n const df = 1.0 / (n - 1);\n // this is a line string; there is no need for chordTol and angleTol within a segment\n // DO NOT apply min strokes per primitive\n if (options && options.hasMaxEdgeLength) {\n for (let i = 1; i < n; i++) {\n const numStroke = options.applyMaxEdgeLength(\n 1, this._points.getPoint3dAtUncheckedPointIndex(i - 1).distance(this._points.getPoint3dAtUncheckedPointIndex(i)),\n );\n handler.announceSegmentInterval(\n this,\n this._points.getPoint3dAtUncheckedPointIndex(i - 1),\n this._points.getPoint3dAtUncheckedPointIndex(i),\n numStroke,\n (i - 1) * df,\n i * df,\n );\n }\n } else {\n for (let i = 1; i < n; i++) {\n handler.announceSegmentInterval(\n this,\n this._points.getPoint3dAtUncheckedPointIndex(i - 1),\n this._points.getPoint3dAtUncheckedPointIndex(i),\n 1,\n (i - 1) * df,\n i * df,\n );\n }\n }\n }\n handler.endCurvePrimitive(this);\n }\n /**\n * Return the stroke count required for given options.\n * @param options StrokeOptions that determine count\n */\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\n const numPoints = this._points.length;\n let numStroke = numPoints - 1;\n\n if (options && options.hasMaxEdgeLength) {\n numStroke = 0;\n for (let i = 1; i < numPoints; i++) {\n numStroke += options.applyMaxEdgeLength(1, this._points.distanceIndexIndex(i - 1, i)!);\n }\n }\n return numStroke;\n }\n /**\n * Compute individual segment stroke counts. Attach in a StrokeCountMap.\n * @param options StrokeOptions that determine count\n * @param parentStrokeMap evolving parent map.\n */\n public override computeAndAttachRecursiveStrokeCounts(options?: StrokeOptions, parentStrokeMap?: StrokeCountMap) {\n const numPoints = this._points.length;\n const applyOptions = options !== undefined && options.hasMaxEdgeLength;\n const myData = StrokeCountMap.createWithCurvePrimitiveAndOptionalParent(this, parentStrokeMap, []);\n for (let i = 1; i < numPoints; i++) {\n const segmentLength = this._points.distanceIndexIndex(i - 1, i)!;\n const numStrokeOnSegment = applyOptions ? options.applyMaxEdgeLength(1, segmentLength) : 1;\n myData.addToCountAndLength(numStrokeOnSegment, segmentLength);\n }\n CurvePrimitive.installStrokeCountMap(this, myData, parentStrokeMap);\n }\n /** Second step of double dispatch: call `handler.handleLineString3d(this)` */\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\n return handler.handleLineString3d(this);\n }\n // HARD TO TEST -- tests that get to announceClipInterval for arc, bspline do NOT get here with\n // linestring because the controller has special case loops through segments?\n /**\n * Find intervals of this CurvePrimitive that are interior to a clipper\n * @param clipper clip structure (e.g. clip planes)\n * @param announce (optional) function to be called announcing fractional intervals\"\n * ` announce(fraction0, fraction1, curvePrimitive)`\n * @returns true if any \"in\" segments are announced.\n */\n public override announceClipIntervals(clipper: Clipper, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\n const n = this._points.length;\n if (n < 2)\n return false;\n let globalFractionA = 0.0;\n let globalFractionB = 1.0;\n const capture = (localFraction0: number, localFraction1: number) => {\n if (announce)\n announce(\n Geometry.interpolate(globalFractionA, localFraction0, globalFractionB),\n Geometry.interpolate(globalFractionA, localFraction1, globalFractionB),\n this,\n );\n };\n const pointA = LineString3d._workPointA;\n const pointB = LineString3d._workPointB;\n this._points.getPoint3dAtUncheckedPointIndex(0, pointA);\n let status = false;\n for (let i = 1; i < n; i++, pointA.setFrom(pointB), globalFractionA = globalFractionB) {\n this._points.getPoint3dAtUncheckedPointIndex(i, pointB);\n globalFractionB = i / (n - 1);\n if (clipper.announceClippedSegmentIntervals(0.0, 1.0, pointA, pointB, capture))\n status = true;\n }\n return status;\n }\n private static _indexPoint = Point3d.create(); // private point for addResolvedPoint\n /** @param fraction used to interpolate between points at index and index + 1 */\n private addResolvedPoint(index: number, fraction: number, dest: GrowableXYZArray) {\n const n = this._points.length;\n if (n === 0) return;\n if (n === 1) {\n this._points.getPoint3dAtUncheckedPointIndex(0, LineString3d._indexPoint);\n dest.push(LineString3d._indexPoint);\n return;\n }\n if (index < 0)\n index = 0;\n if (index > n - 2) {\n index = n - 2;\n fraction += 1;\n }\n this._points.interpolate(index, fraction, index + 1, LineString3d._indexPoint);\n dest.push(LineString3d._indexPoint);\n }\n /**\n * Return a LineString which is a portion of this curve.\n * * Fractions outside [0,1] extend the relevant end segment.\n * @param fractionA [in] start fraction\n * @param fractionB [in] end fraction\n */\n public override clonePartialCurve(fractionA: number, fractionB: number): LineString3d {\n if (fractionB < fractionA) {\n const linestringA = this.clonePartialCurve(fractionB, fractionA);\n if (linestringA)\n linestringA.reverseInPlace();\n return linestringA;\n }\n const n = this._points.length;\n if (n < 2)\n return this.clone();\n if (n > 2 && this.isPhysicallyClosed) {\n // don't extend a closed linestring\n if (fractionA < 0)\n fractionA = 0;\n if (fractionB > 1)\n fractionB = 1;\n }\n let index0, index1: number; // range of original vertices to copy into clone\n const localA = this.globalFractionToSegmentIndexAndLocalFraction(fractionA);\n const localB = this.globalFractionToSegmentIndexAndLocalFraction(fractionB);\n if (fractionA < 0) {\n index0 = 1; // first original vertex is not in clone\n } else if (0 <= fractionA && fractionA <= 1) {\n index0 = Geometry.isSmallRelative(1 - localA.fraction) ? localA.index + 2 : localA.index + 1;\n } else { // 1 < fractionA\n index0 = n; // no original vertices in clone\n }\n if (fractionB < 0) {\n index1 = -1; // no original vertices in clone\n } else if (0 <= fractionB && fractionB <= 1) {\n index1 = Geometry.isSmallRelative(localB.fraction) ? localB.index - 1 : localB.index;\n } else { // 1 < fractionB\n index1 = n - 2; // last original vertex is not in clone\n }\n const result = LineString3d.create();\n this.addResolvedPoint(localA.index, localA.fraction, result._points);\n for (let index = index0; index <= index1; index++) {\n if (this._points.isIndexValid(index)) {\n result._points.pushFromGrowableXYZArray(this._points, index);\n }\n }\n this.addResolvedPoint(localB.index, localB.fraction, result._points);\n return result;\n }\n /** Return (if possible) a specific segment of the linestring */\n public getIndexedSegment(index: number, result?: LineSegment3d): LineSegment3d | undefined {\n if (index >= 0 && index + 1 < this._points.length)\n return LineSegment3d.create(\n this._points.getPoint3dAtCheckedPointIndex(index)!, this._points.getPoint3dAtCheckedPointIndex(index + 1)!, result,\n );\n return undefined;\n }\n /**\n * Whether the start and end points are defined and within tolerance.\n * * Does not check for planarity or degeneracy.\n * @param tolerance optional distance tolerance (default is [[Geometry.smallMetricDistance]])\n * @param xyOnly if true, ignore z coordinate (default is `false`)\n */\n public override isPhysicallyClosedCurve(tolerance: number = Geometry.smallMetricDistance, xyOnly: boolean = false): boolean {\n if (!this._points.length)\n return false;\n if (xyOnly)\n return this._points.almostEqualXYIndexIndex(0, this._points.length - 1, tolerance)!; // we know the indices are valid\n return this._points.almostEqualIndexIndex(0, this._points.length - 1, tolerance)!;\n }\n /** Returns true if first and last points are within metric tolerance. */\n public get isPhysicallyClosed(): boolean {\n return this.isPhysicallyClosedCurve();\n }\n\n /**\n * Evaluate strokes at fractions indicated in a StrokeCountMap.\n * * The map must have an array of component counts corresponding to the segment of this linestring.\n * * \"fractions\" in the output are mapped within a0,a1 of the map.componentData\n * @param map = stroke count data.\n * @param destLinestring = receiver linestring.\n * @return number of strokes added. 0 if `map.componentData` does not match the linestring\n */\n public override addMappedStrokesToLineString3D(map: StrokeCountMap, destLinestring: LineString3d): number {\n const numPoint0 = destLinestring.numPoints();\n const needFractions = destLinestring._fractions !== undefined;\n const needDerivatives = destLinestring._derivatives !== undefined;\n const points = this._points;\n const pointA = LineString3d._workPointA;\n const pointB = LineString3d._workPointB;\n const pointC = LineString3d._workPointC;\n const numParentPoint = points.length;\n if (map.primitive && map.primitive === this && map.componentData && map.componentData.length + 1 === numParentPoint) {\n points.getPoint3dAtUncheckedPointIndex(0, pointA);\n for (let k = 0; k + 1 < numParentPoint; k++, pointA.setFromPoint3d(pointB)) {\n points.getPoint3dAtUncheckedPointIndex(k + 1, pointB);\n const segmentMap = map.componentData[k];\n const m = segmentMap.numStroke;\n const vectorAB = pointA.vectorTo(pointB);\n vectorAB.scale(m);\n for (let i = 0; i <= m; i++) {\n const fraction = i / m;\n const outputFraction = segmentMap.fractionToA(fraction);\n destLinestring.addPoint(pointA.interpolate(fraction, pointB, pointC));\n if (needFractions)\n destLinestring._fractions!.push((outputFraction));\n if (needDerivatives)\n destLinestring._derivatives!.push(vectorAB);\n\n }\n }\n }\n return destLinestring.numPoints() - numPoint0;\n }\n /**\n * Convert variant point data to a single level array of linestrings.\n * * The result is always an array of LineString3d.\n * * Single linestring is NOT bubbled out as a special case.\n * * data with no point is an empty array.\n * * \"deep\" data is flattened to a single array of linestrings, losing structure.\n */\n public static createArrayOfLineString3d(data: MultiLineStringDataVariant): LineString3d[] {\n const collector = new PointStreamGrowableXYZArrayCollector();\n VariantPointDataStream.streamXYZ(data, collector);\n const growableArrays = collector.claimArrayOfGrowableXYZArray();\n const result = [];\n if (growableArrays !== undefined) {\n for (const points of growableArrays)\n result.push(LineString3d.createCapture(points));\n }\n return result;\n }\n /**\n * Return an array containing only the curve primitives.\n * @param collectorArray array to receive primitives (pushed -- the array is not cleared)\n * @param _smallestPossiblePrimitives unused\n * @param explodeLinestrings if true, push a [[LineSegment3d]] for each segment. If false, only push `this`.\n */\n public override collectCurvePrimitivesGo(\n collectorArray: CurvePrimitive[], _smallestPossiblePrimitives: boolean, explodeLinestrings: boolean = false,\n ): void {\n if (explodeLinestrings) {\n let segment: LineSegment3d | undefined;\n for (let i = 0; (segment = this.getIndexedSegment(i)) !== undefined; i++)\n collectorArray.push(segment);\n } else {\n collectorArray.push(this);\n }\n }\n /**\n * Construct an offset of each segment as viewed in the xy-plane (ignoring z).\n * * No attempt is made to join the offset segments. Use RegionOps.constructCurveXYOffset() to return a fully\n * joined offset.\n * @param offsetDistanceOrOptions offset distance (positive to left of the instance curve), or options object\n */\n public override constructOffsetXY(\n offsetDistanceOrOptions: number | OffsetOptions,\n ): CurvePrimitive | CurvePrimitive[] | undefined {\n const options = OffsetOptions.create(offsetDistanceOrOptions);\n const offsets: CurvePrimitive[] = [];\n for (const seg of this.collectCurvePrimitives(undefined, true, true)) {\n const offset = seg.constructOffsetXY(options);\n if (offset !== undefined) {\n if (offset instanceof CurvePrimitive)\n offsets.push(offset);\n else if (Array.isArray(offset))\n offset.forEach((cp) => offsets.push(cp));\n }\n }\n return offsets;\n }\n /**\n * Project instance geometry (via dispatch) onto the given ray, and return the extreme fractional parameters\n * of projection.\n * @param ray ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with zero origin.\n * @param lowHigh optional receiver for output\n * @returns range of fractional projection parameters onto the ray, where 0.0 is start of the ray and 1.0 is\n * the end of the ray.\n */\n public override projectedParameterRange(ray: Vector3d | Ray3d, lowHigh?: Range1d): Range1d | undefined {\n return PlaneAltitudeRangeContext.findExtremeFractionsAlongDirection(this, ray, lowHigh);\n }\n /**\n * Convert the segment detail to a linestring detail:\n * * `detail.childDetail` is set to a clone of the input segment detail (optionally populating pre-allocated `child` object).\n * * `childDetail.a` is set to `segmentIndex`.\n * * `detail.fraction` is set to the global linestring parameter.\n * * `detail.curve` is set to the parent linestring.\n * @param detail segment location detail, converted in place\n * @param segmentIndex index of segment in the linestring\n * @param numSegment linestring segment count\n * @param parent optional linestring primitive\n * @param child optional pre-allocated detail to use to clone the child data\n * @returns reference to input detail, with both linestring and segment data\n */\n public static convertLocalToGlobalDetail(detail: CurveLocationDetail, segmentIndex: number, numSegment: number, parent?: LineString3d, child?: CurveLocationDetail): CurveLocationDetail {\n detail.childDetail = detail.clone(child);\n detail.childDetail.a = segmentIndex;\n detail.fraction = this.mapLocalToGlobalFraction(segmentIndex, detail.fraction, numSegment);\n detail.curve = parent;\n return detail;\n }\n}\n\n/**\n * An AnnotatedLineString3d is a linestring with additional surface-related data attached to each point\n * * This is useful in facet construction.\n * @internal\n */\nexport class AnnotatedLineString3d {\n /** Parameter along curve being faceted. */\n public curveParam?: GrowableFloat64Array;\n /** uv parameters, stored as uvw with the w possibly used for distinguishing among multiple \"faces\". */\n public uvwParam?: GrowableXYZArray;\n /** u direction tangent vectors from surface being faceted. */\n public vectorU?: GrowableXYZArray;\n /** v direction tangent vectors from surface being faceted. */\n public vectorV?: GrowableXYZArray;\n}\n\n/**\n * Context to be called to incrementally accumulate distance along line segments.\n */\nclass MoveByDistanceContext {\n public distance0: number; // accumulated distance through point0\n public point0: Point3d; // most recent point\n public fraction0: number; // most recent fraction position\n public targetDistance: number; // this is always positive.\n /** CAPTURE point0, fraction0, targetDistance */\n public constructor(point0: Point3d, fraction0: number, targetDistance: number) {\n this.point0 = point0;\n this.distance0 = 0.0;\n this.targetDistance = Math.abs(targetDistance);\n this.fraction0 = fraction0;\n }\n // Return CurveSearchStatus indicating whether the accumulated distance has reached the target.\n public distanceStatus(): CurveSearchStatus {\n return Geometry.isSameCoordinate(this.distance0, this.targetDistance) ?\n CurveSearchStatus.success : CurveSearchStatus.stoppedAtBoundary;\n }\n /**\n * Announce next point on the polyline.\n * * if the additional segment does NOT reach the target:\n * * accumulate the segment length\n * * update point0 and fraction0\n * * return false\n * * if the additional segment DOES reach the target:\n * * update point0 and fraction0 to the (possibly interpolated) final point and fraction\n * * return true\n * @param point1 new point\n * @param fraction1 fraction at point1\n * @return true if targetDistance reached.\n */\n public announcePoint(point1: Point3d, fraction1: number): boolean {\n const a = this.point0.distance(point1);\n const distance1 = this.distance0 + a;\n if (distance1 < this.targetDistance && !Geometry.isSameCoordinate(distance1, this.targetDistance)) {\n this.point0.setFromPoint3d(point1);\n this.distance0 = distance1;\n this.fraction0 = fraction1;\n return false;\n }\n const b = this.targetDistance - this.distance0;\n const intervalFraction = Geometry.safeDivideFraction(b, a, 0.0);\n this.point0.interpolate(intervalFraction, point1, this.point0);\n this.fraction0 = Geometry.interpolate(this.fraction0, intervalFraction, fraction1);\n this.distance0 = this.targetDistance;\n return true;\n }\n /**\n * Update point0, fraction0, and distance0 based on extrapolation of a segment between indices of a point array.\n * @returns true if extrapolation succeeded. (False if indexed points are coincident)\n * @param points\n * @param index0\n * @param index1\n * @param fraction0\n * @param fraction1\n * @param result\n * @param CurveLocationDetail\n */\n public announceExtrapolation(points: GrowableXYZArray,\n index0: number, index1: number,\n fraction0: number, fraction1: number): boolean {\n const residual = this.targetDistance - this.distance0;\n const d01 = points.distanceIndexIndex(index0, index1);\n if (!d01)\n return false;\n const extensionFraction = Geometry.conditionalDivideFraction(residual, d01);\n if (extensionFraction === undefined)\n return false;\n // (Remark: indices are swapped and extensionFraction negated to prevent incidental precision\n // loss with the alternative call with (index0, 1 + extensionFraction, index1);\n points.interpolate(index1, -extensionFraction, index0, this.point0);\n this.distance0 = this.targetDistance;\n this.fraction0 = Geometry.interpolate(fraction1, -extensionFraction, fraction0);\n return true;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"LineString3d.js","sourceRoot":"","sources":["../../../src/curve/LineString3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\nimport { Clipper } from \"../clipping/ClipUtils\";\r\nimport { AxisOrder, BeJSONFunctions, Geometry, PlaneAltitudeEvaluator } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { GeometryHandler, IStrokeHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { GrowableFloat64Array } from \"../geometry3d/GrowableFloat64Array\";\r\nimport { GrowableXYArray } from \"../geometry3d/GrowableXYArray\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { MultiLineStringDataVariant } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { PointStreamGrowableXYZArrayCollector, VariantPointDataStream } from \"../geometry3d/PointStreaming\";\r\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XAndY, XYZProps } from \"../geometry3d/XYZProps\";\r\nimport { CurveExtendOptions, VariantCurveExtendParameter } from \"./CurveExtendMode\";\r\nimport { CurveIntervalRole, CurveLocationDetail, CurveSearchStatus } from \"./CurveLocationDetail\";\r\nimport { AnnounceNumberNumberCurvePrimitive, CurvePrimitive } from \"./CurvePrimitive\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { PlaneAltitudeRangeContext } from \"./internalContexts/PlaneAltitudeRangeContext\";\r\nimport { LineSegment3d } from \"./LineSegment3d\";\r\nimport { OffsetOptions } from \"./OffsetOptions\";\r\nimport { StrokeCountMap } from \"./Query/StrokeCountMap\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n/**\r\n * Starting with the segment at (baseIndex, baseIndex + 1):\r\n * * If the segment vector and vectorA determine a normal, accumulate it (scaled) to normal, and return.\r\n * * Otherwise move to next/previous segment if stepDirection is positive/negative and repeat.\r\n * * Do nothing if everything is parallel through the end of the array.\r\n */\r\nfunction accumulateGoodUnitPerpendicular(\r\n points: GrowableXYZArray,\r\n vectorA: Vector3d,\r\n baseIndex: number,\r\n stepDirection: number,\r\n weight: number,\r\n normal: Vector3d,\r\n workVector: Vector3d,\r\n): boolean {\r\n const n = points.length;\r\n if (stepDirection > 0) {\r\n for (let i = baseIndex; i + 1 < n; i++) {\r\n points.vectorIndexIndex(i, i + 1, workVector);\r\n vectorA.crossProduct(workVector, workVector);\r\n if (workVector.normalizeInPlace()) {\r\n normal.addScaledInPlace(workVector, weight);\r\n if (normal.isAlmostEqualXYZ(0, 0, 0, Geometry.smallFraction))\r\n workVector.scale(-weight, normal); // Concavity changed! Revert to previous\r\n return true;\r\n }\r\n }\r\n } else {\r\n if (baseIndex + 1 >= n)\r\n baseIndex = n - 2;\r\n for (let i = baseIndex; i >= 0; i--) {\r\n points.vectorIndexIndex(i, i + 1, workVector);\r\n workVector.crossProduct(vectorA, workVector);\r\n if (workVector.normalizeInPlace()) {\r\n normal.addScaledInPlace(workVector, weight);\r\n if (normal.isAlmostEqualXYZ(0, 0, 0, Geometry.smallFraction))\r\n workVector.scale(-weight, normal); // Concavity changed! Revert to previous\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * * A LineString3d (sometimes called a PolyLine) is a sequence of xyz coordinates that are to be joined by line\r\n * segments.\r\n * * The point coordinates are stored in a GrowableXYZArray, not as full point objects.\r\n * * The parameterization of \"fraction along\" is\r\n * * In a linestring with `N` segments (i.e. `N+1` points), each segment (regardless of physical length) occupies\r\n * the same fraction (1/N) of the 0-to-1 fraction space.\r\n * * Within segment `i`, the fraction interval `i/N` to `(i+1)/N` is mapped proportionally to the segment\r\n * * Note that this `fraction` is therefore NOT fraction of true distance along.\r\n * * Use `moveSignedDistanceFromFraction` to do true-length evaluations.\r\n * @public\r\n */\r\nexport class LineString3d extends CurvePrimitive implements BeJSONFunctions {\r\n /** String name for schema properties */\r\n public readonly curvePrimitiveType = \"lineString\";\r\n private static _workPointA = Point3d.create();\r\n private static _workPointB = Point3d.create();\r\n private static _workPointC = Point3d.create();\r\n private static _workRay = Ray3d.createXAxis();\r\n /** test if `other` is an instance of `LineString3d` */\r\n public isSameGeometryClass(other: GeometryQuery): boolean {\r\n return other instanceof LineString3d;\r\n }\r\n /** A LineString3d extends along its first and final segments. */\r\n public override get isExtensibleFractionSpace(): boolean {\r\n return true;\r\n }\r\n private _points: GrowableXYZArray;\r\n private _fractions?: GrowableFloat64Array;\r\n private _uvParams?: GrowableXYArray;\r\n private _derivatives?: GrowableXYZArray;\r\n private _surfaceNormals?: GrowableXYZArray;\r\n private _pointIndices?: GrowableFloat64Array;\r\n private _uvIndices?: GrowableFloat64Array;\r\n private _normalIndices?: GrowableFloat64Array;\r\n /** Return the points array (cloned). */\r\n public get points(): Point3d[] {\r\n return this._points.getPoint3dArray();\r\n }\r\n /** Return (reference to) point data in packed GrowableXYZArray. */\r\n public get packedPoints(): GrowableXYZArray {\r\n return this._points;\r\n }\r\n /**\r\n * Return array of fraction parameters.\r\n * * These are only present during certain constructions such as faceting.\r\n * * When present, these fractions are fractions of some other curve being stroked, and are NOT related to the\r\n * linestring fraction parameters.\r\n */\r\n public get fractions(): GrowableFloat64Array | undefined {\r\n return this._fractions;\r\n }\r\n /** Return the (optional) array of derivatives. These are only present during certain constructions such as faceting. */\r\n public get packedDerivatives(): GrowableXYZArray | undefined {\r\n return this._derivatives;\r\n }\r\n /** Return the (optional) array of uv parameters. These are only present during certain constructions such as faceting. */\r\n public get packedUVParams(): GrowableXYArray | undefined {\r\n return this._uvParams;\r\n }\r\n /** Return the (optional) array of surface normals. These are only present during certain constructions such as faceting. */\r\n public get packedSurfaceNormals(): GrowableXYZArray | undefined {\r\n return this._surfaceNormals;\r\n }\r\n /** Return the (optional) array of normal indices. These are only present during certain constructions such as faceting. */\r\n public get normalIndices(): GrowableFloat64Array | undefined {\r\n return this._normalIndices;\r\n }\r\n /** Return the (optional) array of uv parameter indices. These are only present during certain constructions such as faceting. */\r\n public get paramIndices(): GrowableFloat64Array | undefined {\r\n return this._uvIndices;\r\n }\r\n /** Return the (optional) array of point indices. These are only present during certain constructions such as faceting. */\r\n public get pointIndices(): GrowableFloat64Array | undefined {\r\n return this._pointIndices;\r\n }\r\n private constructor(points?: GrowableXYZArray) {\r\n super();\r\n if (points)\r\n this._points = points;\r\n else\r\n this._points = new GrowableXYZArray();\r\n }\r\n /** Clone this linestring and apply the transform to the clone points. */\r\n public cloneTransformed(transform: Transform): LineString3d { // we know tryTransformInPlace succeeds.\r\n const c = this.clone();\r\n c.tryTransformInPlace(transform);\r\n return c;\r\n }\r\n /**\r\n * Create a linestring, using flex length arg list and any typical combination of points such as\r\n * Point3d, Point2d, `[1,2,3]', array of any of those, or GrowableXYZArray\r\n */\r\n public static create(...points: any[]): LineString3d {\r\n const result = new LineString3d();\r\n result.addPoints(points);\r\n return result;\r\n }\r\n /** Create a linestring, capturing the given GrowableXYZArray as the points. */\r\n public static createCapture(points: GrowableXYZArray): LineString3d {\r\n return new LineString3d(points);\r\n }\r\n /** Create a linestring from `XAndY` points, with a specified z applied to all. */\r\n public static createXY(points: XAndY[], z: number, enforceClosure: boolean = false): LineString3d {\r\n const result = new LineString3d();\r\n const xyz = result._points;\r\n for (const xy of points) {\r\n xyz.pushXYZ(xy.x, xy.y, z);\r\n }\r\n if (enforceClosure && points.length > 1) {\r\n const distance = xyz.distanceIndexIndex(0, xyz.length - 1);\r\n if (distance !== undefined && distance !== 0.0) {\r\n if (Geometry.isSameCoordinate(0, distance)) {\r\n xyz.pop(); // nonzero but small distance -- to be replaced by point 0 exactly.\r\n const xyzA = xyz.front();\r\n xyz.push(xyzA!);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Add copies of points to the linestring.\r\n * Valid inputs are:\r\n * * a Point2d\r\n * * a point3d\r\n * * An array of 2 doubles\r\n * * An array of 3 doubles\r\n * * A GrowableXYZArray\r\n * * An array of any of the above\r\n */\r\n public addPoints(...points: any[]) {\r\n this._points.pushFrom(points);\r\n }\r\n /** Add points accessed by index in a GrowableXYZArray, with a specified index step. */\r\n public addSteppedPoints(source: GrowableXYZArray, pointIndex0: number, step: number, numAdd: number) {\r\n this._points.addSteppedPoints(source, pointIndex0, step, numAdd);\r\n }\r\n /**\r\n * Add a point to the linestring.\r\n * @param point\r\n */\r\n public addPoint(point: Point3d) {\r\n this._points.push(point);\r\n }\r\n /**\r\n * Add a point to the linestring.\r\n * @param point\r\n */\r\n public addPointXYZ(x: number, y: number, z: number = 0) {\r\n this._points.pushXYZ(x, y, z);\r\n }\r\n /**\r\n * Append a fraction to the fractions array.\r\n * @param fraction\r\n */\r\n public addFraction(fraction: number) {\r\n if (!this._fractions)\r\n this._fractions = new GrowableFloat64Array();\r\n this._fractions.push(fraction);\r\n }\r\n /** Ensure that the fraction array exists with no fractions but at least the capacity of the point array. */\r\n public ensureEmptyFractions(): GrowableFloat64Array {\r\n const n = this.numPoints();\r\n if (!this._fractions) {\r\n this._fractions = new GrowableFloat64Array(n);\r\n return this._fractions;\r\n }\r\n this._fractions.clear();\r\n this._fractions.ensureCapacity(n);\r\n return this._fractions;\r\n }\r\n /** Ensure that the parameter array exists with no points but at least the capacity of the point array. */\r\n public ensureEmptyUVParams(): GrowableXYArray {\r\n const n = this.numPoints();\r\n if (!this._uvParams) {\r\n this._uvParams = new GrowableXYArray(n);\r\n return this._uvParams;\r\n }\r\n this._uvParams.clear();\r\n this._uvParams.ensureCapacity(n);\r\n return this._uvParams;\r\n }\r\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\r\n public ensureEmptySurfaceNormals(): GrowableXYZArray {\r\n const n = this.numPoints();\r\n if (!this._surfaceNormals) {\r\n this._surfaceNormals = new GrowableXYZArray(n);\r\n return this._surfaceNormals;\r\n }\r\n this._surfaceNormals.clear();\r\n this._surfaceNormals.ensureCapacity(n);\r\n return this._surfaceNormals;\r\n }\r\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\r\n public ensureEmptyDerivatives(): GrowableXYZArray {\r\n const n = this.numPoints();\r\n if (!this._derivatives) {\r\n this._derivatives = new GrowableXYZArray(n);\r\n return this._derivatives;\r\n }\r\n this._derivatives.clear();\r\n this._derivatives.ensureCapacity(n);\r\n return this._derivatives;\r\n }\r\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\r\n public ensureEmptyNormalIndices(): GrowableFloat64Array {\r\n const n = this.numPoints();\r\n if (!this._normalIndices) {\r\n this._normalIndices = new GrowableFloat64Array(n);\r\n return this._normalIndices;\r\n }\r\n this._normalIndices.clear();\r\n this._normalIndices.ensureCapacity(n);\r\n return this._normalIndices;\r\n }\r\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\r\n public ensureEmptyUVIndices(): GrowableFloat64Array {\r\n const n = this.numPoints();\r\n if (!this._uvIndices) {\r\n this._uvIndices = new GrowableFloat64Array(n);\r\n return this._uvIndices;\r\n }\r\n this._uvIndices.clear();\r\n this._uvIndices.ensureCapacity(n);\r\n return this._uvIndices;\r\n }\r\n /** Ensure that the surfaceNormals array exists with no points but at least the capacity of the point array. */\r\n public ensureEmptyPointIndices(): GrowableFloat64Array {\r\n const n = this.numPoints();\r\n if (!this._pointIndices) {\r\n this._pointIndices = new GrowableFloat64Array(n);\r\n return this._pointIndices;\r\n }\r\n this._pointIndices.clear();\r\n this._pointIndices.ensureCapacity(n);\r\n return this._pointIndices;\r\n }\r\n /**\r\n * Append a uv coordinate to the uvParams array\r\n * @param uv\r\n */\r\n public addUVParam(uvParam: XAndY) {\r\n if (!this._uvParams)\r\n this._uvParams = new GrowableXYArray();\r\n this._uvParams.pushXY(uvParam.x, uvParam.y);\r\n }\r\n /**\r\n * Append a uv coordinate to the uvParams array\r\n * @param uv\r\n */\r\n public addUVParamAsUV(u: number, v: number) {\r\n if (!this._uvParams)\r\n this._uvParams = new GrowableXYArray();\r\n this._uvParams.pushXY(u, v);\r\n }\r\n /**\r\n * Append a derivative to the derivative array\r\n * @param vector\r\n */\r\n public addDerivative(vector: Vector3d) {\r\n if (!this._derivatives)\r\n this._derivatives = new GrowableXYZArray();\r\n this._derivatives.push(vector);\r\n }\r\n /**\r\n * Append a surface normal to the surface normal array.\r\n * @param vector\r\n */\r\n public addSurfaceNormal(vector: Vector3d) {\r\n if (!this._surfaceNormals)\r\n this._surfaceNormals = new GrowableXYZArray();\r\n this._surfaceNormals.push(vector);\r\n }\r\n /** If the linestring is not already closed, add a closure point. */\r\n public addClosurePoint() {\r\n const distance = this._points.distanceIndexIndex(0, this._points.length - 1);\r\n if (distance !== undefined && !Geometry.isSameCoordinate(distance, 0))\r\n this._points.pushWrap(1);\r\n }\r\n /** Eliminate (but do not return!!) the final point of the linestring */\r\n public popPoint() {\r\n this._points.pop();\r\n }\r\n /** Compute `uvParams` array as (xy parts of) a linear transform of the xyz coordinates */\r\n public computeUVFromXYZTransform(transform: Transform) {\r\n this._uvParams = GrowableXYArray.createFromGrowableXYZArray(this._points, transform);\r\n }\r\n /**\r\n * Create the linestring for a rectangle parallel to the xy plane.\r\n * * The z coordinate from `point0` is used for all points.\r\n * * `ax` and `ay` are signed.\r\n * * The point sequence is:\r\n * * Start at `point0`\r\n * * move by (signed !) `ax` in the x direction.\r\n * * move by (signed !) `ay` in the y direction.\r\n * * move by (signed !) negative `ax` in the x direction.\r\n * * move by (signed !) negative `ay` in the y direction.\r\n * * (this returns to `point0`)\r\n */\r\n public static createRectangleXY(point0: Point3d, ax: number, ay: number, closed: boolean = true): LineString3d {\r\n const ls = LineString3d.create();\r\n const x0 = point0.x;\r\n const x1 = point0.x + ax;\r\n const y0 = point0.y;\r\n const y1 = point0.y + ay;\r\n const z = point0.z;\r\n ls.addPointXYZ(x0, y0, z);\r\n ls.addPointXYZ(x1, y0, z);\r\n ls.addPointXYZ(x1, y1, z);\r\n ls.addPointXYZ(x0, y1, z);\r\n if (closed)\r\n ls.addClosurePoint();\r\n return ls;\r\n }\r\n /**\r\n * Create a regular polygon centered\r\n * @param center center of the polygon.\r\n * @param edgeCount number of edges.\r\n * @param radius distance to vertex or edge (see `radiusToVertices`)\r\n * @param radiusToVertices true if polygon is inscribed in circle (radius measured to vertices); false if polygon\r\n * is outside circle (radius to edges)\r\n */\r\n public static createRegularPolygonXY(\r\n center: Point3d, edgeCount: number, radius: number, radiusToVertices: boolean = true,\r\n ): LineString3d {\r\n if (edgeCount < 3)\r\n edgeCount = 3;\r\n const ls = LineString3d.create();\r\n const i0 = radiusToVertices ? 0 : -1; // offset to make first vector (radius,0,0)\r\n const radiansStep = Math.PI / edgeCount;\r\n let c;\r\n let s;\r\n let radians;\r\n if (!radiusToVertices)\r\n radius = radius / Math.cos(radiansStep);\r\n for (let i = 0; i < edgeCount; i++) {\r\n radians = (i0 + 2 * i) * radiansStep;\r\n c = Angle.cleanupTrigValue(Math.cos(radians));\r\n s = Angle.cleanupTrigValue(Math.sin(radians));\r\n ls.addPointXYZ(center.x + radius * c, center.y + radius * s, center.z);\r\n }\r\n ls.addClosurePoint();\r\n return ls;\r\n }\r\n /**\r\n * Copy coordinate data from another linestring.\r\n * * The copied content is:\r\n * * points\r\n * * derivatives (if present)\r\n * * fractions (if present)\r\n * * surfaceNormals (if present)\r\n * * uvParams (if present)\r\n * @param other\r\n */\r\n public setFrom(other: LineString3d) {\r\n // ugly -- \"clone\" methods are inconsistent about 'reuse' and 'result' parameter . . .\r\n this._points = other._points.clone(this._points);\r\n if (other._derivatives)\r\n this._derivatives = other._derivatives.clone(this._derivatives);\r\n else\r\n this._derivatives = undefined;\r\n if (other._fractions)\r\n this._fractions = other._fractions.clone(false);\r\n else this._fractions = undefined;\r\n if (other._surfaceNormals)\r\n this._surfaceNormals = other._surfaceNormals.clone(this._surfaceNormals);\r\n else\r\n this._surfaceNormals = undefined;\r\n if (other._uvParams)\r\n this._uvParams = other._uvParams.clone();\r\n else\r\n this._uvParams = undefined;\r\n }\r\n /** Create a linestring from an array of points. */\r\n public static createPoints(points: Point3d[]): LineString3d {\r\n const ls = new LineString3d();\r\n let point;\r\n for (point of points)\r\n ls._points.push(point);\r\n return ls;\r\n }\r\n /** Create a linestring, taking points at specified indices from an array of points. */\r\n public static createIndexedPoints(points: Point3d[], index: number[], addClosure: boolean = false): LineString3d {\r\n const ls = new LineString3d();\r\n for (const i of index)\r\n ls._points.push(points[i]); // no clone needed -- we know this reformats to packed array.\r\n if (addClosure && index.length > 1)\r\n ls._points.push(points[index[0]]);\r\n return ls;\r\n }\r\n /** Create a LineString3d from xyz coordinates packed in a Float64Array */\r\n public static createFloat64Array(xyzData: Float64Array): LineString3d {\r\n const ls = new LineString3d();\r\n for (let i = 0; i + 3 <= xyzData.length; i += 3)\r\n ls._points.push(Point3d.create(xyzData[i], xyzData[i + 1], xyzData[i + 2]));\r\n return ls;\r\n }\r\n /** Return a clone of this linestring. */\r\n public clone(): LineString3d {\r\n const retVal = new LineString3d();\r\n retVal.setFrom(this);\r\n return retVal;\r\n }\r\n /**\r\n * Set point coordinates from a json array, e.g. `[[1,2,3],[4,5,6] . . .]`\r\n * * The `json` parameter must be an array.\r\n * * Each member `i` of the array is converted to a point with `Point3d.fromJSON(json[i]`)\r\n */\r\n public setFromJSON(json?: any) {\r\n this._points.clear();\r\n if (Array.isArray(json)) {\r\n let xyz;\r\n for (xyz of json)\r\n this._points.push(Point3d.fromJSON(xyz));\r\n }\r\n }\r\n /**\r\n * Convert an LineString3d to a JSON object.\r\n * * The returned object is an array of arrays of x,y,z coordinates, `[[x,y,z],...[x,y,z]]`\r\n */\r\n public toJSON(): XYZProps[] {\r\n const value = [];\r\n let i = 0;\r\n while (this._points.isIndexValid(i)) {\r\n value.push(this._points.getPoint3dAtUncheckedPointIndex(i).toJSON());\r\n i++;\r\n }\r\n return value;\r\n }\r\n /**\r\n * Construct a new linestring.\r\n * * See `LineString3d.setFromJSON ()` for remarks on `json` structure.\r\n */\r\n public static fromJSON(json?: any): LineString3d {\r\n const ls = new LineString3d(); ls.setFromJSON(json); return ls;\r\n }\r\n /**\r\n * Evaluate a point a fractional position along this linestring.\r\n * * See `LineString3d` class comments for description of how fraction relates to the linestring points.\r\n * @param fraction fractional position\r\n * @param result optional result\r\n */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\r\n const n = this._points.length;\r\n if (n === 0)\r\n return Point3d.createZero();\r\n if (n === 1)\r\n return Point3d.createFrom(this._points.getPoint3dAtUncheckedPointIndex(0), result);\r\n const df = 1.0 / (n - 1);\r\n if (fraction <= df)\r\n return this._points.interpolate(0, fraction / df, 1, result)!;\r\n if (fraction + df >= 1.0)\r\n return this._points.interpolate(n - 1, (1.0 - fraction) / df, n - 2, result)!;\r\n const index0 = Math.floor(fraction / df);\r\n return this._points.interpolate(index0, (fraction - index0 * df) / df, index0 + 1, result)!;\r\n }\r\n /**\r\n * Evaluate a point a fractional position and derivative with respect to fraction along this linestring.\r\n * * See `LineString3d` class comments for description of how fraction relates to the linestring points.\r\n * * At interior corners and the end point, the left derivative is returned; at the start point, the right derivative is returned.\r\n * @param fraction fractional position\r\n * @param result optional result\r\n */\r\n public fractionToPointAndDerivative(fraction: number, result?: Ray3d): Ray3d {\r\n result = result ? result : Ray3d.createZero();\r\n const n = this._points.length;\r\n if (n <= 1) {\r\n result.direction.setZero();\r\n if (n === 1)\r\n result.origin.setFrom(this._points.getPoint3dAtUncheckedPointIndex(0));\r\n else result.origin.setZero();\r\n return result;\r\n }\r\n const numSegment = n - 1;\r\n const df = 1.0 / numSegment;\r\n if (fraction <= df) {\r\n result = result ? result : Ray3d.createZero();\r\n this._points.interpolate(0, fraction / df, 1, result.origin);\r\n this._points.vectorIndexIndex(0, 1, result.direction);\r\n result.direction.scaleInPlace(1.0 / df);\r\n return result;\r\n }\r\n if (fraction + df >= 1.0) {\r\n result = result ? result : Ray3d.createZero();\r\n this._points.interpolate(n - 2, 1.0 - (1.0 - fraction) / df, n - 1, result.origin);\r\n this._points.vectorIndexIndex(n - 2, n - 1, result.direction);\r\n result.direction.scaleInPlace(1.0 / df);\r\n return result;\r\n }\r\n /* true interior point */\r\n result = result ? result : Ray3d.createZero();\r\n const index0 = Math.floor(fraction / df);\r\n const localFraction = (fraction - index0 * df) / df;\r\n this._points.interpolate(index0, localFraction, index0 + 1, result.origin);\r\n this._points.vectorIndexIndex(index0, index0 + 1, result.direction);\r\n result.direction.scaleInPlace(1.0 / df);\r\n return result;\r\n }\r\n /** Return point and derivative at fraction, with 000 second derivative. */\r\n public fractionToPointAnd2Derivatives(fraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const ray = this.fractionToPointAndDerivative(fraction);\r\n result = Plane3dByOriginAndVectors.createCapture(ray.origin, ray.direction, Vector3d.createZero(), result);\r\n return result;\r\n }\r\n /**\r\n * Convert a segment index and local fraction to a global linestring fraction.\r\n * @param index index of segment being evaluated\r\n * @param localFraction local fraction in [0,1] within the segment\r\n * @param numSegment number N of segments in the linestring\r\n * @return global fraction f in [0,1] such that the segment is parameterized by index/N <= f <= (index+1)/N.\r\n */\r\n public static mapLocalToGlobalFraction(index: number, localFraction: number, numSegment: number): number {\r\n if (numSegment < 1)\r\n return 0.0;\r\n return (index + localFraction) / numSegment;\r\n }\r\n /**\r\n * Convert a segment index and local fraction to a global linestring fraction.\r\n * @param index index of segment being evaluated\r\n * @param localFraction local fraction relative to the segment, typically in [0,1]. Fraction may be negative (or greater than 1) to represent extension of the first (or last) segment.\r\n * @return global fraction f such that the segment is parameterized by index/N <= f <= (index+1)/N.\r\n */\r\n public segmentIndexAndLocalFractionToGlobalFraction(index: number, localFraction: number): number {\r\n return LineString3d.mapLocalToGlobalFraction(index, localFraction, this._points.length - 1);\r\n }\r\n /**\r\n * Convert a global linestring fraction to a segment index and local fraction.\r\n * @param globalFraction a fraction f in the linestring parameterization, where the i_th segment\r\n * (0 <= i < N) is parameterized by i/N <= f <= (i+1)/N. If `globalFraction` is negative (or greater than 1),\r\n * so is the returned local fraction, which corresponds to the first (last) segment.\r\n * @param numSegment number N of segments in the linestring\r\n * @returns segment index and local fraction\r\n */\r\n public static mapGlobalToLocalFraction(globalFraction: number, numSegment: number): { index: number, fraction: number } {\r\n if (numSegment < 1)\r\n return { index: 0, fraction: 0.0 };\r\n const scaledGlobalFraction = globalFraction * numSegment;\r\n let segmentIndex: number;\r\n if (globalFraction <= 0)\r\n segmentIndex = 0;\r\n else if (globalFraction >= 1)\r\n segmentIndex = numSegment - 1;\r\n else // globalFraction in (0,1)\r\n segmentIndex = Math.floor(scaledGlobalFraction);\r\n return { index: segmentIndex, fraction: scaledGlobalFraction - segmentIndex };\r\n }\r\n /**\r\n * Convert a global linestring fraction to a segment index and local fraction.\r\n * @param globalFraction a fraction f in the linestring parameterization, where the i_th segment\r\n * (0 <= i < N) is parameterized by i/N <= f <= (i+1)/N. If `globalFraction` is negative (or greater than 1),\r\n * so is the returned local fraction, which corresponds to the first (last) segment.\r\n * @returns segment index and local fraction\r\n */\r\n public globalFractionToSegmentIndexAndLocalFraction(globalFraction: number): { index: number, fraction: number } {\r\n return LineString3d.mapGlobalToLocalFraction(globalFraction, this._points.length - 1);\r\n }\r\n /** Return a frenet frame, using nearby points to estimate a plane. */\r\n public override fractionToFrenetFrame(fraction: number, result?: Transform): Transform {\r\n const n = this._points.length;\r\n if (n <= 1) {\r\n if (n === 1)\r\n return Transform.createTranslation(this._points.getPoint3dAtUncheckedPointIndex(0), result);\r\n return Transform.createIdentity(result);\r\n }\r\n if (n === 2)\r\n return Transform.createRefs(\r\n this._points.interpolate(0, fraction, 1),\r\n Matrix3d.createRigidHeadsUp(this._points.vectorIndexIndex(0, 1)!, AxisOrder.XYZ));\r\n /** 3 or more points. */\r\n const numSegment = n - 1;\r\n const df = 1.0 / numSegment;\r\n let baseIndex = 0;\r\n let localFraction = 0;\r\n if (fraction <= df) {\r\n localFraction = fraction / df;\r\n baseIndex = 0;\r\n } else if (fraction + df >= 1.0) {\r\n baseIndex = n - 2;\r\n localFraction = 1.0 - (1.0 - fraction) / df;\r\n } else {\r\n baseIndex = Math.floor(fraction / df);\r\n localFraction = fraction * numSegment - baseIndex;\r\n }\r\n const origin = this._points.interpolate(baseIndex, localFraction, baseIndex + 1)!;\r\n const vectorA = this._points.vectorIndexIndex(baseIndex, baseIndex + 1)!;\r\n // tricky stuff to handle colinear points. But if vectorA is zero it is still a mess . ..\r\n const normal = Vector3d.create();\r\n const workVector = Vector3d.create();\r\n if (baseIndex === 0) { // only look forward\r\n accumulateGoodUnitPerpendicular(this._points, vectorA, baseIndex + 1, 1, 1.0, normal, workVector);\r\n } else if (baseIndex + 2 >= n) { // only look back\r\n accumulateGoodUnitPerpendicular(this._points, vectorA, baseIndex - 1, -1, 1.0, normal, workVector);\r\n } else {\r\n accumulateGoodUnitPerpendicular(this._points, vectorA, baseIndex - 1, -1, (1.0 - localFraction), normal, workVector);\r\n accumulateGoodUnitPerpendicular(this._points, vectorA, baseIndex + 1, 1, (localFraction), normal, workVector);\r\n }\r\n const matrix = Matrix3d.createRigidFromColumns(normal, vectorA, AxisOrder.ZXY);\r\n if (matrix)\r\n return Transform.createOriginAndMatrix(origin, matrix, result);\r\n return Transform.createTranslation(origin, result);\r\n }\r\n /** Evaluate the start point of the linestring. */\r\n public override startPoint(result?: Point3d) {\r\n if (this._points.length === 0)\r\n return Point3d.createZero(result);\r\n return this._points.getPoint3dAtUncheckedPointIndex(0, result);\r\n }\r\n /** If i is a valid index, return that point. */\r\n public pointAt(i: number, result?: Point3d): Point3d | undefined {\r\n if (this._points.isIndexValid(i))\r\n return this._points.getPoint3dAtUncheckedPointIndex(i, result);\r\n return undefined;\r\n }\r\n /** If i and j are both valid indices, return the vector from point i to point j */\r\n public vectorBetween(i: number, j: number, result?: Vector3d): Vector3d | undefined {\r\n return this._points.vectorIndexIndex(i, j, result);\r\n }\r\n /** If i is a valid index, return that stored derivative vector. */\r\n public derivativeAt(i: number, result?: Vector3d): Vector3d | undefined {\r\n if (this._derivatives && this._derivatives.isIndexValid(i))\r\n return this._derivatives.getVector3dAtCheckedVectorIndex(i, result);\r\n return undefined;\r\n }\r\n /** If i is a valid index, return that stored surfaceNormal vector. */\r\n public surfaceNormalAt(i: number, result?: Vector3d): Vector3d | undefined {\r\n if (this._surfaceNormals && this._surfaceNormals.isIndexValid(i))\r\n return this._surfaceNormals.getVector3dAtCheckedVectorIndex(i, result);\r\n return undefined;\r\n }\r\n /** Return the number of points in this linestring. */\r\n public numPoints(): number {\r\n return this._points.length;\r\n }\r\n /** Return the number of edges in this linestring. */\r\n public numEdges(): number {\r\n return this._points.length > 0 ? this._points.length - 1 : 0;\r\n }\r\n /** Evaluate the end point of the linestring. */\r\n public override endPoint(result?: Point3d) {\r\n if (this._points.length === 0)\r\n return Point3d.createZero(result);\r\n return this._points.getPoint3dAtUncheckedPointIndex(this._points.length - 1, result);\r\n }\r\n /** Reverse the points within the linestring. */\r\n public reverseInPlace(): void {\r\n if (this._points.length >= 2) {\r\n this._points.reverseInPlace();\r\n if (this._fractions) {\r\n this._fractions.reverseInPlace();\r\n for (let i = 0; i < this._fractions.length; ++i)\r\n this._fractions.reassign(i, 1.0 - this._fractions.atUncheckedIndex(i));\r\n }\r\n if (this._uvParams)\r\n this._uvParams.reverseInPlace();\r\n if (this._derivatives) {\r\n this._derivatives.reverseInPlace();\r\n this._derivatives.scaleInPlace(-1.0);\r\n }\r\n if (this._surfaceNormals)\r\n this._surfaceNormals.reverseInPlace();\r\n if (this._pointIndices)\r\n this._pointIndices.reverseInPlace();\r\n if (this._uvIndices)\r\n this._uvIndices.reverseInPlace();\r\n if (this._normalIndices)\r\n this._normalIndices.reverseInPlace();\r\n }\r\n }\r\n /**\r\n * Apply `transform` to each point of this linestring.\r\n * * Note that this method always returns true. If transforming the surface normals fails (due to singular matrix or zero\r\n * normal), the original normal(s) are left unchanged.\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n this._points.multiplyTransformInPlace(transform);\r\n if (this._derivatives)\r\n this._derivatives.multiplyMatrix3dInPlace(transform.matrix);\r\n if (this._surfaceNormals)\r\n this._surfaceNormals.multiplyAndRenormalizeMatrix3dInverseTransposeInPlace(transform.matrix);\r\n return true;\r\n }\r\n /** Sum the lengths of segments within the linestring */\r\n public override curveLength(): number {\r\n return this._points.sumLengths();\r\n }\r\n /** Sum the lengths of segments between fractional positions on a linestring. */\r\n public override curveLengthBetweenFractions(fraction0: number, fraction1: number): number {\r\n const numSegments = this._points.length - 1;\r\n if (fraction1 === fraction0 || numSegments < 1)\r\n return 0.0;\r\n if (fraction1 < fraction0)\r\n return this.curveLengthBetweenFractions(fraction1, fraction0);\r\n const scaledFraction0 = fraction0 * numSegments;\r\n const scaledFraction1 = fraction1 * numSegments;\r\n const index0 = Math.max(1, Math.ceil(scaledFraction0));\r\n const index1 = Math.min(Math.floor(scaledFraction1), numSegments - 1);\r\n const localFraction0 = index0 - scaledFraction0;\r\n const localFraction1 = scaledFraction1 - index1;\r\n if (index0 > index1) {\r\n // the interval is entirely within a single segment\r\n return Math.abs(scaledFraction1 - scaledFraction0) * this._points.distanceIndexIndex(index0 - 1, index0)!;\r\n } else {\r\n // there is leading partial interval, 0 or more complete segments, and a trailing partial interval.\r\n // (either or both partial may be zero length)\r\n let sum = localFraction0 * this._points.distanceIndexIndex(index0 - 1, index0)!\r\n + localFraction1 * (this._points.distanceIndexIndex(index1, index1 + 1))!;\r\n for (let i = index0; i < index1; i++)\r\n sum += this._points.distanceIndexIndex(i, i + 1)!;\r\n return sum;\r\n }\r\n }\r\n /** Compute the range of points between fractional positions on the linestring. */\r\n public override rangeBetweenFractions(fraction0: number, fraction1: number, transform?: Transform): Range3d {\r\n const range = Range3d.create();\r\n if (this.points.length < 1)\r\n return range;\r\n if (fraction1 < fraction0)\r\n return this.rangeBetweenFractions(fraction1, fraction0, transform);\r\n const numSegments = this._points.length - 1;\r\n const scaledFraction0 = fraction0 * numSegments;\r\n const index0 = Math.max(0, Math.floor(scaledFraction0));\r\n const localFraction0 = scaledFraction0 - index0;\r\n const workPoint = Point3d.create();\r\n this._points.interpolate(index0, localFraction0, index0 + 1, workPoint);\r\n range.extendPoint(workPoint, transform);\r\n if (fraction1 === fraction0)\r\n return range; // 1-point range\r\n const scaledFraction1 = fraction1 * numSegments;\r\n const index1 = Math.min(Math.floor(scaledFraction1), numSegments - 1);\r\n const localFraction1 = scaledFraction1 - index1;\r\n this._points.interpolate(index1, localFraction1, index1 + 1, workPoint);\r\n range.extendPoint(workPoint, transform);\r\n for (let i = index0 + 1; i <= index1; i++) {\r\n this._points.getPoint3dAtUncheckedPointIndex(i, workPoint);\r\n range.extendPoint(workPoint, transform);\r\n }\r\n return range;\r\n }\r\n /**\r\n * * Implementation of `CurvePrimitive.moveSignedDistanceFromFraction`. (see comments there!)\r\n * * Find the segment that contains the start fraction\r\n * * Move point-by-point from that position to the start or end (respectively for negative or positive signedDistance)\r\n * * Optionally extrapolate\r\n * @param startFraction\r\n * @param signedDistance\r\n * @param allowExtension\r\n * @param result\r\n */\r\n public override moveSignedDistanceFromFraction(\r\n startFraction: number, signedDistance: number, allowExtension: false, result?: CurveLocationDetail,\r\n ): CurveLocationDetail {\r\n const numSegments = this._points.length - 1;\r\n const scaledFraction = startFraction * numSegments;\r\n let leftPointIndex = Geometry.restrictToInterval(Math.floor(scaledFraction), 0, numSegments - 1); // lower point index on active segment.\r\n const localFraction = scaledFraction - leftPointIndex;\r\n const point0 = this._points.interpolate(leftPointIndex, localFraction, leftPointIndex + 1, LineString3d._workPointA)!;\r\n const point1 = LineString3d._workPointB;\r\n const context = new MoveByDistanceContext(point0, startFraction, signedDistance);\r\n\r\n if (signedDistance > 0.0) {\r\n for (; leftPointIndex <= numSegments;) {\r\n leftPointIndex++;\r\n this._points.getPoint3dAtCheckedPointIndex(leftPointIndex, point1);\r\n if (context.announcePoint(point1, leftPointIndex / numSegments))\r\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\r\n this, context.fraction0, context.point0, signedDistance, CurveSearchStatus.success, result,\r\n );\r\n }\r\n // fall through for extrapolation from final segment\r\n if (allowExtension)\r\n context.announceExtrapolation(this._points, numSegments - 1, numSegments,\r\n (numSegments - 1) / numSegments, 1.0);\r\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\r\n this, context.fraction0, context.point0, signedDistance, context.distanceStatus(), result,\r\n );\r\n } else { // (moving backwards)\r\n if (localFraction <= 0.0)\r\n leftPointIndex--;\r\n for (; leftPointIndex >= 0; leftPointIndex--) {\r\n this._points.getPoint3dAtCheckedPointIndex(leftPointIndex, point1);\r\n if (context.announcePoint(point1, leftPointIndex / numSegments))\r\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\r\n this, context.fraction0, context.point0, signedDistance, CurveSearchStatus.success, result,\r\n );\r\n }\r\n // fall through for backward extrapolation from initial segment\r\n if (allowExtension)\r\n context.announceExtrapolation(this._points, 1, 0, 1.0 / numSegments, 0.0);\r\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\r\n this, context.fraction0, context.point0, -context.distance0, context.distanceStatus(), result,\r\n );\r\n }\r\n }\r\n /** Sum lengths of segments in the linestring. (This is a true length.) */\r\n public quickLength(): number { return this.curveLength(); }\r\n /**\r\n * Compute and normalize cross product among 3 points on the linestring.\r\n * * Essentially 3 random points are used to form the cross product.\r\n * * This is appropriate for a polygon known to be convex.\r\n * * No test for convexity or colinearity is performed.\r\n * * If the polygon is not convex, the returned normal may be reversed.\r\n * * If the random points used in the cross product are colinear, undefined is returned.\r\n * @param result pre-allocated object to populate and return\r\n * @returns unit normal, or undefined if normalization failed\r\n */\r\n public quickUnitNormal(result?: Vector3d): Vector3d | undefined {\r\n let step = Math.floor(this._points.length / 3);\r\n if (step < 1)\r\n step = 1;\r\n result = this._points.crossProductIndexIndexIndex(0, step, step + step);\r\n if (result && result.normalizeInPlace())\r\n return result;\r\n return undefined;\r\n }\r\n /** Find the point on the linestring (including its segment interiors) that is closest to spacePoint. */\r\n public override closestPoint(\r\n spacePoint: Point3d, extend: VariantCurveExtendParameter, result?: CurveLocationDetail,\r\n ): CurveLocationDetail {\r\n result = CurveLocationDetail.create(this, result);\r\n const extend0 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0);\r\n const extend1 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1);\r\n const numPoints = this._points.length;\r\n if (numPoints > 0) {\r\n const lastIndex = numPoints - 1;\r\n result.setFP(1.0, this._points.getPoint3dAtUncheckedPointIndex(lastIndex), undefined);\r\n result.setDistanceTo(spacePoint);\r\n if (numPoints > 1) {\r\n let segmentFraction = 0;\r\n let d = 0;\r\n for (let i = 1; i < numPoints; i++) {\r\n segmentFraction = spacePoint.fractionOfProjectionToLine(\r\n this._points.getPoint3dAtUncheckedPointIndex(i - 1), this._points.getPoint3dAtUncheckedPointIndex(i),\r\n );\r\n if (segmentFraction < 0) {\r\n if (!extend0 || i > 1)\r\n segmentFraction = 0.0;\r\n } else if (segmentFraction > 1.0) {\r\n if (!extend1 || i < lastIndex)\r\n segmentFraction = 1.0;\r\n }\r\n this._points.getPoint3dAtUncheckedPointIndex(i - 1)\r\n .interpolate(segmentFraction, this._points.getPoint3dAtUncheckedPointIndex(i), result.pointQ);\r\n d = result.pointQ.distance(spacePoint);\r\n if (d < result.a) {\r\n result.setFP(\r\n this.segmentIndexAndLocalFractionToGlobalFraction(i - 1, segmentFraction), result.pointQ, undefined, d,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /** Test if all points of the linestring are in a plane. */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n return this._points.isCloseToPlane(plane, Geometry.smallMetricDistance);\r\n }\r\n /** Push a hit, fixing up the prior entry if needed. */\r\n private static pushVertexHit(\r\n result: CurveLocationDetail[], counter: number, cp: CurvePrimitive, fraction: number, point: Point3d,\r\n ): void {\r\n const detail = CurveLocationDetail.createCurveFractionPoint(cp, fraction, point);\r\n result.push(detail);\r\n if (counter === 0) {\r\n detail.setIntervalRole(CurveIntervalRole.isolatedAtVertex);\r\n } else if (counter === 1) { // last entry must be isolatedAtVertex !!!\r\n result[result.length - 2].setIntervalRole(CurveIntervalRole.intervalStart);\r\n detail.setIntervalRole(CurveIntervalRole.intervalEnd);\r\n } else {\r\n result[result.length - 2].setIntervalRole(CurveIntervalRole.intervalInterior);\r\n detail.setIntervalRole(CurveIntervalRole.intervalEnd);\r\n }\r\n }\r\n /**\r\n * Find intersections with a plane.\r\n * Intersections within segments are recorded as CurveIntervalRole.isolated\r\n * Intersections at isolated \"on\" vertex are recoded as CurveIntervalRole.isolatedAtVertex.\r\n */\r\n public override appendPlaneIntersectionPoints(plane: PlaneAltitudeEvaluator, result: CurveLocationDetail[]): number {\r\n if (this._points.length < 1) return 0;\r\n const initialLength = result.length;\r\n const n = this._points.length;\r\n const divisor = n === 1 ? 1.0 : n - 1;\r\n const pointA = LineString3d._workPointA;\r\n const pointB = LineString3d._workPointB;\r\n const pointC = LineString3d._workPointC;\r\n this._points.getPoint3dAtUncheckedPointIndex(0, pointA);\r\n let hB = 0;\r\n let numConsecutiveZero = 0;\r\n let hA = 0;\r\n let segmentFraction = 0;\r\n for (let i = 0; i < this._points.length; i++, pointA.setFrom(pointB), hA = hB) {\r\n this._points.getPoint3dAtUncheckedPointIndex(i, pointB);\r\n hB = Geometry.correctSmallMetricDistance(plane.altitude(pointB));\r\n if (hB === 0.0)\r\n LineString3d.pushVertexHit(result, numConsecutiveZero++, this, i / divisor, pointB);\r\n else {\r\n if (hA * hB < 0.0) { // at point0, hA=0 will keep us out of here . ..\r\n segmentFraction = hA / (hA - hB); // this division is safe because the signs are different.\r\n pointA.interpolate(segmentFraction, pointB, pointC);\r\n const detail = CurveLocationDetail.createCurveFractionPoint(this, (i - 1 + segmentFraction) / divisor, pointC);\r\n detail.setIntervalRole(CurveIntervalRole.isolated);\r\n result.push(detail);\r\n numConsecutiveZero = 0;\r\n }\r\n }\r\n }\r\n return result.length - initialLength;\r\n }\r\n /** Extend `rangeToExtend` to include all points of this linestring. */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n this._points.extendRange(rangeToExtend, transform);\r\n }\r\n /** Test if each point of this linestring isAlmostEqual with corresponding point in `other`. */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (!(other instanceof LineString3d))\r\n return false;\r\n if (!GrowableXYZArray.isAlmostEqual(this._points, other._points))\r\n return false;\r\n return true;\r\n }\r\n /**\r\n * Append (clone of) one point.\r\n * @param point the point to append. If same as the last point, nothing is appended.\r\n * @param fraction optional associated fraction to append. If same as the last fraction, nothing is appended.\r\n * It is assumed that both fractions refer to the same CurvePrimitive.\r\n */\r\n public appendStrokePoint(point: Point3d, fraction?: number): void {\r\n const n = this._points.length;\r\n let add = true;\r\n const addFraction = (fraction !== undefined) && (this._fractions !== undefined);\r\n if (n > 0) {\r\n if (addFraction && Geometry.isSmallRelative(fraction - this._fractions!.back()))\r\n add = false;\r\n if (point.isAlmostEqual(this._points.getPoint3dAtUncheckedPointIndex(n - 1)))\r\n add = false;\r\n }\r\n if (add) {\r\n this._points.push(point);\r\n if (addFraction)\r\n this.addFraction(fraction);\r\n }\r\n }\r\n /** Compress out duplicate points (according to point.isAlmostEqual) */\r\n public removeDuplicatePoints(tolerance: number = Geometry.smallMetricDistance) {\r\n const n = this._points.length;\r\n if (n < 2)\r\n return;\r\n let n1 = 1;\r\n for (let i = 1; i < n; i++) {\r\n const q = this._points.distanceIndexIndex(i, n1 - 1);\r\n if (q !== undefined && q > tolerance) {\r\n this._points.moveIndexToIndex(i, n1);\r\n if (this._fractions !== undefined)\r\n this._fractions.setAtUncheckedIndex(n1, this._fractions.atUncheckedIndex(i));\r\n if (this._derivatives)\r\n this._derivatives.moveIndexToIndex(i, n1);\r\n n1++;\r\n }\r\n }\r\n this._points.resize(n1);\r\n if (this._fractions)\r\n this._fractions.resize(n1);\r\n if (this._derivatives)\r\n this._derivatives.resize(n1);\r\n }\r\n /**\r\n * Append a suitable evaluation of a curve.\r\n * * If the computed point is the same as the last point, nothing is appended.\r\n * * Otherwise, the point is appended, as well as the fraction and derivative (if those arrays are present).\r\n * @param curve the curve to evaluate.\r\n * @param fraction the fraction at which to evaluate the curve.\r\n */\r\n public appendFractionToPoint(curve: CurvePrimitive, fraction: number) {\r\n let ray: Ray3d | undefined;\r\n let point: Point3d | undefined;\r\n const n = this._points.length;\r\n if (this._derivatives) {\r\n ray = curve.fractionToPointAndDerivative(fraction, LineString3d._workRay);\r\n point = ray.origin;\r\n } else {\r\n point = curve.fractionToPoint(fraction, LineString3d._workPointA);\r\n }\r\n if (n > 0 && point.isAlmostEqual(this._points.getPoint3dAtUncheckedPointIndex(n - 1)))\r\n return;\r\n if (ray)\r\n this._derivatives?.push(ray.direction);\r\n if (this._fractions)\r\n this._fractions.push(fraction);\r\n this._points.push(point);\r\n }\r\n /**\r\n * Clear all array data:\r\n * * points\r\n * * optional fractions.\r\n * * optional derivatives.\r\n */\r\n public clear() {\r\n this._points.clear();\r\n if (this._fractions)\r\n this._fractions.clear();\r\n if (this._derivatives)\r\n this._derivatives.clear();\r\n }\r\n /**\r\n * * options.needParams triggers creation of fraction array and uvParams array.\r\n * * options.needNormals triggers creation of derivatives array\r\n * @param capacity if positive, initial capacity of arrays\r\n * @param options optional, to indicate if fraction and derivative arrays are required.\r\n */\r\n public static createForStrokes(capacity: number = 0, options: StrokeOptions | undefined): LineString3d {\r\n const ls = LineString3d.create();\r\n if (capacity > 0)\r\n ls._points.ensureCapacity(capacity);\r\n if (options) {\r\n if (options.needParams) {\r\n ls._fractions = new GrowableFloat64Array(capacity);\r\n ls._uvParams = new GrowableXYArray(capacity);\r\n }\r\n if (options.needNormals) {\r\n ls._derivatives = new GrowableXYZArray(capacity);\r\n ls._surfaceNormals = new GrowableXYZArray(capacity);\r\n }\r\n }\r\n return ls;\r\n }\r\n /**\r\n * Evaluate a curve at uniform fractions. Append the evaluations to this linestring.\r\n * @param curve primitive to evaluate.\r\n * @param numStrokes number of strokes (edges).\r\n * @param fraction0 starting fraction coordinate\r\n * @param fraction1 end fraction coordinate\r\n * @param include01 if false, points at fraction0 and fraction1 are omitted.\r\n */\r\n public appendFractionalStrokePoints(\r\n curve: CurvePrimitive, numStrokes: number, fraction0: number = 0, fraction1: number = 1, include01: boolean = true,\r\n ): void {\r\n let i0 = 1;\r\n let i1 = numStrokes - 1;\r\n if (include01) {\r\n i0 = 0;\r\n i1 = numStrokes;\r\n }\r\n if (numStrokes >= 1) {\r\n const df = (fraction1 - fraction0) / numStrokes;\r\n for (let i = i0; i <= i1; i++)\r\n this.appendFractionToPoint(curve, fraction0 + i * df);\r\n }\r\n }\r\n /**\r\n * Append points constructed as interpolation between two points.\r\n * @param numStrokes number of strokes.\r\n * @param point0 first point\r\n * @param point1 last point\r\n * @param include01 if false, OMIT both start and end points (i.e. only compute and add true interior points)\r\n */\r\n public appendInterpolatedStrokePoints(numStrokes: number, point0: Point3d, point1: Point3d, include01: boolean): void {\r\n if (include01)\r\n this.appendStrokePoint(point0, 0.0);\r\n if (numStrokes > 1) {\r\n const df = 1.0 / numStrokes;\r\n for (let i = 1; i < numStrokes; i++) {\r\n const f = i * df;\r\n this.appendStrokePoint(point0.interpolate(f, point1), f);\r\n }\r\n }\r\n if (include01)\r\n this.appendStrokePoint(point1, 1.0);\r\n }\r\n /** Emit strokes to caller-supplied linestring */\r\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\r\n const n = this._points.length;\r\n const pointA = LineString3d._workPointA;\r\n const pointB = LineString3d._workPointB;\r\n if (n > 0) {\r\n // This is a linestring.\r\n // There is no need for chordTol and angleTol within a segment.\r\n // Do NOT apply min strokes per primitive.\r\n if (options && options.hasMaxEdgeLength) {\r\n dest.appendStrokePoint(this._points.getPoint3dAtUncheckedPointIndex(0));\r\n for (let i = 1; i < n; i++) {\r\n this._points.getPoint3dAtUncheckedPointIndex(i - 1, pointA);\r\n this._points.getPoint3dAtUncheckedPointIndex(i, pointB);\r\n const numStroke = options.applyMaxEdgeLength(1, pointA.distance(pointB));\r\n if (numStroke > 1)\r\n dest.appendInterpolatedStrokePoints(numStroke, pointA, pointB, false);\r\n dest.appendStrokePoint(pointB);\r\n }\r\n } else {\r\n for (let i = 0; i < n; i++) {\r\n dest.appendStrokePoint(this._points.getPoint3dAtUncheckedPointIndex(i));\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Emit strokable parts of the curve to a caller-supplied handler.\r\n * If the stroke options does not have a maxEdgeLength, one stroke is emitted for each segment of the linestring.\r\n * If the stroke options has a maxEdgeLength, smaller segments are emitted as needed.\r\n */\r\n public emitStrokableParts(handler: IStrokeHandler, options?: StrokeOptions): void {\r\n const n = this._points.length;\r\n handler.startCurvePrimitive(this);\r\n if (n > 1) {\r\n const df = 1.0 / (n - 1);\r\n // this is a line string; there is no need for chordTol and angleTol within a segment\r\n // DO NOT apply min strokes per primitive\r\n if (options && options.hasMaxEdgeLength) {\r\n for (let i = 1; i < n; i++) {\r\n const numStroke = options.applyMaxEdgeLength(\r\n 1, this._points.getPoint3dAtUncheckedPointIndex(i - 1).distance(this._points.getPoint3dAtUncheckedPointIndex(i)),\r\n );\r\n handler.announceSegmentInterval(\r\n this,\r\n this._points.getPoint3dAtUncheckedPointIndex(i - 1),\r\n this._points.getPoint3dAtUncheckedPointIndex(i),\r\n numStroke,\r\n (i - 1) * df,\r\n i * df,\r\n );\r\n }\r\n } else {\r\n for (let i = 1; i < n; i++) {\r\n handler.announceSegmentInterval(\r\n this,\r\n this._points.getPoint3dAtUncheckedPointIndex(i - 1),\r\n this._points.getPoint3dAtUncheckedPointIndex(i),\r\n 1,\r\n (i - 1) * df,\r\n i * df,\r\n );\r\n }\r\n }\r\n }\r\n handler.endCurvePrimitive(this);\r\n }\r\n /**\r\n * Return the stroke count required for given options.\r\n * @param options StrokeOptions that determine count\r\n */\r\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\r\n const numPoints = this._points.length;\r\n let numStroke = numPoints - 1;\r\n\r\n if (options && options.hasMaxEdgeLength) {\r\n numStroke = 0;\r\n for (let i = 1; i < numPoints; i++) {\r\n numStroke += options.applyMaxEdgeLength(1, this._points.distanceIndexIndex(i - 1, i)!);\r\n }\r\n }\r\n return numStroke;\r\n }\r\n /**\r\n * Compute individual segment stroke counts. Attach in a StrokeCountMap.\r\n * @param options StrokeOptions that determine count\r\n * @param parentStrokeMap evolving parent map.\r\n */\r\n public override computeAndAttachRecursiveStrokeCounts(options?: StrokeOptions, parentStrokeMap?: StrokeCountMap) {\r\n const numPoints = this._points.length;\r\n const applyOptions = options !== undefined && options.hasMaxEdgeLength;\r\n const myData = StrokeCountMap.createWithCurvePrimitiveAndOptionalParent(this, parentStrokeMap, []);\r\n for (let i = 1; i < numPoints; i++) {\r\n const segmentLength = this._points.distanceIndexIndex(i - 1, i)!;\r\n const numStrokeOnSegment = applyOptions ? options.applyMaxEdgeLength(1, segmentLength) : 1;\r\n myData.addToCountAndLength(numStrokeOnSegment, segmentLength);\r\n }\r\n CurvePrimitive.installStrokeCountMap(this, myData, parentStrokeMap);\r\n }\r\n /** Second step of double dispatch: call `handler.handleLineString3d(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleLineString3d(this);\r\n }\r\n // HARD TO TEST -- tests that get to announceClipInterval for arc, bspline do NOT get here with\r\n // linestring because the controller has special case loops through segments?\r\n /**\r\n * Find intervals of this CurvePrimitive that are interior to a clipper\r\n * @param clipper clip structure (e.g. clip planes)\r\n * @param announce (optional) function to be called announcing fractional intervals\"\r\n * ` announce(fraction0, fraction1, curvePrimitive)`\r\n * @returns true if any \"in\" segments are announced.\r\n */\r\n public override announceClipIntervals(clipper: Clipper, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\r\n const n = this._points.length;\r\n if (n < 2)\r\n return false;\r\n let globalFractionA = 0.0;\r\n let globalFractionB = 1.0;\r\n const capture = (localFraction0: number, localFraction1: number) => {\r\n if (announce)\r\n announce(\r\n Geometry.interpolate(globalFractionA, localFraction0, globalFractionB),\r\n Geometry.interpolate(globalFractionA, localFraction1, globalFractionB),\r\n this,\r\n );\r\n };\r\n const pointA = LineString3d._workPointA;\r\n const pointB = LineString3d._workPointB;\r\n this._points.getPoint3dAtUncheckedPointIndex(0, pointA);\r\n let status = false;\r\n for (let i = 1; i < n; i++, pointA.setFrom(pointB), globalFractionA = globalFractionB) {\r\n this._points.getPoint3dAtUncheckedPointIndex(i, pointB);\r\n globalFractionB = i / (n - 1);\r\n if (clipper.announceClippedSegmentIntervals(0.0, 1.0, pointA, pointB, capture))\r\n status = true;\r\n }\r\n return status;\r\n }\r\n private static _indexPoint = Point3d.create(); // private point for addResolvedPoint\r\n /** @param fraction used to interpolate between points at index and index + 1 */\r\n private addResolvedPoint(index: number, fraction: number, dest: GrowableXYZArray) {\r\n const n = this._points.length;\r\n if (n === 0) return;\r\n if (n === 1) {\r\n this._points.getPoint3dAtUncheckedPointIndex(0, LineString3d._indexPoint);\r\n dest.push(LineString3d._indexPoint);\r\n return;\r\n }\r\n if (index < 0)\r\n index = 0;\r\n if (index > n - 2) {\r\n index = n - 2;\r\n fraction += 1;\r\n }\r\n this._points.interpolate(index, fraction, index + 1, LineString3d._indexPoint);\r\n dest.push(LineString3d._indexPoint);\r\n }\r\n /**\r\n * Return a LineString which is a portion of this curve.\r\n * * Fractions outside [0,1] extend the relevant end segment.\r\n * @param fractionA [in] start fraction\r\n * @param fractionB [in] end fraction\r\n */\r\n public override clonePartialCurve(fractionA: number, fractionB: number): LineString3d {\r\n if (fractionB < fractionA) {\r\n const linestringA = this.clonePartialCurve(fractionB, fractionA);\r\n if (linestringA)\r\n linestringA.reverseInPlace();\r\n return linestringA;\r\n }\r\n const n = this._points.length;\r\n if (n < 2)\r\n return this.clone();\r\n if (n > 2 && this.isPhysicallyClosed) {\r\n // don't extend a closed linestring\r\n if (fractionA < 0)\r\n fractionA = 0;\r\n if (fractionB > 1)\r\n fractionB = 1;\r\n }\r\n let index0, index1: number; // range of original vertices to copy into clone\r\n const localA = this.globalFractionToSegmentIndexAndLocalFraction(fractionA);\r\n const localB = this.globalFractionToSegmentIndexAndLocalFraction(fractionB);\r\n if (fractionA < 0) {\r\n index0 = 1; // first original vertex is not in clone\r\n } else if (0 <= fractionA && fractionA <= 1) {\r\n index0 = Geometry.isSmallRelative(1 - localA.fraction) ? localA.index + 2 : localA.index + 1;\r\n } else { // 1 < fractionA\r\n index0 = n; // no original vertices in clone\r\n }\r\n if (fractionB < 0) {\r\n index1 = -1; // no original vertices in clone\r\n } else if (0 <= fractionB && fractionB <= 1) {\r\n index1 = Geometry.isSmallRelative(localB.fraction) ? localB.index - 1 : localB.index;\r\n } else { // 1 < fractionB\r\n index1 = n - 2; // last original vertex is not in clone\r\n }\r\n const result = LineString3d.create();\r\n this.addResolvedPoint(localA.index, localA.fraction, result._points);\r\n for (let index = index0; index <= index1; index++) {\r\n if (this._points.isIndexValid(index)) {\r\n result._points.pushFromGrowableXYZArray(this._points, index);\r\n }\r\n }\r\n this.addResolvedPoint(localB.index, localB.fraction, result._points);\r\n return result;\r\n }\r\n /** Return (if possible) a specific segment of the linestring */\r\n public getIndexedSegment(index: number, result?: LineSegment3d): LineSegment3d | undefined {\r\n if (index >= 0 && index + 1 < this._points.length)\r\n return LineSegment3d.create(\r\n this._points.getPoint3dAtCheckedPointIndex(index)!, this._points.getPoint3dAtCheckedPointIndex(index + 1)!, result,\r\n );\r\n return undefined;\r\n }\r\n /**\r\n * Whether the start and end points are defined and within tolerance.\r\n * * Does not check for planarity or degeneracy.\r\n * @param tolerance optional distance tolerance (default is [[Geometry.smallMetricDistance]])\r\n * @param xyOnly if true, ignore z coordinate (default is `false`)\r\n */\r\n public override isPhysicallyClosedCurve(tolerance: number = Geometry.smallMetricDistance, xyOnly: boolean = false): boolean {\r\n if (!this._points.length)\r\n return false;\r\n if (xyOnly)\r\n return this._points.almostEqualXYIndexIndex(0, this._points.length - 1, tolerance)!; // we know the indices are valid\r\n return this._points.almostEqualIndexIndex(0, this._points.length - 1, tolerance)!;\r\n }\r\n /** Returns true if first and last points are within metric tolerance. */\r\n public get isPhysicallyClosed(): boolean {\r\n return this.isPhysicallyClosedCurve();\r\n }\r\n\r\n /**\r\n * Evaluate strokes at fractions indicated in a StrokeCountMap.\r\n * * The map must have an array of component counts corresponding to the segment of this linestring.\r\n * * \"fractions\" in the output are mapped within a0,a1 of the map.componentData\r\n * @param map = stroke count data.\r\n * @param destLinestring = receiver linestring.\r\n * @return number of strokes added. 0 if `map.componentData` does not match the linestring\r\n */\r\n public override addMappedStrokesToLineString3D(map: StrokeCountMap, destLinestring: LineString3d): number {\r\n const numPoint0 = destLinestring.numPoints();\r\n const needFractions = destLinestring._fractions !== undefined;\r\n const needDerivatives = destLinestring._derivatives !== undefined;\r\n const points = this._points;\r\n const pointA = LineString3d._workPointA;\r\n const pointB = LineString3d._workPointB;\r\n const pointC = LineString3d._workPointC;\r\n const numParentPoint = points.length;\r\n if (map.primitive && map.primitive === this && map.componentData && map.componentData.length + 1 === numParentPoint) {\r\n points.getPoint3dAtUncheckedPointIndex(0, pointA);\r\n for (let k = 0; k + 1 < numParentPoint; k++, pointA.setFromPoint3d(pointB)) {\r\n points.getPoint3dAtUncheckedPointIndex(k + 1, pointB);\r\n const segmentMap = map.componentData[k];\r\n const m = segmentMap.numStroke;\r\n const vectorAB = pointA.vectorTo(pointB);\r\n vectorAB.scale(m);\r\n for (let i = 0; i <= m; i++) {\r\n const fraction = i / m;\r\n const outputFraction = segmentMap.fractionToA(fraction);\r\n destLinestring.addPoint(pointA.interpolate(fraction, pointB, pointC));\r\n if (needFractions)\r\n destLinestring._fractions!.push((outputFraction));\r\n if (needDerivatives)\r\n destLinestring._derivatives!.push(vectorAB);\r\n\r\n }\r\n }\r\n }\r\n return destLinestring.numPoints() - numPoint0;\r\n }\r\n /**\r\n * Convert variant point data to a single level array of linestrings.\r\n * * The result is always an array of LineString3d.\r\n * * Single linestring is NOT bubbled out as a special case.\r\n * * data with no point is an empty array.\r\n * * \"deep\" data is flattened to a single array of linestrings, losing structure.\r\n */\r\n public static createArrayOfLineString3d(data: MultiLineStringDataVariant): LineString3d[] {\r\n const collector = new PointStreamGrowableXYZArrayCollector();\r\n VariantPointDataStream.streamXYZ(data, collector);\r\n const growableArrays = collector.claimArrayOfGrowableXYZArray();\r\n const result = [];\r\n if (growableArrays !== undefined) {\r\n for (const points of growableArrays)\r\n result.push(LineString3d.createCapture(points));\r\n }\r\n return result;\r\n }\r\n /**\r\n * Return an array containing only the curve primitives.\r\n * @param collectorArray array to receive primitives (pushed -- the array is not cleared)\r\n * @param _smallestPossiblePrimitives unused\r\n * @param explodeLinestrings if true, push a [[LineSegment3d]] for each segment. If false, only push `this`.\r\n */\r\n public override collectCurvePrimitivesGo(\r\n collectorArray: CurvePrimitive[], _smallestPossiblePrimitives: boolean, explodeLinestrings: boolean = false,\r\n ): void {\r\n if (explodeLinestrings) {\r\n let segment: LineSegment3d | undefined;\r\n for (let i = 0; (segment = this.getIndexedSegment(i)) !== undefined; i++)\r\n collectorArray.push(segment);\r\n } else {\r\n collectorArray.push(this);\r\n }\r\n }\r\n /**\r\n * Construct an offset of each segment as viewed in the xy-plane (ignoring z).\r\n * * No attempt is made to join the offset segments. Use RegionOps.constructCurveXYOffset() to return a fully\r\n * joined offset.\r\n * @param offsetDistanceOrOptions offset distance (positive to left of the instance curve), or options object\r\n */\r\n public override constructOffsetXY(\r\n offsetDistanceOrOptions: number | OffsetOptions,\r\n ): CurvePrimitive | CurvePrimitive[] | undefined {\r\n const options = OffsetOptions.create(offsetDistanceOrOptions);\r\n const offsets: CurvePrimitive[] = [];\r\n for (const seg of this.collectCurvePrimitives(undefined, true, true)) {\r\n const offset = seg.constructOffsetXY(options);\r\n if (offset !== undefined) {\r\n if (offset instanceof CurvePrimitive)\r\n offsets.push(offset);\r\n else if (Array.isArray(offset))\r\n offset.forEach((cp) => offsets.push(cp));\r\n }\r\n }\r\n return offsets;\r\n }\r\n /**\r\n * Project instance geometry (via dispatch) onto the given ray, and return the extreme fractional parameters\r\n * of projection.\r\n * @param ray ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with zero origin.\r\n * @param lowHigh optional receiver for output\r\n * @returns range of fractional projection parameters onto the ray, where 0.0 is start of the ray and 1.0 is\r\n * the end of the ray.\r\n */\r\n public override projectedParameterRange(ray: Vector3d | Ray3d, lowHigh?: Range1d): Range1d | undefined {\r\n return PlaneAltitudeRangeContext.findExtremeFractionsAlongDirection(this, ray, lowHigh);\r\n }\r\n /**\r\n * Convert the segment detail to a linestring detail:\r\n * * `detail.childDetail` is set to a clone of the input segment detail (optionally populating pre-allocated `child` object).\r\n * * `childDetail.a` is set to `segmentIndex`.\r\n * * `detail.fraction` is set to the global linestring parameter.\r\n * * `detail.curve` is set to the parent linestring.\r\n * @param detail segment location detail, converted in place\r\n * @param segmentIndex index of segment in the linestring\r\n * @param numSegment linestring segment count\r\n * @param parent optional linestring primitive\r\n * @param child optional pre-allocated detail to use to clone the child data\r\n * @returns reference to input detail, with both linestring and segment data\r\n */\r\n public static convertLocalToGlobalDetail(detail: CurveLocationDetail, segmentIndex: number, numSegment: number, parent?: LineString3d, child?: CurveLocationDetail): CurveLocationDetail {\r\n detail.childDetail = detail.clone(child);\r\n detail.childDetail.a = segmentIndex;\r\n detail.fraction = this.mapLocalToGlobalFraction(segmentIndex, detail.fraction, numSegment);\r\n detail.curve = parent;\r\n return detail;\r\n }\r\n}\r\n\r\n/**\r\n * An AnnotatedLineString3d is a linestring with additional surface-related data attached to each point\r\n * * This is useful in facet construction.\r\n * @internal\r\n */\r\nexport class AnnotatedLineString3d {\r\n /** Parameter along curve being faceted. */\r\n public curveParam?: GrowableFloat64Array;\r\n /** uv parameters, stored as uvw with the w possibly used for distinguishing among multiple \"faces\". */\r\n public uvwParam?: GrowableXYZArray;\r\n /** u direction tangent vectors from surface being faceted. */\r\n public vectorU?: GrowableXYZArray;\r\n /** v direction tangent vectors from surface being faceted. */\r\n public vectorV?: GrowableXYZArray;\r\n}\r\n\r\n/**\r\n * Context to be called to incrementally accumulate distance along line segments.\r\n */\r\nclass MoveByDistanceContext {\r\n public distance0: number; // accumulated distance through point0\r\n public point0: Point3d; // most recent point\r\n public fraction0: number; // most recent fraction position\r\n public targetDistance: number; // this is always positive.\r\n /** CAPTURE point0, fraction0, targetDistance */\r\n public constructor(point0: Point3d, fraction0: number, targetDistance: number) {\r\n this.point0 = point0;\r\n this.distance0 = 0.0;\r\n this.targetDistance = Math.abs(targetDistance);\r\n this.fraction0 = fraction0;\r\n }\r\n // Return CurveSearchStatus indicating whether the accumulated distance has reached the target.\r\n public distanceStatus(): CurveSearchStatus {\r\n return Geometry.isSameCoordinate(this.distance0, this.targetDistance) ?\r\n CurveSearchStatus.success : CurveSearchStatus.stoppedAtBoundary;\r\n }\r\n /**\r\n * Announce next point on the polyline.\r\n * * if the additional segment does NOT reach the target:\r\n * * accumulate the segment length\r\n * * update point0 and fraction0\r\n * * return false\r\n * * if the additional segment DOES reach the target:\r\n * * update point0 and fraction0 to the (possibly interpolated) final point and fraction\r\n * * return true\r\n * @param point1 new point\r\n * @param fraction1 fraction at point1\r\n * @return true if targetDistance reached.\r\n */\r\n public announcePoint(point1: Point3d, fraction1: number): boolean {\r\n const a = this.point0.distance(point1);\r\n const distance1 = this.distance0 + a;\r\n if (distance1 < this.targetDistance && !Geometry.isSameCoordinate(distance1, this.targetDistance)) {\r\n this.point0.setFromPoint3d(point1);\r\n this.distance0 = distance1;\r\n this.fraction0 = fraction1;\r\n return false;\r\n }\r\n const b = this.targetDistance - this.distance0;\r\n const intervalFraction = Geometry.safeDivideFraction(b, a, 0.0);\r\n this.point0.interpolate(intervalFraction, point1, this.point0);\r\n this.fraction0 = Geometry.interpolate(this.fraction0, intervalFraction, fraction1);\r\n this.distance0 = this.targetDistance;\r\n return true;\r\n }\r\n /**\r\n * Update point0, fraction0, and distance0 based on extrapolation of a segment between indices of a point array.\r\n * @returns true if extrapolation succeeded. (False if indexed points are coincident)\r\n * @param points\r\n * @param index0\r\n * @param index1\r\n * @param fraction0\r\n * @param fraction1\r\n * @param result\r\n * @param CurveLocationDetail\r\n */\r\n public announceExtrapolation(points: GrowableXYZArray,\r\n index0: number, index1: number,\r\n fraction0: number, fraction1: number): boolean {\r\n const residual = this.targetDistance - this.distance0;\r\n const d01 = points.distanceIndexIndex(index0, index1);\r\n if (!d01)\r\n return false;\r\n const extensionFraction = Geometry.conditionalDivideFraction(residual, d01);\r\n if (extensionFraction === undefined)\r\n return false;\r\n // (Remark: indices are swapped and extensionFraction negated to prevent incidental precision\r\n // loss with the alternative call with (index0, 1 + extensionFraction, index1);\r\n points.interpolate(index1, -extensionFraction, index0, this.point0);\r\n this.distance0 = this.targetDistance;\r\n this.fraction0 = Geometry.interpolate(fraction1, -extensionFraction, fraction0);\r\n return true;\r\n }\r\n}\r\n"]}
|